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

标签 java parsing compiler-construction grammar lr

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

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

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

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

最佳答案

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

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

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

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

关于java - 任何适用于 Java 的 L(AL)R 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21471465/

相关文章:

Java - 来自字符串的字节数组

java - 如何为 void 方法创建单元测试,该方法仅更改数据并保存它

Java 8 的 Files.lines() : Performance concern for very long line

java - xpath 匹配同名节点内容的函数表达式

xml - SWXMLHash 紧凑根元素

java - 使用 Java 将 GMT 时间转换为本地时间

c - 编译器语法中if then else的翻译

php - iOS 应用程序接收格式正确的 JSON,但仍然返回为不以数组或对象开头

c++ - 奇怪的编译错误 C++ "undefined reference"& "relocation truncated"

c++ - C++ 编译器会消除赋值重复吗?