2009-10-28 3 views
5

Каков наилучший способ обработки нескольких парсеров Flex/Bison внутри проекта?Множественные анализаторы гибких/бизонов

Я написал парсер, и теперь мне нужен второй в том же проекте. До сих пор в третьем разделе parser1.y я ввел метод main(..) и назвал его yyparse.

То, что я хочу, чтобы получить это имеет два различных парсеров (parser1.y и parser2.y) и быть в состоянии использовать их из внешней функции (давайте предположим main в main.cpp).

Какие меры предосторожности следует использовать для экспорта yyparse функций за пределами .y файлов и как я должен обрабатывать два парсера?

PS. Я использую g ++ для компиляции, но не для C++-версий Flex и Bison, и я хотел бы сохранить их таким образом (чтобы избежать инкапсуляции парсера внутри объекта).

ответ

7

Обратите внимание, что Bison предоставляет опцию '-p zz' для префикса символов 'zz' вместо 'yy'.

Аналогично, Flex предоставляет опцию '-p zz' для префикса символов 'zz' вместо 'yy'. Он использует «-p» для отчетов о производительности. Жаль, что они не согласуются друг с другом.

+0

Когда я это делаю, у моего lexer и parser есть много ссылок на YYTYPE и YYSTYPE и т. Д., И компиляция терпит неудачу. Почему они не обращаются? Что я делаю не так?? Я не хочу реентерабельный синтаксический анализатор, я просто хочу, чтобы одноразовый парсер вызывал один из двух парсеров, затем программа выходила. – TimeHorse

+0

@TimeHorse: Учитывая количество времени между ответом на этот вопрос и вашим комментарием/вопросом, я думаю, вы должны задать новый вопрос, иллюстрирующий проблему, с которой вы столкнулись с двумя примерами лексики/грамматики (MCVE - [MCVE ]) и показывая процесс сборки, который вы используете, и сообщения об ошибках, которые вы получаете. Если вы не воспользуетесь возможностью предоставить эту информацию, которую вы получите с новым вопросом, я не могу дать ответ. Во что бы то ни стало вернитесь и оставите комментарий здесь, прося меня посмотреть на ваш новый вопрос; подумайте о включении ссылки на этот вопрос и в ваш. –

10

В дополнение к ответу Леффлера, я хотел бы предоставить другой подход здесь:

В файле .lex можно использовать %option prefix="PREFIX", и в файле .y вы можете использовать %define api.prefix PREFIX, который делает то же самое, как мимоходом -p PREFIX Бизону и -P PREFIX в Flex.

Уведомления после переопределения префикса по умолчанию yy, вы можете получить доступ к внутренним именам через ОБА оригинального yy* и изменённые PREFIX*, в то время как очевидно, для внешних имен вы должны использовать ваши PREFIX* доступ к ним.

+0

Обратите внимание, что в современных версиях bison вам нужно выполнить '% define api.prefix {PREFIX}' или вы получите предупреждение –

5

Если вы используете Bison 3.0 или лучше, то есть смотреть на %define api.prefix {foo_}, который заменяет все yy и YY префиксы с foo_ и FOO_.

См. Documentation about Multiple Parsers.

Между Bison 2.6 и 3.0 раньше не было брекетов: %define api.prefix foo_.

-1

В дополнение к тому, что уже было сказано, если вы используете «% определяют api.prefix {PREFIX}» будет также переименовать yytext & & yyparse в PREFIXtext и PREFIXparse. Не забывайте {} вокруг префикса!
То же самое относится к префиксу «% option prefix =« PREFIX »в lex, ваш лексер будет переименован в PREFIXlex.

 Смежные вопросы

  • Нет связанных вопросов^_^