Skip to content

Commit cf4a1ec

Browse files
committed
Added matching of curly braces, whitespace changes
1 parent 52fb4e4 commit cf4a1ec

File tree

1 file changed

+78
-76
lines changed

1 file changed

+78
-76
lines changed

scanner.l

100644100755
Lines changed: 78 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -19,88 +19,90 @@ using namespace yy;
1919

2020
%option noyywrap c++ outfile="Lexer.cpp"
2121

22-
letter [A-Za-z]
23-
underscore _
24-
digit [0-9]
25-
id {letter}({underscore}|{letter}|{digit})*
26-
integer {digit}+
27-
float {digit}+(\.{digit}+)?([eE][+-]?{digit}+)?
28-
boolean True|False
29-
string \'([^\'])*\'
30-
comment #.*
31-
newline \r\n|\n\r|\n
22+
letter [A-Za-z]
23+
underscore _
24+
digit [0-9]
25+
id {letter}({underscore}|{letter}|{digit})*
26+
integer {digit}+
27+
float {digit}+(\.{digit}+)?([eE][+-]?{digit}+)?
28+
boolean True|False
29+
string \'([^\'])*\'
30+
comment #.*
31+
newline \r\n|\n\r|\n
3232

3333
%%
3434

35-
" "+ loc->begin = loc->end; loc->columns(YYLeng()); /* no action and no return */
36-
\t loc->begin = loc->end; loc->end.column = ((loc->end.column + 7) & ~7) + 1; /* no action and no return */
37-
{comment} /* no action and no return */
38-
{newline} loc->begin = loc->end; loc->lines(); return Parser::token::EOL;
39-
"<-"|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ASSIGN;
40-
"+" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::PLUS;
41-
"-" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MINUS;
42-
"*"|"×" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MULTIPLY;
43-
"/"|"÷" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DIVIDE;
44-
"(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LPAREN;
45-
")" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RPAREN;
46-
"<" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LT;
47-
">" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::GT;
48-
"=" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::EQ;
49-
"/="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::NE;
50-
"<="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LE;
51-
">="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::GE;
52-
"CONSTANT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CONSTANT;
53-
"DIV" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DIV;
54-
"MOD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MOD;
55-
"AND" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::AND;
56-
"OR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::OR;
57-
"NOT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::NOT;
58-
"," loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::COMMA;
59-
":" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::TYPESPEC;
60-
"." loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DOT;
61-
"[" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LBRAK;
62-
"]" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RBRAK;
35+
" "+ loc->begin = loc->end; loc->columns(YYLeng()); /* no action and no return */
36+
\t loc->begin = loc->end; loc->end.column = ((loc->end.column + 7) & ~7) + 1; /* no action and no return */
37+
{comment} /* no action and no return */
38+
{newline} loc->begin = loc->end; loc->lines(); return Parser::token::EOL;
39+
"<-"|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ASSIGN;
40+
"+" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::PLUS;
41+
"-" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MINUS;
42+
"*"|"×" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MULTIPLY;
43+
"/"|"÷" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DIVIDE;
44+
"(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LPAREN;
45+
")" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RPAREN;
46+
"<" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LT;
47+
">" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::GT;
48+
"=" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::EQ;
49+
"/="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::NE;
50+
"<="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LE;
51+
">="|"" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::GE;
52+
"CONSTANT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CONSTANT;
53+
"DIV" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DIV;
54+
"MOD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::MOD;
55+
"AND" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::AND;
56+
"OR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::OR;
57+
"NOT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::NOT;
58+
"," loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::COMMA;
59+
":" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::TYPESPEC;
60+
"." loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::DOT;
61+
"[" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LBRAK;
62+
"]" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RBRAK;
63+
"{" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LCURL;
64+
"}" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RCURL;
6365

