如何附加两个词法分析器表达式 - ANTLR4

How to append two lexer expressions- ANTLR4

我需要词法分析器将两个不同的字符表达式解析为一个表达式。

所以我有这样的东西,

rootPath : 'A' rootType SEP childPath; //我的输出应该是 AB:2 或 AC:4


子路径:RESERVED_NUMBERS;

根目录类型:ONE_LETTER;


SEP: ':' RESERVED_NUMBERS:[1-9] ONE_LETTER : [A-Z]

解析时出现错误,如何将 'A' 和 ONE_LETTER 组合成单个字符串

根据您的评论,您似乎希望将根级别和子级别的两个字母保留为单独的标记,但是有一个“冲突”(在您 rootLevel 解析器规则中)您的'A' 标记文字和您的 ONE_LETTER 规则都匹配“A”字符。如果我没看错的话,你并不是真的在“附加词法分析器表达式”。

重要的是要认识到语法中的 'A' 只是定义 Lexer 规则的语法快捷方式(ANTLR 将使用类似 T__0 的名称创建它),所以它只是另一个词法分析器规则。

了解您的输入字符流用于创建要由解析器使用的令牌流也很重要。解析器规则无法控制“A”是否匹配 T__0 ('A') 规则或 ONE_LETTER 规则。该决定是由 Tokenizer 做出的,它必须只查看输入字符流来选择一个。

考虑到这一点,您可能不应该尝试与词法分析器作斗争,而是允许两个字符都被识别为 ONE_LETTER 标记,并向您的 rootPath 规则添加语义谓词:

rootPath
    : rootLevel = 'A' {$rootLevel.text == "A" }? subLevel = ONE_LETTER SEP childPath
    ; //my output should be AB:2 or AC:4

现在 rootPath 规则仅在 rootLevel ONE_LETTER 标记为“A”时才匹配,您将有 rootLevelsubLevel RootPathContext class.

中的字段