多个 flex/bison 解析器
在项目中处理多个 Flex/Bison 解析器的最佳方法是什么?
我编写了一个解析器,现在我需要在同一项目中使用第二个解析器。到目前为止,在 parser1.y
的第三部分中,我插入了 main(..)
方法并从那里调用了 yyparse
。
我想要获得的是拥有两个不同的解析器(parser1.y
和 parser2.y
),并能够从外部函数使用它们(假设 main
在 main.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
除了莱弗勒的回答之外,我想在这里提供另一种方法:
在
.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 originalyy*
and your overriddenPREFIX*
, while obviously for external names you MUST use yourPREFIX*
to access them.请注意,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.
如果您使用 Bison 3.0 或更高版本,请查看
%define api.prefix {foo_}
,它替换所有yy
和YY
前缀与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 allyy
andYY
prefixes withfoo_
andFOO_
.See the Documentation about Multiple Parsers.
Between Bison 2.6 and 3.0, there used to be no braces:
%define api.prefix foo_
.除了已经说明的内容之外,如果您使用“%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.
api.prefix 变量不再对我有用(它产生编译错误)
我必须使用以下语法
The api.prefix variable is not working for me anymore (it's producing a compilation error)
I had to use the following syntax