美文网首页
yacc语法分析器#bison

yacc语法分析器#bison

作者: 哆啦A梦没有毛 | 来源:发表于2019-06-17 21:16 被阅读0次

    实现一个简单的表达式计算器,要求能进行加、减、乘、除、幂运算,注意优先级。写出详细的步骤和源程序。

    第一步:

    安装bison(sudo apt-get install bison)

    第二步:

    编辑cal.l程序并保存,内容如下:

    %{
    
    #include<stdlib.h>
    
    #include<stdio.h>
    
    #include "calc.tab.h"  //这是下一步中使用bison生成的头文件
    
    %}
    
    %%
    
    [a-z] {yylval=*yytext-'a';return VARIABLE;}
    
    [0-9]+ {yylval=atoi(yytext);return INTEGER;}
    
    [-+()=/*^\n] {return *yytext;}
    
    [\t] ;
    
    
    
    %%
    
    int yywrap(void)
    
    {
    
    return 1;
    
    }
    
    第三步:

    编辑cal.y程序并保存,内容如下:

    %token INTEGER VARIABLE
    
    %left '+' '-'    //越往下,优先级越高
    %left '*' '/'
    %left '^'
    
    %{
    
    #include<stdio.h>
    #include<math.h>
    
    void yyerror(char*);
    
    int yylex(void);
    
    int sym[26];
    
    %}
    
    %%
    
    program:program statement '\n'
    | ;
    
    statement:
    expr {printf("%d\n",$1);}
    |VARIABLE'='expr {sym[$1]=$3;}  
    ;  //$1为第一个匹配串,即VARIABLE;$3为expr
    
    expr:
    INTEGER
    |VARIABLE'='expr {sym[$1]=$3;};
    
    expr:
    INTEGER
    |VARIABLE {$$=sym[$1];} //$$为规约后的串,即expr
    |expr'+'expr {$$=$1+$3;}
    |expr'-'expr {$$=$1-$3;}
    |expr'*'expr {$$=$1*$3;}
    |expr'/'expr {$$=$1/$3;}
    |expr'^'expr {$$=pow($1,$3);}
    |'('expr')' {$$=$2;}
    
    %%
    
    void main()
    {
      yyparse();
    }
    
    void yyerror(char *msg)
    {
      printf("error is %s",msg);
    }
    
    
    第四步:
    使用bison编译calc.y程序生成calc.tab.h以及calc.tab.c,命令如下
    
    bison -d calc.y
    
    第五步:
    使用flex编译calc.l程序,生成cal.lex.c程序,命令如下:
    
        Flex -o cal.lex.c calc.l
    
    第六步:

    使用gcc编译链接calc.tab.c和calc.lex.c,并链入math库(幂函数pow()的使用需要math库),生成calc可执行文件。

    第七步:

    运行calc程序,观察结果:

    相关文章

      网友评论

          本文标题:yacc语法分析器#bison

          本文链接:https://www.haomeiwen.com/subject/gettqctx.html