Générer un compilateur à partir de la grammaire lex et yacc

J’essaie de générer un compilateur pour pouvoir lui transmettre un fichier .c après.

J’ai téléchargé les grammaires YACC et LEX à l’ adresse http://www.quut.com/c/ANSI-C-grammar-y.html et les ai nommées clexyacc.l et clexyacc.y.

Lors de la génération sur le terminal, j’ai fait:

yacc -d clexyacc.y lex clexyacc.l 

Tout s’est bien passé. Quand je passe à la dernière partie, je reçois quelques erreurs.

La dernière partie est: cc lex.yy.c y.tab.c -oclexyacc.exe

Mais je reçois ces erreurs:

 y.tab.c:2261:16: warning: implicit declaration of function 'yylex' is invalid in C99 [-Wimplicit-function-declaration] yychar = YYLEX; ^ y.tab.c:1617:16: note: expanded from macro 'YYLEX' # define YYLEX yylex () ^ y.tab.c:2379:7: warning: implicit declaration of function 'yyerror' is invalid in C99 [-Wimplicit-function-declaration] yyerror (YY_("syntax error")); ^ clexyacc.y:530:6: error: conflicting types for 'yyerror' void yyerror(const char *s) ^ y.tab.c:2379:7: note: previous implicit declaration is here yyerror (YY_("syntax error")); ^ 2 warnings and 1 error generated. 

La version de yacc que vous utilisez génère du code C non valide pour C99.

Le code qu’il génère n’inclut pas de déclarations pour les fonctions yylex ou yyerror avant de les appeler. Ceci produit les avertissements. Dans le cas de yyerror, il en résulte également une déclaration implicite qui ne correspond pas à la définition réelle ultérieure.

Vous pouvez le contourner en incluant ce qui suit en haut du fichier .y:

 %{ int yylex(); void yyerror(const char *s); %} 

Ou, vous pouvez passer à un compilateur yacc plus moderne.

Voir aussi: Les grammaires simples de yacc donnent une erreur