用YACC构造简单语法分析器

时间:2021-04-04 16:48:03

课堂实验题

  • 要求
    通过YACC构造能够识别台式计算器表达式的文法的语法分析程序
    文法:
    E–>E+T|E-T|T
    T–>T*F|F
    F–>(E)|DIGIT

  • 分析
    YACC的工作流程是:
    1.L语言的YACC源程序trans.y 通过YACC编译器生成trans_tab.c
    2.trans_tab.c通过C语言编译器生成trans_tab.exe
    trans_tab.exe就是我们需要的语法分析器。
    trans.y的格式为:

说明部分
%% 翻译规则 %%
用C语言编写的辅助例程

按照YACC的源程序规则由题中所给文法写出trans.y

  • Code
%{
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
%}
%token DIGIT
%%
line    :expr'\n' { printf("%d\n",$1);return;}
        ;
expr    :expr'+'term { $$=$1+$3;}
		|expr'-'term { $$=$1-$3;}
		|term
		;
term	:term'*'factor {$$=$1*$3;}
		|factor
		;
factor	:'('expr')' {$$=$2;}
        |DIGIT
        ;
%%
main(){
    return yyparse();
}

int yylex(){
    int c;
    while ((c=getchar())==' ');
    if(isdigit(c)){
        yylval=c-'0';
        return DIGIT;
    }
    return c;
}
int yyerror(char *s){
    fprintf(stderr,"%s\n",s);
    return 1;
}

我所使用的YACC工具是bision,执行 bison trans.y得到trans.tab.c,然后对.c文件进行编译得到trans.tab.exe可执行文件。
最后测试一下就OK了。
用YACC构造简单语法分析器
最后结果很明显是正确的。

注:上面的代码并不是严格按照课本上的方法做的(严格按照课本上的做法会出错,需要在一些地方做一些修改。)