我正在尝试构建一个词法分析器来标记单个单词和引用的字符串。我得到了以下内容:
STRING: QUOTE (options {greedy=false;} : . )* QUOTE ;
WS : SPACE+ { $channel = HIDDEN; } ;
WORD : ~(QUOTE|SPACE)+ ;
对于极端情况,需要解析:
"string" word1" word2
作为三个令牌:"string"
为STRING,word1"
和word2
为WORD。基本上,如果有最后一个引用,它必须是WORD的一部分。如果引号被白色空格包围,那么它应该是一个WORD。
我为WORD尝试了这条规则,没有成功:
WORD: ~(QUOTE|SPACE)+
| (~(QUOTE|SPACE)* QUOTE ~QUOTE*)=> ~(QUOTE|SPACE)* QUOTE ~(QUOTE|SPACE)* ;
答案 0 :(得分:3)
我终于发现了一些可以解决问题而无需编写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)+ ;