Antlr阵列帮助

Antlr阵列帮助,antlr,Antlr,嘿,我开始在java中使用Antlr,我想知道如何将一些值直接存储到2d数组中并返回这个数组?我找不到任何关于这方面的教程,所有的帮助都没有了。这里是我制作的语法的一些摘录,它解析人名并返回一个名称对象。应该足以向你展示它是如何工作的。其他对象(如数组)的处理方式与此相同 在语法上: grammar PersonNames; fullname returns [Name name] @init { name = new Name(); } : (directory_style[na

嘿,我开始在java中使用Antlr,我想知道如何将一些值直接存储到2d数组中并返回这个数组?我找不到任何关于这方面的教程,所有的帮助都没有了。

这里是我制作的语法的一些摘录,它解析人名并返回一个
名称
对象。应该足以向你展示它是如何工作的。其他对象(如数组)的处理方式与此相同

在语法上:

grammar PersonNames;

fullname returns [Name name]
@init {
    name = new Name();
}
  : (directory_style[name] | standard[name] | title_without_fname[name] |      family_style[name] | proper_initials[name]) EOF;

standard[Name name]
 : (title[name] ' ')* fname[name] ' ' (mname[name] ' ')* (nickname[name] ' ')? lname[name] (sep honorifics[name])*;

 fname[Name name] : (f=NAME | f=INITIAL)  { name.set(Name.Part.FIRST, toNameCase($f.text)); };
java -cp antlr-3.2.jar org.antlr.Tool Number.g
在常规Java代码中

public static Name parseName(String str) throws RecognitionException {
    System.err.println("parsing `" + str + "`");
    CharStream stream = new ANTLRStringStream(str);
    PersonNamesLexer lexer = new PersonNamesLexer(stream);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    PersonNamesParser parser = new PersonNamesParser(tokens);

    return parser.fullname();
}

假设您想要解析一个包含由空格分隔的数字的平面文本文件。您希望将其解析为一个包含
int
的2d数组,其中每一行都是数组中的一行

这种“语言”的ANTLR语法可能如下所示:

grammar Number;

parse
  :  line* EOF
  ;

line
  :  Number+ (LineBreak | EOF)
  ;

Number
  :  ('0'..'9')+
  ;

Space
  :  (' ' | '\t') {skip();}
  ;

LineBreak
  :  '\r'? '\n'
  |  '\r'
  ;
现在,您希望让
parse
规则返回
List
对象的
List
。在
解析
规则之后添加一个
返回[列表编号]
,该规则可以在
@init{…}
块中初始化:

parse returns [List<List<Integer>> numbers]
@init {
  $numbers = new ArrayList<List<Integer>>();
}
  :  line* EOF
  ;
下一步是用正在解析的实际值填充
列表。这可以通过将代码
{$row.add(Integer.parseInt($Number.text));}
嵌入
Number+
循环中的
规则来实现:

line returns [List<Integer> row]
@init {
  $row = new ArrayList<Integer>();
}
  :  (Number {$row.add(Integer.parseInt($Number.text));})+ (LineBreak | EOF)
  ;
parse returns [List<List<Integer>> numbers]
@init {
  $numbers = new ArrayList<List<Integer>>();
}
  :  (line {$numbers.add($line.row);})* EOF
  ;
以下是最后的语法:

grammar Number;

parse returns [List<List<Integer>> numbers]
@init {
  $numbers = new ArrayList<List<Integer>>();
}
  :  (line {$numbers.add($line.row);})* EOF
  ;

line returns [List<Integer> row]
@init {
  $row = new ArrayList<Integer>();
}
  :  (Number {$row.add(Integer.parseInt($Number.text));})+ (LineBreak | EOF)
  ;

Number
  :  ('0'..'9')+
  ;

Space
  :  (' ' | '\t') {skip();}
  ;

LineBreak
  :  '\r'? '\n'
  |  '\r'
  ;
编译所有
.java
源文件:

javac -cp antlr-3.2.jar *.java
并运行主类:

// On *nix
java -cp .:antlr-3.2.jar Main

// or Windows
java -cp .;antlr-3.2.jar Main
将生成以下输出:

[[1, 2], [3, 4, 5, 6, 7], [8], [9, 10, 11]]

HTH

非常感谢这太好了
// On *nix
java -cp .:antlr-3.2.jar Main

// or Windows
java -cp .;antlr-3.2.jar Main
[[1, 2], [3, 4, 5, 6, 7], [8], [9, 10, 11]]