Проблемы выведения бизонов при генерации кода - PullRequest
1 голос
/ 17 декабря 2010

Здравствуйте, я использую bison для компилятора в учебных целях, я получил следующий код:

if :
if2
|
if1;

if2: 
SE expressao {$1 = (struct lbs *) newlblrec(); $1->for_jmp_false = reserve_loc(); $1->label = label; label+=2;} ENTAO 
comandos
SENAO  {$1->for_goto = reserve_loc(); back_patch($1->for_jmp_false, JMP_FALSE, $1->label);}
comandos
FIMSE  {back_patch($1->for_goto, GOTO, $1->label+1);}
| 
SE expressao error {yyerrok; errors++; yyerror("Entao nao encontrado no se");}
comandos
SENAO 
comandos
FIMSE ;

if1: 
SE expressao {$1 = (struct lbs *) newlblrec(); $1->for_jmp_false = reserve_loc(); $1->label = label++;} ENTAO 
comandos 
FIMSE {back_patch($1->for_jmp_false, JMP_FALSE, $1->label); gen_code(LABEL,$1->label);}
|
SE expressao  error {yyerrok; errors++; yyerror("Entao nao encontrado no se");}
comandos 
FIMSE;

Этот код генерирует правило 'if2' только тогда, когда он нашел "FIMSE"указывает, что команда является простым if) перед "SENAO" (в данном случае это команда if else) возникает ошибка, это происходит только когда я помещаю код C для генерации промежуточного кода.Мой вопрос: почему?Как я могу это исправить?

1 Ответ

1 голос
/ 18 декабря 2010

Когда синтаксический анализатор получает SE и expressao в вашей расширенной форме, он сразу же должен выбрать, какое действие выполнить (потому что вы спросили, что действие происходит в этот момент. Без аннотации он можетсначала нажмите ENTAO и commandos, а затем примите решение о сокращении.

По сути, действие внутри RHS переводится в одно, которое имеет действие в конце, с другим нетерминальным.Поэтому

 foo: bar { action1 } foobar
 foo: bar { action2 } baz

переводится в

 foo: helper1 foobar
 foo: helper2 baz
 helper1: bar { action1 }
 helper2: bar { action2 }

Как следствие, эти действия приводят к конфликту уменьшения-уменьшения в вашей грамматике.

Существует два подхода:

  1. поставить действие в конце.
  2. изменить грамматику так, чтобы действие было одинаковым в обеих альтернативах.
...