资源描述:
《实验四 用Yacc实现的语法分析器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验4用Yacc工具构造语法分析器一、实验目的掌握移进-归约技术语法分析技术,利用语法分析器生成工具Yacc/Bison实现语法分析器的构造。二、实验内容利用语法分析器生成工具Yacc/Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。三、实验要求1.个人完成,提交实验报告。2.实验报告中给出采用测试源代码片断,及其对应的最右推导过程(形式可以自行考虑,如依次给出推导使用的产生式)。例如,程序片断四、实验步骤1、根据文法编写.y文件:%{#include<
2、ctype.h>#include#defineYYSIYPEdoublevoidyyerror(char*s){printf("%s",s);}%}%tokenNUM%tokenBASICIFELSEDOBREAKREALTRUEFALSEIDLEINDEX%tokenWHILEANDOREQNEGE%left'+''-'%left'*''/'%rightUMINUS%%program:block{printf("program->block");};block:'{'declsstmts'}
3、'{printf("block->declsstmts");};decls:declsdecl{printf("decls->declsdecl");}
4、{printf("decls->E");};decl:typeID';'{printf("decl->typeid");};type:type'['NUM']'{printf("type->type[num]");}
5、BASIC{printf("type->basic");};stmts:stmtsstmt{printf("stmts->st
6、mtsstmt");}
7、{printf("stmts->E");};stmt:loc'='bool';'{printf("stmt->loc=bool");}
8、IF'('bool')'stmt{printf("stmt->if(bool)stmt");}
9、IF'('bool')'stmtELSEstmt{printf("stmt->if(bool)stmtelsestmt");}
10、WHILE'('bool')'stmt{printf("stmt->while(bool)stmt");}
11、DOst
12、mtWHILE'('bool')'';'{printf("stmt->->dostmtwhile(bool)");}
13、BREAK';'{printf("stmt->break");}
14、block{printf("stmt->block");};loc:loc'['bool']'{printf("loc->loc[bool]");}
15、ID{printf("loc->id");};bool:boolORjoin{printf("bool->bool
16、
17、join");}
18、join{printf("bo
19、ol->join");};join:joinANDequality{printf("join->join&&equality");}
20、equality{printf("join->equality");};equality:equalityEQrel{printf("equality->equality==rel");}
21、equalityNErel{printf("equality->equality!=rel");}
22、rel{printf("equality->rel");};rel:expr
23、'<'expr{printf("rel->expr24、exprLEexpr{printf("rel->expr<=expr");}
25、expr'>'expr{printf("rel->expr>expr");}
26、exprGEexpr{printf("rel->expr>=expr");}
27、expr{printf("rel->expr");};expr:expr'+'term{printf("expr->expt+term");}
28、expr'-'term{printf("expr->
29、expr-term");}
30、term{printf("expr->term");};term:term'*'unary{printf("term->term*unary");}
31、term'/'unary{printf("term->term/unary");}
32、unary{printf("term->unary