多个flex/bison解析器

Jac*_*ack 6 yacc lex bison parser-generator

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

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

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

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

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

sta*_*ify 11

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

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

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


Jon*_*ler 9

请注意,Bison提供'-p zz'选项,用'zz'而不是'yy'为符号添加前缀.

类似地,Flex提供'-P zz'选项以使用'zz'而不是'yy'为符号添加前缀.它使用'-p'进行性能报告."可惜他们彼此不一致.


aki*_*kim 5

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

请参阅有关多个分析程序文档.

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