source: trunk/orbital/mesh-scanner.l @ 1506

Last change on this file since 1506 was 1506, checked in by sam, 9 years ago

orbital: add "ch" command to create chamfers.

File size: 3.6 KB
Line 
1%{
2//
3// Orbital
4//
5// Copyright: (c) 2009-2012 Cédric Lecacheur <jordx@free.fr>
6//            (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com>
7//            (c) 2012 Sam Hocevar <sam@hocevar.net>
8//
9
10#if defined HAVE_CONFIG_H
11#   include "config.h"
12#endif
13
14#include "core.h"
15#include "loldebug.h"
16
17using namespace lol;
18
19#include "../mesh-compiler.h"
20
21typedef orbital::MeshParser::token token;
22typedef orbital::MeshParser::token_type token_type;
23
24#ifndef YY_DECL
25#   define YY_DECL orbital::MeshParser::token_type \
26        orbital::MeshScanner::lex(orbital::MeshParser::semantic_type* yylval, \
27                                  orbital::MeshParser::location_type* yylloc)
28#endif
29
30#define yyterminate() return token::T_END
31#define YY_NO_UNISTD_H
32#define YY_USER_ACTION yylloc->columns(yyleng);
33%}
34
35%option c++ prefix="Mesh"
36%option batch yywrap nounput stack
37
38%%
39
40%{
41    /* reset location at the beginning of yylex() */
42    yylloc->step();
43%}
44
45sc    { return token::T_COLOR; }
46scb   { return token::T_BGCOLOR; }
47
48ch    { return token::T_CHAMFER; }
49tx    { return token::T_TRANSLATEX; }
50ty    { return token::T_TRANSLATEY; }
51tz    { return token::T_TRANSLATEZ; }
52t     { return token::T_TRANSLATE; }
53rx    { return token::T_ROTATEX; }
54ry    { return token::T_ROTATEY; }
55rz    { return token::T_ROTATEZ; }
56tax   { return token::T_TAPERX; }
57tay   { return token::T_TAPERY; }
58taz   { return token::T_TAPERZ; }
59sx    { return token::T_SCALEX; }
60sy    { return token::T_SCALEY; }
61sz    { return token::T_SCALEZ; }
62s     { return token::T_SCALE; }
63mx    { return token::T_MIRRORX; }
64my    { return token::T_MIRRORY; }
65mz    { return token::T_MIRRORZ; }
66
67ac    { return token::T_CYLINDER; }
68ab    { return token::T_BOX; }
69ascb  { return token::T_SMOOTHCHAMFBOX; }
70afcb  { return token::T_FLATCHAMFBOX; }
71asph  { return token::T_SPHERE; }
72as    { return token::T_STAR; }
73aes   { return token::T_EXPANDEDSTAR; }
74ad    { return token::T_DISC; }
75at    { return token::T_TRIANGLE; }
76aq    { return token::T_QUAD; }
77acg   { return token::T_COG; }
78
79#[0-9a-f]{3} {
80        uint32_t tmp = strtol(yytext + 1, NULL, 16);
81        yylval->u32val = 0x11000000u * (tmp >> 8)
82                       | 0x00110000u * ((tmp >> 4) & 0xf)
83                       | 0x00001100u * (tmp & 0xf)
84                       | 0x000000ffu;
85        return token::COLOR; }
86#[0-9a-f]{4} {
87        uint32_t tmp = strtol(yytext + 1, NULL, 16);
88        yylval->u32val = 0x11000000u * (tmp >> 12)
89                       | 0x00110000u * ((tmp >> 8) & 0xf)
90                       | 0x00001100u * ((tmp >> 4) & 0xf)
91                       | 0x00000011u * (tmp & 0xf);
92        return token::COLOR; }
93#[0-9a-f]{6} {
94        yylval->u32val = 0xffu
95                       | 0x100u * (uint32_t)strtol(yytext + 1, NULL, 16);
96        return token::COLOR; }
97#[0-9a-f]{8} {
98        yylval->u32val = (uint32_t)strtol(yytext + 1, NULL, 16);
99        return token::COLOR; }
100[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? {
101        yylval->fval = atof(yytext); return token::NUMBER; }
102-     { return token_type('-'); }
103"["   { return token_type('['); }
104"]"   { return token_type(']'); }
105[ ,]  { /* ignore this */ }
106[\n]  { /* ignore this */ }
107.     { return token::T_ERROR; }
108
109%%
110
111orbital::MeshScanner::MeshScanner(char const *command)
112    : MeshFlexLexer(0, 0),
113      m_input(command)
114{
115}
116
117orbital::MeshScanner::~MeshScanner()
118{
119}
120
121int orbital::MeshScanner::LexerInput(char* buf, int max_size)
122{
123    buf[0] = m_input[0];
124    if (buf[0])
125        ++m_input;
126    return buf[0] ? 1 : 0;
127}
128
129#ifdef yylex
130#undef yylex
131#endif
132int MeshFlexLexer::yylex()
133{
134    std::cerr << "in MeshFlexLexer::yylex() !" << std::endl;
135    return 0;
136}
137
138int MeshFlexLexer::yywrap()
139{
140    return 1;
141}
142
Note: See TracBrowser for help on using the repository browser.