2012-01-25 7 views
2

に私はこの1つ(仮想例)などのデータファイルを解析する:解析データファイル

Name: bob 
Age: 14 
----- 
Name: alice 
----- 

は、ファイルの形式は、私が望んでいないことを十分に複雑であること、この例では、のは、仮定しようそれを直接コーディングする。私はより良いパーサを得るためにANTLRを使うことを好む。

ここに質問があります:どのようにANTLRを使ってこのデータをリストのような構造にマップできますか?私は完全な文法は必要ありませんが、そのようなデータをどのようにデータ構造にマップできるかについての説明だけです。

+0

ルック:[http://stackoverflow.com/questions/6526131/antlr-を空の状態を生成する] –

答えて

3

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}] 
+0

私の質問に完全に答えます。どうもありがとう! – plmaheu

+0

あなたは大歓迎です、@pboy。 –

関連する問題