ANTLR 语法中解析器和词法分析器规则的调用顺序是什么?
What is the order of invocation of parser and lexer rules in ANTLR grammar?
ANTLR 语法中解析器和词法分析器规则的调用顺序是什么?
例如在下面的语法中输入
223
始终标识为 APLHANUMERIC 而不是 digit
digit : F_DIGIT+;
alpha : APLHANUMERIC;
APLHANUMERIC : (LOWERCASE | UPPERCASE | F_DIGIT | '_')+ ;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment F_DIGIT : [0-9] ;
对评论进行详细说明:
分词器(又名词法分析器)将始终处理您的输入流,为解析器规则生成标记流,以便在识别您的源结构时使用。
唯一的“调用顺序”是 Tokenizer 在解析器之前运行(显然是必要的,因为解析器作用于解析器生成的标记)。
对于词法分析器规则,所有规则都逻辑上适用于您的输入流。如果您有多个 Lexer 规则可以匹配输入中的下一个字符,则有两个规则起作用。
1 - 如果一个 Lexer 规则匹配一组更长的字符,那么它将用于生成令牌。
2 - 如果多个规则匹配输入流中相同数量的字符,那么出现在语法中的第一个规则将“获胜”
fragment
s 不是词法分析器规则。它们只是一种便利,您可以利用它们来编写 Lexer 规则以避免重复并提高可读性。
在解析器中,您选择起始规则,然后解析器处理该规则的内容(递归调用构成该规则的规则及其子规则等)。唯一涉及的“顺序”是 ANTLR 将按顺序评估规则中的顶级替代方案,这可用于解决算术表达式中正确的运算符优先级等问题。
ANTLR 语法中解析器和词法分析器规则的调用顺序是什么? 例如在下面的语法中输入
223
始终标识为 APLHANUMERIC 而不是 digit
digit : F_DIGIT+;
alpha : APLHANUMERIC;
APLHANUMERIC : (LOWERCASE | UPPERCASE | F_DIGIT | '_')+ ;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment F_DIGIT : [0-9] ;
对评论进行详细说明:
分词器(又名词法分析器)将始终处理您的输入流,为解析器规则生成标记流,以便在识别您的源结构时使用。
唯一的“调用顺序”是 Tokenizer 在解析器之前运行(显然是必要的,因为解析器作用于解析器生成的标记)。
对于词法分析器规则,所有规则都逻辑上适用于您的输入流。如果您有多个 Lexer 规则可以匹配输入中的下一个字符,则有两个规则起作用。
1 - 如果一个 Lexer 规则匹配一组更长的字符,那么它将用于生成令牌。
2 - 如果多个规则匹配输入流中相同数量的字符,那么出现在语法中的第一个规则将“获胜”
fragment
s 不是词法分析器规则。它们只是一种便利,您可以利用它们来编写 Lexer 规则以避免重复并提高可读性。
在解析器中,您选择起始规则,然后解析器处理该规则的内容(递归调用构成该规则的规则及其子规则等)。唯一涉及的“顺序”是 ANTLR 将按顺序评估规则中的顶级替代方案,这可用于解决算术表达式中正确的运算符优先级等问题。