Avanti Indietro Indice

5. Fare un analizzatore in C++

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".


Avanti Indietro Indice