Parsing 写BNF时,{和}之间是什么?

Parsing 写BNF时,{和}之间是什么?,parsing,yacc,bnf,parser-generator,happy,Parsing,Yacc,Bnf,Parser Generator,Happy,我和BNF有点问题。我不知道做事情的标准方式是什么(如果有的话),也不知道是否有像char或int之类的类型或者任何已经内置的类型 然而,我的主要问题是不理解花括号中的BNF部分是如何工作的。 假设: exp : term {$$ = $1;} | exp '+' term {$$ = $1 + $3;} | exp '-' term {$$ = $1 - $

我和BNF有点问题。我不知道做事情的标准方式是什么(如果有的话),也不知道是否有像char或int之类的类型或者任何已经内置的类型

然而,我的主要问题是不理解花括号中的BNF部分是如何工作的。
假设:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  
(这是从某处偷来的,是给yacc/C的)


花括号里的东西到底在说什么?对于happy parser generator,我也看到了类似的事情,但同样感到困惑。

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


例如,规则
exp'+'项{$$=$1+$3;}
$1
指的是
exp
$3
指的是
,因此在解析此规则时,添加
exp
,以获得结果。

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


但是,在Yacc语法中,大括号包含了匹配规则时要执行的操作(用行话来说是简化的)。因此,“
{$$=$1;}
”操作意味着将“term”匹配的值分配给减少“exp::=term”(使用BNF的另一个变量)的结果。

Oh,这实际上不是BNF。@drachenstern:虽然这个问题主要是因为我在看BNF,因为我必须为Happy编写一些东西,以便为编译器任务创建玩具语言的解析器,但它本身并不是一个家庭作业问题。当我在谷歌上搜索的时候,我不明白我在看什么,所以我问。所以这不是家庭作业,而是和我的学位相关的工作。即使这样,我也不是在请别人为我工作,我只是在寻求一个解释。~那很酷。我只知道人们在这里通过作业是很常见的,BNF问题+67的代表会让你成为这样做的好候选人。但是是的,这有点不公平。因此,我只是把它作为一个问题扔掉了。谢谢你的澄清。~~除此之外,在你真正需要在学校处理研究之前,先做研究是值得称赞的<代码>;)