Чистый способ прекратить разбор парсера бизона - PullRequest
3 голосов
/ 29 апреля 2011

Я пишу небольшой анализатор выражений для проекта в компании, где я работаю. Парсер должен проверять, например, деление на ноль или неопределенный идентификатор, сообщать об ошибке и останавливаться. Каков наилучший способ сделать это? Предполагая, что мой собственный код не имеет утечек памяти, я могу просто сделать это:

if ($3 == 0) {
  yyerror("Division by zero");
  return 1;
}

Должен ли я сделать:

if ($3 == 0) {
  yyerror("Division by zero");
  YYERROR;
}

существует ли третья лучшая альтернатива?

Ответы [ 2 ]

4 голосов
/ 01 января 2013

Существует третий вариант: YYACCEPT

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

Это оставляет YYERROR для грамматических ошибок (например, получение строки из другого языка)

2 голосов
/ 29 апреля 2011

Если вы звоните yyerror явно, как насчет использования YYABORT?Насколько я вижу, bison, кажется, выполняет некоторые очистки при выходе.Так, YYABORT или YYERROR будет более предпочтительным, чем return 1.

...