2009-05-08 1 views
0

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

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

+1

Какой файл конфигурации? Тот, который вы собираетесь создать? тот, который уже существует? Какой формат он использует? –

+0

Также, какой язык программирования вы используете? Скорее всего, есть уже библиотеки, которые вы можете использовать для обработки этой работы. – bchang

ответ

2

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

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

Для XML см. Мой ответ об ANTXR ниже - он основан на ANTLR. –

0

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

http://www.yaml.org/

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 (и, если хотите, front-end может выполнить проверку). Код для запуска анализатора выглядит следующим образом:

// 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();