· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Парсер/лексический анализатор...

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 12, 2004 22:15:04

Есть у мя проект на жабе...
(Quantum, кстати, спасибо за идею с архитектурой!)

Дык вот, есть текстовый файл примерно такого вида:
%objects
{
	BIND-Condition(1)
	BIND-loc-siteA(1)
	BIND-loc-siteB(1)
}

%common=5
{
	Author	(vasya, pupkin, organization|ATP|Toronto|zzz|Canada|some street|me@here.com|123-456-789|321-654-987|M2Z 45F)
	Author	(fedya, NULL, NULL)
	BIND_pub_object	(1, 12457)
	BIND_pub_object	(2, 4576)
	BIND_Interaction_division(metazoa)

}

%keywords = 23
{
	BINDObjectTypeId
	Org_ref
	BINDObject_short_label
	BINDObject_other_names
	BINDObject_descr
	BIND_other_db
	BIND_loc_site
	BIND_loc_site_source
	BIND_id_Geninfo_id
	BINDObjectTypeId
	BINDObject_short_label
	BINDObject_other_names
	BINDObject_descr
	BIND_other_db
	BIND_loc_site
	BIND_loc_site_source
	BIND_id_Geninfo_id
	BIND_condition_system
	BIND_condition_general
	BIND_condition_descr
	BINDdescr_simple_descr
	BIND_condition_bait_condition
	BIND_condition_source
}

(A)protein	(A)280|Xanthobacter autotrophicus	(A)short_label	(A)aaa|bbb	(A)some shit	(A)EntrezGeneID|5089|NULL	(A)(0)58-169|NULL	(A)(0)2|12457	(A)4545 6787	(B)protein	(B)short_label	(B)aaa|bbb	(B)some  shit	(B)EntrezGeneID|5089|NULL	(B)(0)58-169|NULL	(B)(0)2|12457	(B)4545 6787	(0)1	(0)0	(0)some  desc	some description of the interaction	(0)0	(0)2|4576	


Задача.
Пропарсить такой файл. После последней закрывающей фигурной скобки идут данные - таких строк может быть от 1 до нескольких десятков тысяч.
Парсер обрабатывает txt файл и, юзая чудовищно огромную API, выдает XML-файл согласно некоторой спецификации.
На данный момент я парсаю файл в лоб. При помощи регулярок, построчной обработкой и т.п. Основной минус такого подхода - это то, что какая-нибудь чукча просто постоянно вставит где-нибудь лишний пробельчик, символ табуляции, левую запятую и все грохается к херам. И мне приходится то регулярки править, то еще чего-нибудь в этом же роде. Надоело!
Есть же компиляторы. Есть же у них синтаксические анализаторы. И вполне успешно справляются с тупыми ошибками. Во всяком случае, лишней запятой или пробелом их не прибить ;) Хочу что-то такое подобное.
Просто в голове пока каша, может быть, ваши ответы ее смогут упорядочить...


Дата: Ноя 12, 2004 22:16:17

Тьфу, не синтаксические, а лексические. Мне нужно что-то вроде лексического анализатора... Типа какой-нибудь такой парсер + внутренняя таблица символов... Наверное... Мнения?


Дата: Ноя 12, 2004 23:26:31

volodya
Привет!

Неужели регулярные выражения не могут отсеить лишний пробельчик, символ табуляции, левую запятую?


Дата: Ноя 12, 2004 23:31:58

Могут, но ты представляешь с какой тщательностью их приходится выбирать? Я уже очумел их переделывать!


Дата: Ноя 12, 2004 23:32:44

душа чего-то такого эдакого просит :)


Дата: Ноя 12, 2004 23:36:53 · Поправил: Sten

volodya imho, гну-шный flex создан специально для твоего случая. :)) А если скрестить его с bison для грамматического анализа тогда у-у.. будет сообще супер. :)

