Я пытаюсь создать лексер для токенизации одиноких слов и строк в кавычках.Я получил следующее:
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)* ;