1、词法分析的目的
将字符流转换为记号流,对应.l文件
%{ #include "calc.tab.h" //导入的是通过.y文件生成的头文件,包含ADD、SUB、MUL等的定义,也可直接自己在这儿声明 %} %% "+" {return ADD;} "-" {return SUB;} "*" {return MUL;} "/" {return DIV;} "|" {return ABS;} [0-9]+ {yylval = atoi(yytext);return NUM;} \n {return EOL;} [ \t] {} . {printf("Mystery character %c\n", *yytext);} %% /* main(int argc,char **argv) { int token; while(token = yylex()){ printf("%d",token); if(token == NUMBER){ printf(" = %d\n",yylval); } else{ printf("\n"); } } }*/
2、语法分析的目的
将词法分析输出的记号流,根据规则生成一颗语法树
%{ #include <stdio.h> int yyerror(char *s); int yylex(); %} %token NUM %token ADD SUB MUL DIV ABS %token EOL %% start: | start expr EOL { printf("= %d\n> ", $2); } | start EOL { printf("> "); } ; expr: term { $$ = $1; } | expr ADD term { $$ = $1 + $3; } | expr SUB term { $$ = $1 - $3; } ; term: factor { $$ = $1; } | term MUL factor { $$ = $1 * $3; } | term DIV factor { $$ = $1 / $3; } ; factor: NUM { $$ = $1; } ; %% int main(int argc, char **argv) { printf("> "); yyparse(); return 0; } int yyerror(char *s) { fprintf(stderr, "error: %s\n", s); }