我正在使用this示例代码来更好地理解ANTLR。据我了解,row
规则返回一个Map<String,String> values
。 rows
规则内的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);
}
}
答案 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),而生成器内联代码要等到生成时才编译。