如何在 YACC (/RACC) 中对一系列可选令牌进行编码

How to encode a series of optional tokens in YACC (/RACC)

我正在尝试编写一个 RACC 解析器,其中一部分可以用正则表达式表示 a[b][c][d]

我想出了以下产品(每个令牌代表令牌名称的小写字符):

  expr
    : A
    | A b
    ;

  b
    : B
    | B c
    | c
    ;

  c
    : C
    | C D
    | D

这是最简单的形式吗,还是我遗漏了什么?

如果BCD 可以通过它们的第一个标记相互区分(如果它们是标记而不是更复杂语法的简化,情况肯定如此),那么另一种选择是定义表示可选性的非终结符。

optional_B: /* empty */ | B
optional_C: /* empty */ | C
optional_D: /* empty */ | D 
expression: A optional_B optional_C optional_D

当不能立即区分可选的子表达式时,这会变得更加复杂,因为解析器需要仅根据以下标记正确识别可选的非终结符匹配空字符串。但听起来你的语法并非如此。