编译原理——语法分析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