ANTLR4如何分离Lexer子规则
ANTLR4 how to separate Lexer subrule
假设我有这样的 Lexer 规则:
EMPTY_LITERAL: '\'' '\'';
LITERAL: '\'' (ESCAPED_SEQ|.)*? '\'' ;
fragment ESCAPED_SEQ: '\\'' | '\\'
和这样的解析器规则:
literal: EMPTY_LITERAL #EmptyLiteral | LITERAL #LiteralWithContent;
我想在解析器中获取不带引号的 LITERAL 的内容。当然,我可以去掉引号,但我很想得到不带引号的字符串。
如果我移动 LITERAL 中的内部规则,规则将无法正确匹配(将仅匹配 1 个字符)。如果我将 LITERAL 作为解析器规则移动,我可以匹配 ESCAPED_SEQ 但这不是我想要的。有没有办法在词法分析器中命名内部规则?
Is there a way to name the inner rule in the lexer?
不,没有。在 ANTLR 4 中无法命名或访问令牌的特定部分,也没有将 LITERAL
转换为解析器规则的明智方法。
因此,您自己从令牌文本中删除引号是您唯一的选择。
假设我有这样的 Lexer 规则:
EMPTY_LITERAL: '\'' '\'';
LITERAL: '\'' (ESCAPED_SEQ|.)*? '\'' ;
fragment ESCAPED_SEQ: '\\'' | '\\'
和这样的解析器规则:
literal: EMPTY_LITERAL #EmptyLiteral | LITERAL #LiteralWithContent;
我想在解析器中获取不带引号的 LITERAL 的内容。当然,我可以去掉引号,但我很想得到不带引号的字符串。
如果我移动 LITERAL 中的内部规则,规则将无法正确匹配(将仅匹配 1 个字符)。如果我将 LITERAL 作为解析器规则移动,我可以匹配 ESCAPED_SEQ 但这不是我想要的。有没有办法在词法分析器中命名内部规则?
Is there a way to name the inner rule in the lexer?
不,没有。在 ANTLR 4 中无法命名或访问令牌的特定部分,也没有将 LITERAL
转换为解析器规则的明智方法。
因此,您自己从令牌文本中删除引号是您唯一的选择。