【问题标题】:Java LR or LL ParsingJava LR 或 LL 解析
【发布时间】:2014-09-17 08:14:40
【问题描述】:

我的一位老师说,Java 无法进行 LL 解析。 我不明白这一点,想知道这是不是真的。

我搜索了一个Java 8的语法,发现了这个:https://github.com/antlr/grammars-v4/blob/master/java8/Java8.g4

但是即使我尝试分析语法,我也没有得到 LL 解析的问题。 有谁知道这是否属实,知道科学证明或只是可以向我解释为什么不可能找到可以 LL 解析的 Java 语法构造?

非常感谢大家。

【问题讨论】:

  • 考虑重新标记以将“语言律师”作为标签之一。
  • 我会区分语言的 LL 可解析性和语言的某些语法。你的老师显然没有。我至少想不出任何会影响 Java 的 LL 可解析性的东西(尽管我实际上也没有见过或写过 Java 的 LL 语法)。
  • 以下分支允许 ANTLR 4 使用语言规范中语法的文字转录来解析 Java 8。它不仅允许使用 LL 解析器解析 Java 8,而且实际上允许它甚至无需将语法更改为 LL 解析器生成器传统使用的形式,并生成准确反映语言规范中使用的具体语法的解析树。 github.com/sharwell/antlr4/tree/java8-grammar

标签: java parsing grammar language-lawyer


【解决方案1】:

Java Language Specification for Java 7 说它不是LL(1)

本章介绍的语法是 参考实现。请注意,虽然它不是 LL(1) 语法 在许多情况下,它最大限度地减少了必要的前瞻性。

如果您发现:

  • 左递归,或
  • 一个替代(A|B),两个或多个替代的交集共享相同的FIRST集合; FIRST(A)FIRST(B) 中也有一个或多个符号

你的语法不会是LL(1)

【讨论】:

  • 如果语法不是 LL(1),那么对于 n >= 0,该语法也不可能是 LL(n)?我说得对吗?
  • @Benny 你不正确。如果一个文法不是 LL(k),那么对于任何 a k 它也不是 LL(a) i>.
【解决方案2】:

我认为这是由于左递归。 LL 解析器无法处理左递归,并且在某些情况下使用它们指定当前的 Java 语法,至少 Java 7。

当然,众所周知,可以构造等价的语法来摆脱左递归,但在其当前规范中,Java 语言无法进行 LL 解析。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多