Domanda

Sebbene questa domanda riguardi JFLEX, probabilmente si applica ad altri generatori di scanner come Lex, anche Flex.

Se ho qualche regola, come posso creare un gruppo di cattura in parte di quella regola e usare il risultato di quel gruppo catturato come argomento al codice che viene chiamato sulla corrispondenza della regola?

Ad esempio, supponiamo che avessi una semplice regola da abbinare a un tag SGML:

"<"[a-zA-Z]+">"    {return new Token(Type.OPEN_TAG);}

Come potrei catturare la parte del personaggio interiore ([a-za-z]+) e usarla come argomento nel mio costruttore di token?

EDIT: Sono consapevole che potrei semplicemente usare YyText () per ottenere l'intero valore abbinato e quindi separare le parti altrove nel codice, ma sembra che renderebbe le cose più complicate di quanto debbano essere.

È stato utile?

Soluzione

I generatori di scanner generalmente non supportano i gruppi di cattura e, a dire il vero, non ho mai visto una valida necessità per loro in un generatore di scanner. La maggior parte delle cose che normalmente ci vorresti che i gruppi di cattura per altri motori regex sono meglio gestiti nel parser o da un semplice pezzo di codice nell'azione.

Qualcosa come i seguenti dovrebbero probabilmente funzionare.

"<"[a-zA-Z]+">"    {
                     String matchedText = yytext();
                     String label = matchedText.substring(1, matchedText.length() - 1);
                     return new Token(Type.OPEN_TAG, label);
                   }

L'implementazione dell'acquisizione di gruppi tende a interferire con molte delle ottimizzazioni eseguite dal generatore di scanner per ridurre le dimensioni della tabella di transizione. Non ho mai usato JFlex ma mi sembra di ricordare qualcosa su Flex a sostegno di una forma limitata di backtracking e guardare avanti/alle spalle, ma emetterei avvertimenti sulle prestazioni se usato.

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