Чистый путь, чтобы положить конец парсинга парсер Зубр
Я пишу небольшой анализатор выражений parser для проекта в компании, где я работаю. Парсер должен проверить, например, деление на ноль или неопределенный идентификатор, сообщить об ошибке и остановиться. Как лучше всего это сделать? Предположив, что мой собственный код не имеет утечек памяти, могу ли я просто сделать это:
if ($3 == 0) {
yyerror("Division by zero");
return 1;
}
Должен ли я скорее сделать:
if ($3 == 0) {
yyerror("Division by zero");
YYERROR;
}
Есть ли третья лучшая альтернатива?2 ответа:
Если вы вызываете
yyerror
явно, как насчет использованияYYABORT
? Насколько я вижу,bison
, кажется, выполняет некоторые очистки на выходе. Итак,YYABORT
илиYYERROR
будет предпочтительнееreturn 1
.
Действительно существует третий вариант:
YYACCEPT
Если вы пытаетесь остановить синтаксический анализ, потому что входные данные были корректными и без ошибок(так как вы делаете синтаксический анализатор для обнаружения ошибок, то это не ошибка синтаксического анализа, входные данные вписываются в правила грамматики).
Это оставляет YYERROR для грамматических ошибок (например, получение строки из другого языка)