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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top