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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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[]之中为止

//也就是检查程序代码是否出错,如果出错则向下读直到可以确认为新起点为止

相关文档
最新文档