Sappiamo tutti che l'analisi dell'HTML mediante espressioni regolari non è possibile in generale, dal momento che analizzerebbe una grammatica sensibile al contesto mentre le espressioni regolari possono solo analizzare grammatiche regolari. Lo stesso è certamente vero per altri linguaggi di programmazione.I linguaggi di programmazione con evidenziazione della sintassi sono possibili utilizzando le espressioni regolari?
Ora, recentemente, è stato annunciato l'evidenziatore di sintassi Rainbow.js. La sua premessa è descritta come molto semplice:
Rainbow da solo è molto semplice. Passa attraverso i blocchi di codice, elabora i modelli regex e avvolge i pattern corrispondenti nei tag.
Ho immaginato che l'evidenziazione della sintassi è essenzialmente un compito della stessa complessità dell'analisi del linguaggio, se assumiamo che sia buono e adatto a molte lingue. Tuttavia, mentre c'è un bel po 'di criticism di quella libreria, né quella né la HackerNews discussion (presa come esempio per una discussione di inclini tecnicamente) hanno menzionato che evidenziare la sintassi usando le espressioni regolari è praticamente impossibile in un caso generale, che io Considererei un difetto importante e ostentato.
Ora la domanda è: c'è qualcosa che mi manca? In particolare:
- L'evidenziazione della sintassi con le espressioni regolari è possibile in generale?
- Si tratta di un'istanza di una regola 80/20 applicata, in cui è sufficiente quanto basta con le espressioni regolari per essere utile?
Giusto, perché un lexer definisce una grammatica context-free (CFG), ma un'espressione regolare può solo definire una grammatica regolare (RG). – Daniel
L'uso di un "lexer" non implica necessariamente una grammatica context-free - l'analisi lessicale è qualcosa che puoi fare per tutti i tipi di linguaggi. Detto questo, la maggior parte dei linguaggi di programmazione ha grammatiche senza contesto. –
Dubito che abbiate bisogno di qualche caratteristica di fantasia non inclusa nella definizione matematica del 19 ° secolo delle regex. Il back-reference che date può essere facilmente sostituito perché può essere solo una volta su quattro cose: '('...') | (" ... ") | ('' '...' '') | ("" "... """) '. Ciò che precisamente può andare in ogni tipo di stringa è descritto nel [riferimento al linguaggio Python] (http://docs.python.org/reference/lexical_analysis.html#string-literals) e sembra abbastanza semplice da tradurre in espressioni regolari. – delnan