当前位置: 首页 > 面试题库 >

如何获得antlr4规则匹配的原始文本?

管和志
2023-03-14
问题内容

使用Java
7语法https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4,我想查找具有特定名称的方法,然后仅打印该方法。我看到我可以methodDeclaration在匹配时使用该规则。因此,我继承Java7BaseListener并覆盖了此侦听器方法:

@Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { }

如何获得原始文本? ctx.getText()给我一个字符串,其中所有空格都被删除。我想要注释和原始格式。


问题答案:

ANTLR的CharStream类有一个方法getText(Interval interval),该方法将返回给定范围内的原始源。该Context对象具有获取起点和终点的方法。假设您的侦听器中有一个名为的字段,该字段input已解析CharStream,则可以执行以下操作:

    int a = ctx.start.getStartIndex();
    int b = ctx.stop.getStopIndex();
    Interval interval = new Interval(a,b);
    input.getText(interval);


 类似资料:
  • 我刚刚开始学习ANTLR4 lexer规则。我的目标是为Java属性文件创建一个简单的语法。以下是我目前掌握的信息:

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

  • 我试图了解ANTLR4是如何基于lexer和解析器规则工作的,但我在下面的示例中遗漏了一些内容: 我正在尝试解析一个文件,并匹配所有的数学加法(例如1+2+3等)。我的文件包含以下文本: 我想和 4+5+22+1 而且 2+4+255 以上所述都与lexer匹配输入的方式有关?我知道lexer会查找第一个最长的匹配规则,但我如何更改语法以便只匹配添加的规则呢?

  • 基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was

  • whistle的协议比较多,具体参见:协议列表,这些协议的匹配优先级及同时可匹配规则个数遵循以下四个原则: 相同协议规则的默认优先级从上到下,即前面的规则优先级匹配高于后面,如: www.test.com 127.0.0.1:9999 www.test.com/xxx 127.0.0.1:8080 请求 https://www.test.com/xxx/index.html 按从上到下的