fix agentOnCamera to cope with the wrap
[openc2e.git] / caoslexer.re2c
blob85c81a52bea7d664996357784bbd9368cb601528
1 /* vim: set ft=cpp : */
2 #include "token.h"
3 #include "caoslexer.h"
5 static void parse_error(const char *p, int lineno) {
6         std::ostringstream oss;
7         oss << "Parse error at line " << lineno;
8         throw parseException(oss.str());
11 static char string_escape(char c) {
12         switch (c) {
13         case 'n': return '\n';
14         case 'r': return '\r';
15         case 't': return '\t';
16         default : return c;
17         }
21 void lexcaos(std::vector<token> &v, const char *p, bool c2) {
22 #define make_word(str) \
23         v.push_back(token(std::string(str), yylineno))
24         int yylineno = 1;
25         int tokidx   = 0;
26         std::string tempstr;
27         bytestring_t tempbs;
28         const char *basep, *YYMARKER;
29 std:
30         basep = p;
31 /*!re2c
32         re2c:define:YYCTYPE = "unsigned char";
33         re2c:define:YYCURSOR = p;
34         re2c:yyfill:enable = 0;
35         re2c:yych:conversion = 1;
36         re2c:indent:top = 1;
38 noneoi     = [\001-\377];
39 eoi        = [\000];
40 any        = noneoi | eoi;      
41 DIGIT      = [0-9];
42 WORDINIT   = [a-zA-Z_];
43 WORDANY    = [$#a-zA-Z0-9:?!_+-];
44 SIGN       = [-+];
47         [\r\n] { ++yylineno; goto std; }
48         [ \t,] { goto std; }
49         "*" [^\r\n\000]* { goto std; }
50         "'" noneoi "'"  { v.push_back(token(caosVar((int)basep[1]), yylineno)); goto std; }
51         [fF] "**" [kK] { make_word("f**k"); goto std; }
52         WORDANY* WORDINIT WORDANY* {
53                 std::string word(basep, p - basep);
54                 std::transform(word.begin(), word.end(), word.begin(), tolower);
55                 make_word(word);
56                 goto std;
57         }
58         "%" [01]* {
59                 int accum = 0;
60                 for (const char *i = basep + 1; i <= p; i++) {
61                         accum <<= 1;
62                         accum += (*i == '1');
63                 }
64                 v.push_back(token(caosVar(accum), yylineno));
65                 goto std;
66         }
67         SIGN? DIGIT* "." DIGIT* {
68                 v.push_back(token(caosVar((float)atof(basep)), yylineno));
69                 goto std;
70         }
71         SIGN? DIGIT+  {
72                 v.push_back(token(caosVar(atoi(basep)), yylineno));
73                 goto std;
74         }
75 "<>"                     { make_word("ne"); goto std; }
76 "<="                     { make_word("le"); goto std; }
77 ">="                     { make_word("ge"); goto std; }
78 "<"                      { make_word("lt"); goto std; }
79 ">"                      { make_word("gt"); goto std; }
80 "=="                     { make_word("eq"); goto std; }
81 "="                      { make_word("eq"); goto std; }
82 "&&"                     { make_word("and"); goto std; }
83 "||"                     { make_word("or"); goto std; }
85 "["  { if (c2) goto brstr; else goto bytestr; }
86 "\"" { goto str; }
87 eoi { goto out; }
89 any { parse_error(p, yylineno); }
91 bytestr:
92         basep = p;
93         /*!re2c
94 [0-9]+  { tempbs.push_back(atoi(basep)); goto bytestr; }
95 [\n\r] { yylineno++; goto bytestr; }
96 [ \t] { goto bytestr; }
97 "]" { v.push_back(token(tempbs, yylineno)); tempbs.clear(); goto std; }
98 any { parse_error(p, yylineno); }
100 brstr:
101         basep = p;
102         /*!re2c
103 [\000\r\n] { parse_error(basep, yylineno); }
104 "]" { v.push_back(token(caosVar(tempstr), yylineno)); tempstr.clear(); goto std;  }
105 noneoi { tempstr.push_back(*basep); goto brstr; }
108 str:
109         basep = p;
110         /*!re2c
111 [\000\r\n] { parse_error(p, yylineno); }
112 "\\" . { tempstr.push_back(string_escape(basep[1])); goto str; }
113 "\"" { v.push_back(token(caosVar(tempstr), yylineno)); tempstr.clear(); goto std;  }
114 noneoi      { tempstr.push_back(*basep); goto str; }
116 out:
117         v.push_back(token()); // EOI
118         for (size_t i = 0; i < v.size(); i++)
119                 v[i].index = i;