64-
"OUTPUT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::OUTPUT;
65-
"USERINPUT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::USERINPUT;
66-
"LEN(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LEN;
67-
"POSITION(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::POSITION;
68-
"SUBSTRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBSTRING;
69-
"STRING_TO_INT(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING_TO_INT;
70-
"INT_TO_STRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::INT_TO_STRING;
71-
"STRING_TO_REAL(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING_TO_REAL;
72-
"REAL_TO_STRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::REAL_TO_STRING;
73-
"CHAR_TO_CODE(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CHAR_TO_CODE;
74-
"CODE_TO_CHAR(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CODE_TO_CHAR;
75-
"RANDOM_INT(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RANDOM_INT;
76-
"RECORD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RECORD;
77-
"ENDRECORD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDRECORD;
78-
"SUBROUTINE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBROUTINE;
79-
"RETURN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RETURN;
80-
"ENDSUBROUTINE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDSUBROUTINE;
66+
"OUTPUT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::OUTPUT;
67+
"USERINPUT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::USERINPUT;
68+
"LEN(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::LEN;
69+
"POSITION(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::POSITION;
70+
"SUBSTRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBSTRING;
71+
"STRING_TO_INT(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING_TO_INT;
72+
"INT_TO_STRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::INT_TO_STRING;
73+
"STRING_TO_REAL(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING_TO_REAL;
74+
"REAL_TO_STRING(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::REAL_TO_STRING;
75+
"CHAR_TO_CODE(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CHAR_TO_CODE;
76+
"CODE_TO_CHAR(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::CODE_TO_CHAR;
77+
"RANDOM_INT(" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RANDOM_INT;
78+
"RECORD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RECORD;
79+
"ENDRECORD" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDRECORD;
80+
"SUBROUTINE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBROUTINE;
81+
"RETURN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::RETURN;
82+
"ENDSUBROUTINE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDSUBROUTINE;
8183

82-
"IF" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::IF;
83-
"THEN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::THEN;
84-
"ELSE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ELSE;
85-
"ENDIF" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDIF;
86-
"WHILE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::WHILE;
87-
"ENDWHILE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDWHILE;
88-
"REPEAT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::REPEAT;
89-
"UNTIL" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::UNTIL;
90-
"FOR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::FOR;
91-
"TO" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::TO;
92-
"STEP" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STEP;
93-
"IN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::IN;
94-
"ENDFOR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDFOR;
84+
"IF" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::IF;
85+
"THEN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::THEN;
86+
"ELSE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ELSE;
87+
"ENDIF" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDIF;
88+
"WHILE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::WHILE;
89+
"ENDWHILE" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDWHILE;
90+
"REPEAT" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::REPEAT;
91+
"UNTIL" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::UNTIL;
92+
"FOR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::FOR;
93+
"TO" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::TO;
94+
"STEP" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STEP;
95+
"IN" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::IN;
96+
"ENDFOR" loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ENDFOR;
9597

96-
{integer} value->emplace<IntT>(strtol(YYText(), 0, 10)); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::INTEGER;
97-
{float} value->emplace<RealT>(strtod(YYText(), 0)); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::FLOAT;
98-
{boolean} value->emplace<BoolT>(YYText()[0] == 'T' ? true : false); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::BOOLEAN;
99-
{string} value->emplace<StringT>(StringT{ YYText() + 1, YYText() + YYLeng() - 1 }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING;
100-
{id}"(" value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() - 1 }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBID;
101-
{id} value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ID;
102-
<<EOF>> loc->begin = loc->end; return Parser::token::ENDOFFILE;
103-
. loc->begin = loc->end; loc->columns(); value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() }); return Parser::token::UNKNOWN;
98+
{integer} value->emplace<IntT>(strtol(YYText(), 0, 10)); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::INTEGER;
99+
{float} value->emplace<RealT>(strtod(YYText(), 0)); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::FLOAT;
100+
{boolean} value->emplace<BoolT>(YYText()[0] == 'T' ? true : false); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::BOOLEAN;
101+
{string} value->emplace<StringT>(StringT{ YYText() + 1, YYText() + YYLeng() - 1 }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::STRING;
102+
{id}"(" value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() - 1 }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::SUBID;
103+
{id} value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() }); loc->begin = loc->end; loc->columns(YYLeng()); return Parser::token::ID;
104+
<<EOF>> loc->begin = loc->end; return Parser::token::ENDOFFILE;
105+
. loc->begin = loc->end; loc->columns(); value->emplace<std::string>(std::string{ YYText(), YYText() + YYLeng() }); return Parser::token::UNKNOWN;
104106

105107
%%
106108
int yyFlexLexer::yylex() { throw std::runtime_error("bad call to yyFlexLexer::yylex()"); }

0 commit comments

Comments
 (0)