从C程序中调用两个单独的解析器

时间:2016-03-20 10:06:10

标签: c parsing bison flex-lexer

假设解析器的名称是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 ()等已多次定义,这是可以理解的。

我的问题:    是否有一些方法可以让我的程序中有两个解析器? 或者请提出你的建议。

1 个答案:

答案 0 :(得分:1)

要调用C程序中的多个解析器,有两种方法:

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

  2. 更改解析器的前缀yy。这将删除所有名称冲突。可以使用选项-Dapi.prefix={prefix}指定新前缀。

    如果您使用的是separte词法分析器,则还需要修改词法分析器的前缀。这可以通过使用--prefix=PREFIX标志来实现。

  3. 有关在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