0

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

Expr: Expr COMMA Expr 
     | Assignment


Assignment: IDENTIFIER
            | Assignment COMMA Assignment

Function Call: IDENTIFIER PARENOPEN Expr PARENOPEN

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

最终发生的事情是p,q,r减少到Assignment而不是Expr COMMA Expr. 这是有问题的,因为我需要运行一些只能使用Expr COMMA Expr. 同样不可能删除该规则Assignment COMMA Assignment,因为它对于某些减少至关重要。有什么方法可以将在这种情况下需要做的事情硬编码到 YACC 中吗?

4

1 回答 1

1

问题是所写的语法是模棱两可的。正如您所注意到的,在解析输入p,q时,可以将其解析为Expr COMMA Expr每个Expr归约的位置Assignment(归约自IDENTIFIER),或者可以将其解析为Assignment COMMA Assignment然后归约为单个Expr.

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

此外,您还有左右递归歧义。当你有p,q,r你想要它解析为(Expr , Expr) , Expror Expr , (Expr , Expr)?同样,您需要决定在什么条件下想要哪个,并进行适当的设置。

于 2013-04-15T20:53:59.757 回答