Antlr Lexer цитируемый предикат строки - PullRequest
1 голос
/ 23 мая 2010

Я пытаюсь создать лексер для токенизации одиноких слов и строк в кавычках.Я получил следующее:

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

Для угловых случаев необходимо разобрать:

"string" word1" word2

Как три токена: "string" как STRING и word1" и word2меч.По сути, если есть последняя цитата, она должна быть частью СЛОВА, где бы она ни была.Если цитата окружена пробелами, это должно быть СЛОВО.

Я пробовал это правило для СЛОВА, но безуспешно:

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

1 Ответ

3 голосов
/ 25 мая 2010

Я наконец нашел что-то, что могло бы помочь, не прибегая к написанию кода 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)+ ;

Таким образом, предикат дифференцирует / решает для обоих:

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

и

            |   ~(QUOTE|SPACE)+ ;
...