P.S. упс. Проглядел что проект на жабе. Тогда не знаю, быть может написать парзер все-таки на C (flex+bison)? :)


Дата: Ноя 12, 2004 23:58:48

Да нет, вот это уже будет чересчур :) Парсер на жабе, а не на С. Пардон :)
Что-то свое написать с нуля...
Ладно, на выходных почитаю драконовскую книжку и чем-нибудь своим с нуля разрожусь за недельку...


Дата: Ноя 13, 2004 04:08:15

volodya
Драконовская книжка помогает понять принцип работы старых компилеров, но на базе голой теории разродиться чем-нибудь своим... эт будет очень сложно, IMHO. Кстати, про С vs. Java, не забывай что жаба имеет JNI, т.е. интерфейс для нативного кода.


Дата: Ноя 13, 2004 12:34:25 · Поправил: Valery

угу. на что-то похожее наткнулся недавно. представь себе файл из неск тыс ПОЛУвыровненных (по шаблону) сиквенсов. Парсятся без проблем. И вдруг огромный кусок файла совсем битый - не только выравнивание полностью поехало но и разделители нестандартные. Т.е. не то что бы битый - просто первый кусок сгенерил такой же идиот, но это был ДРУГОЙ идиот с другими условностями. Я офигел и перетащил этот кусок в sql, запросами разобрал 100 случаев совсем офигел и тогда скормил все сям - просто уничтожил нафиг все полувыравнивание (шаблонное) и ровнял уже заново все.


Дата: Ноя 14, 2004 06:58:43

До сих пор непонятно, что нужно?
-- игнорировать мусор
-- обнаруживать и тыкать юзера носом в мусор
-- преобразовывать кавычку в &quote; и т. п.


Дата: Ноя 14, 2004 19:09:38

Володя, у нас сейчас идет курс "теория языков программирования". На лабах мы как раз анализаторы делаем. Есть сносная теория по вопросу - лекции в электронном виде. Мне удалось разобраться без посещения лекций вообще, так что думаю они могут тебе помочь. Это, конечно, если решишь с нуля писать.

Если заинтересовал, могу выслать. Или можно в онлайне увидеть тут: ermak.cs.nstu.ru/trans/


Дата: Ноя 14, 2004 19:11:34

captain cobalt
Это не существенно. Это семантика, а интересует в первую очередь лексика, ведь так?


Дата: Ноя 14, 2004 19:15:28

Есть куча или несколько ;-) книг(лекций ввиде книг) по написанию компиляторов, там рассматривается теория разработки лексических анализаторов.


Дата: Ноя 14, 2004 19:32:07

n0p> Это семантика, а интересует в первую очередь лексика, ведь так?

В том то и дело, что проблема как следует не поставлена.
Возможно, лексическим анализатором тут не отделаться. ;)


Дата: Ноя 14, 2004 19:48:34

captain cobalt

Я не пытаюсь ставить проблему. И не выдаю ТЗ. Это мой проект, который я делаю сам. Просто, читая посты, я пытаюсь собрать мысли в кучу. Вот и все :)

Теперь немножко более детально.
Секции "%keywords" и "%common" содержат имена хендлеров, которые подключаются через reflection. Порядок расположения хендлеров в "%keywords" определяет расположение элементов собственно тела файла (строк с данными, которых может быть от 1 до десятков тысяч). Т.о. от анализатора файла мне требуется следующее:

1) Получить имя хендлера без пробелов и любого другого мусора.
2) В случае секций "%common" и "%objects" получить имя хендлера + данные, несмотря на возможные лишние пробелы и т.п.
3) При парсе собственно тела файла (не заголовка) лишние табы должны игнорироваться.
4) Секции "%common", "%objects", "%keywords" могут следовать в произвольном порядке
5) Если файл где-то сформирован неверно - надо уведомить юзверя об ошибках

Примерно так :)

n0p
Хорошо. Давай. Мыло знаешь. Спасибо.

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.098