当前位置: 首页 > 知识库问答 >
问题:

ANTLR:获取子lexer规则的文本表示形式

孟树
2023-03-14

考虑ANTLR4中的以下lexer规则:

ID: [a-z]+;
INT: [0-9]+;
ARRAY: ID '[' INT ']';

在可以访问ctx.array()(其中ctx是由解析器规则生成的ParserRuleContext的子类)的树行走场景中,是否可以获得lexer规则idint的文本表示?我当前使用ctx.array().getText()获取整个文本表示,并使用regexes解析idint的内容,我只是想知道是否有一个“cleaner”开箱即用的解决方案。

注意:由于外部依赖关系,不能将array作为解析器规则。

提前感谢有意义的回答。

共有1个答案

公孙驰
2023-03-14

ANTLR 4中的Lexer规则不能分解为多个部分。这是我们做出的一个设计决定,它是ANTLR4 Lexer相对于ANTLR3 Lexer在速度和内存方面的巨大改进的一部分。ANTLR3 lexer是递归下降识别器,具有许多与解析器相同的特性。在ANTLR4中,lexer只不过是一个支持语义谓词的DFA识别器,因此根本不跟踪令牌的各个组件之间的边界。

您必须使array成为解析器规则,或者在需要分解令牌文本时单独解析getText()的结果。

 类似资料:
  • 问题内容: 我是ANTLR初学者,想计算符号的SHA1-哈希值。 我的简化示例语法: 当词法分析器删除所有空白时,将使用不同的字符串,但是不幸的是,获得了相同的SHA1-Hash值。 是否有可能在所有跳过的空格和其他通道的文本之间获得规则的“原始”文本? (我想到的一种可能性是将所有字符都包含在-和-lexer规则中,但是还有更多规则,因此这不是很实用。) 我使用标准的ANTLRInputStre

  • 我有一个antlr语法,它有多个与同一个单词匹配的词法规则。在词法分析过程中无法解决这个问题,但通过语法,它就变得毫不含糊了。 示例: 输入:<代码>1英寸(米) 单词“in”与lexer规则和匹配。 如何在保持语法文件可读性的同时解决此问题?

  • 我需要以下令牌: 允许的字符包括大写、小写、数字、空格和连字符 长度不固定(长度必须至少为两个字符) 标记必须至少包含一个空格或连字符 令牌必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾) 下面语法中的ANTLR lexer规则“alphanumericspacehyphen”除了一个情况外几乎都起作用。使用解析器规则“sic”进行测试,以下输入将解析(不带引号): 以下输入

  • 现在我得到了:错误。 我知道我的输入被AND和TERM lexer规则匹配,但我希望能够指定TERM是除与AND规则匹配的内容之外的任何内容。

  • 查看文档,ANTLR2过去有一种叫做谓词法的东西,下面的例子是这样的(灵感来自Pascal): 在我看来,这实际上是规则开头的一个积极的前瞻性断言:如果前瞻性与匹配,那么第一个规则将被应用(并与该输入的部分匹配),依此类推。 我还没有在ANTLR4中找到这样的东西。2到3迁移指南似乎没有提到这一点,而3到4更改文档指出: ANTLR3和4之间最大的区别是ANTLR4接受您给出的任何语法,除非该语法

  • 我正在重新学习一些基本的Antlr,并尝试编写一个生成todo项的语法: 我遇到的问题是,有三个lexer规则特别“不匹配”,这取决于它们使用的上下文: 以下是我的完整语法以求清晰: 旁白:我知道还有其他奇怪的地方,比如一个事件的名称只能是一个单词,但我是在一次处理一个问题。