一、LL(1)语法分析原理
LL(1)文法定义中的条件是为了满足选择规则时的唯一性,在我们选择规则的时候只能选择其中的一条规则进行推导,依据这样的思想构造的语法分析程序叫做LL(1)语法分析程序
替换就是直接使用右部代替左部,而待判断字符串不变
匹配需要分析栈和字符串同时改变
整个语法分析器的结构:
stack就是所谓的栈,栈顶是X1,分析的对象是输入流,这是我们用到的两个分析对象:VT是终极符集合(Terminal),非终极符集合。
二、LL(1)分析表的构造
终极符VT里还要增加一个#,竖着写非终极符,横着写终极符。
给每个文法规则编号,随便编,然后在E的predict集中有某个终极符的框框里填文法规则的编号,没有的地方空着就行
三、驱动程序设计
初始格局的S是初始状态,后面是带匹配的字符串
一般格局是指驱动程序执行一段时间之后,当前的结果状态。前面是根据文法规则推导出来的一些短语,后面是前面已经被部分匹配掉的字符串。
每步的分析:
如果X1,最开头的元素是终极符就要和待比较字符串进行匹配,匹配成功就从两个列表中把它们去掉
如果不是终极符,根据当前文法规则使用右部代替左部,注意这里涉及到压栈顺序的问题
最后只剩两个#则成功,否则报错还要提供相关的错误信息。
四、注意问题
五、相关例题
满足LL(1)文法分析的条件
- 没有公共前缀
A->aB|aC|aj|a
这些项都有一个共同的左公共因子,可以把它提取出来
(和数学中提取公因式相同,如果最后一个是a的话,提取出来剩一个null)
A->aA'
A'->B|C|j|null
- 消除左递归
左递归有两种:直接左递归和间接左递归
1. 直接左递归
A->Aa|b
消除方法:
A->bA'
A'-> aA'|null(不要忘了这个null)
2. 间接左递归
A->Bb
B->Aa
先转换成直接左递归,就将B->Aa代入到上面的式子中即可
A->Aab
然后利用化简直接左递归的方法进行化简。
即按照LL(1)文法的定义来进行判断,如果两个推出的predict集有交集就不符合LL(1)文法