在项目中处理多个Flex / Bison解析器的最佳方法是什么?
我写了一个解析器,现在我需要在同一个项目中使用第二个解析器。到目前为止,在parser1.y
的第三部分中,我插入了main(..)
方法并从那里调用了yyparse
。
我想要获得的是拥有两个不同的解析器(parser1.y
和parser2.y
),并且能够从外部函数中使用它们(让我们假设main
中的main.cpp
)。
我应该使用哪些预防措施来导出yyparse
文件之外的.y
个函数,以及如何处理两个解析器?
PS。我正在使用g ++编译而不是Flex和Bison的C ++版本,我想保持这种方式(因此避免将解析器封装在对象中)。
答案 0 :(得分:11)
除了Leffler的回答,我还想提供另一种方法:
在.lex
文件中,您可以使用%option prefix="PREFIX"
,在.y
文件中,您可以使用%define api.prefix PREFIX
,这与传递-p PREFIX
的内容相同到Bison和-P PREFIX
到Flex。
请注意,在覆盖默认前缀yy
之后,您可以通过原始yy*
和被覆盖的PREFIX*
访问内部名称,而显然对于外部名称,您必须使用您的{ {1}}访问它们。
答案 1 :(得分:9)
请注意,Bison提供'-p zz'选项,用'zz'代替'yy'为符号添加前缀。
类似地,Flex提供'-P zz'选项以使用'zz'而不是'yy'为符号添加前缀。它使用'-p'进行性能报告。 “可惜他们彼此不一致。”
答案 2 :(得分:5)
如果您使用Bison 3.0或更高版本,请查看%define api.prefix {foo_}
,该yy
替换所有YY
和foo_
前缀FOO_
和%define api.prefix foo_
。
请参阅Documentation about Multiple Parsers。
在Bison 2.6和3.0之间,曾经没有大括号:{{1}}。
答案 3 :(得分:0)
api.prefix变量不再适用于我(它产生编译错误)
%define api.prefix {PREFIX}
我必须使用以下语法
%name-prefix="PREFIX"
答案 4 :(得分:-1)
除了已经陈述的内容之外,如果使用'%define api.prefix {PREFIX}',它还将重命名yytext&& yyparse到PREFIXtext和PREFIXparse。不要忘记前缀周围的{}
这同样适用于lex中的'%option prefix =“PREFIX”',您的词法分析器将重命名为PREFIXlex。