Domanda

Durante la modifica di questo e quello in Vim, trovo spesso che l'evidenziazione della sintassi (per alcuni tipi di file) presenti alcuni difetti. Al momento non ricordo alcun esempio, ma sicuramente qualcuno lo farà. Di solito, consiste in stringhe mal evidenziate in alcuni casi, alcune cose con operatori aritmetici e booleani e alcune altre piccole cose.

Ora, vim usa regex per quel genere di cose (il suo sapore).

Tuttavia, ho iniziato a imbattermi in editor che, a prima vista, hanno evidenziato meglio la sintassi. Ho sempre pensato che le regex siano la strada da percorrere per quel tipo di cose.

Quindi mi chiedo, quegli editori hanno solo regex scritti meglio, o se ne occupano in qualche altro modo? Che cosa ? Come viene curata l'evidenziazione della sintassi quando si desidera che sia "stabile" ? E secondo te qual è l'editore che si è preso cura del meglio (nel tuo editor preferito), e come ha fatto (in termini linguistici)?

Modifica-1: Ad esempio, editor come Emacs, Notepad2, Notepad ++, Visual Studio - conosci forse quale meccanismo usano per syn. alta. ?

È stato utile?

Soluzione

Il pensiero che viene subito in mente per quello che vorresti usare al posto delle regex per l'evidenziazione della sintassi è analisi . I regex hanno molti vantaggi, ma come vediamo con l'evidenziazione di Vim, ci sono dei limiti. (Se cerchi discussioni sull'utilizzo di regex per analizzare XML, troverai materiale esauriente sul perché le regex non possono fare ciò che fanno i parser.)

Poiché ciò che vogliamo dall'evidenziazione della sintassi è che segua la struttura sintattica del linguaggio, che i regex possono solo approssimarsi, è necessario eseguire un certo livello di analisi reale per andare oltre ciò che i regex possono fare. Un semplice lexer di discesa ricorsiva probabilmente farà benissimo per la maggior parte delle lingue, sto pensando.

Altri suggerimenti

Alcuni linguaggi di programmazione hanno una definizione / specifica formale scritta in Backus-Naur Form . Tutti i linguaggi di programmazione *) possono essere descritti al suo interno. Tutto ciò di cui hai bisogno è una specie di parser per la notazione.

*) non verificato

Ad esempio, la definizione di BNF di C è "solo cinque pagine".

Se vuoi evidenziare con precisione uno ha bisogno di una vera programmazione e non di espressioni regolari. I RegEx sono raramente la risposta ad attività tutt'altro che banali. Per evidenziare in modo migliore è necessario scrivere un semplice parser. Le analisi hanno sostanzialmente componenti separati che ognuno può fare qualcosa come identificare e consumare una stringa o un numero letterale tra virgolette. Se detto componente guardando il suo cursore non può consumare ciò che sta sotto, non fa nulla. Da ciò puoi facilmente analizzare o evidenziare in modo abbastanza semplice e facile.

Dato qualcosa del genere

static int field = 123;

• Il primo macher salta lo spazio bianco prima di "quotare". La parola chiave, i letterali ecc. Non farebbero nulla perché la gestione degli spazi bianchi non fa per loro.

• La parola chiave corrisponde quando posizionata sopra " statico " lo consumerei. Perché " s " non è una cifra che il letterale associato non fa nulla. Lo skipper degli spazi bianchi non fa altrettanto perché "quot" non è un personaggio bianco.

Naturalmente il tuo loop continua a far avanzare il cursore sulla stringa di input fino a raggiungere la fine. L'ordinamento dei tuoi abbinatori è ovviamente importante.

Questo approccio è flessibile in quanto gestisce frammenti sintatticamente errati ed è anche facile estendere e riutilizzare i singoli matcher per supportare l'evidenziazione di altre lingue ...

Suggerisco l'uso di RE per l'evidenziazione della sintassi. Se non funziona correttamente, allora la tua RE non è abbastanza potente o abbastanza complicata :-) Questa è una di quelle aree in cui le RE brillano.

Ma dato che non puoi fornire alcun esempio di errore (quindi possiamo dirti qual è il problema) o i nomi degli editor che lo fanno meglio (così possiamo dirti come lo fanno), non c'è molto di più saremo in grado di darti una risposta.

Non ho mai avuto problemi con Vim con le lingue tradizionali e non ho mai avuto bisogno di usare strani linguaggi esoterici, quindi si adatta bene ai miei scopi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top