java - antlr4 - 如何实现递归

标签 java recursion antlr antlr4

我想解析以下输入:

<name 1> WITH <name 2> WITH <name 3> WITH <name 4> ...

我尝试了以下语法:

WITH        : 'WITH'
            ;
NAME        : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+
            ;
query       : NAME (WITH query)?
            ;

但这似乎不起作用。如何实现递归?

供您引用

我的最终目标是解析像这样的树状结构:

<name 1> WITH (<name 2> WITH <name 3> WITH <name 4>) WITH <name 5>

这会产生以下树:

<name 1>
  <name 2>
    <name 3>
    <name 4>
  <name 5>

但是让我们首先从第一个表达式开始。

我的代码:

new TParser(new CommonTokenStream(new TLexer(new ANTLRInputStream( "hello WITH world" )))).query()

导致消息:

line 1:16 no viable alternative at input '<EOF>'

最佳答案

当添加消耗(并跳过)空格的词法分析器规则时,我没有问题。

语法:

grammar T;

SPACE       : [ \t\r\n]+ -> skip
            ;
WITH        : 'WITH'
            ;
NAME        : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+
            ;
query       : NAME (WITH query)?
            ;

将匹配输入aWITHbWITHcWITHd如下:

请注意,您的 NAME 规则可以编写如下:

NAME        : [a-zA-Z0-9_-]+
            ;

要摆脱 EOF 消息,只需引入一个以 EOF 结尾的语法入口点:

parse : query EOF;

然后执行:

new TParser(...).parse()

关于java - antlr4 - 如何实现递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352650/

相关文章:

java - 代码在不同的 IDE 上表现不同

java - : tag in the Spring template app? bean 是什么

java - 在 Gradle 构建中兼顾 Scala、Antlr 和 Java

使用 Spring 和 Hibernate 的 java.lang.NoSuchMethodError : antlr. collections.AST.getLine()

error-handling - 强制antlr3在规则失败时立即退出

java - 如何从 onProgressUpdate 和 onPostExecute 获得响应

java - @PathVariable 的全局通用 PropertyEditorSupport -> 域对象

c - 使用 C 递归删除目录

SVN不递归更新

java - 查找二维数组的可能组合