Next Previous Contents

## 5. Making a Parser in C++

Although Lex and YACC predate C++, it is possible to generate a C++ parser. While Flex includes an option to generate a C++ lexer, we won't be using that, as YACC doesn't know how to deal with it directly.

My preferred way to make a C++ parser is to have Lex generate a plain C file, and to let YACC generate C++ code. When you then link your application, you may run into some problems because the C++ code by default won't be able to find C functions, unless you've told it that those functions are extern "C".

To do so, make a C header in YACC like this:

> `

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

>     }

> `

If you want to declare or change yydebug, you must now do it like this:

> `

>     extern int yydebug;

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

> `

This is because C++'s One Definition Rule, which disallows multiple definitions of yydebug.

You may also find that you need to repeat the #define of YYSTYPE in your Lex file, because of C++'s stricter type checking.

To compile, do something like this:

> `

>     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

> `

Because of the -o statement, y.tab.h is now called bindconfig2.cc.h, so take that into account.

To summarize: don't bother to compile your Lexer in C++, keep it in C. Make your Parser in C++ and explain your compiler that some functions are C functions with extern "C" statements.

Next Previous Contents