diff --git a/src/lexer/lexical_analyzer.l b/src/lexer/lexical_analyzer.l index c6ac08f728c7761f6eefa27fba03fbb4a84a5cc4..242f211695de547ed8c25f76a9e2d0520ec498c3 100755 --- a/src/lexer/lexical_analyzer.l +++ b/src/lexer/lexical_analyzer.l @@ -20,12 +20,51 @@ int pos_end; /******************TODO*********************/ /****请在此补全所有flex的模式与动作 start******/ //STUDENT TO DO - + /******** 运算 ********/ +\+ {pos_start=pos_end;pos_end+=strlen(yytext);return ADD;} +\- {pos_start=pos_end;pos_end+=strlen(yytext);return SUB;} +\* {pos_start=pos_end;pos_end+=strlen(yytext);return MUL;} +\/ {pos_start=pos_end;pos_end+=strlen(yytext);return DIV;} +\< {pos_start=pos_end;pos_end+=strlen(yytext);return LT;} +\<\= {pos_start=pos_end;pos_end+=strlen(yytext);return LTE;} +\> {pos_start=pos_end;pos_end+=strlen(yytext);return GT;} +\>\= {pos_start=pos_end;pos_end+=strlen(yytext);return GTE;} +\=\= {pos_start=pos_end;pos_end+=strlen(yytext);return EQ;} +\!\= {pos_start=pos_end;pos_end+=strlen(yytext);return NEQ;} +\= {pos_start=pos_end;pos_end+=strlen(yytext);return ASSIN;} + + /******** 符号 ********/ +\; {pos_start=pos_end;pos_end+=strlen(yytext);return SEMICOLON;} +\, {pos_start=pos_end;pos_end+=strlen(yytext);return COMMA;} +\( {pos_start=pos_end;pos_end+=strlen(yytext);return LPARENTHESE;} +\) {pos_start=pos_end;pos_end+=strlen(yytext);return RPARENTHESE;} +\[ {pos_start=pos_end;pos_end+=strlen(yytext);return LBRACKET;} +\] {pos_start=pos_end;pos_end+=strlen(yytext);return RBRACKET;} +\{ {pos_start=pos_end;pos_end+=strlen(yytext);return LBRACE;} +\} {pos_start=pos_end;pos_end+=strlen(yytext);return RBRACE;} + + /******** 关键字 ********/ +else {pos_start=pos_end;pos_end+=strlen(yytext);return ELSE;} +if {pos_start=pos_end;pos_end+=strlen(yytext);return IF;} +int {pos_start=pos_end;pos_end+=strlen(yytext);return INT;} +float {pos_start=pos_end;pos_end+=strlen(yytext);return FLOAT;} +return {pos_start=pos_end;pos_end+=strlen(yytext);return RETURN;} +void {pos_start=pos_end;pos_end+=strlen(yytext);return VOID;} +while {pos_start=pos_end;pos_end+=strlen(yytext);return WHILE;} + + /******** ID和NUM ********/ +[a-zA-Z]+ {pos_start=pos_end;pos_end+=strlen(yytext);return IDENTIFIER;} +[0-9]+ {pos_start=pos_end;pos_end+=strlen(yytext);return INTEGER;} +[0-9]+\.[0-9]+ {pos_start=pos_end;pos_end+=strlen(yytext);return FLOATPOINT;} +[0-9]+\. {pos_start=pos_end;pos_end+=strlen(yytext);return FLOATPOINT;} +\[\] {pos_start=pos_end;pos_end+=strlen(yytext);return ARRAY;} +[a-zA-Z] {pos_start=pos_end;pos_end+=strlen(yytext);return LETTER;} + + /******** others ********/ +[\n]+ {pos_start = 1;pos_end = 1;lines+=strlen(yytext);return EOL;} +\/\*([^\*]|(\*)*[^\*\/])*(\*)*\*\/ {return COMMENT;} +[ \f\n\r\t\v] {pos_start = pos_end;pos_end+=strlen(yytext);return BLANK;} . {return ERROR;} - - - - /****请在此补全所有flex的模式与动作 end******/ %% /****************C代码 start*************/ @@ -52,6 +91,15 @@ void analyzer(char* input_file, Token_Node* token_stream){ switch(token){ case COMMENT: //STUDENT TO DO + for(int i = 0;i < strlen(yytext);i++) + { + pos_end++; + if( yytext[i] == '\n' ) + { + lines += 1;pos_end = 1; + } + } + break; case BLANK: //STUDENT TO DO break; @@ -80,7 +128,3 @@ void analyzer(char* input_file, Token_Node* token_stream){ printf("[END]: Analysis completed.\n"); return; } - - - -/****************C代码 end*************/