【问题标题】:Is this a LL(1) grammar?这是 LL(1) 语法吗?
【发布时间】:2013-12-19 19:41:19
【问题描述】:

考虑以下命题逻辑语法:

<A> ::= <B> <-> <A> | <B> 
<B> ::= <C>  -> <B> | <C> 
<C> ::= <D>  \/ <C> | <D> 
<D> ::= <E>  /\ <D> | <E> 
<E> ::= <F> | -<F>
<F> ::= <G> | <H>
<G> ::= (<A>)
<H> ::= p | q | r | ... | z 

连接词的优先级是:-、/\、/、->、。

还考虑了关联性,例如p\/q\/r 应该与p\/(q\/r) 相同。其他连接件也一样。

我假装在 java 中制作了一个自上而下的预测解析器。我在这里没有看到歧义或直接左递归,但不确定这是否就是我需要考虑的全部 LL(1) 语法。也许是非直接左递归?

如果这不是 LL(1) 语法,根据我的意图转换它所需的步骤是什么?

【问题讨论】:

  • 这不是一个真正的编程问题,是吗?
  • 请定义“编程问题”。
  • 一个编程问题会更关心代码来做你所问的,而不是你所问的。你的问题是元,如果有的话。
  • 好吧,也许这更像是一个“理论问题”。
  • 我会将其归档在 LogicMath 下(数学交流似乎有一些逻辑线程)。无需定义,他们已经在帮助中心定义了。

标签: parsing grammar ll


【解决方案1】:

这不是 LL(1)。原因如下:

LL(1) 语法的第一条规则是:

当且仅当A --&gt; C | D 是 G 的两个不同产生式时,语法 G 是 LL(1),以下条件成立:

  1. 对于没有终端 a ,C 和 D 都派生以 a 开头的字符串。

这条规则是,所以在解析这段代码时没有冲突。当解析器遇到( 时,它不会知道使用哪个产生式。

你的语法违反了第一条规则。同一个产生式右手边的所有非终结符,即所有的 Cs 和 Ds,最终都会归约为 G 和 H,因此它们都至少派生出一个以 ( 开头的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多