实验四 编译 用Yacc工具构造语法分析器.docVIP

  • 32
  • 0
  • 约6.07千字
  • 约 10页
  • 2020-10-06 发布于浙江
  • 举报

实验四 编译 用Yacc工具构造语法分析器.doc

实验4 用Yacc工具构造语法分析器 一、实验目的 掌握移进-归约技术语法分析技术,利用语法分析器生成工具Yacc/Bison实现语法分析器的构造。 二、实验内容 利用语法分析器生成工具Yacc/Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 源语言的文法定义见教材附录 A.1,p394,要求实现完整的语言。 三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最右推导过程(形式可以自行考虑,如依次给出推导使用的产生式)。 例如,程序片断 四、实验思路 本次实验是一次实现词法分析和语法分析的过程,词法分析的内容与第二次实验类似,对关键词,数字,标识符以及其他类型的字符进行识别,分别返回对应的数据类型,这个过程相对来说是比较简单的,由于有特定的词法分析过程的格式,很容易将代码编写出来。语法分析的过程则给出了文法以及相应的语义动作,代码的编写相对比较复杂。 首先,在D:\FlexBison的目录下建立一个文件夹,我命名为expmt3,将bison.exe和flex.exe放到expmt3目录下。然后编写mylex.l文件和myyacc.y文件,在dos下切换到expmt3目录下,先用命令flex mylex.l生成lex.yy.c文件,再用命令bison –d myyacc.y生成myyacc.tab.c文件和myyacc.tab.h文件,在这个目录中再新建一个example.c文件,用vc++打开这个文件,然后编译这个文件,再将前两步生成的lex.yy.c、myyacc.tab.c和myyacc.tab.h文件加入到工程中,再编译并连接生成可执行文件。最后测试程序的正确性要在expmt3的debug目录下创建一个测试文件test.txt,将测试片段放入其中,然后在dos界面运行程序,知道产生正确的结果,实验就完成了。 五、具体代码 Mylex.l %option noyywrap %{ #includectype.h #includestring.h #includestdio.h #includestdlib.h #include myYacc.tab.h %} delim [ \t\n] ws {delim}+ letter [A-Za-z] digit [0-9] %% {ws} { } if {printf(IF );return(IF);} else {printf(ELSE );return(ELSE);} int {printf(INT ); return(BASIC);} float {printf(FLOAT ); return(BASIC);} break {printf(BREAK);return(BREAK);} do {printf(DO );return(DO);} while {printf(WHILE );return(WHILE);} true {printf(TRUE );return(TRUE);} index {printf(INDEX ); return(INDEX);} bool {printf(BOOL ); return(BASIC);} char {printf(CHAR ); return(BASIC);} real {printf(real);return(REAL);} false {printf(FLASE ); return(FALSE);} [a-zA-Z_][a-zA-Z0-9_]* {printf(ID);return(ID);} [+-]?[0-9]+ {printf(NUM);return(NUM);} [+-]?[0-9]*[.][0-9]+ {printf(NUM);return(NUM);} {printf(LT );return();} = {printf(LE );return(LE);} = {printf(= );return(=);} == {printf(EQ );return(EQ);} != {printf(NE );return(NE);} {printf(GT );return();} = {printf(GE );return(GE);} + {printf(+ );return(+);} - {printf(- );return(-);} [ {printf([ );retu

文档评论(0)

1亿VIP精品文档

相关文档