2013-05-10 10 views
7

ho il seguente grammatica per ANTLR 4:ANTLR 4 gettoni lexer all'interno di altri gettoni

grammar Pattern; 

//parser rules 
parse : string LBRACK CHAR DASH CHAR RBRACK ; 
string : (CHAR | DASH)+ ; 

//lexer rules 
DASH : '-' ; 
LBRACK : '[' ; 
RBRACK : ']' ; 
CHAR : [A-Za-z0-9] ; 

E sto cercando di analizzare la seguente stringa

ab-cd[0-9] 

Il codice analizza la ab-cd su la sinistra che verrà trattata come una stringa letterale nella mia applicazione. Analizza quindi [0-9] come un set di caratteri che in questo caso si tradurrà in qualsiasi cifra. La mia grammatica funziona per me, tranne che non mi piace avere (CHAR | DASH)+ come regola parser quando viene semplicemente trattato come un token. Avrei preferito il lexer creare un token STRING e mi danno i seguenti token:

"ab-cd" "[" "0" "-" "9" "]" 

invece di questi

"ab" "-" "cd" "[" "0" "-" "9" "]" 

ho guardato in altri esempi, ma non sono stati in grado di capirlo . Di solito altri esempi hanno citazioni intorno a tali letterali stringa o hanno spazi bianchi per aiutare a delimitare l'input. Mi piacerebbe evitare entrambi. Questo può essere realizzato con le regole lessice o devo continuare a gestirlo nelle regole del parser come sto facendo?

risposta

7

In ANTLR 4, è possibile utilizzare le modalità lexer per questo.

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

Dopo l'analisi di un carattere [, lexer funzionerà in modalità CharSet fino al raggiungimento di un carattere ] e viene eseguito il comando popMode.

+0

Grazie per questa intuizione. L'impostazione di subtokenizzatori come questo sembra la soluzione perfetta. Ricevo un errore sebbene affermi che 'le modalità lessicali sono consentite solo nelle grammatiche lessicali'. Posso dichiarare la mia grammatica come "lexer grammar IdPattern;", ma poi non posso usare le regole del parser. Cosa mi manca? – Charles

+1

Avrai bisogno di usare una 'lexer grammar' per il tuo lexer e una' parser grammar' separata (in un file separato) per il tuo parser. –

+0

Ecco un link che può aiutare gli altri: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle

Problemi correlati