如何从令牌值到词法分析器规则?

How to go from token value to lexer rule?

到目前为止,我认为令牌值(由词法分析器规则生成)与该规则的规则索引相同。显然情况并非如此,正如您在查看生成的代码中的 ruleNamesliteral/display names 字段时所看到的那样。与显示名称(仅是标记值的字符串表示形式)相比,规则名称的顺序部分不同,并且还包含片段规则之类的内容。另一方面,没有虚拟令牌的条目(如 tokens 部分中所定义)。

现在,当您想从令牌值中获取规则索引时,您会怎么做?我能想到的唯一方法是从词汇表中获取符号名称(即规则名称),然后在规则名称数组中查找它。但这似乎有点奇怪。应该有更直接的方法。有什么想法吗?

附加信息:当您想要从解析器规则开始遍历 ATN 时,需要查找。词法分析器标记存储为转换标签,这就是它们的来源。为了继续在词法分析器 ATN 中行走,您需要正确的规则索引。

一般来说这是不可能的。 Lexer 规则可以 return 与规则名称完全不对应的标记。因此,令牌和生成它们的规则之间没有可靠的关系(通常匹配,但并非总是匹配)。