Несколько анализаторов flex/bison
-
06-07-2019 - |
Вопрос
Каков наилучший способ обработки нескольких анализаторов Flex / Bison внутри проекта?
Я написал синтаксический анализатор, и теперь мне нужен второй в том же проекте.До сих пор в третьем разделе parser1.y
Я вставил main(..)
метод и вызванный yyparse
оттуда.
То, что я хочу получить, - это наличие двух разных анализаторов (parser1.y
и parser2.y
) и иметь возможность использовать их из внешней функции (давайте предположим main
в main.cpp
).
Какие меры предосторожности я должен использовать для экспорта yyparse
функции снаружи .y
файлы и как я должен обрабатывать два анализатора?
PS.Я использую g ++ для компиляции, но не C ++-версии Flex и Bison, и я хотел бы сохранить это таким образом (чтобы избежать инкапсуляции анализатора внутри объекта).
Решение
Обратите внимание, что Bison предоставляет опцию '-p zz' для префикса символов с 'zz' вместо 'yy'.
Аналогично, Flex предоставляет опцию '-P zz' для префикса символов с 'zz' вместо 'yy'.Он использует '-p' для отчетов о производительности.Жаль, что они не согласуются друг с другом.
Другие советы
В дополнение к ответу Леффлера, я хотел бы предложить здесь другой подход:
В .lex
файл, который вы могли бы использовать %option prefix="PREFIX"
, и в .y
файл, который вы могли бы использовать %define api.prefix PREFIX
, который делает то же самое , что и передача -p PREFIX
к Бизону и -P PREFIX
сгибаться.
Обратите внимание после переопределения префикса по умолчанию yy
, вы можете получить доступ к внутренним именам как через исходные yy*
и ваш отвергнутый PREFIX*
, в то время как очевидно , что для внешних имен вы ДОЛЖНЫ использовать свой PREFIX*
чтобы получить к ним доступ.
Если вы используете Bison 3.0 или выше, то взгляните на %define api.prefix {foo_}
, который заменяет все yy
и YY
префиксы с foo_
и FOO_
.
Смотрите на Документация о нескольких анализаторах.
Между Bison 2.6 и 3.0 раньше не было брекетов: %define api.prefix foo_
.
Переменная api.prefix у меня больше не работает (она выдает ошибку компиляции)
%define api.prefix {PREFIX}
Мне пришлось использовать следующий синтаксис
%name-prefix="PREFIX"
В дополнение к тому, что уже было указано, если вы используете '%define api.prefix {ПРЕФИКС}', он также переименует yytext && yyparse в PREFIXtext и PREFIXparse .Не забудьте {} вокруг префикса !
То же самое относится к '%option prefix="ПРЕФИКС"' в lex, ваш лексер будет переименован в PREFIXlex.