其他分享
首页 > 其他分享> > 编译原理——语法分析LL(1)文法和分析法

编译原理——语法分析LL(1)文法和分析法

作者:互联网

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自上而下分析
在这里插入图片描述
分析过程如下:
判断这个输入串是不是文法的句子
1.先有输的根节点,从文法的开始符号S,自上而下,向下推导。让S与输入串xy匹配,匹配是从左到右匹配。
2.S(非终结符)无法与x(终结符)进行匹配,S只有一个候选,所以只有让S->xAy,让S拓展为xAy,语法树向下增长一层。
3.由于输入串的x与语法树的x匹配成功,所以指针向右移。
4.由于
无法与A进行匹配,又由于A是一个非终结符,不能与终结符(星号)相匹配。
5.A有两个定义式,机械一点,用第一个候选的定义式来定义A。如下图

在这里插入图片描述
6.左边的*可以与当前的星号相匹配。指针向右移动,此时由y与星号相匹配。显然不匹配
在这里插入图片描述
7.分析无法进行下去,此时,将A替换为另一个候选
在这里插入图片描述
8.匹配成功!得到的输入串对应的语法树AST,也判断了这个输入串是一个合法的句子。

在这里插入图片描述
如果一个非终结符有多个拓展,我们要如何做出正确的选择?避免不必要的回溯,这是自上而下分析面临的问题,我们希望有一个不需要回溯的程序

在这里插入图片描述
左递归问题,会使得语法树无限生长但是单词的分析无法前进,导致整个分析器陷入死循环,所以自上而下分析程序要避免左递归的问题
在这里插入图片描述
在这里插入图片描述
直接左递归消除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
间接左递归消除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消除回溯,当前有用的信息就是之前的a,要根据前面的字符,来从A的候选中选定一个准确的候选拓展A
在这里插入图片描述
选择要么以a开头,要么可以推出以a开头的串的候选式

在这里插入图片描述
在这里插入图片描述
为了使候选首符集尽可能两两不想交
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

显然T‘不能选择第一个候选,因为首符集+号,只能选择空字。
当A选择候选为空的时候,**还要确定有a跟在T‘后面这样的句型,**这是能A能选择空字的条件
在这里插入图片描述
在这里插入图片描述
L(从左到右扫描输入串)L(最左推导)(1(每一步只需向前查看一个符号))

在这里插入图片描述

标签:候选,文法,终结符,递归,匹配,LL,语法分析,输入,自上而下
来源: https://blog.csdn.net/pkapkaever/article/details/122388087