2009-10-28 60 views
5

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

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

我想获得是一种有两个不同的解析器(parser1.yparser2.y),并能够从外部函数中使用它们什么(假设在main.cppmain)。

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

PS。我使用g ++编译而不是C++版本的Flex和Bison,我想这样保持它(所以避免在对象中封装解析器)。

回答

7

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

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

+0

当我这样做时,我的词法分析器和解析器有很多对YYTYPE和YYSTYPE等的引用,编译失败。为什么没有被转换?我究竟做错了什么??我不想要一个可重入的解析器,我只想要一个调用两个解析器之一的解析器,然后程序退出。 – TimeHorse 2017-01-07 01:26:18

+0

@TimeHorse:考虑到回答这个问题和你的评论/问题之间的时间差异,我想你应该问一个新问题,用两个小词法/文法例子来解释你遇到的问题(一个MCVE - [MCVE ])并显示您正在使用的构建过程以及您收到的错误消息。如果你没有机会提供这些信息,你会得到一个新的问题,我无法给出答案。尽一切办法回来,在这里留下评论,让我看看你的新问题;考虑在你的这个问题中加入一个链接。 – 2017-01-07 01:49:22

10

除了莱弗勒的答案,我想在这里提供另一种方法:

.lex文件,你可以使用%option prefix="PREFIX",并在.y文件,你可以使用%define api.prefix PREFIX,它做同样的事情为合格到Bison的-p PREFIX和到Flex的-P PREFIX。默认前缀yy的首要后

通知,您可以通过对原始yy*并访问内部名称的覆盖PREFIX*,而显然对于外部名称,你必须使用你的PREFIX*访问它们。

+0

请注意,在现代野牛版本中,您需要执行'%define api.prefix {PREFIX}',否则您会收到警告 – 2015-06-08 01:43:34

5

如果使用野牛3.0或更好,然后看看%define api.prefix {foo_},它取代所有yyYY前缀与foo_FOO_

查看Documentation about Multiple Parsers

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

-1

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