Parsing 这是LL(1)语法吗?

Parsing 这是LL(1)语法吗?,parsing,grammar,ll,Parsing,Grammar,Ll,考虑命题逻辑的以下语法: <A> ::= <B> <-> <A> | <B> <B> ::= <C> -> <B> | <C> <C> ::= <D> \/ <C> | <D> <D> ::= <E> /\ <D> | <E> <E> ::= <F>

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

<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 |…|Z
连词的优先级为:-、/\、/、->、

还考虑了关联性,例如
p\/q\/r
应与
p\/(q\/r)
相同。其他连词也是如此

我假装用java做了一个自顶向下的预测解析器。我看不到这里的模糊或直接左递归,但不确定,如果这就是我需要考虑这一个LL(1)语法。也许是无向左递归

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

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

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

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

  • 对于无终端
    a
    ,C和D是否都派生以
    a
    开头的字符串
  • 此规则为,因此在解析此代码时不存在冲突。当解析器遇到
    )时,它将不知道使用哪个产品

    您的语法违反了第一条规则。同一产品右侧的所有非终端,即所有Cs和Ds,最终都会减少为G和H,因此它们都派生至少一个以
    它不是LL(1)开头的字符串。原因如下:

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

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

  • 对于无终端
    a
    ,C和D是否都派生以
    a
    开头的字符串
  • 此规则为,因此在解析此代码时没有冲突。当解析器遇到
    )时,它将不知道要使用哪个产品

    您的语法违反了第一条规则。同一产品右侧的所有非终端,即所有Cs和Ds,最终都会减少为G和H,因此它们都派生至少一个以
    它不是LL(1)开头的字符串。原因如下:

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

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

  • 对于无终端
    a
    ,C和D是否都派生以
    a
    开头的字符串
  • 此规则为,因此在解析此代码时没有冲突。当解析器遇到
    )时,它将不知道要使用哪个产品

    您的语法违反了第一条规则。同一产品右侧的所有非终端,即所有Cs和Ds,最终都会减少为G和H,因此它们都派生至少一个以
    它不是LL(1)开头的字符串。原因如下:

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

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

  • 对于无终端
    a
    ,C和D是否都派生以
    a
    开头的字符串
  • 此规则为,因此在解析此代码时没有冲突。当解析器遇到
    )时,它将不知道要使用哪个产品


    您的语法违反了第一条规则。同一个产品右侧的所有非终端,即所有Cs和Ds,最终都减少为G和H,因此所有这些终端都派生至少一个以
    开头的字符串(

    这不是真正的编程问题,是吗?请定义“编程问题”。一个编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。如果有什么问题的话,你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线索)。不需要定义它,他们已经在帮助中心这样做了。这不是一个真正的编程问题,是吗?请定义“编程问题”。编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线程)下。不需要定义,他们已经在帮助中心做了。这不是真正的编程问题,是吗?请定义“编程问题”“。一个编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。如果有什么问题的话,你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线索)。不需要定义它,他们已经在帮助中心这样做了。这不是一个真正的编程问题,是吗?请定义“编程问题”。编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线程)下。不需要定义它,他们已经在帮助中心这样做了。