BA-Sがあなたの質問の下にコメントに投稿したthe answerが見つかりませんでしたので、私は新しい回答を書き始めました。あまり説明がなければ(詳細は他の答えを読んでください)、ここではANTLRを使って単純な入力を解析してList<Person>
にする例を示します。埋め込みコードを含む次いで
grammar T;
parse
: person* EOF
;
person
: Name Word (Age Number)? Separator
;
Name
: 'Name:'
;
Age
: 'Age:'
;
Word
: ('a'..'z')+
;
Number
: ('0'..'9')+
;
Separator
: '-----'
;
Space
: (' ' | '\t' | '\r' | '\n') {skip();}
;
同じ文法しかし:
grammar T;
parse returns [List<Person> persons]
@init{$persons = new ArrayList<Person>();}
: (person {$persons.add($person.p);})* EOF
;
person returns [Person p]
: Name Word (Age Number)? Separator {$p = new Person($Word.text, $Number.text);}
;
Name
: 'Name:'
;
Age
: 'Age:'
;
Word
: ('a'..'z')+
;
Number
: ('0'..'9')+
;
Separator
: '-----'
;
Space
: (' ' | '\t' | '\r' | '\n') {skip();}
;
と、(class Person
付き)小テストクラス:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRFileStream("test.txt"));
TParser parser = new TParser(new CommonTokenStream(lexer));
java.util.List<Person> persons = parser.parse();
System.out.println(persons);
}
}
class Person {
final String name;
final int age;
public Person(String nm, String num) {
name = nm;
age = num == null ? -1 : Integer.valueOf(num);
}
@Override
public String toString() {
return String.format("{name=%s, age=%d}", name, age);
}
}
あなたの入力を説明
文法
test.txt
は、
Name: bob
Age: 14
-----
Name: alice
-----
あなたが今Main
を実行すると、以下が出力されます:この質問の答えのコードで
[{name=bob, age=14}, {name=alice, age=-1}]
ルック:[http://stackoverflow.com/questions/6526131/antlr-を空の状態を生成する] –