【问题标题】:Any working L(AL)R grammar for Java [duplicate]任何适用于 Java 的 L(AL)R 语法 [重复]
【发布时间】:2014-01-31 02:31:07
【问题描述】:

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

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

谁能就此提出一些建议?

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

【问题讨论】:

  • 看这个问题的答案:stackoverflow.com/questions/8378521/…
  • LR(1)?你确定吗?大多数情况下,这会得到巨大的解析器表而不给你买任何东西?还是你只想要 LALR(1)?
  • @JerryJeremiah 我读过那个。首先,那里给出的链接已经过时,并且没有指向任何有用的地方。其次,这个人要求 Java 7;但即使你给我 Java 1.0 版我也没关系。
  • @TedHopp 与上述相同的答案......(不知道为什么我不能在同一评论中@两个人)

标签: java parsing compiler-construction grammar lr


【解决方案1】:

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至少当我发布这个答案时他们还在直播。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2011-04-24
    • 2012-08-11
    • 2011-12-17
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多