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,因此所有这些终端都派生至少一个以
开头的字符串(
这不是真正的编程问题,是吗?请定义“编程问题”。一个编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。如果有什么问题的话,你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线索)。不需要定义它,他们已经在帮助中心这样做了。这不是一个真正的编程问题,是吗?请定义“编程问题”。编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线程)下。不需要定义,他们已经在帮助中心做了。这不是真正的编程问题,是吗?请定义“编程问题”“。一个编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。如果有什么问题的话,你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线索)。不需要定义它,他们已经在帮助中心这样做了。这不是一个真正的编程问题,是吗?请定义“编程问题”。编程问题更关心的是做你想做的事情的代码,而不是你想做的事情。你的问题是元问题。好吧,也许这更像是一个“理论问题”。我会把它放在逻辑或数学(数学交换似乎有一些关于逻辑的线程)下。不需要定义它,他们已经在帮助中心这样做了。