Как/чем лучше парсить текстовые файлы
От: Gregory Liokumovich  
Дата: 16.11.06 12:57
Оценка:
Задача прочитать файл формата смахивающего на лисп.
При этом незнакомые блоки (нечто заключенное в скобки) нужно просто игнорировать.

Типичный пример: мы знаем и понимаем «(text ‘title’)», а на вход подали модернизированный вариант «(text ‘title’ (font ‘ariel’))».

Сейчас парсер реализован на bison/flex и валится на неописанной конструкции «font».
Вопрос 1: можно ли настроить bison/flex чтобы получить желаемый результат?
Вопрос 2: какие еще библиотеки хорошо справляются с подобными задачами?
Re: Как/чем лучше парсить текстовые файлы
От: remark Россия http://www.1024cores.net/
Дата: 16.11.06 18:09
Оценка:
Здравствуйте, Gregory Liokumovich, Вы писали:

GL>Задача прочитать файл формата смахивающего на лисп.

GL>При этом незнакомые блоки (нечто заключенное в скобки) нужно просто игнорировать.

GL>Типичный пример: мы знаем и понимаем «(text ‘title’)», а на вход подали модернизированный вариант «(text ‘title’ (font ‘ariel’))».


GL>Сейчас парсер реализован на bison/flex и валится на неописанной конструкции «font».

GL>Вопрос 1: можно ли настроить bison/flex чтобы получить желаемый результат?
GL>Вопрос 2: какие еще библиотеки хорошо справляются с подобными задачами?

boost.spirit
Подкупает то, что всё встроено в код — никаких внешних описаний грамматик, внешних утилит и т.д.
Если чо-нить не очень сложное, то вполне подходит


antlr
Очень крутой и мощный парсер
Когда искал парсеры о нём слышал в основном только хорошее
Но придётся убить достаточно времени на изучение и встраивание всего этого дела в процесс сборки


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Как/чем лучше парсить текстовые файлы
От: vnp  
Дата: 16.11.06 20:05
Оценка:
Здравствуйте, Gregory Liokumovich, Вы писали:

GL>Задача прочитать файл формата смахивающего на лисп.

GL>При этом незнакомые блоки (нечто заключенное в скобки) нужно просто игнорировать.

GL>Типичный пример: мы знаем и понимаем «(text ‘title’)», а на вход подали модернизированный вариант «(text ‘title’ (font ‘ariel’))».


GL>Сейчас парсер реализован на bison/flex и валится на неописанной конструкции «font».

GL>Вопрос 1: можно ли настроить bison/flex чтобы получить желаемый результат?

Разумеется, можно. Прежде всего, ловить неизвестные "ключевые слова" прямо во флексе. Навскидку, должны помочь состояния (%s и/или %x).
Выделяете состояние KEYWORD, в которое сканер перейдет увидя открывающую скобку, и выйдет из него, прочтя первое слово. В состоянии KEYWORD должен быть catch-all case, который либо вернет парсеру токен UNKNOWN, либо переведет сканер в совсем новое состояние SKIP (в скипе нужно просто подсчитывать скобки и не возращать парсеру ничего, пока они не сбалансируются). На ваще усмотрение.

GL>Вопрос 2: какие еще библиотеки хорошо справляются с подобными задачами?


Честно говоря, для лиспообразного формата в первую очередь приходит в голову собственно лисп.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.