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

时间:2014-11-05 02:44:04

标签: 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 - > ε

1 个答案:

答案 0 :(得分:1)

基本问题是你的语法含糊不清 - 你有XZ规则中的两个嵌套重复模式,它们都可以匹配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 | ε