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?
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
Avrai bisogno di usare una 'lexer grammar' per il tuo lexer e una' parser grammar' separata (in un file separato) per il tuo parser. –
Ecco un link che può aiutare gli altri: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle