编写BNF时{和}之间有什么?
-
27-09-2019 - |
题
我在BNF上遇到了一些麻烦。我无法说出似乎是做事的标准方式(如果有的话),以及是否有诸如char或int之类的类型或已内置的类型。
但是,我的主要问题是不了解BNF的一部分在卷发括号中的工作方式。
给出类似的东西:
exp : term {$$ = $1;}
| exp '+' term {$$ = $1 + $3;}
| exp '-' term {$$ = $1 - $3;}
;
(这是从某个地方轻松偷来的,适用于yacc / c)
卷发括号中实际上在说什么?我也为快乐解析器发电机看了类似的事情,并且同样感到困惑。
解决方案
您需要将BNF(和EBNF)和YACC语法区分开来。 BNF中的牙套的含义随方言而异。它通常意味着“选择一种替代方案”,或者可以与重复或两者相关联。在EBNF(ISO 14977:1996)中,'{...}'表示重复零或更多次,并且'{...} - '表示重复一次或多次(以及为什么那是' - ' - ' - 而不是一个'+'是神秘的)。 IETF使用 RFC-5234 BNF的方言根本不使用'{}'。
但是,在YACC语法中,牙套封闭了在规则匹配时要执行的动作(在术语中减少)。所以 '{$$ = $1;}
“操作”表示“分配“术语”匹配的值,以减少'exp :: = term'的结果(使用BNF的另一个变体)。
其他提示
卷曲支架中的内容实际上是当相应规则解析时执行的C代码。这 $
符号是占位符,被YACC解析的实际值所取代: $$
是您希望计算的结果 $1
至 $n
表示规则右侧的符号值。
例如,规则 exp '+' term { $$ = $1 + $3; }
, $1
指的是 exp
和 $3
是个 term
, ,所以这说明该规则被解析时,请添加 exp
和 term
得到结果。
不隶属于 StackOverflow