在项目中处理多个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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top