antlr字符串解析器规则优先于其他规则

antlr字符串解析器规则优先于其他规则,antlr,antlr4,Antlr,Antlr4,我的语法如下: cell : operator value ; operator : EQ ; value : StringCharacters ; EQ : '=' ; StringCharacters : StringCharacter+ ; fragment StringCharacter : ~[\\\r\n] ; WS : [ \t\r\n\u000C]+ ->

我的语法如下:

cell
    : operator value
    ;

operator
    : EQ
    ;

value
    : StringCharacters
    ;

EQ
    : '='
    ;

StringCharacters
    :   StringCharacter+
    ;
fragment
StringCharacter
    :   ~[\\\r\n]
    ;

WS  :  [ \t\r\n\u000C]+ -> skip
    ;
其思想是允许以下输入:

= 3
=3
=asdkfljer
=skdfj wkrje slkjf 
以此类推,让解析器始终识别前面的运算符。但事实并非如此。相反,解析器总是将所有内容都识别为值

如何实现语法,使解析器始终首先识别运算符,并基本上接受其余的运算符作为值?

问题是StringCharacters与任何输入字符串匹配,ANTLR使用尽可能长的标记

为了解决这个问题,我建议使用以下方法:

EQ
    : '=' -> pushMode(VALUE_MODE)
    ;

mode VALUE_MODE;

StringCharacters
    :   StringCharacter+ -> popMode
    ;

fragment
StringCharacter
    :   ~[\\\r\n]
    ;

WS  :  [ \t\r\n\u000C]+ -> skip
    ;
注意,上面的示例只能解析一行

如果要解析多行值,必须修改lexer和解析器:

Lexer:

EQ
    : '=' -> pushMode(VALUE_MODE)
    ;

mode VALUE_MODE;

StringCharacters
    :   StringCharacter+ [\r\n]* -> popMode
    ;

fragment
StringCharacter
    :   ~[\\\r\n]
    ;

WS  :  [ \t\r\n\u000C]+ -> skip
    ;
解析器:

cell
    : (operator value)*
    ;

operator
    : EQ
    ;

value
    : StringCharacters
    ;