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

时间:2019-07-05 11:25:06

标签: antlr antlr4

我有以下语法:

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 

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

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

1 个答案:

答案 0 :(得分:1)

问题是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
    ;