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
;