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
;
我有以下语法:
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
;