%option noyywrap %{ /*****************声明和选项设置 begin*****************/ #include #include #include "syntax_tree.h" #include "syntax_analyzer.h" int lines = 1; int pos_start; int pos_end; void pass_node(char *text){ yylval.node = new_syntax_tree_node(text); } void comment_helper(char *comment, unsigned int len) { pos_end += 2; for (int i = 2; i < len-2; i++){ if (comment[i] == '\n' || comment[i] == '\r'){ lines++; pos_end = 0; } else pos_end++; } pos_end += 2; } /*****************声明和选项设置 end*****************/ %} letter [a-zA-Z] digit [0-9] ID {letter}+ INTEGER {digit}+ FLOAT {digit}+\.|{digit}*\.{digit}+ COMMENT "/*".*"*/" NEWLINE \r\n|\r|\n WHITESPACE [ \t] /* %token _IF _ELSE _WHILE _RETURN _INT _FLOAT _VOID %token _ASSIGN _RELOP _ADD_OP _MUL_OP %token _L_SQUARE _R_SQUARE _L_PARE _R_PARE _L_BRACKET _R_BRACKET %token _SEMI _COMMA _ID _INTEGER _FLOATPOINT */ %% {COMMENT} { comment_helper(yytext, yyleng); } if { pos_start = pos_end; pos_end += 2; pass_node("if"); return _IF;} else { pos_start = pos_end; pos_end += 4; pass_node("else"); return _ELSE;} while { pos_start = pos_end; pos_end += 5; pass_node("while"); return _WHILE;} return { pos_start = pos_end; pos_end += 6; pass_node("return"); return _RETURN;} int { pos_start = pos_end; pos_end += 3; pass_node("int"); return _INT;} float { pos_start = pos_end; pos_end += 5; pass_node("float"); return _FLOAT;} void { pos_start = pos_end; pos_end += 4; pass_node("void"); return _VOID;} {ID} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _ID;} {INTEGER} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _INTEGER;} {FLOAT} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _FLOATPOINT;} "=" { pos_start = pos_end; pos_end += 1; pass_node("="); return _ASSIGN;} "<="|">="|"<"|">"|"=="|"!=" { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _RELOP;} "+"|"-" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return _ADD_OP;} "*"|"/" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return _MUL_OP;} "["|"]" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '[' ? _L_SQUARE : _R_SQUARE;} "("|")" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '(' ? _L_PARE : _R_PARE;} "{"|"}" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '{' ? _L_BRACKET : _R_BRACKET;} ","|";" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == ',' ? _COMMA : _SEMI;} {WHITESPACE} { pos_end++; } {NEWLINE} { lines++; pos_end = 0;} %%