Чем парсить тексты?

kruzer25

Где-то встречал какой-то такой синтаксис (где, уже не помню):
whitespace : " "
whitespace : "\t"
whitespace : "\r"
whitespace : "\n"
whitespace : whitespace & whitespace
whitespaceorempty : ""
whitespaceorempty : whitespace
curlyopen : "{"
curlyclose : "}"
semicolon : ";"
non-zero-digit : "1".."9"
digit : "0".."9"
number : non-zero-digit
number : number & digit
instruction : number & semicolon
instruction : program
programbody : instruction
programbody : programbody & whitespaceorempty & instruction
program : curlyopen & whitespaceorempty & programbody & whitespaceorempty & curlyclose
program :
__body : program

Хочется из этого и
{
12;
{ 45; 6; }
78;
}

получить какую-то структуру вроде
<node type="__body">
<value>{
12;
{ 45; 6; }
78;
}</value>
<node type="program">
<value>{
12;
{ 45; 6; }
78;
}</value>
<node type="curlyopen"><value>{</value></node>
<node type="whitespaceorempty"><value>
</value></node>
<node type="programbody">
<value>12;
{ 45; 6; }
78;</value>
<node type="instruction">
<value>12;</value>
<node type="number">
<value>12</value>
<node type="non-zero-digit"><value>1</value></node>
<node type="digit"><value>2</value></node>
</node>
<node type="semicolon"><value>;</value></node>
</node>
<node type="whitespaceorempty"><value>
</value>
<node type="program">
<value>{ 45; 6; }</value>
...
</node>
...
</node>
<node type="whitespaceorempty"><value>
</value></node>
<node type="curlyclose"><value>}</value></node>
</node>
</node>

Чем это можно сделать?
Просто не хочется руками писать конкретный парсер; накопал решения вроде flex - но они некрасивы; там для каждого элемента нужно сразу писать, что с ним делать; и они на выходе дают не готовую структуру для входного текста, а программу на некотором языке, в которую этот текст надо засунуть - это как-то совсем уж некрасиво.

oliver11

ANTLR, кажется, умеет AST в XML сериализовывать.

kruzer25

Необязательно XML, я тут XML написал просто потому что так понятнее, что за структура нужна.
А этот ANTLR, насколько я понимаю, работает по тем же принципам, что и Flex - для заданных правил пишет программу на нужном языке; это не так интересно, как если бы была готовая .NET программа, которая получала на входе правила, обрабатывала их, запоминала, и тут же в соответствии с ними парсила тексты и отдавала готовые объекты.

oliver11

ANTLR для заданных грамматик генерирует лексичечский и синтаксический анализаторы, с помощью которых ты можешь преобразовать входной поток символов в абстрактное синтаксическое дерево, с которым потом можно делать, что хочешь.
Не вижу проблем с помощью ANTLR написать то, что ты хочешь. Правда, он джаву хочет. :)
У ANTLR даже уже есть готовые языки для описания грамматик и того, что с получившимися AST делать (смотри TreeParser-ы). Кода кроме грамматик придётся написать строчек 20.

VitMix

Я так понимаю автору нужен не генератор парсеров, а универсальный парсер.
Вообще, это хорошая задачка по программированию для студентов :)

Serab

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

Dasar

Я так понимаю автору нужен не генератор парсеров, а универсальный парсер
что такое "универсальный парсер"?

kruzer25

"Универсальный парсер" - это программа, которая парсит тексты по произвольным заданным правилам, не создавая какие-то промежуточные программы.
Например, в случае с flex универсальным парсером является только целый комбайн flex+gcc+libc+etc. А мне не хочется, чтобы в комплект парсера входили какие-то там компиляторы си, так не интересно.
Ну и хочется, чтобы мы за пределы парсера вообще не вылезали - тогда в flex надо будет интегрировать компилятор си и интерпретатор машинных кодов.

Serab

И ты действительно хочешь такой парсер, который во время работы должен парсить еще что-то? У тебя что, грамматика на лету изменяется, я вот не понимаю.
Если что flex'а достаточно только для самых топорных грамматик. Полуркай еще yacc (bison).

kruzer25

У тебя что, грамматика на лету изменяется
Совсем на лету - не изменяется.
Но когда при каждом изменении грамматики мы получаем новые исходники на си, которые надо снова компилировать в бинарники - неспортивно.
Ах да, и ещё, насколько я понимаю, при этом придётся в правилах (грамматике) писать куски кода на языке, на который этот ваш yacc или flex скомпилируют эту грамматику. Это уже как-то совсем уныло.

Dasar

"Универсальный парсер" - это программа, которая парсит тексты по произвольным заданным правилам, не создавая какие-то промежуточные программы.
.net-ные генераторы под это подходят, т.к. парсер может создаваться и на лету.

kruzer25

.net-ные генераторы под это подходят
Что значит ".net-ный генератор"? Я так понимаю, тот, который работает под .net?
Можно примеры таких? В статье в википедии про платформы генераторов ничего не сказано - только про целевые языки.

kruzer25

Ничего ты, Михаил, не понимаешь в хороших задачках.
Моя задачка - слишком простая? :crazy:
ЗЫ: Вообще, у меня почему-то при взгляде на грамматику из первого поста сразу возникают ассоциации со всякими там хаскеллями и прологами. Ещё бы понять, при чём тут они.

Dasar

Можно примеры таких? В статье в википедии про платформы генераторов ничего не сказано - только про целевые языки.
как минимум все те где написано Development Platform = .Net Framework.

kruzer25

Мне кажется, что там речь всё-таки немного не о том. Почти у всех написано Development Platform = all, и что-то мне кажется, что это означает "наш генератор сделает код для любой платформы, для какой напишете куски кода в описании грамматики", а не "наш генератор существует в версиях для .NET, Java, и даже виртуальной машины васи пупкина".

Dasar

как минимум все те где написано Development Platform = .Net Framework.

karkar

OSLO & M?

yolki

GoldParser посмотри.
Мы как-то таким пользовались. там единственная заморочка - компиляция таблиц для него.
т.е. там идея примерно такая: в парсер в рантайме можно подгружать таблицы, скомпилированные отдельно. сам парсер был открытым, компилятор таблиц - закрытым (поставлялась cl-утилита и dll для компиляции таблиц).
upd.
за 5 лет "eventually" так и не свершилось..
Are you going to release the Builder source code?
Eventually the source code will be released, but this will be some time from now.
http://devincook.com/goldparser

Serab

Ничего ты, Михаил, не понимаешь в хороших задачках.
Моя задачка - слишком простая?
Нет, но «хорошая задачка для студента» — это, к примеру, написать парсер заданной грамматики. А вот написать генератор парсеров — это уже надолго и не так просто. Вот например, пользователь за пару месяцев не напишет некоторого подобия bison.

VitMix

Вот например, пользователь за пару месяцев не напишет некоторого подобия bison.
Смелое утверждение :)
Оставить комментарий
Имя или ник:
Комментарий: