Вопрос

Каков наилучший способ обработки нескольких анализаторов 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top