ANTLR problema di spazio bianco canale nascosto
-
18-09-2019 - |
Domanda
Ho la seguente grammatica Antlr:
grammar MyGrammar;
doc : intro planet;
intro : 'hi';
planet : 'world';
MLCOMMENT
: '/*' ( options {greedy=false;} : . )* '*/' { $channel = HIDDEN; };
WHITESPACE : (
(' ' | '\t' | '\f')+
|
// handle newlines
( '\r\n' // DOS/Windows
| '\r' // Macintosh
| '\n' // Unix
)
)
{ $channel = HIDDEN; };
Negli ANTLRWorks 1.2.3 interprete, gli ingressi hi world
, hi/**/world
e hi /*A*/ world
lavoro, come previsto.
Tuttavia, il hiworld
di ingresso, che non deve di lavoro, è anche accettata.
Come faccio hiworld
fallire? Come forzo almeno uno spazio bianco (o un commento) tra "hi" e "mondo"?
Si noti che ho usato solo MLCOMMENT e gli spazi che in questo esempio per semplificare, ma anche altri tipi di commenti sarebbero sostenuti.
Soluzione
È necessario creare un token ID generale. Dal momento che il lexer costruisce il token più lungo che può, che vedrebbe l'ingresso "hiworld" come una sola parola dal momento che è più lungo di "ciao" o "mondo" di se stessi. Tale regola potrebbe essere simile:
ID : ('a'..'z' | 'A'..'Z')+;
Per fare un esempio, che è esattamente come parser per i linguaggi di programmazione separano la parola "fare" da "doppio" (tipo di parola chiave, inizia con 'fare') o (nome della variabile) "done".
Altri suggerimenti
Un modo per rendere il hiworld
stringa di fallire è quello di utilizzare un predicato semantico validazione che è garantito per fallire, come segue:
doc: intro planet;
failure : 'hiworld' { false }?;
intro : 'hi';
planet : 'world';
// rest of grammar omitted