我在使用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)中,“{...}”表示重复零次或多次,“{...}-”表示重复一次或多次(以及为什么是“-”而不是a “+”是神秘的)。 IETF使用RFC-5234,其BNF的方言根本不使用“{}”。

但是,在Yacc语法中,花括号将匹配规则时要执行的动作(用术语减少)括起来。因此,“{$$ = $1;}”操作的意思是“将与'term'匹配的值分配给减少'exp::= term'的结果(使用BNF的另一种形式)。

关于parsing - 编写BNF时{和}之间是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4037911/

10-09 05:18