【问题标题】:Antlr Lexer Quoted String PredicateAntlr Lexer 引用字符串谓词
【发布时间】:2010-05-23 05:27:58
【问题描述】:

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

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

【问题讨论】:

    标签: string word antlr lexer quotes


    【解决方案1】:

    我终于找到了无需编写 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)+ ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      相关资源
      最近更新 更多