2013-10-20 5 views
8

Ich habe eine YACC-Datei beschreibt eine bestimmte Sprache, für die ich einen Editor mit IMP (Eclipse-Projekt) zu entwickeln. Ich benutze LPG als Parser-Generator, so dass ich eine BNF-Regeln extrahieren musste aus meiner Yacc-Datei. Die YACC-Datei, die ich erhalten habe, enthält Regeln und Aktionen. Ich wollte jedoch nur die Regeln der Grammatikbeschreibung extrahieren, die in LPG verwendet werden. Eine Möglichkeit besteht darin, die Regeln manuell zu extrahieren und in die BNF-Syntax umzuformatieren (oder ein Programm zu schreiben, um es so zu konvertieren, wie ich es möchte). Ich habe mich gefragt, ob es einen automatisierten Weg dafür gibt. Ich habe in einigen Blogs gelesen, dass Bison helfen könnte, aber ich konnte nicht die richtigen Befehle finden. weiß jemand, wie man mit diesem Problem umgeht.extrahieren BNF Grammatikregeln aus yacc Datei

Ich kann nicht wirklich die yacc-Datei, die ich habe, da es vertraulich ist. aber ich konnte ein Beispiel geben, wie

argExprList: 
     assignExp 
      { 
      // some rules here 
      } 
     | assignExpList ',' assignExp 
      { 
       //some other rules here 
      } 
     ; 

folgt, was ich wollte, dass es umgewandelt werden soll, einfach wie

argExpList ::= assignExp|assignExpList ',' assignExp 

Antwort

9

Bison kann helfen, wenn Sie bereit sind, etwas Nachbearbeitung zu tun.

Wenn Sie Bison mit der -v Option ausführen, wird es eine Datei namens filename.output erzeugen (wo filename ist der Basisname der .y Datei); Diese Datei enthält eine Kopie der Grammatik und eine Beschreibung jedes Zustands. Die Grammatik hat keine Aktionen und es gibt eine Produktion pro Zeile. Aber Sie müssen etwas Arbeit tun:

  1. Jede Produktion ist nummeriert. Sie müssen diese Nummern entfernen.

  2. Wenn es Mid-Rule-Aktionen gibt, werden sie als leere Nicht-Terminals mit Sondernamen angezeigt. Die Namen sind etwa [email protected] oder @2. Sie müssen diese Token und die entsprechenden leeren Produktionen löschen.

  3. Leere Produktionen sind (mindestens in einer neuen Version von Bison) als /* empty */ gezeigt. Das ist vielleicht nicht deine Vorliebe.

  4. Es ändert sich nicht : zu ::=

I Grammatiken von yacc/Bison-Dateien auf diese Weise extrahiert haben, und es ist sehr geradlinig; Sie können alle oben genannten Änderungen mit einem einfachen sed oder awk Skript vornehmen.

+0

Das war genau das, was ich gefragt habe. Es hat mein Problem gelöst. – lferasu

+0

@Iferasu: ... dann akzeptiere Ricis Antwort –