基于规则的解析配置文件

时间:2009-05-08 20:19:45

标签: parsing rules

实现基于一组规则解析配置文件的系统的最佳方法是什么?我将非常感谢最佳实践或现有实施方向的任何指示。

编辑:我还没有决定不选择任何特定的语言,但我对Perl和Python都很满意。这些文件是路由器/交换机配置文件中具有不同功能部分的文件。

3 个答案:

答案 0 :(得分:2)

假设这不是基于XML的配置文件,我可以recommend ANTLR吗?

  • 根据您提供的EBNF样式语法规则文件生成解析器代码。
  • 将规则文件的图形编辑器作为Eclipse插件。
  • 非常强大且完善的解析器技术
  • 根据您对解析输出的要求,提供灵活性
  • 运行时环境允许使用C ++,C,C#,Java,Python和Ruby应用程序中的ANTLR进行解析。

答案 1 :(得分:0)

我经常使用YAML作为配置文件,它是轻量级的,并且有大量的库以不同的语言支持它。

http://www.yaml.org/

答案 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();