任何适用于Java的L(AL)R语法

时间:2014-01-31 02:31:07

标签: java parsing compiler-construction grammar lr

我正在拼命寻找可以保证为LR(1)的Java语法。我不关心哪个版本的Java;我应该能够将其修改为我想要的版本。

我正在阅读Java™语言规范第二版的最后一章。而且,那一章中的语法似乎根本不是LR(1)。我有一种感觉,语法是循环的或有点奇怪,因为我在尝试从语法生成解析表时不断出现减少移位冲突。

有人可以就此提出一些建议吗?

注意:编辑L(AL)R的标题,因为我也可以接受Java的LALR语法。

1 个答案:

答案 0 :(得分:3)

Java语言规范的第19章,版本1.0具有Java的LALR(1)语法。通过在网上搜索“java language specification 1.0”,可以在很多地方找到该文档。本章在JLS的第二版中消失了,取而代之的是(正如你已经指出的)不是LR(1)的语法。以下是1.0版规范 1 的几个工作链接:

然而,关于这个语法,值得阅读this analysis by Trevor Jim,他们指出所呈现的语法是模棱两可的。目前尚不清楚是否有可能在不破坏语法的无上下文性质的情况下引入消歧规则。他的结论是,Java是否是一种无上下文的语言是一个悬而未决的问题(尽管他认为是这样)。

请注意,以上内容适用于Java 1.0。我不相信更新的Java语言版本是无上下文的。正如this thread中所指出的那样,“C#和Java都不是无上下文的,因为已知在整个特定范围内是否正确且一致地使用变量的检查是不受上下文限制的”。例如,使用PDA一次性传递无法解析前向引用(例如,方法)。

1 当我发布这个答案时,至少他们还活着。