%option noyywrap %{ /*****************声明和选项设置 begin*****************/ #include #include #include "syntax_tree.h" #include "syntax_analyzer.h" /* #define __DEBUG_COMMENT__ */ 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) { #ifdef __DEBUG_COMMENT__ printf("Get COMMENT in line<%d>: \"%s\"\n", lines, comment); #endif /* 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*****************/ %} /* use exclusive state */ %x COMMENT letter [a-zA-Z] digit [0-9] ID {letter}+ INTEGER {digit}+ FLOAT {digit}+\.|{digit}*\.{digit}+ 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 */ /* .* { pos_end += yyleng; comment_helper(yytext, yyleng); } */ %% "/*" { BEGIN(COMMENT); pos_end += 2; } [^*\n]*|"*"+[^*/\n]* { pos_end += yyleng; comment_helper(yytext, yyleng); } "*/" { BEGIN(0); pos_end += 2; } 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;} %%