多个flex / bison解析器

时间:2009-10-28 01:31:05

标签: yacc bison lex parser-generator

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

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

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

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

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

5 个答案:

答案 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替换所有YYfoo_前缀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。