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

antlr string parser rule takes precedent over other rules

我有以下语法:

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 会采用尽可能长的标记。

为了解决这个问题,我建议使用 Lexical Modes,例如:

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

mode VALUE_MODE;

StringCharacters
    :   StringCharacter+ -> popMode
    ;

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

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

注意,上面的例子只能解析一行。

如果要解析多行值,则必须修改词法分析器和解析器:

词法分析器:

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
    ;