Antlr Lexer引用字符串谓词

时间:2010-05-23 05:27:58

标签: string word antlr lexer quotes

我正在尝试构建一个词法分析器来标记单个单词和引用的字符串。我得到了以下内容:

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)* ; 

1 个答案:

答案 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)+ ;