理论教育 编译器设计之路:NeoPascal源代码实现

编译器设计之路:NeoPascal源代码实现

时间:2023-11-04 理论教育 版权反馈
【摘要】:了解了语法分析表的作用后,阅读Neo Pascal的语法分析器的源代码就非常容易了。实际上,Neo Pascal语法分析器只是3.2.3节中介绍的LL算法模型的扩充而己。图3-9 Neo Pascal语法分析器算法流程设计程序3-3 Syntax.h程序3-4 Syntax.cpp第3行:临时变量初始化。第44--48行:调用相应的语义子程序,这里使用函数指针的数组实现。如果语义子程序返回true,则表示语义分析正确,否则表示语义分析出错。参数szProduct就是产生式字符串,其中每3个字符表示一个符号的编号。

编译器设计之路:NeoPascal源代码实现

前面已经介绍了语法分析表的构造及逻辑结构的设计,这是语法分析器的核心,它将指导与控制语法分析器的工作流程。了解了语法分析表的作用后,阅读Neo Pascal的语法分析器的源代码就非常容易了。实际上,Neo Pascal语法分析器只是3.2.3节中介绍的LL(1)算法模型的扩充而己。语法分析器的整体流程如图3-9所示。

978-7-111-32164-4-Chapter03-60.jpg

图3-9 Neo Pascal语法分析器算法流程设计

程序3-3 Syntax.h

978-7-111-32164-4-Chapter03-61.jpg

978-7-111-32164-4-Chapter03-62.jpg

程序3-4 Syntax.cpp

978-7-111-32164-4-Chapter03-63.jpg

978-7-111-32164-4-Chapter03-64.jpg

第3行:临时变量(分析表行号)初始化

第4行:临时变量(分析表列号)初始化。

第5行:临时变量(存储分析栈栈顶符号)初始化。

第6行:输入单词流的当前读取指针(即当前读取位置)。

第7行:分析栈清空。

第8行:将文法开始符压入分析栈。(www.daowen.com)

第9行:循环结构条件为分析栈为空或单词流读取完毕。

第11行:分析栈栈顶符号出栈,置入iVal中。

第13~16行:栈顶符号为空字,不作处理,直接进行下一步分析。

第17~28行:栈顶符号为终结符,需要判断当前输入单词与iVal是否相等。如果相等,则读取指针后移一个字符,即读取下一个单词,如果不相等,则语法分析出错。

第29~43行:栈顶符号为非终结符,则根据该非终结符与当前单词检索语法分析表。如果检索结果为1,则表示当前状态下不允许读取当前单词。如果检索结果不为1,则将产生式右部符号逆序压入分析栈。

第44--48行:调用相应的语义子程序,这里使用函数指针的数组实现。语义子程序是无参函数,返回值为bool类型。如果语义子程序返回true,则表示语义分析正确,否则表示语义分析出错。

第51~54行:分析栈为空且输入单词流读取完毕,即while是正常结束的,则表示语法分析正确,否则语法分析出错。

程序3-5 Syntax.cpp

978-7-111-32164-4-Chapter03-65.jpg

第1行:EnStack函数的作用是将产生式右部符号逆向压入分析栈。参数szProduct就是产生式字符串,其中每3个字符表示一个符号的编号。

第3行:如果产生式字符串为空,则无需处理。

第7r_10行:截取产生式字符串中相应符号的编号,并将其转换为整型值后推入分析栈。

第12行:ClearStack函数的作用是清空分析栈。

第16行:DeStack函数的作用是将分析栈的栈顶符号弹出,并置入iTop变量中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