编译原理 --- 预测分析程序

本文介绍了LL(1)文法的预测分析程序工作原理,包括总控程序、分析表的使用以及栈的操作。预测分析表通过非递归方式实现语法分析,其构造涉及FIRST集合和FOLLOW集合。当遇到二义性问题,如悬挂的else,可通过补充规则解决。分析过程中,当分析表中存在多重定义入口时,会引发语法解析的二义性,这通常需要通过调整文法规则来消除。
摘要由CSDN通过智能技术生成

第一部分 --- 预测分析程序的工作原理(以非递归形式实现语法分析)

1.总控程序:根据现行栈顶符号和当前输入符号查找分析表,并执行分析表中查找到的动作

2.分析表,也称为预测分析表,负责指导总控程序如何对栈顶符号进行操作

分析表本身的数据结构是矩阵,第一个坐标是非终结符A,第二则是终结符a,根据坐标找到的元素则是在输入符号为终结符a,文法匹配符号为非终结符A时用来进行扩展的非终结符A的候选式

根据矩阵找到候选式后,总控程序就会将这个候选式从后往前,逐个文字符号的压入到栈中并继续进行匹配

3.栈的底部有一个#号,表示的是此处为栈底;输入串的尾部也有一个#号,表示此处为输入串的尾部

4.所有与语法相关的知识都在分析表中,而总控程序只是负责去执行这些知识的机器,这个机器在不同的语法分析程序中都是通用的(执行的步骤都是一样的)

1.为了分析方便,我们将分析栈推倒放平为左下方这样

2.分析开始时,先压入#号,然后再压入文法的开始符号S

 

1.定义一个bool变量FLAG作为标记,如果这个标记为TRUE的话,则这个语法分析没有结束,程序继续执行,如果标记为FASLE的话,则语法分析程序结束

2.所谓的栈顶符号上托出去的意思就是将栈顶符号弹出

 


第二部分 --- 预测分析示例

1.上图中的下半部分就是图中文法对应的预测分析表

2.上表中空着的地方放的是出错标志

3.注意上面的i1,i2,i3表示的都是同一个字符 i ,之所以加下标只是为了表示这三个字符的位置不同

1.在弹出非终结符,并用其候选式来代替它的位置时,指向输入串字符的指针没有变动且也没有进行匹配,直到栈中无法再进行替换(入栈)后,我们才开始进行输入串的匹配

 


第三部分 --- 构造预测分析表的算法

1.构造预测分析表前我们需要先构造出给定文法的FIRST集合和FELLOW集合

2.分析表的生成其实就是将前面递归下降分析器表格化的结果

 


第四部分 --- LL(1)文法与二义性

1.多重定义入口的意思就是一个分析表的一个格子中存在有多个产生式

 

1.当else前面出现了两个if的时候,else就会出现语法匹配的二义性问题 ---- 它该和离他最近的 if 匹配呢(最近匹配)?还是与离他最远的 if 匹配呢?(最远匹配)

这种问题体现在分析表中就是多重定义入口的出现,这个else也被我们称为悬挂的else

解决这个问题的方法就是给悬挂的else增加一个匹配规则,来应对这个特殊问题的出现 --- 这个规则就是让悬挂的else根据最近匹配规则来匹配 if

2.面对语言二义性问题导致的分析表多重定义入口出现,我们常常采用补充定义的方式来解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值