Verder Terug Inhoud

5. Een Parser in C++ maken

Hoewel Lex en YACC ouder zijn dan C++, is het mogelijk een C++ parser te maken. Flex heeft een optie om een C++ lexer te genereren, maar die zullen we niet gebruiken, want YACC kan er direct mee omgaan.

Ik geef er de voorkeur aan Lex een gewoon C bestand te laten genereren, en YACC C++ code te laten genereren. Als je dan je toepassing linkt, kom je misschien problemen tegen omdat de C++ code standaard geen C functies kan vinden, tenzij je het verteld hebt dat de functies extern "C" zijn.

Maak hiervoor een C header in YACC:

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

}

Als je yydebug wilt declareren of veranderen, moet dat nu zo:

extern int yydebug;

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

Dit is vanwege de Een Definitie Regel van C++, die geen meervoudige definities van yydebug toestaat.

Je zult misschien ook de #define van YYSTYPE in je Lex bestand moeten herhalen, vanwege C++ z'n strengere type checking.

Compileren gaat ongeveer zo:

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 

Vanwege het -o statement heet y.tab.h nu bindconfig2.cc.h, dus hou daar rekening mee.

Samengevat: doe geen moeite om een Lexer in C++ te compileren, hou het in C. Maak je parser in C++ en leg je compiler uit dat sommige functies C functies zijn met extern "C" statements.


Verder Terug Inhoud