Regex ANTLR4-在lexer模式中,将一条规则优先于另一条规则的原因是什么?

Regex ANTLR4-在lexer模式中,将一条规则优先于另一条规则的原因是什么?,regex,antlr4,Regex,Antlr4,我们的设置: parser.g4: absolute_schema_nodeid : (SLASH identifier)+; identifier: IDENTIFIER lexer.g4 tokens{ SLASH } SLASH : '/' ->type(SLASH); IDENTIFIER : [a-zA-Z0-9_][a-zA-Z0-9_\-.]* -> pushMode(VALUE_MODE); mode VALUE_MODE; fragment ESC

我们的设置:

parser.g4:

absolute_schema_nodeid : (SLASH identifier)+;
identifier: IDENTIFIER
lexer.g4

tokens{
    SLASH
}

SLASH : '/' ->type(SLASH);

IDENTIFIER : [a-zA-Z0-9_][a-zA-Z0-9_\-.]* -> pushMode(VALUE_MODE);

mode VALUE_MODE;

fragment ESC :  '\\' (["\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;

END_SLASH : '/' ->type(SLASH), popMode;
STRING: ((~( '\r' | '\n' | '\t' | ' ' | ';' | '{' | '"' | '\'' | ':' | '/' | '=' | '[' | ']' )~( '\r' | '\n' | '\t' | ' ' | ';' | '{' | ':' | '/' | '=' | '[' | ']')* )) ->popMode;// IDENTIFIER ;

mode BLOCK_COMMENT_MODE;
测试规则:

/aaa/aaabbb
我们需要VALUE_模式中的lexer在找到“/”(END_斜杠)时弹出

为什么字符串规则优先于结束斜杠?原因是什么?

在第一次阅读时,似乎这是操作的顺序。你的问题不清楚这是否是你所期望的

  • 规则
    SLASH
    匹配令牌
    /
  • 规则
    IDENTIFIER
    匹配令牌
    aaa
    • 推送模式
      VALUE\u模式
  • 规则
    END\u斜杠
    匹配令牌
    /
    • 将令牌类型设置为斜杠
    • 流行模式
  • 规则
    IDENTIFIER
    匹配令牌
    aaabbb
    • 推送模式
      VALUE\u模式
  • 文件结束

  • 好的,它的工作原理如下:

    lexer:

    RPC_KEYWORD : 'rpc'-> pushMode(VALUE_MODE);
    
    解析器:

    rule1 : RPC_KEYWORD
    
    rule2 : [a-z]+
    
    例1:rpca

    匹配规则2(较长的一条),规则顺序无关紧要

    示例2:rpc


    匹配规则1,规则顺序很重要

    您所写的是我们真正想要的,但实际上它是字符串规则,而不是结束斜杠。所以,我们的问题仍然是:为什么字符串规则优先于尾端斜杠?