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.