从上下文访问规则返回值

时间:2018-06-30 01:11:19

标签: antlr4

我正在使用this示例代码来更好地理解ANTLR。据我了解,row规则返回一个Map<String,String> valuesrows规则内的file标签收集所有RowContext对象。从file规则的for-each循环中,是否可以访问Map<String,String> values规则返回的row

如果没有,如何从row规则访问所有Map<String,String> values规则的file

代码段:

/** 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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

for (RowContext r : $rows) {
  System.out.println("row token interval: "+r.getSourceInterval());
  System.out.println("values: "+r.values);
}

但是,我建议不要在解析器语法中使用内联代码。 ANTLR为您生成一个Visitor和一个Listener。侦听器/访问者代码是按时编译的(如果使用适当的IDE),而生成器内联代码要等到生成时才编译。