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
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>
;
L'articolo di Wikipedia su Left Recursion fornisce informazioni piuttosto buone su come estrarlo.
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
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.
- 1. Commentando le espressioni regolari
- 2. Comprendere le espressioni regolari
- 3. Chi definisce le espressioni regolari?
- 4. Le espressioni regolari di Ruby 1.9 sono ugualmente potenti per una grammatica senza contesto?
- 5. In che modo JavaScript rileva le espressioni regolari?
- 6. espressioni regolari che mancano alcune lettere
- 7. Espressioni regolari in C# che funzionano lentamente
- 8. Negazione delle stringhe utilizzando le espressioni regolari
- 9. Come utilizzare le espressioni regolari in Jinja2?
- 10. Raccontando le eccezioni di espressioni regolari di espressioni in JavaScript
- 11. Quando non dovrei usare le espressioni regolari?
- 12. partita date utilizzando le espressioni regolari pitone
- 13. Tutte le espressioni regolari si fermano?
- 14. Enumera le espressioni regolari tramite UglifyJS
- 15. Le espressioni regolari in C preprocessore macro
- 16. Utilizzare scanf con le espressioni regolari
- 17. Unire le espressioni regolari in julia
- 18. Ambito di grep con le espressioni regolari
- 19. In espressioni regolari, che cosa significa \ w *?
- 20. espressioni regolari che non contiene certa stringa
- 21. Utilizzare le espressioni regolari in R strsplit
- 22. espressioni regolari - uguale per tutte le lingue?
- 23. Come si capiscono le espressioni regolari scritte in una riga?
- 24. Limitazioni delle espressioni regolari?
- 25. Espressioni regolari Python O
- 26. Espressioni regolari e assemblaggio
- 27. case-insensitive espressioni regolari
- 28. espressioni regolari Fuzzy
- 29. Espressioni regolari sulla punteggiatura
- 30. Raschia schermo: espressioni regolari o espressioni XQuery?
Proprio sull'uomo; hai risposto a tutte le mie domande questa sera. Grazie! – wkf