有没有一种简单的方法来确定一个文法是否是LL(1),LR(0),SLR(1)……仅仅看语法而不做任何复杂的分析?
例如:要确定BNF语法是否为LL(1),您必须先计算集合,然后再计算集合-在某些情况下,这可能很耗时。
有没有人知道如何更快地做到这一点?任何帮助都将不胜感激!
发布于 2009-01-24 13:22:23
首先,有点卖弄学问。您不能确定语言是否为LL(1)通过检查它的语法,您只能对语法本身作出声明。为存在LL(1)文法的语言编写非LL(1)文法是完全可能的。
这样就不会有什么问题了:
,,
发布于 2009-02-16 21:13:13
回答你的主要问题:对于一个非常简单的语法,可以确定它是否是LL(1),而不需要先构造和跟随集合,例如
A→A+A|a
不是LL(1),而是
A→a|b
是。
但是当你变得更复杂的时候,你需要做一些分析。
A→B|a
B→A+A
这不是LL(1),但它可能不是立即明显的
算术的语法规则很快就变得非常复杂:
expr→term { '+‘term }
术语→因子{ '*‘因子}
系数表达式编号| '(‘→')’
这个语法只处理乘法和加法,并且已经不能立即确定该语法是否为LL(1)。仍然可以通过查看语法来评估它,但随着语法的发展,它变得越来越不可行。如果我们要为一种完整的编程语言定义语法,那么几乎可以肯定的是,它需要进行一些复杂的分析。
也就是说,有一些明显的迹象表明语法不是LL(1) -就像上面的A→A+A-如果你能在你的语法中找到其中的任何一个,你就会知道如果你正在编写递归下降解析器,它需要重写。但是没有捷径可以验证语法是LL(1)。
发布于 2009-01-25 02:14:31
一方面,“是语言/语法不明确”,就像Post correspondence和halting问题一样。
https://stackoverflow.com/questions/475949
复制相似问题