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);
}