2013-10-20 15 views
8

Ho un file yacc che descrive un determinato linguaggio per il quale sto sviluppando un editor utilizzando IMP (progetto eclipse). Sto usando il GPL come generatore di parser, quindi ho bisogno di estrarre una regola BNF dal mio file yacc. il file yacc che ho ricevuto contiene regole e azioni. Tuttavia, volevo estrarre solo le regole della descrizione della grammatica da utilizzare in GPL. un modo per farlo è estrarre manualmente le regole e riformattarle nella sintassi BNF (o scrivere un programma per convertirlo nel modo in cui lo voglio). Mi stavo chiedendo se esiste un modo automatico per farlo. Ho letto in alcuni blog che il bisonte potrebbe aiutare ma non sono riuscito a trovare esattamente i comandi appropriati. qualcuno sa come affrontare questo problema.estratto regole grammaticali BNF dal file yacc

Non riesco a pubblicare il file yacc in quanto è riservato. ma ho potuto fare un esempio come segue

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

quello che volevo da convertire in è semplicemente come

argExpList ::= assignExp|assignExpList ',' assignExp 

risposta

9

Bison può aiutare, se siete disposti a fare un po 'di post-elaborazione.

Se si esegue bisonte con l'opzione -v, produrrà un file chiamato filename.output (dove filename è il nome base del file .y); quel file contiene una copia della grammatica e una descrizione di ogni stato. La grammatica non ha azioni e ha una produzione per riga. Ma dovrai fare un po 'di lavoro:

  1. Ogni produzione è numerata. Dovrai rimuovere quei numeri.

  2. Se ci sono azioni di media regola, si visualizzeranno come non-terminali vuoti con nome strano. I nomi saranno qualcosa come [email protected] o @2. Dovrai eliminare questi token e le relative produzioni vuote corrispondenti.

  3. Le produzioni vuote sono (almeno in una versione recente di bisonte) mostrate come /* empty */. Potrebbe non essere la tua preferenza.

  4. Non cambia : a ::=

Ho estratto grammatiche da file yacc/bisonti in questo modo, ed è molto straight-forward; è possibile apportare tutte le modifiche di cui sopra con uno script semplice sed o awk.

+0

Era esattamente quello che stavo chiedendo. Ha risolto il mio problema. – lferasu

+0

@Iferasu: ... quindi accetta la risposta di Rici –