2010-05-23 4 views
1

J'essaye de construire un lexer pour symboliser des mots isolés et des chaînes entre guillemets. Je suis arrivé ce qui suit:Antlr Lexer Quoted String Prédicat

STRING: QUOTE (options {greedy=false;} : .)* QUOTE ; 
WS : SPACE+ { $channel = HIDDEN; } ; 
WORD : ~(QUOTE|SPACE)+ ; 

Pour les cas d'angle, il faut analyser:

"string" word1" word2 

Comme trois jetons: "string" STRING et word1" et word2 comme WORD. Fondamentalement, s'il y a une dernière citation, elle doit faire partie de WORD si elle l'est. Si la citation est entourée d'espaces blancs, cela devrait être un MOT.

J'ai essayé cette règle pour mot, sans succès:

WORD: ~(QUOTE|SPACE)+ 
    | (~(QUOTE|SPACE)* QUOTE ~QUOTE*)=> ~(QUOTE|SPACE)* QUOTE ~(QUOTE|SPACE)* ; 

Répondre

3

j'ai enfin trouvé quelque chose qui pourrait faire l'affaire sans avoir recours à l'écriture de code Java:

fragment QUOTE 
      : '"' ; 
    fragment SPACE 
      : (' '|'\r'|'\t'|'\u000C'|'\n') ; 

    WS  : SPACE+ {$channel=HIDDEN;}; 
    PHRASE : QUOTE (options {greedy=false;} : .)* QUOTE ; 
    WORD : (~(QUOTE|SPACE)* QUOTE ~QUOTE* EOF)=> ~(QUOTE|SPACE)* QUOTE ~(SPACE)* 
      | ~(QUOTE|SPACE)+ ; 

De cette façon, la Différencier prédicat/résout pour les deux:

PHRASE : QUOTE (options {greedy=false;} : .)* QUOTE ; 

et

  | ~(QUOTE|SPACE)+ ;