多个 flex/bison 解析器

发布于 2024-08-09 17:42:10 字数 472 浏览 6 评论 0原文

在项目中处理多个 Flex/Bison 解析器的最佳方法是什么?

我编写了一个解析器,现在我需要在同一项目中使用第二个解析器。到目前为止,在 parser1.y 的第三部分中,我插入了 main(..) 方法并从那里调用了 yyparse

我想要获得的是拥有两个不同的解析器(parser1.yparser2.y),并能够从外部函数使用它们(假设 mainmain.cpp 中)。

我应该使用哪些预防措施将 yyparse 函数导出到 .y 文件之外?我应该如何处理两个解析器?

附言。我使用 g++ 进行编译,但不是 Flex 和 Bison 的 C++ 版本,我想保持这种方式(因此避免将解析器封装在对象内)。

What is the best way to handle multiple Flex/Bison parsers inside a project?

I wrote a parser and now I need a second one in the same project. So far in the third section of parser1.y I inserted the main(..) method and called yyparse from there.

What I want to obtain is having two different parsers (parser1.y and parser2.y) and be able to use them from an external function (let's assume main in main.cpp).

Which precautions should I use to export yyparse functions outside .y files and how should I handle two parsers?

PS. I'm using g++ to compile but not the C++ versions of Flex and Bison and I would like to keep it this way (so avoiding encapsulating the parser inside an object).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清醇 2024-08-16 17:42:10

除了莱弗勒的回答之外,我想在这里提供另一种方法:

.lex 文件中,您可以使用 %option prefix="PREFIX" ,并在 < code>.y 文件中,您可以使用 %define api.prefix PREFIX,其作用与将 -p PREFIX 传递给 Bison 和 - 相同Flex 的 P 前缀

请注意,在覆盖默认前缀 yy 后,您可以通过原始 yy* 和覆盖的 PREFIX* 访问内部名称,而显然对于外部名称,您必须使用 PREFIX* 来访问它们。

In addition to Leffler's answer, I'd like to provide another approach here:

In the .lex file you could use %option prefix="PREFIX", and in the .y file you could use %define api.prefix PREFIX, which does the same thing as passing -p PREFIX to Bison and -P PREFIX to Flex.

Notice after the overriding of the default prefix yy, you can access internal names via BOTH the original yy* and your overridden PREFIX*, while obviously for external names you MUST use your PREFIX* to access them.

凌乱心跳 2024-08-16 17:42:10

请注意,Bison 提供了“-p zz”选项来为符号添加前缀“zz”而不是“yy”。

类似地,Flex 提供了“-P zz”选项来为符号添加前缀“zz”而不是“yy”。它使用“-p”进行性能报告。遗憾的是,他们彼此不一致。

Note that Bison provides the '-p zz' option to prefix symbols with 'zz' instead of 'yy'.

Similarly, Flex provides the '-P zz' option to prefix symbols with 'zz' instead of 'yy'. It uses '-p' for performance reporting. 'Tis a pity they are not consistent with each other.

倾城°AllureLove 2024-08-16 17:42:10

如果您使用 Bison 3.0 或更高版本,请查看 %define api.prefix {foo_},它替换所有 yyYY 前缀与 foo_FOO_

请参阅有关多个的文档解析器

在 Bison 2.6 和 3.0 之间,曾经没有大括号:%define api.prefix foo_

If you use Bison 3.0 or better, then have a look at %define api.prefix {foo_}, which replaces all yy and YY prefixes with foo_ and FOO_.

See the Documentation about Multiple Parsers.

Between Bison 2.6 and 3.0, there used to be no braces: %define api.prefix foo_.

最美的太阳 2024-08-16 17:42:10

除了已经说明的内容之外,如果您使用“%define api.prefix {PREFIX}”,它还会重命名 yytext && yyparse 到 PREFIXtext 和 PREFIXparse。不要忘记前缀周围的 {}!
这同样适用于 lex 中的 '%option prefix="PREFIX"',您的词法分析器将被重命名为 PREFIXlex。

In addition to what was already stated, if you use a '%define api.prefix {PREFIX}' it will also rename yytext && yyparse to PREFIXtext and PREFIXparse. Don't forget the {} around the prefix !
The same applies to '%option prefix="PREFIX"' in lex, your lexer will be renamed to PREFIXlex.

高跟鞋的旋律 2024-08-16 17:42:10

api.prefix 变量不再对我有用(它产生编译错误)

%define api.prefix {PREFIX}

我必须使用以下语法

%name-prefix="PREFIX"

The api.prefix variable is not working for me anymore (it's producing a compilation error)

%define api.prefix {PREFIX}

I had to use the following syntax

%name-prefix="PREFIX"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文