假设解析器的名称是parser_1和parser_2。
parser_1:
Bison file = parser_1.y
Flex file = parser_1.l
使用gcc编译后,我在以下两个文件中获取了我的paser:
parser_1.tab.c和parser_1.lex.yy.c
与我的解析器_2相似:
parser_2.tab.c和parser_2.lex.yy.c
我正在尝试将两个解析器一起编译,因为我的程序需要两个解析器。 我无法用一个解析器替换两个解析器,因为以下两个原因。语法是完全不同的,解析器将在我的程序的完全不同的统计数据中调用。
gcc parser_1.tab.c parser_1.lex.yy.c \
parser_2.tab.c parser_2.lex.yy.c \
my_program.c -lfl
我错误地认为某些函数如yylex ()
,yyparse ()
等已多次定义,这是可以理解的。
我的问题: 是否有一些方法可以让我的程序中有两个解析器? 或者请提出你的建议。
答案 0 :(得分:1)
要调用C程序中的多个解析器,有两种方法:
如果语法密切相关,请使用多个开始符号。
有关详情,请参阅
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html
更改解析器的前缀yy
。这将删除所有名称冲突。可以使用选项-Dapi.prefix={prefix}
指定新前缀。
如果您使用的是separte词法分析器,则还需要修改词法分析器的前缀。这可以通过使用--prefix=PREFIX
标志来实现。
有关在Bison中重命名的详细信息,请参阅:http://www.gnu.org/software/bison/manual/html_node/Multiple-Parsers.html
有关在Flex中重命名的详细信息,请参阅:http://westes.github.io/flex/manual/#Code_002dLevel-And-API-Options
在flex中,您需要指定%option noyywrap
作为.l
文件的第一行。有关详细信息,请参阅:http://westes.github.io/flex/manual/Generated-Scanner.html#index-yywrap_0028_0029