Зубр: правило бесполезно в парсере из-за конфликтов [-Wother]

У меня есть эта грамматика, которая должна генерировать 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

Решение

Зубр только смотрит вперед на 1 жетон, чтобы решить, какое производство применить.
Ваши два произведения для оператора имеют блоки кода перед
Парсер прочитал все токены, чтобы узнать, какая продукция будет применена.

2

Другие решения

Если вы генерируете подобный сборке код стека с метками непосредственно в ваших правилах 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); }

Если вы генерируете байт-код напрямую, у вас нет «меток» как таковых — когда вы генерируете прямую ветвь, вы помните место в байт-коде, куда должно идти целевое смещение и когда вы добираетесь до места, где будет выводить метку, вы создаете обратную ветку, чтобы перейти к текущему местоположению.

1

По вопросам рекламы [email protected]