我在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, ,所以这说明该规则被解析时,请添加 expterm 得到结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top