【问题标题】:Rules based parsing for configuration files基于规则的配置文件解析
【发布时间】:2009-05-08 20:19:45
【问题描述】:

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

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

【问题讨论】:

  • 什么样的配置文件?你要创建一个?一个已经存在的?它使用什么格式?
  • 另外,您使用的是什么编程语言?很有可能,已经有一些库可以用来处理这方面的繁重工作。

标签: parsing rules


【解决方案1】:

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

  • 根据您提供的 EBNF 样式语法规则文件生成解析器代码。
  • 具有规则文件的图形编辑器作为 Eclipse 插件。
  • 非常强大且可靠的解析器技术
  • 灵活地处理解析后的输出
  • 运行时环境允许在 C++、C、C#、Java、Python 和 Ruby 应用程序中使用 ANTLR 进行解析。

【讨论】:

  • 对于 XML,请参阅下面我对 ANTXR 的回答——它基于 ANTLR。
【解决方案2】:

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

http://www.yaml.org/

【讨论】:

    【解决方案3】:

    如果您正在考虑使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多