Parsing 如何解决这种间接的第一套语法冲突?

Parsing 如何解决这种间接的第一套语法冲突?,parsing,context-free-grammar,Parsing,Context Free Grammar,下面是我试图简化为LL(1)的语法的一小部分: 我知道F和G都有第一组冲突,它们可以通过以下方式解决: F -> id F' F' -> H F | . 但是我不知道如何解决与A的间接第一集冲突。B和C都指向不同的符号,但是F和G都指向id。我一直在使用帮助,但它无法处理这种类型的冲突。由于F和G是相同的,自顶向下的解析器将无法处理两者都是可能预测的语法。(在这里,我们看不到I的定义,但是如果碰巧是lpar∈ 首先(I)然后,即使是自下而上的解析器也会有问题。) 简单的解

下面是我试图简化为LL(1)的语法的一小部分:

我知道F和G都有第一组冲突,它们可以通过以下方式解决:

F  -> id F'
F' -> H F
    | .

但是我不知道如何解决与
A
的间接第一集冲突。
B
C
都指向不同的符号,但是
F
G
都指向
id
。我一直在使用帮助,但它无法处理这种类型的冲突。

由于
F
G
是相同的,自顶向下的解析器将无法处理两者都是可能预测的语法。(在这里,我们看不到
I
的定义,但是如果碰巧是
lpar∈ 首先(I)
然后,即使是自下而上的解析器也会有问题。)

简单的解决方案是通过在两种上下文中只使用其中一种结果来消除冗余

对于自上而下的解析器,您仍然需要使用左因子,因为
B
C
仍然具有相同的
FIRST
集合。一个简单的解决方案可能是:

A ⇒ B'
  | intnum 
  | floatnum 
  | lpar D rpar 
  | not A 
  | E A .

B' ⇒ F C' .

C' ⇒ I
   | lpar rpar .
假设
lpar∉ 首先(I)
(以及对
E
的类似保证),这个片段是LL(1)


这对完整语法的适用程度取决于该片段的简化程度。对于LL(1)解析器来说,解决这个问题非常困难,但是对于LR(1)解析器(或者对于小k的LR(k)解析器),解决这个问题相对简单。特别是,您的原始语法,即使有冗余的
F
G
,也是LALR(1)(用Bison测试)。

F和G是相同的。为什么不使用一个这样的非终端呢?好吧,假设我这样做了,那么
F
可以被传递到
A
像这样:
A->fb | fc | intnum | floatnum |。我仍然会有第一盘的冲突
G  -> id G'
G' -> H G
    | .
A ⇒ B'
  | intnum 
  | floatnum 
  | lpar D rpar 
  | not A 
  | E A .

B' ⇒ F C' .

C' ⇒ I
   | lpar rpar .