Parsing 为什么这个语法不是LL(1)

Parsing 为什么这个语法不是LL(1),parsing,grammar,Parsing,Grammar,我有下一个语法: C := (PZ) P := X | C X := iQ | eQ | rQ Q := AX | ε A := + L := > Z := LP | AP | ε 我正在使用JFLAP构建LL(1)解析表,但在我键入这些规则的那一刻,JFLAP抛出了一个错误,它说:语法不是LL(1)。我在规则“Q”中找到了错误所在 第一组Q是Q={+,ε},接下来的一组Q是Q={,+,>},在解析表中,我在表[Q,+]中有两个规则,这是错误的,但是我不知道如何修复它,因为我需要规则Q

我有下一个语法:

C := (PZ)
P := X | C
X := iQ | eQ | rQ
Q := AX | ε
A := +
L :=  >
Z := LP | AP | ε
我正在使用JFLAP构建LL(1)解析表,但在我键入这些规则的那一刻,JFLAP抛出了一个错误,它说:语法不是LL(1)。我在规则“Q”中找到了错误所在


第一组Q是Q={+,ε},接下来的一组Q是Q={,+,>},在解析表中,我在表[Q,+]中有两个规则,这是错误的,但是我不知道如何修复它,因为我需要规则Q->ε基本问题是语法不明确-
X
Z
有两个嵌套的重复模式,它们都可以匹配
i+i
片段。因此,您需要决定如何解决这种不确定性——像
i+i
这样的片段应该以哪种方式匹配:

         PZ                          PZ
        /  \                        /  \
       X    ε                      X    AP
      / \                         / \  /  \
     i   Q                       i  Q  +   X
        / \                        /      / \
       A   X                      ε      i   Q
      /   / \                                |
     +   i   Q                               ε
             |
             ε
最简单的修复方法是使其始终匹配正确的示例,您只需去掉
X
/
Q
重复模式即可:

C := (PZ)
P := X | C
X := i | e | r
A := +
L :=  >
Z := LP | AP | ε
如果要始终匹配左侧示例,则需要在
Z
模式中禁用
+

C := (PZ)
P := X | C
X := iQ | eQ | rQ
Q := AX | ε
A := +
L :=  >
Z := LP | ε