%option noyywrap %{ /*****************声明和选项设置 begin*****************/ #include #include #include "syntax_tree.h" #include "syntax_analyzer.h" int lines; int pos_start; int pos_end; void pass_node(char *text){ yylval.value = new_syntax_tree_node(text); } /*****************声明和选项设置 end*****************/ %} letter [a-zA-Z] digit [0-9] ID {letter}+ INTEGER {digit}+ FLOAT {digit}+\. | {digit}*\.{digit}+ /* %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 */ %% 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;} " " | \t { pos_end++; } \r\n | \n | \r { lines++; pos_end = 0;} /* . { pos_start = pos_end; pos_end++; return ERROR; } */ /****请在此补全所有flex的模式与动作 end******/ %%