2009-06-10 15 views
7

Sto provando a scrivere un motore di espressioni regolari. Mi piacerebbe scrivere un parser di discesa ricorsivo a mano. Come sarebbe una grammatica senza contesto senza ricorsione a sinistra per il linguaggio delle espressioni regolari (non le lingue che possono essere descritte dalle espressioni regolari)? Sarebbe più semplice ri-calcolare lo zucchero sintattico, cioè cambiare a+ a aa*? Grazie in anticipo!Grammatica context-free che descrive le espressioni regolari?

risposta

7

ricorsione sinistra:

Expression = Expression '|' Sequence 
      | Sequence 
      ; 

Sequence = Sequence Repetition 
     | <empty> 
     ; 

ricorsione a destra:

Expression = Sequence '|' Expression 
      | Sequence 
      ; 

Sequence = Repetition Sequence 
     | <empty> 
     ; 

forma ambigua:

Expression = Expression '|' Expression 
      | Sequence 
      ; 

Sequence = Sequence Sequence 
     | Repetition 
     | <empty> 
     ; 
+0

Proprio sull'uomo; hai risposto a tutte le mie domande questa sera. Grazie! – wkf

0

L'articolo di Wikipedia su Left Recursion fornisce informazioni piuttosto buone su come estrarlo.

+0

Non è che ho bisogno di ridimensionare una grammatica con ricorsione a sinistra, ma piuttosto che sto cercando di capire come dovrebbe essere la grammatica in generale. Mentre ho letto molto su di loro, in realtà non ho mai usato una grammatica context-free 'in the wild', per così dire. – wkf

2

Si potrebbe guardare il source code for Plan 9 grep. Il file grep.y ha una grammatica yacc (LALR (1) se ricordo correttamente) per le espressioni regolari. Potresti essere in grado di iniziare dalla grammatica yacc e riscriverlo per l'analisi della discesa ricorsiva.

Problemi correlati