当前位置:文档之家› 编译原理语法分析实验报告.

编译原理语法分析实验报告.

编译原理语法分析实验报告
02282021 赖荣凤
1.实验目的
编写一语法分析器,锻炼团队工作能力
2.实验环境
Windows XP VC++6.0
3.实验内容
这次实验中我的任务就是:设计程序框架,制定编译器文法,作出状态转换图并编写部分程序代码。

这次实验任务较重,为了更好组织大家一起动手实验,由我和黄曙丰统一策划这次实验安排。

我们用递归下降分析方法,为每一标识符编写一分析子程序。

我跟黄曙丰先制定了本编译器的32条文法规则。

SmartC语言的EBNF文法规则语法:
1. program -> declaration-list
2. declaration-list -> declaration { declaration }
3. declaration -> var-declaration | fun-declaration
4. var-declaration -> type-specifier ID ; | type-specifier ID [ NUM ] ;
5. type-specifier -> int | void
6. fun-declaration -> type-specifier ID ( params ) compound-stmt
7. params -> params-list | void
8. param-list -> param { , param }
9. param -> type-specifier ID | type-specifier ID [ ]
10. compound-stmt -> { local-declarations statement-list}
(注:该处左右大括号是真正意义上的大括号)
11. local-declarations -> var-declaration { var-declaration }| empty
12. statement-list -> statement { statement }| empty
13. statement -> expression-stmt | compound-stmt | selection-stmt
| iteration-stmt | return-stmt
14. expression-stmt -> expression ; | ;
15. selection-stmt -> if ( expression ) statement [ else statement ]
(注:该处左右中括号是唯一表示内容可选的中括号)
16. iteration-stmt -> while ( expression ) statement
|for(expression;expression;expression) statement
17. return-stmt -> return ; | return expression;
18. expression -> var = expression | simple-expression|logical-expression
19. var -> ID | ID [value]
20. simple-expression -> additive-expression relop additive-expression
| additive-expression
21. logical-expression-> simple-expression logical simple-expression {logical
logical-expression}| ! simple-expression {logical logical-expression}
22 logical-> &&| ||
23. relop -> <= | >= | < | > | == | !=
24. additive-expression -> term { addop term }
25. addop -> + | -
26. term -> factor { mulop factor }
27. mulop -> * | /
28. factor -> ( simple-expression )|(logical-expression) | value
29. value->var | call | NUM
30. call -> ID ( args )
31. args -> { arg-list }
32. arg-list -> expression { , expression }
然后由我根据这些文法规则画出了本编译器的状态转换图,并确定各标识符的First集和Follow 集。

params
expression
根据文法规则和状态转换图,我们将语法法分析做成一个类。

为每一个标识符编写一个分析程序。

类的结构如下:
下面解释各函数的作用:
Syntax();
//构造函数,对各标识符的first follow集进行赋值
void Programe();
//整个程序对外接口,调用这个子程序分析源代码
int Scanto(int synchset[],int n);
//扫描源程序,直到当前token在synchset[]之中为止
int Checkinput(int firstset[],int followset[],int firstnum,int follownum);
//检查当前token是否在firstset之中,
//若不在就向下扫描源程序直到当前token在firstset[]或followset[]之中为止
//也就是检查程序代码是否出错,如果出错则向下读直到可以确认为新起点为止
int Match(int tokentype);
//用当前token.tokentype与tokentype比较,
//若相同则读下一个token,否则进行错误处理
void Value();
//匹配标识符V alue的子程序
//程序处理的是一个数(通过各种方式得到的一个数)如:变量,常量,数组,函数返回值
//参阅状态转换图(自动机)
void Factor();
//匹配标识符Factor的子程序
//程序处理的是项中的一个因子,处理优先级最高的操作符(),!
//参阅状态转换图(自动机)
void Term();
//匹配标识符Term的子程序
//程序处理的是简单表达式中的一个项,处理优先级第二高的操作符*,*,&&
//参阅状态转换图(自动机)
void Simple_expression();
//匹配标识符Simple_expression的子程序
//程序处理的是表达式中的简单表达式,处理优先级较低的操作符+,-,||
//参阅状态转换图(自动机)
void Expression();
//匹配标识符Expression的子程序
//程序处理的是语句体中的表达式,处理优先级最低的关系操作符==,!=,>,>=,<,<= //参阅状态转换图(自动机)
void Forexpression();
//匹配标识符Forexpression的子程序
//程序处理的是基本语句中的赋值语句和函数调用
//这个子程序是为处理for语句中的初始化
//参阅状态转换图(自动机)
void Params();
//匹配标识符Params的子程序
//程序处理的函数声明时的,参数声明部分
//参阅状态转换图(自动机)
void Declaration();
//匹配标识符Declaration的子程序
//程序处理的全局变量声明,函数声明
//参阅状态转换图(自动机)
void Statement();
//匹配标识符Statement的子程序
//程序处理的是复合语句体中的基本语句,
//如:IF 语句,WHILE语句,FOR语句,RETURN语句,赋值语句,函数调用语句//参阅状态转换图(自动机)
void Compound_stmt();
//匹配标识符Compound_stmt的子程序
//程序处理的是复合语句体,包括局部变量声明,和基本语句处理
//参阅状态转换图(自动机)
COutputTreeView* ptreeview; //信息输出窗口
TOKEN temptoken; //记录程序当前分析的token
所有程序可分成两类,一类程序是进行错误处理的,如:int Scanto(int synchset[],int n); int Checkinput(int firstset[],int followset[],int firstnum,int follownum)和
int Match(int tokentype);,另一类就是对代码进行解释的,包括所有其它程序。

4.实验心得:
整体规划是做给大家看的,所以它不仅必须做的正确,还得让组员们便于理解。

整体规划不难做,但要做到这一点就难了。

开始做程序时,由于没有画出状态转换图。

使得小组成员们只能根据文法规则编程。

工作进展非常慢,画出状态转换图后,思路就豁然开朗了,而且也减轻了大家的编程任务。

相关主题