Question:
Analyse LALR: récupérer les règles de grammaire à partir des tables d'analyse générées
Seki
2013-12-10 23:35:29 UTC
view on stackexchange narkive permalink

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.

S'il vous plaît voir la modification :)
Un répondre:
Igor Skochinsky
2013-12-11 04:46:19 UTC
view on stackexchange narkive permalink

Je n'ai pas de réponse réelle. J'ai entendu des rumeurs sur un outil faisant cela, mais je n'ai rien vu de concret. J'ai cependant trouvé une page qui devrait être très utile:

Comprendre les parseurs C générés par GNU Bison

Ce document est une tentative pour décrire l'implémentation d'un LALR (1) analyseur en C tel que généré par Bison 2.3. J'ai utilisé une grammaire simple pour démontrer le fonctionnement de l'analyseur et la nature des tables d'analyse. Vous trouverez également une comparaison de ces tableaux avec le schéma tabulaire non compressé donné dans le livre populaire "Compilers - Principles, Techniques and Tools" par Aho, Sethi et Ullman, également appelé le "Dragon Book" et de nombreux autres livres sur la conception de compilateurs .

Voir ici.

EDIT : trouvé un script qui prétend le faire!

http://nah6.com/~itsme/cvs-xdadevtools/perlutils/yydecode.pl

Cependant, il semble qu'il soit destiné à être utilisé avec un autre ensemble de tables. Néanmoins, cela pourrait être utile pour commencer.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...