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);
}
12-29 09:46