2016-05-16 8 views
0

У меня есть эта грамматика, которая должна генерировать java-байтовый код из Java-кода. Я знаю, что это предупреждение было рассмотрено ранее во многих вопросах, но я не мог найти проблему, похожую на мою. выводит из этого предупреждения для этих двух правил, в частности:Bison: правило бесполезно в парсере из-за конфликтов [-Wother]

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

Если вы не выполняете действия, ваше правило 'b_expression':' b_expression:/* empty */| выражение RELA_OP выражение | b_expression'. Пустое производство почти наверняка ошибочно, и последнее производство, очевидно, бесполезно, поскольку оно является чистой рекурсией. Проблема с вашей постановкой 'statement_list', безусловно, рассматривается в руководстве bison и, вероятно, в некотором дублирующем вопросе о SO. – rici

+0

Например [эти вопросы] (http://stackoverflow.com/search?q= [yacc] + или + [bison] + mid-rule + action + conflict) и [эта глава руководства] (https: // www. gnu.org/software/bison/manual/bison.html#Mid_002dRule-Conflicts) – rici

+0

первое спасибо за руководство, я, должно быть, передал эту часть. для b_expression произошло что-то неправильное при копировании вопроса, теперь у него есть правильная грамматика. – mohRamadan

ответ

1

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

+0

Так что же такое решение, если мне нужно передать некоторые атрибуты 'statement'? – mohRamadan

+0

Вы не можете передавать атрибуты таким образом, потому что это вызывает конфликты. Вам нужно сделать это по-другому. Что вы на самом деле пытаетесь сделать? Зачем вам эти атрибуты? Почему вы не можете сгенерировать их в правиле '' '' '' 'после разбора начала инструкции? –

+0

первое спасибо за помощь, комментарии помогли. оператор должен иметь следующую метку, которая будет использоваться, если оператор переходит к условному выражению (если, while), так что каждое утверждение будет знать, какой ярлык получил следующий. предположим, что мы имеем, а если {statement} else {statement}, первое утверждение должно знать, куда прыгать после завершения. – mohRamadan

0

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

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

+0

это нечто похожее на то, что я делаю, но я генерирую Java Bytecode, поэтому прыжки должны быть в самом условии. – mohRamadan

+0

также вы не можете использовать $$ в действиях средних правил. – mohRamadan

+0

Нет проблем с использованием '$$' в действиях среднего правила, хотя если вы используете '% union' и тип отличается или вы используете bison, вам понадобится явный тип. –

 Смежные вопросы

  • Нет связанных вопросов^_^