编译系统中的LR与LL理解
编译原理:LL(1),LR(0),SLR(1),LALR(1),LR(1)对比 LL(1)定义: 一个文法G是LL(1)的,当且仅当对于G的每一个非终结符A的任何两个不同产生式 A→α|β,下面的条件成立:SELECT( A→α) ∩ SELECT( A→ β ) =dd,其中, α|β不能同时 ε. 解释:LL(1)的意思是,第一个L,指的是从左往右处理输入,第二个L,指的是它为输入生成一个最左推导 。 1指的是向前展望1个符号 。 LL(1)文法是 上下文无关文法 的一个子集。它用的方法是 自顶向下的(递归式的处理 )。它要求生成的 预测分析表 的每一个项目至多只能有一个生成式 。 上面的定义说的是,任何两个不同的产生式 A→α和 A→β,选择A→α或者 A→β是不能有冲突的,即SELECT( A→α)∩SELECT( A→β)=,具体来说,就是, 第一:First( A→α) ∩First( A→β)=,首符集不能有交集, 否则当交集中的元素出现时,选择哪个产生式进行推导是不确定的 ,(这其中也包含了α|β不能同时ε,否则交集就是{ε}不为空); 第二:若任何一个产生式β,有ε属于First(β),应有First(A)∩Follow(A)为空(当ε属于First(β),则A有可能被空串代替,那么就要看 A的下一个字符,即Follow集