2013-10-20 12 views
8

Mam plik yacc opisujący pewien język, dla którego opracowuję edytor za pomocą IMP (projekt eclipse). Używam LPG jako generatora analizatora składni, więc musiałem wyodrębnić reguły BNF z mojego pliku YACC. otrzymany plik yacc zawiera reguły i akcje. Chciałem jednak wyodrębnić tylko zasady opisu gramatyki, które mają być używane w LPG. Jednym ze sposobów na to jest ręczne wyodrębnienie reguł i ponowne sformatowanie go do składni BNF (lub może być pisanie programu, aby przekonwertować go tak, jak chcę). Zastanawiam się, czy istnieje zautomatyzowany sposób robienia tego. Czytałem na niektórych blogach, że żubry mogłyby pomóc, ale nie mogłem dokładnie znaleźć odpowiednich poleceń. czy ktokolwiek wie, jak sobie z tym poradzić?Wyodrębnij reguły gramatyki BNF z pliku yacc

Nie mogę opublikować pliku yacc, który mam, ponieważ jest poufny. ale mogę dać przykład następująco

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

co chciałem być konwertowane na to po prostu jak

argExpList ::= assignExp|assignExpList ',' assignExp 

Odpowiedz

9

Bison może pomóc, jeśli jesteś gotów zrobić trochę post-processing.

Jeśli prowadzisz żubra z opcją -v, będzie produkować plik o nazwie filename.output (gdzie filename jest basename pliku .y); ten plik zawiera kopię gramatyki i opis każdego stanu. Gramatyka nie ma akcji i ma jedną produkcję na linię. Ale musisz wykonać pewną pracę:

  1. Każda produkcja jest ponumerowana. Musisz usunąć te liczby.

  2. Jeśli występują akcje w środkowej części, będą wyświetlane jako niepasujące puste o dziwnej nazwie. Nazwy będą takie jak [email protected] lub @2. Musisz usunąć te tokeny i odpowiadające im puste puste produkcje.

  3. Puste produkcje są (przynajmniej w jednej najnowszej wersji bizona) oznaczone jako /* empty */. To może nie być twoja preferencja.

  4. Nie zmienia : do ::=

Mam ekstrakcji gramatyk z yacc/bizon plików w ten sposób, i to jest bardzo prosta; możesz dokonać wszystkich powyższych zmian za pomocą prostego skryptu sed lub awk.

+0

To było dokładnie to, o co prosiłem. Rozwiązał mój problem. – lferasu

+0

@Iferasu: ... następnie zaakceptuj odpowiedź Rici –