如果那么在编译器语法中的翻译

问题描述 投票:0回答:2
...
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 = )

[markerNext都是EMPTY规则

上述语法规则和实现的问题是,当表达式为as时,它无法生成正确的代码

bool a;
if(a){
  printf("hi");
}
else{
  prinf("die");
}

[期望赋值表达式必须包含relopORANDgenerate correct code。因为在这种情况下,我们对relop进行比较,所以相同的情况适用于ORAND

但是由于上面的代码中不包含任何内容,因此无法生成正确的代码。可以使用以下规则生成正确的代码,但这会导致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

c compiler-construction bison lex lr
2个回答
1
投票

为了插入规则中的动作,您需要左因子;否则,由野牛生成的解析器无法确定要减少的两个MRA中的哪个。 (即使它们大概是相同的,但野牛也不知道。)

if_prefix: "if" '(' expression ')' { $$ = $3; /* Normalize the flist */ }
if: if_prefix marker statement { ... }
  | if_prefix marker statement "else" Next statement { ... }

((您可以留下不同的因数;这只是一个建议。)


1
投票

似乎您的语法对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或阅读一些教程可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.