我在使用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/