Regex ANTLR4-在lexer模式中,将一条规则优先于另一条规则的原因是什么?
我们的设置: parser.g4: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
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,规则顺序很重要您所写的是我们真正想要的,但实际上它是字符串规则,而不是结束斜杠。所以,我们的问题仍然是:为什么字符串规则优先于尾端斜杠?