Analisi lessicale senza espressioni regolari


9

Ho esaminato alcuni lexer in vari linguaggi di livello superiore ( Python , PHP , Javascript tra gli altri) e tutti sembrano usare espressioni regolari in una forma o nell'altra. Mentre sono sicuro che i regex sono probabilmente il modo migliore per farlo, mi chiedevo se ci fosse un modo per ottenere il lex di base senza espressioni regolari, forse una sorta di analisi delle stringhe diretta o qualcosa del genere.

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

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


2
Sembra "c'è un libro sul calcolo che non usa tutte quelle lettere greche e strane cose strette?"
Kevin Cline,

@kevincline Perché le persone remano attraverso l'Atlantico quando ci sono piani perfettamente buoni nel cielo?
Sfuma

1
il canottaggio e l'equitazione hanno effetti collaterali diversi.
Kevin Cline,

Risposte:


3

Prima di tutto, ci sono state librerie di espressioni regolari per C da prima che i tuoi linguaggi "di livello superiore" fossero inventati. Stavo solo dicendo che i programmi in C non sono podunk come alcune persone sembrano pensare.

Per la maggior parte delle grammatiche, il lessico è una questione di ricerca di spazi bianchi e di alcuni altri caratteri come () [] {}; per dividere le parole, quindi corrispondere a un elenco di parole chiave per vedere se vi sono corrispondenze.


1
Non intendevo dire che C non potesse fare regex, intendevo che ha caratteristiche più potenti per fare questo genere di cose. Immagino che sia più semplice costruire un lexer avanzato e performante in C rispetto a un linguaggio di livello superiore.
Sfuma

1
@sam la complessità e le prestazioni di un lexer o di un parser sono più una funzione della complessità del linguaggio analizzato che delle lingue in cui il parser è implementato, quindi no.
jk.

+1. Un lexer è incredibilmente semplice; hai solo bisogno di una stringa, un tipo di dati per i token e una tabella di parole chiave predefinite. La parte più difficile riguarda gli spazi bianchi e i commenti: P
Mason Wheeler,

2

Potresti essere interessato ai "parser scannerless", che non hanno una fase di tokenizzazione separata. Una spiegazione dei vantaggi dei parser scannerless è fornita all'inizio di questo documento: Filtri di disambiguazione per parser 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.)


1

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


0

Ovviamente puoi usare altri parser, dato che ogni lingua normale è anche senza contesto. La domanda si riduce davvero al motivo per cui vorresti.

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

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


Quindi come lo fa regex? Non dovrebbe ancora andare carattere per carattere (almeno per la maggior parte degli schemi usati nel lexing)?
Jetti,

@Jetti Sì, certo.
Pubblico,

Sarebbe altrettanto facile leggere ogni personaggio e poi tornare indietro se necessario per estrarre un gettone. Sarebbe più codice ma non più difficile.
Jetti,

@Jetti Non riesco a vedere quanto sia ingenuo il backtracking.
Pubblico,

Non ho mai detto di meglio. Ma l'OP ha chiesto se ci sono altri modi ed è un altro modo che non è un parser avanzato.
Jetti,

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.