多个flex / bison解析器
-
06-07-2019 - |
题
在项目中处理多个Flex / Bison解析器的最佳方法是什么?
我写了一个解析器,现在我需要在同一个项目中使用第二个解析器。到目前为止,在 parser1.y
的第三部分,我插入了 main(..)
方法,并从那里调用了 yyparse
。
我想要获得的是拥有两个不同的解析器( parser1.y
和 parser2.y
)并且能够从外部函数中使用它们(让我们假设< main.cpp
中的代码> main 。
我应该使用哪些预防措施在 .y
文件之外导出 yyparse
函数,以及如何处理两个解析器?
PS。我正在使用g ++编译而不是Flex和Bison的C ++版本,我想保持这种方式(因此避免将解析器封装在对象中)。
解决方案
请注意,Bison提供'-p zz'选项,用'zz'代替'yy'为符号添加前缀。
类似地,Flex提供'-P zz'选项以使用'zz'而不是'yy'为符号添加前缀。它使用'-p'进行性能报告。 “可惜他们彼此不一致。”
其他提示
除了Leffler的回答,我还想提供另一种方法:
在 .lex
文件中,您可以使用%option prefix =&quot; PREFIX&quot;
,并在 .y
文件中使用%定义api.prefix PREFIX
,它与将 -p PREFIX
传递给Bison并将 -P PREFIX
传递给Flex完全相同。
注意在覆盖默认前缀 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 {PREFIX}',它还会重命名yytext&amp;&amp; yyparse到PREFIXtext和PREFIXparse。不要忘记前缀周围的{}!
这同样适用于'%option prefix =&quot; PREFIX&quot;'在lex中,你的词法分析器将被重命名为PREFIXlex。