我在BNF遇到了一些麻烦。我不知道什么是标准的做事方式(如果有的话),以及是否有像char或int这样的类型或者已经内置的任何类型。
然而,我的主要问题是不明白大括号中的BNF部分是如何工作的 给出类似的东西:
exp : term {$$ = $1;}
| exp '+' term {$$ = $1 + $3;}
| exp '-' term {$$ = $1 - $3;}
;
(这是从某个地方轻易偷走的,适用于yacc / C)
花括号实际上说的是什么?我也为快乐的解析器生成器看了类似的事情,并且同样感到困惑。
答案 0 :(得分:2)
大括号内的东西实际上是在解析相应规则时执行的C代码。 $
符号是占位符,替换为yacc解析的实际值:$$
是您要计算的结果,而$1
到$n
表示的值是规则右侧的符号。
例如,规则exp '+' term { $$ = $1 + $3; }
,$1
引用exp
而$3
引用term
,因此这表示解析此规则时,添加exp
和term
以获得结果。
答案 1 :(得分:2)
您需要区分一般的BNF(和EBNF)和Yacc语法。 BNF中括号的含义因方言而异;它通常意味着“选择一种替代方案”,或者它可以与重复相关联,或两者兼而有之。在EBNF(ISO 14977:1996)中,'{...}'表示重复零次或多次,'{...} - '表示重复一次或多次(以及为什么这是' - '而不是'+'很神秘)。 IETF使用RFC-5234,其BNF方言根本不使用“{}”。
但是,在Yacc语法中,大括号包含匹配规则时要执行的操作(用行话减少)。因此,'{$$ = $1;}
'动作的意思是'将'term'匹配的值分配给减少'exp :: = term'的结果(使用BNF的另一个变体)。