Per quanto Lex e YACC preceda il C++, è possibile generare un analizzatore sintattico C++. Anche se Flex include un'opzione per generare un Analizzatore lessicale in C++, non verrà usata qua, visto che YACC non sa come gestirla direttamente.
Il modo che preferisco per fare un analizzatore sintattico per C++ è di fare generare a Lex un file in C, e lasciare a YACC la generazione del codice C++. Quando poi si effettua il link dell'applicazione, si potrebbero incontrare dei problemi perché, senza indicazioni, il codice C++ non è in grado di trovare le funzioni C, a meno che non gli si dica che quelle funzioni sono extern "C".
Per fare ciò, si fa una testata C in YACC come questa:
extern "C"
{
int yyparse(void);
int yylex(void);
int yywrap()
{
return 1;
}
}
Se si volesse dichiarare o cambiare yydebug, si deve fare ora in questo modo:
extern int yydebug;
main()
{
yydebug=1;
yyparse();
}
Questo a causa della regola del C++ che esige un'unica definizione, ciò che impedisce definizioni multiple di yydebug.
Può anche capitare che sia necessario ripetere la #define di YYSTYPE nel file per Lex, a causa di una maggiore rigidità nel controllo del tipo in C++.
Per compilare, fare qualcosa di simile a quel che segue:
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
A causa dell'asserzione -o y.tab.h è ora chiamato bindconfig2.cc.h, quindi tenetene conto.
Per riassumere: non prendetevi la briga di compilare l'analizzatore sintattico (Lexer) in C++, lasciatelo in C. Scrivete il vostro analizzatore (Parser) in C++ e spiegate al vostro compilatore che alcune funzioni sono funzioni C con dichiarazioni extern "C".