Когда вы используете yacc, как вы говорите yyparse (), что хотите прекратить синтаксический анализ? - PullRequest
4 голосов
/ 02 марта 2011

Все еще изучал yacc и flex, и наткнулся на сценарий, который я не рассматриваю с практическими рекомендациями и учебными пособиями.Я пытаюсь проанализировать файл, и по ходу дела я делаю некоторую вторичную проверку ошибок в коде, который я поместил в мой parser.y файл.Когда я сталкиваюсь с чем-то, что является лексикографически правильным (то есть, синтаксический анализ соответствует правильно), но логически неправильным (неожиданное значение или неуместное значение), как я могу получить yyparse для выхода?Кроме того, могу ли он вернуть мне код ошибки, который я могу проверить в своем коде вызова?

/* Sample */
my_file_format:
  header body_lines footer
  ;
header:
  OBRACE INT CBRACE
  |
  OBRACE STRING CBRACE {
    if ( strcmp ( $1, "Contrived_Example" ) != 0 ) { /* I want to exit here */ }
  }
  ;
/* etc ... */

Я понимаю, что в моем примере я могу просто искать "Contrived_Example", используя правило,но моя точка зрения находится в if -блоке - могу ли я сказать yyparse, что я хочу прекратить разбор здесь?

1 Ответ

4 голосов
/ 02 марта 2011

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

Youтакже можно использовать YYACCEPT, чтобы yyparse немедленно возвращал успех.

...