2010-10-27 78 views
3

我在BNF遇到了一些麻烦。我不知道什么似乎是做事的标准方式(如果有的话),以及是否有类似char或int或其他内置类型。写BNF时{和}之间有什么关系?

但是,我的主要问题是了解花括号中的BNF部分是如何工作的。
鉴于这样的:

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

(这是轻而易举地从什么地方偷来的,是YACC/C)

什么是大括号的东西实际上是在说?我也看到了类似的东西快乐的分析器生成器也一样困惑。

+0

这是功课吗? – jcolebrand 2010-10-27 21:37:23

+0

哦,这实际上不是BNF。 – 2010-10-27 21:44:15

+0

@drachenstern:虽然这个问题主要是因为我在看BNF而被问到,因为我必须为Happy编写一些东西来为编译器任务创建一个玩具语言的解析器,但它本身并不是一个家庭作业问题。我不明白当我使用谷歌搜索时我正在看的东西,因此问。所以这不是家庭作业,但它与我的学位课程有关。即使那样,我也不是要求某人为我工作,我是在解释之后。 – Squidly 2010-10-27 22:01:12

回答

2

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

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

2

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

例如,规则exp '+' term { $$ = $1 + $3; }$1exp$3term,所以这个说,当这条规则被解析,加expterm得到结果。

相关问题