-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathLexer.re
More file actions
62 lines (58 loc) · 2.41 KB
/
Lexer.re
File metadata and controls
62 lines (58 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "Lexer.h"
#include <iostream>
// This file is processed by re2c (http://re2c.org) to generate a finite state
// machine that matches various regular expressions.
// Scan the given string for the next token (discarding whitespace).
// The string pointer is passed by reference; it is advanced to the character
// following the token. Discards invalid characters (with a warning).
// Returns kTokenEOF if the string contains no token.
Token Lexer(const char*& source)
{
start:
const char* begin = source;
/*!re2c
re2c:define:YYCTYPE = char;
re2c:define:YYCURSOR = source;
re2c:yyfill:enable = 0;
integer = "-"?[0-9]+;
id = [a-zA-Z_][a-zA-Z_0-9]*;
space = [ \t\r\n]+;
eof = "\x00";
integer { return Token( atoi( begin ) ); }
"bool" { return kTokenBool; }
"true" { return kTokenTrue; }
"false" { return kTokenFalse; }
"int" { return kTokenInt; }
"if" { return kTokenIf; }
"else" { return kTokenElse; }
"operator" { return kTokenOperator; }
"return" { return kTokenReturn; }
"while" { return kTokenWhile; }
id { return Token( std::string( begin, source ) ); }
"+" { return kTokenPlus; }
"-" { return kTokenMinus; }
"*" { return kTokenTimes; }
"/" { return kTokenDiv; }
"%" { return kTokenMod; }
"==" { return kTokenEQ; }
"!=" { return kTokenNE; }
"<" { return kTokenLT; }
"<=" { return kTokenLE; }
">" { return kTokenGT; }
">=" { return kTokenGE; }
"&&" { return kTokenAnd; }
"||" { return kTokenOr; }
"!" { return kTokenNot; }
"(" { return kTokenLparen; }
")" { return kTokenRparen; }
"{" { return kTokenLbrace; }
"}" { return kTokenRbrace; }
"," { return kTokenComma; }
"=" { return kTokenAssign; }
";" { return kTokenSemicolon; }
space { goto start; }
eof { return Token( kTokenEOF ); }
. { std::cerr << "Discarding unexpected character '"
<< *begin << "'" << std::endl; }
*/
}