Antlr4 从上下文访问规则返回值

Antlr4 从上下文访问规则返回值,antlr4,Antlr4,我使用示例代码来更好地理解ANTLR。据我所知,行规则返回一个映射值。文件规则内的行标签收集所有RowContext对象。从文件规则中的for each循环中,是否有方法访问行规则返回的映射值 如果没有,我如何实现从文件规则访问所有行规则映射值 代码片段: /** Derived from rule "file : hdr row+ ;" */ file locals [int i=0] : hdr ( rows+=row[$hdr.text.split(",")] {$i++;} )

我使用示例代码来更好地理解ANTLR。据我所知,
规则返回一个
映射值
文件
规则内的
标签收集所有RowContext对象。从
文件
规则中的for each循环中,是否有方法访问
规则返回的
映射值

如果没有,我如何实现从
文件
规则访问所有
规则
映射值

代码片段:

/** Derived from rule "file : hdr row+ ;" */
file
locals [int i=0]
     : hdr ( rows+=row[$hdr.text.split(",")] {$i++;} )+
       {
       System.out.println($i+" rows");
       for (RowContext r : $rows) {
           System.out.println("row token interval: "+r.getSourceInterval());
       }
       }
     ;

hdr : row[null] {System.out.println("header: '"+$text.trim()+"'");} ;

/** Derived from rule "row : field (',' field)* '\r'? '\n' ;" */
row[String[] columns] returns [Map<String,String> values]
locals [int col=0]
@init {
    $values = new HashMap<String,String>();
}
@after {
    if ($values!=null && $values.size()>0) {
        System.out.println("values = "+$values);
    }
}
/**源自规则“文件:hdr行+;”*/
文件
局部变量[int i=0]
:hdr(rows+=row[$hdr.text.split(“,”){$i++;})+
{
System.out.println($i+“行”);
for(rowr:$rows){
System.out.println(“行标记间隔:+r.getSourceInterval());
}
}
;
hdr:row[null]{System.out.println(“头:“+$text.trim()+””);
/**源自规则“行:字段(','字段)*'\r'?'\n';”*/
行[字符串[]列]返回[映射值]
局部变量[int col=0]
@初始化{
$values=newhashmap();
}
@之后{
如果($values!=null&&$values.size()>0){
System.out.println(“values=“+$values”);
}
}

查看生成的
CSVParser.java
。您可以在此生成的文件中找到内联代码。如果要访问这些值,只需访问
RowContext
values
字段即可

for (RowContext r : $rows) {
  System.out.println("row token interval: "+r.getSourceInterval());
  System.out.println("values: "+r.values);
}
但是,我建议不要在解析器语法中使用内联代码。ANTLR为您生成一个
访问者
和一个
侦听器
。侦听器/访问者代码被及时编译(如果您使用适当的IDE),而生成器内联代码直到生成时才被编译