我有一个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中硬编码在这种情况下需要做什么?
答案 0 :(得分:1)
问题在于所写的语法含糊不清。正如您所注意到的,在解析输入p,q
时,可以将其解析为Expr COMMA Expr
,其中每个Expr
从Assignment
减少(从IDENTIFIER
减少),或者可以将其解析为Assignment COMMA Assignment
,然后将其缩减为单个Expr
。
Expr
和Assignment
完全独立。
此外,您还有左右对称的递归模糊性。当您p,q,r
时,是否要将其解析为(Expr , Expr) , Expr
或Expr , (Expr , Expr)
?你需要在什么条件下决定你想要的东西,然后适当地进行设置。