语法冲突YACC / Bison

时间:2013-04-15 17:30:49

标签: parsing compiler-construction bison yacc

我有一个YACC语法用于解析C中的表达式。这些是它的一些片段:

Expr: Expr COMMA Expr 
     | Assignment


Assignment: IDENTIFIER
            | Assignment COMMA Assignment

Function Call: IDENTIFIER PARENOPEN Expr PARENOPEN

我基本上希望能够解析形式为(p,q,r)的函数调用,并检查传递的参数的数量和类型是否与函数定义中指定的相匹配,以便它们减少在标识符本身的级别Expr

最终发生的事情是p,q,r缩减为Assignment而不是Expr COMMA Expr。这是有问题的,因为我需要运行一些只能使用Expr COMMA Expr运行的语义规则。此外,无法删除规则Assignment COMMA Assignment,因为它对某些减少至关重要。有没有什么办法可以在YACC中硬编码在这种情况下需要做什么?

1 个答案:

答案 0 :(得分:1)

问题在于所写的语法含糊不清。正如您所注意到的,在解析输入p,q时,可以将其解析为Expr COMMA Expr,其中每个ExprAssignment减少(从IDENTIFIER减少),或者可以将其解析为Assignment COMMA Assignment,然后将其缩减为单个Expr

你想要哪个?如果你总是想要一个或另一个,只需删除你从未想过的那个,因为它永远不会出现。如果你有时想要一个,有时想要另一个,你需要在任何特定的情况下说你怎么知道。如果它基于上下文,那么您需要以不同方式重构语法,以便区分上下文,可能是通过使ExprAssignment完全独立。

此外,您还有左右对称的递归模糊性。当您p,q,r时,是否要将其解析为(Expr , Expr) , ExprExpr , (Expr , Expr)?你需要在什么条件下决定你想要的东西,然后适当地进行设置。