1

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

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

任何人都可以对此提出一些建议吗?

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

4

1 回答 1

4

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

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

请注意,以上适用于 Java 1.0。我不相信最近的 Java 语言版本是上下文无关的。正如该线程中所指出的,“C# 和 Java 都不是上下文无关的,因为检查变量是否在特定范围内正确且一致地使用已知不是上下文无关的”。例如,前向引用(例如,对方法的引用)不能在 PDA 中一次性解析。

1至少当我发布这个答案时,他们是现场直播的。

于 2014-01-31T05:43:50.287 回答