这是LL(1)语法吗?

时间:2013-12-19 19:41:19

标签: parsing grammar ll

考虑命题逻辑的以下语法:

<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 

锥形的优先级是: - ,/ \,/, - &gt;,&lt; - &gt;。

还考虑了相关性,例如p\/q\/r应与p\/(q\/r)相同。其他锥形物也一样。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

  1. 对于没有终端a,C和D都会导出以a开头的字符串。
  2. 此规则是,因此在解析此代码时不会发生冲突。当解析器遇到(时,它将不知道要使用哪个生产。

    你的语法违反了第一条规则。同一作品右边的所有非终端,即你所有的C和D,最终都会减少到G和H,所以它们都至少得到一个以(开头的字符串。

相关问题