Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Antlr Lexer带引号的字符串谓词_String_Word_Antlr_Lexer_Quotes - Fatal编程技术网

String Antlr Lexer带引号的字符串谓词

String Antlr Lexer带引号的字符串谓词,string,word,antlr,lexer,quotes,String,Word,Antlr,Lexer,Quotes,我正在尝试构建一个lexer来标记单独的单词和引用的字符串。我得到以下信息: STRING: QUOTE (options {greedy=false;} : . )* QUOTE ; WS : SPACE+ { $channel = HIDDEN; } ; WORD : ~(QUOTE|SPACE)+ ; 对于角落案例,需要解析: "string" word1" word2 作为三个标记:“string”作为string,word1”和word2作为WORD。基本

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

STRING:    QUOTE (options {greedy=false;} : . )* QUOTE ;
WS    :    SPACE+ { $channel = HIDDEN; } ;
WORD  :    ~(QUOTE|SPACE)+ ;
对于角落案例,需要解析:

"string" word1" word2
作为三个标记:
“string”
作为string,
word1”
word2
作为WORD。基本上,如果有最后一个引号,它需要是单词的一部分。如果引号被空格包围,它应该是单词

我一字不差地尝试了这条规则,但没有成功:

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

我终于找到了一种不用编写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)+ ;