一連のルールに基づいて構成ファイルを解析するためのシステムを実装するための最良の方法は何ですか? ベスト プラクティスまたは既存の実装の方向性についての指針をいただければ幸いです。
編集: 特定の言語を選択しないと決めたわけではありませんが、Perl と Python の両方に慣れています。ファイルは、さまざまな機能セクションを持つルーター/スイッチ構成ファイルに沿ったものです。
XML を考えていて Java を使用している場合は、ANTLR 2.7.x に基づいた、私の XML パーサー ジェネレーター ANTXR を試すことができます。
詳細については、 http://javadude.com/tools/antxr/index.htmlを参照してください。
例:
XML ファイル:
<?xml version="1.0"?>
<people>
<person ssn="111-11-1111">
<firstName>Terence</firstName>
<lastName>Parr</lastName>
</person>
<person ssn="222-22-2222">
<firstName>Scott</firstName>
<lastName>Stanchfield</lastName>
</person>
<person ssn="333-33-3333">
<firstName>James</firstName>
<lastName>Stewart</lastName>
</person>
</people>
パーサー スケルトン:
header {
package com.javadude.antlr.sample.xml;
}
class PeopleParser extends Parser;
document
: <people> EOF;
<people>
: (<person>)*
;
<person>
: ( <firstName>
| <lastName>
)*
;
<firstName>
: PCDATA
;
<lastName>
: PCDATA
;
実際にデータを処理するパーサー:
header {
package com.javadude.antlr.sample.xml;
import java.util.List;
import java.util.ArrayList;
}
class PeopleParser extends Parser;
document returns [List results = null]
: results=<people> EOF
;
<people> returns [List results = new ArrayList()]
{ Person p; }
: ( p=<person> { results.add(p); } )*
;
<person> returns [Person p = new Person()]
{ String first, last; }
: ( first=<firstName> { p.setFirstName(first); }
| last=<lastName> { p.setLastName(last); }
)*
;
<firstName> returns [String value = null]
: pcdata:PCDATA { value = pcdata.getText(); }
;
<lastName> returns [String value = null]
: pcdata:PCDATA { value = pcdata.getText(); }
;
私はこれを何年も使用しており、職場の人々に見せたとき、最初の「文法に慣れる」学習曲線の後、彼らは本当にそれを気に入っています.
SAX または XMLPull フロントエンドを使用できることに注意してください (必要に応じてフロントエンドで検証を行うこともできます)。パーサーを実行するコードは次のようになります
// Create our scanner (using a simple SAX parser setup)
BasicCrimsonXMLTokenStream stream =
new BasicCrimsonXMLTokenStream(new FileReader("people.xml"),
PeopleParser.class, false, false);
// Create our ANTLR parser
PeopleParser peopleParser = new PeopleParser(stream);
// parse the document
peopleParser.document();