Analisi lessicale senza espressioni regolari

9

Ho visto alcuni lassisti in vari linguaggi di livello superiore ( Python , PHP , Javascript tra gli altri) e sembrano utilizzare espressioni regolari in una forma o nell'altra. Mentre sono sicuro che le regex sono probabilmente il modo migliore per farlo, mi chiedevo se esistesse un modo per ottenere il lexing di base senza espressioni regolari, magari una sorta di analisi delle stringhe diretta o qualcosa del genere.

Quindi sì, è possibile implementare una sorta di lexing di base in un linguaggio di livello superiore * senza usare espressioni regolari in nessuna forma?

* I linguaggi di livello superiore sono cose come Perl / PHP / Python / Javascript ecc. Sono sicuro che c'è un modo per farlo in C

    
posta Smudge 10.02.2012 - 14:26
fonte

5 risposte

3

Prima di tutto, ci sono state librerie di espressioni regolari per C da prima che venissero inventate le lingue "di livello superiore". Detto solo, i programmi C non sono così snodati come pensano alcune persone.

Per la maggior parte delle grammatiche, il lexing è una questione di ricerca di spazi bianchi e di pochi altri caratteri come () [] {}; per dividere le parole e quindi confrontarle con un elenco di parole chiave per verificare se corrispondono.

    
risposta data 10.02.2012 - 15:14
fonte
2

Potresti essere interessato ai "parser senza scanner", che non hanno una fase di tokenizzazione separata. Una spiegazione dei vantaggi dei parser senza scanner è fornita all'inizio di questo documento: Filtri disambiguazione per Analizzatori LR generalizzati senza scanner . (Ci sono anche degli svantaggi.)

(I PEG, che sono stati menzionati in altre risposte, possono anche essere usati per costruire parser senza scanner.)

    
risposta data 11.02.2012 - 04:46
fonte
1

Non c'è nulla di specifico sulle espressioni regolari. Sono semplicemente una scorciatoia che ti permette di generare il codice molto più facilmente e le implementazioni sono comunemente spedite. Tuttavia, fondamentalmente, i lexer sono FSM e le espressioni regolari sono solo un modo per raggiungere questo obiettivo.

    
risposta data 10.02.2012 - 20:12
fonte
0

Ovviamente puoi usare altri parser, dato che ogni lingua normale è anche libera dal contesto. La domanda riguarda davvero il perché vorresti.

Non c'è nulla di più semplice delle espressioni regolari (come puoi migliorare O (N)?) e cercare di semplificare non aiuta. Puoi sempre usare il backtracking semplice come ha fatto notare Jetti, anche se ti consiglio di evitarlo se possibile.

Se hai intenzione di utilizzare un parser più avanzato per il lexing, probabilmente non avrai affatto bisogno di una fase di lexing. In effetti, i motivi per cui abbiamo una fase di lexing è che è più veloce analizzare i token lessati piuttosto che analizzare i caratteri, insieme a semplificare drasticamente il nostro passo di analisi. Quindi, usando un parser più avanzato, semplicemente perdi tutti i benefici del lexing, in primo luogo.

    
risposta data 10.02.2012 - 15:06
fonte
0

Ha senso fare un'analisi lessicale con espressioni regolari, o saltare questo passaggio e fare un parsing lessless molto più flessibile e potente con PEG o GLR.

    
risposta data 10.02.2012 - 20:18
fonte

Leggi altre domande sui tag