假设我有一个语法:
S -> Aaa
A -> a | ε
很显然,该语法只能解析序列aa
和aaa
。当转换为等效语法时,一个简单的LR(1)解析器(甚至LL)就可以解析它们:
S -> aaA
A -> a | ε
尽管这些语法是等效的,但它们生成的解析树却不同。考虑序列aaa
:
S S
/ \ / \
A aa aa A
| |
a a
语法确定序列是否为语言的一部分,而不是提供表示该语言的语法分析树。未转换的语法无法解析序列(没有更大的前瞻性)。虽然转换后的语法可以解析它,但是会构建无效的解析树。
如何为序列构建分析树-它的(无上下文)语法可以(未经转换)不能由LR分析器表示?
答案 0 :(得分:0)
如果语法没有LR(1)解析器,则需要使用其他解析算法。在这种情况下,您可以使用LR(3)解析器。或者,您可以(通常)使用没有提前限制的Earley或GLR解析器。
我认为您的问题与使用转换后的语法从解析结果中恢复原始解析有关。这取决于转换算法。
在您提供的示例中,我认为您正在使用左递归消除转换;此过程不会保留派生,因此据我所知,没有恢复原始解析的算法。
如果知道k
的值,则可以从LR(k)语法构造一个不同的变换来构造LR(1)语法。这种转变是可逆的。但是,由于它可以有效地将LR(k)机器编码为语法规则,因此通常不被认为是实用的,这会导致语法大量崩溃。等效于使用真实的LR(k)解析器,该解析器也具有巨大的自动机。
答案 1 :(得分:0)
首先,我要说:“语法确定一个序列是否是一种语言的句子。然后,您要说转换后的语法将构建一个无效解析树。会说它建立了一个不同解析树,可能或可能没有用。但是,对于您关于从中构建解析树的问题一个非LR语法,请考虑以下任何k都不属于LR(k)的语法,因为它模棱两可:
E -> E + E | E * E | number
例如:
7 * 4 + 3
由于语法上的歧义,您可以根据此句子构建两个截然不同的语法分析树(确实这是模棱两可的语法的定义)。因此,您的问题的答案是在一般情况下我不知道该怎么做。