antlr v4的不同令牌具有相同符号



如何在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
;

相关内容

  • 没有找到相关文章

最新更新