考虑命题逻辑的以下语法:
<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)语法,那么根据我的意图改变它所需的步骤是什么?
答案 0 :(得分:3)
不是LL(1)。原因如下:
LL(1)语法的第一条规则是:
语法G是LL(1)当且仅当A --> C | D
是G的两个不同产品时,以下条件成立:
a
,C和D都会导出以a
开头的字符串。此规则是,因此在解析此代码时不会发生冲突。当解析器遇到(
时,它将不知道要使用哪个生产。
你的语法违反了第一条规则。同一作品右边的所有非终端,即你所有的C和D,最终都会减少到G和H,所以它们都至少得到一个以(
开头的字符串。