YACC, когда выражение && выражение ошибка!не могу прочитать первое выражение первым - PullRequest
0 голосов
/ 28 мая 2019

Я пишу парсер и проверяю сообщение об ошибке.
Но когда я иду в петле, как
while (index <= n && index> 0) делать ...
мой синтаксис в порядке.
но процесс для запуска кода этой строки, по моим следам,
он сначала отслеживает выражение: index> 0, затем отслеживает выражение && expression,
последнее будет первым выражением (index <= n). но почему? <br/> Не правильно ли сначала проверить индекс <= n, а затем индекс> 0, последним будет выражение && выражение?

Только в одном условии все будет хорошо.
например, как: while (index <= n) do <br /> Но если это комбинированные условия, все идет не так.

это мой частичный код

    expr: expr LE expr
          {<br/>
           Trace("expression <= expression");
           if ($1->type != $3->type) yyerror("type not match"); 
           if ($1->type != intType && $1->type != realType) yyerror("operator error"); 
           idInfo *info = new idInfo();
           info->attribute = 2; //variable type
           info->type = boolType;
           $$ = info;
          }<br/>
         |expr AND expr
         {
          Trace("expression && expression");
          if ($1->type != $3->type) yyerror("type not match"); 
          if ($1->type != boolType) yyerror("operator error"); 
          idInfo *info = new idInfo();
          info->attribute = 2; //variable type
          info->type = boolType;
          $$ = info;
         }
        |expr GG expr
        {<br/>
         Trace("expression > expression");
         if ($1->type != $3->type) yyerror("type not match"); 
         if ($1->type != intType && $1->type != realType) yyerror("operator error"); 
         idInfo *info = new idInfo();
         info->attribute = 2; //variable type
         info->type = boolType;
         $$ = info;
        }

Это результат по моему следу ....
в то время как
'('
ID: индекс
<= <Бр /> ID: п
&&
ID: индекс
'>'
INTEGER: 0
')'

Строка: 16 выражений> выражение
Строка: 16 выражений && выражение
Линия: 16 тип не соответствует
Строка: 16 ошибка оператора
Строка: 16 выражений <= выражение <br /> Линия: 16 тип не совпадает

1 Ответ

0 голосов
/ 28 мая 2019

Ваши объявления приоритетов неверны или отсутствуют.

На самом деле их не видно, трудно предоставить дополнительную информацию, но похоже, что все ваши операторы имеют одинаковый приоритет и правоассоциативность.

Если вы получили предупреждение о разборе конфликтов, было бы полезно, если бы вы упомянули этот факт (и даже лучше, если бы вы решили проблему).

Почти всегда лучшеиспользовать встроенную трассировку Bison, чем пытаться сделать это самостоятельно.Функция Bison является более полной, более точной и намного менее трудоемкой.См. Раздел Отладка вашего анализатора в руководстве Bison.

...