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

第一部分 --- 预测分析程序的工作原理(以非递归形式实现语法分析)编译原理 --- 预测分析程序_第1张图片

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

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

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

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

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

4.所有与语法相关的知识都在分析表中,而总控程序只是负责去执行这些知识的机器,这个机器在不同的语法分析程序中都是通用的(执行的步骤都是一样的)编译原理 --- 预测分析程序_第2张图片

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

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

 编译原理 --- 预测分析程序_第3张图片

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

2.所谓的栈顶符号上托出去的意思就是将栈顶符号弹出编译原理 --- 预测分析程序_第4张图片

 


第二部分 --- 预测分析示例编译原理 --- 预测分析程序_第5张图片

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

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

3.注意上面的i1,i2,i3表示的都是同一个字符 i ,之所以加下标只是为了表示这三个字符的位置不同编译原理 --- 预测分析程序_第6张图片

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

 


第三部分 --- 构造预测分析表的算法编译原理 --- 预测分析程序_第7张图片

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

2.分析表的生成其实就是将前面递归下降分析器表格化的结果编译原理 --- 预测分析程序_第8张图片

 


第四部分 --- LL(1)文法与二义性编译原理 --- 预测分析程序_第9张图片

1.多重定义入口的意思就是一个分析表的一个格子中存在有多个产生式编译原理 --- 预测分析程序_第10张图片

 编译原理 --- 预测分析程序_第11张图片

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

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

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

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

你可能感兴趣的:(编译原理,算法)