从 C 程序调用两个独立的解析器
Invoking two separate parsers from a C program
假设解析器的名称是 parser_1 和 parser_2。
parser_1:
Bison file = parser_1.y
Flex file = parser_1.l
用 gcc 编译后,我在以下两个文件中得到了我的 paser:
parser_1.tab.c and parser_1.lex.yy.c
与我的 parser_2 类似:
parser_2.tab.c and 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 ()
等函数定义多次,可以理解
我的问题:
有什么方法可以让我的程序中有两个解析器吗?
或者请大家提出建议。
要从 C 程序调用使用多个解析器,有两种方法:
如果语法密切相关,请使用多个起始符号。
详情见
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html
更改解析器的前缀 yy
。这将消除所有名称冲突。可以使用选项 -Dapi.prefix={prefix}
.
指定新前缀
如果您使用的是单独的词法分析器,您还需要修改词法分析器的前缀。这可以通过使用 --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
假设解析器的名称是 parser_1 和 parser_2。
parser_1:
Bison file = parser_1.y
Flex file = parser_1.l
用 gcc 编译后,我在以下两个文件中得到了我的 paser:
parser_1.tab.c and parser_1.lex.yy.c
与我的 parser_2 类似:
parser_2.tab.c and 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 ()
等函数定义多次,可以理解
我的问题: 有什么方法可以让我的程序中有两个解析器吗? 或者请大家提出建议。
要从 C 程序调用使用多个解析器,有两种方法:
如果语法密切相关,请使用多个起始符号。 详情见
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html更改解析器的前缀
指定新前缀yy
。这将消除所有名称冲突。可以使用选项-Dapi.prefix={prefix}
.如果您使用的是单独的词法分析器,您还需要修改词法分析器的前缀。这可以通过使用
--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