...
IF LP assignment-expression RP marker statement {
backpatch($3.tlist,$5.instr);
$$.nextList = mergeList($3.flist,$6.nextList);
}
|IF LP assignment-expression RP marker statement ELSE Next statement {
backpatch($3.tlist,$5.instr);
backpatch($3.flist,$8.instr);
YYSTYPE::BackpatchList *temp = mergeList($6.nextList,$8.nextList);
$$.nextList = mergeList(temp,$9.nextList);
}
...
Assignment-expression是使用C运算符=, +=, -=, *=, /=
可能的任何赋值表达式。
LP = (
RP = )
[marker
和Next
都是EMPTY
规则
上述语法规则和实现的问题是,当表达式为as时,它无法生成正确的代码
bool a;
if(a){
printf("hi");
}
else{
prinf("die");
}
[期望赋值表达式必须包含relop
或OR
或AND
至generate correct code
。因为在这种情况下,我们对relop
进行比较,所以相同的情况适用于OR
和AND
。
但是由于上面的代码中不包含任何内容,因此无法生成正确的代码。可以使用以下规则生成正确的代码,但这会导致two reduce-reduce conflict
。
...
IF LP assignment-expression {
if($3.flist == NULL && $3.tlist == NULL)
...
} RP marker statement {
...
}
|IF LP assignment-expression{
if($3.flist == NULL && $3.tlist == NULL)
...
} RP marker statement ELSE Next statement {
...
}
...
我应该对语法规则进行哪些修改,以便它可以按预期工作?
我尝试过IF ELSE grammar rule从这里以及从龙书里来,但是无法解决这个问题。整个语法可以在这里找到Github
为了插入规则中的动作,您需要左因子;否则,由野牛生成的解析器无法确定要减少的两个MRA中的哪个。 (即使它们大概是相同的,但野牛也不知道。)
if_prefix: "if" '(' expression ')' { $$ = $3; /* Normalize the flist */ }
if: if_prefix marker statement { ... }
| if_prefix marker statement "else" Next statement { ... }
((您可以留下不同的因数;这只是一个建议。)
似乎您的语法对expression
的定义不正确。
赋值表达式只是应该能够简化为表达式的许多非终结符之一。对于if / then / else构造,通常需要允许在括号之间出现any表达式。如您所指出的,您的第一个示例是完全有效的C,但不包含赋值。
在您的语法中,您有以下一行:
/*Expression list**/
expression:
assignment-expression{}
|expression COMMA assignment-expression{}
;
但是,一个表达式应该可以具有多个赋值表达式。对yacc / bison不太熟悉,我想您需要将其更改为以下内容:
/*Expression **/
expression:
assignment-expression{}
|logical-OR-expression{}
|logical-AND-expression{}
|inclusive-OR-expression{}
|exclusive-OR-expression{}
|inclusive-AND-expression{}
|equality-expression{}
|relational-expression{}
|additive-expression{}
|multiplicative-expression{}
|exponentiation-expression{}
|unary-expression{}
|postfix-expression{}
|primary-expression{}
|expression COMMA expression{}
;
我无法真正验证这是否对您有用,并且可能不完美,但希望您能理解。每种不同类型的表达式都需要能够简化为一个表达式。在语法的早期,您对statement
具有非常相似的内容,因此,这应该很有意义。
阅读how LR grammars work或阅读一些教程可能会有所帮助。