如何在antlr v4中识别相同符号的不同令牌?例如,在selected = $("library[title='compiler'] isbn");
中,第一个=
是分配,而第二个=
是操作员。
这是相关的Lexer规则:
EQUALS
:
'='
;
OP
:
'|='
| '*='
| '~='
| '$='
| '='
| '!='
| '^='
;
这是该行的解析器规则:
assign
:
ID EQUALS DOLLAR OPEN_PARENTHESIS QUOTES ID selector ID QUOTES
CLOSE_PARENTHESIS SEMICOLON
;
selector
:
OPEN_BRACKET ID OP APOSTROPHE ID APOSTROPHE CLOSE_BRACKET
;
只要我使用与=
不同的OP。
这是错误日志:
JjQueryParser::init:34:29: mismatched input '=' expecting OP
JjQueryParser::init:34:39: mismatched input ''' expecting '"'
JjQueryParser::init:34:46: mismatched input '"' expecting '='
无法在Lexer中解决该问题,因为Lexer始终返回同一字符串的一个令牌类型。但是在解析器中解决它非常容易。只需重写规则较低的情况:
equals
: '='
;
op
:'|='
| '*='
| '~='
| '$='
| '='
| '!='
| '^='
;
我也有同样的问题。如下:
在Lexer中解决EQUALS: '=';
OP : '|' EQUALS
| '*' EQUALS
| '~' EQUALS
| '$' EQUALS
| '!' EQUALS
| '^' EQUALS
;
这可以保证符号'='一直以单个令牌为代表。不要忘记更新相关规则如下:
selector
:
OPEN_BRACKET ID (OP|EQUALS) APOSTROPHE ID APOSTROPHE CLOSE_BRACKET
;