У меня есть эта грамматика, которая должна генерировать 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.
Зубр только смотрит вперед на 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); }
Если вы генерируете байт-код напрямую, у вас нет «меток» как таковых — когда вы генерируете прямую ветвь, вы помните место в байт-коде, куда должно идти целевое смещение и когда вы добираетесь до места, где будет выводить метку, вы создаете обратную ветку, чтобы перейти к текущему местоположению.