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