为编译器实现特定解析规则的不同方法

时间:2019-04-15 19:53:37

标签: parsing compiler-construction bison

比方说,我们在解析令牌时有一条规则指定:

x -> [y[,y]*]

括号中的[[]]表示其中的任何内容都是可选的,以便规则生效,*表示0或更大。 例如,可能是:

x : (empty) 
  OR
x : y 
  OR
x : y,y

也是如此(上面的示例是激活“ x”规则的输入示例,而不是代码的示例)

我已经尝试了以下可行的方法

x : y commaY
  |
  ;

commaY : COMMA y commaY
       |
       ;

我想知道上面的替代选项,如果有的话,它可以用于教育目的。

谢谢。

1 个答案:

答案 0 :(得分:1)

EDIT我先前的答案不正确(如注释中所指出),但是我无法删除一个可接受的答案,因此我决定对其进行编辑。

x -> [y[,y]*]至少需要2条规则。这是另一种可能性:

x
 : list
 | /* eps */
 ;

list
 : list ',' y
 | y
 ;