前面已经介绍了语法分析表的构造及逻辑结构的设计,这是语法分析器的核心,它将指导与控制语法分析器的工作流程。了解了语法分析表的作用后,阅读Neo Pascal的语法分析器的源代码就非常容易了。实际上,Neo Pascal语法分析器只是3.2.3节中介绍的LL(1)算法模型的扩充而己。语法分析器的整体流程如图3-9所示。
图3-9 Neo Pascal语法分析器算法流程设计
程序3-3 Syntax.h
程序3-4 Syntax.cpp
第4行:临时变量(分析表列号)初始化。
第5行:临时变量(存储分析栈栈顶符号)初始化。
第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
第1行:EnStack函数的作用是将产生式右部符号逆向压入分析栈。参数szProduct就是产生式字符串,其中每3个字符表示一个符号的编号。
第3行:如果产生式字符串为空,则无需处理。
第7r_10行:截取产生式字符串中相应符号的编号,并将其转换为整型值后推入分析栈。
第12行:ClearStack函数的作用是清空分析栈。
第16行:DeStack函数的作用是将分析栈的栈顶符号弹出,并置入iTop变量中。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。