繁体   English   中英

语法冲突YACC / Bison

[英]Conflict in grammar YACC/Bison

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

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中?

问题在于所写的语法是模棱两可的。 如您Expr COMMA Expr ,当解析输入p,q ,可以将其解析为Expr COMMA Expr ,其中每个ExprAssignment减少(从IDENTIFIER减少),也可以解析为Assignment COMMA Assignment ,然后减少到单个Expr

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

此外,您还有左与右递归歧义。 当您拥有p,q,r ,是否要将其解析为(Expr , Expr) , ExprExpr , (Expr , Expr) 同样,您需要确定在什么条件下需要哪个并进行适当设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM