编译原理语法分析实验报告.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理语法分析实验报告
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[]之中为止
//也就是检查程序代码是否出错,如果出错则向下读直到可以确认为新起点为止