写BNF时{和}之间有什么关系?

时间:2010-10-27 21:35:42

标签: parsing yacc bnf parser-generator happy

我在BNF遇到了一些麻烦。我不知道什么是标准的做事方式(如果有的话),以及是否有像char或int这样的类型或者已经内置的任何类型。

然而,我的主要问题是不明白大括号中的BNF部分是如何工作的 给出类似的东西:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  

(这是从某个地方轻易偷走的,适用于yacc / C)

花括号实际上说的是什么?我也为快乐的解析器生成器看了类似的事情,并且同样感到困惑。

2 个答案:

答案 0 :(得分:2)

大括号内的东西实际上是在解析相应规则时执行的C代码。 $符号是占位符,替换为yacc解析的实际值:$$是您要计算的结果,而$1$n表示的值是规则右侧的符号。

例如,规则exp '+' term { $$ = $1 + $3; }$1引用exp$3引用term,因此这表示解析此规则时,添加expterm以获得结果。

答案 1 :(得分:2)

您需要区分一般的BNF(和EBNF)和Yacc语法。 BNF中括号的含义因方言而异;它通常意味着“选择一种替代方案”,或者它可以与重复相关联,或两者兼而有之。在EBNF(ISO 14977:1996)中,'{...}'表示重复零次或多次,'{...} - '表示重复一次或多次(以及为什么这是' - '而不是'+'很神秘)。 IETF使用RFC-5234,其BNF方言根本不使用“{}”。

但是,在Yacc语法中,大括号包含匹配规则时要执行的操作(用行话减少)。因此,'{$$ = $1;}'动作的意思是'将'term'匹配的值分配给减少'exp :: = term'的结果(使用BNF的另一个变体)。