从 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 程序调用使用多个解析器,有两种方法:

  1. 如果语法密切相关,请使用多个起始符号。 详情见
    http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html

  2. 更改解析器的前缀 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