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

Different methods of implementing a specific parsing rule for a compiler

假设我们在解析标记时有一个规则指定:

x -> [y[,y]*]

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

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

以及等等(以上是 'x' 规则将被激活的输入示例,而不是代码应该如何)

我已经尝试了以下有效的方法

x : y commaY
  |
  ;

commaY : COMMA y commaY
       |
       ;

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

提前致谢。

编辑我之前的回答不正确(正如评论中指出的),但我无法删除已接受的答案,所以我决定编辑它。

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

x
 : list
 | /* eps */
 ;

list
 : list ',' y
 | y
 ;