多个flex/bison解析器

7
什么是在项目中处理多个Flex/Bison解析器的最佳方法?
我编写了一个解析器,现在我需要在同一项目中使用第二个解析器。到目前为止,在parser1.y的第三部分中,我插入了main(..)方法并从那里调用了yyparse。
我想要实现的是拥有两个不同的解析器(parser1.y和parser2.y),并能够从外部函数(假设是main.cpp中的main)中使用它们。
我应该采取哪些预防措施来将yyparse函数导出到.y文件之外,并如何处理两个解析器?
PS. 我正在使用g++进行编译,但不是Flex和Bison的C++版本,我希望保持这种方式(因此避免将解析器封装在对象内)。
5个回答

12
除了Leffler的答案,我在这里提供另一种方法:
在.lex文件中,您可以使用%option prefix =“PREFIX”,而在.y文件中,可以使用%define api.prefix PREFIX,它与将-p PREFIX传递给Bison和-P PREFIX传递给Flex相同。
请注意,在覆盖默认前缀yy后,您可以通过原始的yy*和您重写的PREFIX*访问内部名称,但显然对于外部名称,您必须使用PREFIX*来访问它们。

1
请注意,在现代的Bison版本中,您需要执行%define api.prefix {PREFIX},否则会收到警告。 - Michael Mrozek

11
请注意,Bison提供了“-p zz”选项,用于将符号的前缀从“yy”更改为“zz”。
同样,Flex提供了“-P zz”选项,用于将符号的前缀从“yy”更改为“zz”。它使用“-p”来进行性能报告。遗憾的是它们彼此之间并不一致。

6
如果您使用Bison 3.0或更高版本,请查看%define api.prefix {foo_},它将所有的yyYY前缀替换为foo_FOO_
请参见有关多个解析器的文档
在Bison 2.6和3.0之间,没有大括号:%define api.prefix foo_

0

api.prefix 变量对我不再起作用了(它产生编译错误)

%define api.prefix {PREFIX}

我不得不使用以下语法

%name-prefix="PREFIX"

嗯...你使用的那种方式实际上是旧的方法,已经过时了。甚至手册都明确说明了这一点。 - Pryftan

0
除了已经提到的内容外,如果您使用“%define api.prefix {PREFIX}”,它还将重命名yytext和yyparse为PREFIXtext和PREFIXparse。 不要忘记前缀周围的{}! 对于lex中的“%option prefix =“PREFIX””,同样适用,您的词法分析器将被重命名为PREFIXlex。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接