Domanda

Sto scrivendo un lexer jFlex per Lua e sto riscontrando problemi nel progettare un'espressione regolare per abbinare una parte particolare delle specifiche del linguaggio:

  

Le stringhe letterali possono anche essere definite usando un formato lungo racchiuso tra parentesi lunghe. Definiamo una parentesi lunga aperta di livello n come parentesi quadra aperta seguita da n segni uguali seguiti da un'altra parentesi quadra aperta. Quindi, una parentesi lunga aperta di livello 0 è scritta come [[, una parentesi lunga aperta di livello 1 è scritta come [= [e così via. Una parentesi lunga di chiusura è definita in modo simile; per esempio, una parentesi lunga di chiusura di livello 4 è scritta come] ====]. Una stringa lunga inizia con una parentesi lunga aperta di qualsiasi livello e termina alla prima parentesi lunga chiusa dello stesso livello. I letterali in questa forma tra parentesi possono essere eseguiti su più righe, non interpretare alcuna sequenza di escape e ignorare parentesi lunghe di qualsiasi altro livello. Possono contenere qualsiasi cosa tranne una parentesi chiusa del livello appropriato.

In poche parole, sto cercando di progettare un'espressione regolare che corrisponderà a una parentesi lunga aperta, al contenuto della stringa in mezzo e alla parentesi lunga chiusa. Una corrispondenza dovrebbe verificarsi solo quando la parentesi lunga aperta e la parentesi lunga chiusa hanno lo stesso numero di segni uguali, che possono essere zero o più.

È stato utile?

Soluzione

\[(=*)\[.*?\]\1\]

the \ 1 cattura il primo ().

Altri suggerimenti

Beh, temo che il tokenizzazione con espressioni regolari non sia abbastanza buono per questo compito. Le espressioni regolari non sono abbastanza potenti.

Non c'è modo di confrontare il numero di segni '=' usando semplici espressioni regolari in jFlex. Perl avrebbe un trucco per questo (\ 1 come suggerito sopra), ma non stiamo parlando di programmare Perl, ma jFlex lexer.

La soluzione è andare con \ [= * \ [per il token parentesi quadra sinistra, \] = * \] per il token parentesi destra, quindi nel livello sopra (un parser) confrontare se corrispondono in lunghezza.

Ad ogni modo, puoi leggere read_long_string () nel codice sorgente lua in llex.c e vedere come hanno fatto senza usare affatto le espressioni regolari.

\[(=*)\[.*?\]\1\]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top