实现基于一组规则解析配置文件的系统的最佳方法是什么?我将非常感谢最佳实践或现有实施方向的任何指示。
编辑:我还没有决定不选择任何特定的语言,但我对Perl和Python都很满意。这些文件是路由器/交换机配置文件中具有不同功能部分的文件。
答案 0 :(得分:2)
假设这不是基于XML的配置文件,我可以recommend ANTLR吗?
答案 1 :(得分:0)
我经常使用YAML作为配置文件,它是轻量级的,并且有大量的库以不同的语言支持它。
答案 2 :(得分:0)
如果您正在考虑XML并使用Java,您可以尝试我的XML解析器生成器ANTXR,它基于ANTLR 2.7.x
有关详细信息,请参阅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();