如何附加两个词法分析器表达式 - 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”时才匹配,您将有 rootLevel
和 subLevel
RootPathContext
class.
中的字段
我需要词法分析器将两个不同的字符表达式解析为一个表达式。
所以我有这样的东西,
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”时才匹配,您将有 rootLevel
和 subLevel
RootPathContext
class.