Чистый путь, чтобы положить конец парсинга парсер Зубр


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

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

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

if ($3 == 0) {
  yyerror("Division by zero");
  YYERROR;
}
Есть ли третья лучшая альтернатива?
2 3

2 ответа:

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

Действительно существует третий вариант: YYACCEPT

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

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