是否有一种简单的方法可以在不进行复杂分析的情况下确定语法是LL(1), LR(0), SLR(1)呢?
例如:要确定BNF语法是否为LL(1),您需要计算First和Follow集,这在某些情况下可能很耗时。
有人有什么快速的方法吗? 任何帮助都将不胜感激!
是否有一种简单的方法可以在不进行复杂分析的情况下确定语法是LL(1), LR(0), SLR(1)呢?
例如:要确定BNF语法是否为LL(1),您需要计算First和Follow集,这在某些情况下可能很耗时。
有人有什么快速的方法吗? 任何帮助都将不胜感激!
您可以编写一个解析器用于语法分析,并让程序为您计算first和follow集等其他属性。毕竟,这是BNF语法的最大优势,它们是机器可理解的。
检查语法并查找各种语法类型约束条件的违规。例如:LL(1)允许右递归但不允许左递归,因此,包含左递归的语法不是LL(1)。(对于其他语法属性,您需要花费一些时间阅读定义,因为我现在就想不起来其他的了 :).
是LL(1)。A → A + A | a
不是LL(1),而
A → a | b
这不是LL(1),但可能不是显而易见的。A → B | a
B → A + A
这个语法仅处理乘法和加法,已经不清楚这个语法是否是LL(1)。仍然可以通过查看语法来评估它,但随着语法的增长,这变得不太可行。如果我们为整个编程语言定义一个语法,几乎肯定需要进行一些复杂的分析。expr → term { '+' term }
term → factor { '*' factor }
factor → number | '(' expr ')'
检查语法是否存在歧义。如果有歧义,则该语法不是LL(1),因为没有歧义的语法是LL(1)。
嗨,这里有LL(1)语法的快捷方式:
1)如果A -> B1 | B2 | ....... | Bn,则first(B1)交集first(B2)交集......交集first(Bn)=空集,则它是LL(1)语法。
2)如果A -> B1 | epsilon,则B1交集follow(A)为空集。
3)如果G是任何文法,每个非终端符号只派生一个产生式,则该文法是LL(1)。
p0 S' → E
p1 E → id
p2 E → id ( E )
p3 E → E + id
id ( id + id )
的步骤(移进、规约、接受)。