7

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

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

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

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

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

4

5 回答 5

12

除了 Leffler 的回答,我想在这里提供另一种方法:

.lex您可以使用的文件%option prefix="PREFIX"中,以及在.y您可以使用的文件%define api.prefix PREFIX中,这与传递-p PREFIX给 Bison 和-P PREFIXFlex 的作用相同。

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

于 2012-11-08T15:30:56.627 回答
11

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

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

于 2009-10-28T02:09:05.793 回答
5

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

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

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

于 2012-11-09T06:03:40.047 回答
0

api.prefix 变量不再为我工作(它产生编译错误)

%define api.prefix {PREFIX}

我不得不使用以下语法

%name-prefix="PREFIX"
于 2018-03-19T10:41:21.827 回答
-1

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

于 2014-02-26T09:21:42.003 回答