Анализ на основе правил для файлов конфигурации - PullRequest
0 голосов
/ 09 мая 2009

Каков наилучший способ реализации системы анализа файла конфигурации на основе набора правил? Буду признателен за любые указания в отношении лучших практик или существующих реализаций.

Редактировать: я еще не решил не выбирать какой-либо конкретный язык, но мне комфортно и с Perl, и с Python. Эти файлы находятся в конфигурационных файлах Router / Switch с различными функциональными разделами.

Ответы [ 3 ]

2 голосов
/ 09 мая 2009

Если предположить, что это не файл конфигурации на основе XML, могу я рекомендовать ANTLR ?

  • Создает код анализатора на основе предоставленного вами файла правил грамматики стиля EBNF.
  • Имеет графический редактор для файла правил в виде плагина Eclipse.
  • Очень мощная и надежная технология парсера
  • Гибкость с точки зрения того, что вы хотите делать с анализируемым выводом
  • Среды выполнения позволяют выполнять синтаксический анализ с помощью ANTLR в приложениях C ++, C, C #, Java, Python и Ruby.
0 голосов
/ 12 мая 2009

Если вы думаете о 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();
0 голосов
/ 09 мая 2009

Я часто использую YAML для файлов конфигурации, он легок и есть тонна библиотек, поддерживающих его на разных языках.

http://www.yaml.org/

...