野牛:由于冲突,规则在解析器中无用[-Wother]

时间:2016-05-16 00:20:55

标签: c++ parsing syntax bison context-free-grammar

我有这个语法,应该用java代码生成java字节码。我知道此警告在许多问题中已经解决过,但我找不到类似于我的问题。 它特别为这两条规则显示了这个警告:

statement_list: 
    {
        $<stmt_type>$.next = $<stmt_type>0.next;
    }
     statement 
    | 
    {
        $<stmt_type>$.next = strdup(genLabel().c_str());    //generate label for statement and assign it to statement list next
    }
    statement_list 
    {
        $<stmt_type>$.next = $<stmt_type>0.next;
        fout<<$<stmt_type>1.next<<":"<<endl;    //mark statement with statement list next label
    }
    statement 
    ;

和这一个

b_expression:
expression RELA_OP expression       
    {$$ = $<bexpr_type>0;relaCast(string($2),$$.nTrue,$$.nFalse);}
|{/* addding some strings to this action */ } b_expression BOOL_OP b_expression

我需要在解析它之前用下一个语句标记每个语句,以便在代码生成中使用它。 当我从statement_list中删除语义动作时,它的错误就会消失,但我没有对b_expression做同样的尝试。

2 个答案:

答案 0 :(得分:2)

Bison只向前看1个令牌以决定应用哪个生产。 你的两个for语句都有代码块 解析器已读取任何令牌以了解哪些生产将适用。

答案 1 :(得分:1)

如果您在yacc规则中直接使用标签生成类似汇编的堆栈代码,通常会使用以下内容:

if_statement: IF condition {
                      $$ = gen_label();
                      gen_code(JUMP_FALSE, $$); }
              THEN block {
                      $$ = gen_label();
                      gen_code(JUMP, $$);
                      gen_code(LABEL, $3); }
              ELSE block {
                      gen_code(LABEL, $6); }

while_statement: WHILE { gen_code(LABEL, $$ = gen_label()); }
                 condition { gen_code(JUMP_FALSE, $$ = gen_label); }
                 block { gen_code(JUMP, $2); gen_code(LABEL, $4); }

如果您直接生成字节代码,则表示您没有标签&#39;因此 - 当你生成一个前向分支时,你会记住字节码中目标偏移应该去的位置,当你到达输出标签的位置时,你会回溯分支跳转到当前位置。