下一页 上一页 目录

5. 用 C++ 创建解析器

尽管 Lex 和 YACC 比 C++ 早出现,但仍然可以生成 C++ 解析器。虽然 Flex 包含生成 C++ 词法分析器的选项,但我们不会使用它,因为 YACC 无法直接处理它。

我首选的创建 C++ 解析器的方法是让 Lex 生成纯 C 文件,并让 YACC 生成 C++ 代码。当您随后链接应用程序时,您可能会遇到一些问题,因为 C++ 代码默认情况下无法找到 C 函数,除非您告诉它这些函数是 extern "C"。

要做到这一点,像这样在 YACC 中创建一个 C 头文件

extern "C"
{
        int yyparse(void);
        int yylex(void);  
        int yywrap()
        {
                return 1;
        }

}

如果您想声明或更改 yydebug,现在必须这样做

extern int yydebug;

main()
{
        yydebug=1;
        yyparse();
}

这是因为 C++ 的单一定义规则,它不允许 yydebug 的多个定义。

您可能还会发现,由于 C++ 更严格的类型检查,您需要在 Lex 文件中重复 #define YYSTYPE。

要编译,请执行类似操作

lex bindconfig2.l
yacc --verbose --debug -d bindconfig2.y -o bindconfig2.cc
cc -c lex.yy.c -o lex.yy.o
c++ lex.yy.o bindconfig2.cc -o bindconfig2 

由于 -o 语句,y.tab.h 现在被命名为 bindconfig2.cc.h,因此请考虑到这一点。

总结一下:不要费心用 C++ 编译您的 Lexer,请将其保留在 C 中。用 C++ 创建您的 Parser,并向您的编译器解释一些函数是带有 extern "C" 语句的 C 函数。


下一页 上一页 目录