J'ai un ancien code d'analyse / compilateur d'entreprise C qui a été généré à partir d'un ancien Yacc et la source de grammaire d'origine est perdue (comme les fichiers intermédiaires) le seul résultat généré par l'analyseur ytab.c
fichier. Cet ancien morceau de code a besoin d'être réorganisé, mais je ne peux pas me permettre de le recoder à partir de zéro.
Par "ancien Yacc", je veux dire que l'analyseur utilise des tables nommées yyact
, yypact
, yypgo
, yyr1
, yyr2
, yytoks
, yyexca
, yychk
, yydef
.
Peut-il être possible de récupérer / régénérer mécaniquement les règles d'analyse par déduction des tables d'analyse afin de reconstruire le grammaire?
Exemple avec un petit échantillon d'un analyseur d'expressions que je peux traiter avec le même ancien Yacc:
yytabelem yyexca [] = {- 1, 1, 0 , -1, -2, 0, -1, 21, 261, 0, -2, 8,}; yytabelem yyact [] = {13, 9, 10, 11, 12, 23, 8, 22, 13, 9 , 10, 11, 12, 9, 10, 11, 12, 1, 2, 11, 12, 6, 7, 4, 3, 0, 16, 5, 0, 14, 15, 0, 0, 0, 17 , 18, 19, 20, 21, 0, 0 , 24}; yytabelem yypact [] = {-248, -1000, -236, -261, -236, -236, -1000, -1000, -248, -236, -236, -236, -236, - 236, -253, -1000, -263, -245, -245, -1000, -1000, -249, -1000, -248, -1000}; yytabelem yypgo [] = {0, 17, 24}; yytabelem yyr1 [] = {0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2}; yytabelem yyr2 [] = {0, 8, 12, 0, 6, 6, 6, 6, 6, 6, 4, 2, 2}; yytabelem yychk [] = {-1000, -1, 266, -2, 259, 263, 257, 258, 267, 262, 263, 264, 265, 261, -2, -2, -1, -2, -2, -2, -2, -2, 260, 268, -1}; yytabelem yydef [] = {3, -2, 0, 0, 0 0, 11, 12, 3, 0,
0, 0, 0, 0, 0, 10, 1, 4, 5, 6, 7, -2, 9, 3, 2}; yytoktype yytoks [] = {"NAME", 257, "NUMBER", 258, "LPAREN", 259, "RPAREN", 260, "EQUAL", 261, "PLUS", 262, "MINUS", 263, "TIMES", 264, "DIVIDE", 265, "IF", 266, "THEN ", 267," ELSE ", 268," LOW ", 269," UMINUS ", 270," -unknown- ", -1 / * termine la recherche * /};
I cherche à récupérer
stmt: IF exp THEN stmt | IF exp THEN stmt ELSE stmt | / * autres * /; exp: exp PLUS exp | exp MINUS exp | exp TIMES exp | exp DIVIDE exp | exp EQUAL exp | LPAREN exp RPAREN | MINUS exp | NOM | NUMBER;
L'analyseur complet de cet exemple est disponible sous forme de résumé, il affiche une table yyreds
contenant les règles sous forme de des informations de débogage qui ne sont pas dans l'analyseur que j'essaye d'inverser.
Remarque: J'ai demandé ceci anciennement sur SO, et on m'a suggéré de le demander dans RE. Une aide?
PS: je ne connais pas les balises de question RE, n'hésitez pas à corriger cela.