我有这个语法,应该用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做同样的尝试。
答案 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;因此 - 当你生成一个前向分支时,你会记住字节码中目标偏移应该去的位置,当你到达输出标签的位置时,你会回溯分支跳转到当前位置。