-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathC_lexical.lex
86 lines (67 loc) · 3.44 KB
/
C_lexical.lex
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
%{
#include <string>
#include <iostream>
#include "AST_node.h"
#include "C_syntax.hpp"
#define TOKEN(t) (yylval.token = t)
extern int lineNumber;
%}
%option noyywrap
%%
"extern" return TOKEN(EXTERN);
"return" return TOKEN(RETURN);
"int" { yylval.string = new string(yytext, yyleng); return INT; }
"double" { yylval.string = new string(yytext, yyleng); return DOUBLE; }
"char" { yylval.string = new string(yytext, yyleng); return CHAR; }
"void" { yylval.string = new string(yytext, yyleng); return VOID; }
"if" return TOKEN(IF);
"else" return TOKEN(ELSE);
"for" return TOKEN(FOR);
"while" return TOKEN(WHILE);
["].*["] {
yylval.string = new string(yytext, yyleng);
yylval.string->erase(yylval.string->begin());
yylval.string->erase(yylval.string->end() - 1);
return CSTR;
}
[_A-Za-z][_0-9A-Za-z]* { yylval.string = new string(yytext, yyleng); return VAR; }
[0-9]+ { yylval.string = new string(yytext, yyleng); return CINT; }
[0-9]+\.[0-9]* { yylval.string = new string(yytext, yyleng); return CDOUBLE; }
['].['] {
yylval.string = new string(yytext, yyleng);
yylval.string->erase(yylval.string->begin());
yylval.string->erase(yylval.string->end() - 1);
return CCHAR;
}
"(" return TOKEN(LPAREN);
")" return TOKEN(RPAREN);
"[" return TOKEN(LBRACK);
"]" return TOKEN(RBRACK);
"{" return TOKEN(LBRACE);
"}" return TOKEN(RBRACE);
"=" return TOKEN(EQUAL);
"==" return TOKEN(EQ);
"!=" return TOKEN(NE);
">" return TOKEN(GR);
">=" return TOKEN(GE);
"<" return TOKEN(LW);
"<=" return TOKEN(LE);
"&&" return TOKEN(AND);
"||" return TOKEN(OR);
"+" return TOKEN(ADD);
"-" return TOKEN(SUB);
"*" return TOKEN(MUL);
"/" return TOKEN(DIV);
"+=" return TOKEN(SADD);
"-=" return TOKEN(SSUB);
"*=" return TOKEN(SMUL);
"/=" return TOKEN(SDIV);
"." return TOKEN(DOT);
"," return TOKEN(COMMA);
":" return TOKEN(COLON);
";" return TOKEN(SEMICOLON);
[ \t\r]* ;
"\n" lineNumber += 1;
^"#include ".+ ;
. cout << "Unknown token! " << yytext << endl; yyterminate();
%%