3

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

但是,我的主要问题是不了解大括号中的 BNF 部分是如何工作的。
给定类似的东西:

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

(这是从某个地方随便偷来的,用于 yacc / C)

花括号中的内容实际上是在说什么?我也为快乐的解析器生成器看过类似的东西,并且同样感到困惑。

4

2 回答 2

2

花括号中的内容实际上是在解析相应规则时执行的 C 代码。符号是占位符,$被 yacc 解析的实际值替换:$$是您希望计算的结果,同时$1表示$n规则右侧的符号值。

例如, rule exp '+' term { $$ = $1 + $3; },$1指的是and exp,所以这表示当解析这条规则时,添加and得到结果。$3termexpterm

于 2010-10-27T21:40:43.933 回答
2

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

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

于 2010-10-27T21:45:24.027 回答