prendere in considerazione le seguenti regole del lexer in ANTLR4:
ID: [a-z]+;
INT: [0-9]+;
ARRAY: ID "[" INT "]";
E 'possibile in uno scenario di tree walking a cui ho accesso ctx.ARRAY()
(dove ctx
è una sottoclasse di ParserRuleContext
che è stato generato da una regola parser) per ottenere la rappresentazione testuale delle regole del lexer ID
e INT
? Attualmente sto recuperando l'intera rappresentazione del testo con ctx.ARRAY().getText()
e analizzare il contenuto di ID
e INT
usando regex e chiedevo solo se c'è una soluzione "pulita" pronta all'uso che fornisce ANTLR.
Nota: a causa delle dipendenze esterne ARRAY
una regola parser non è un'opzione.
Grazie in anticipo per le risposte significative.
risposte:
3 per risposta № 1Le regole di Lexer in ANTLR 4 non possono essere suddivise inparti. Questa è stata una decisione progettuale che abbiamo fatto come parte di un enorme miglioramento della velocità e della memoria per i lexer ANTLR 4 rispetto ai lexer ANTLR 3. I lexer ANTLR 3 erano riconoscitori ricorsivi di discendenza con molte delle stesse funzionalità dei parser. In ANTLR 4, il lexer non è nient'altro che un riconoscitore DFA con supporto per i predicati semantici, quindi i contorni tra i singoli componenti di un token non vengono tracciati affatto.
Dovrai o fare ARRAY
una regola di parser, o analizzare separatamente il risultato di getText()
quando è necessario suddividere il testo del token.