Comments 72
Писал шаблонизатор, а зачем вам результаты этого опроса?
Не совсем написание, скорее генерация, использовался javaCC. Правда, сгенерированный парсер пришлось допиливать напильником. Задача — разбор выражений, сходных с WHERE-блоком SQL, для фильтрации выборок на клиентской стороне (толстый клиент).
Я думаю почти все писали парсер для какого-нибудь сайта или странички.
Кстати, я ожидал, что будет больше тех, кто пытался создать свои языки, чем тех, кто писал разборщики для существующих.
Интересно какие цели вы преследовали, обучение, бизнес-задачи?
Интересно какие цели вы преследовали, обучение, бизнес-задачи?
Писал парсеры для DSLей для своих проектов — code.google.com/p/octalforty-wizardby/ и code.google.com/p/octalforty-chinchillin/
На bison в универе делал штуку для символьных вычислений на C/C++ (вычисление выражений, символьное дифференцирование и тд).
На практике написания парсеров для создания новых ЯП и языков разметки стараюсь избегать (пока успешно), т.к. слишком легко сделать ненужный велосипед, который нужно будет как-то поддерживать и в котором потом никто не разберется. Хотя полезные применения всему этому, безусловно, есть.
На практике написания парсеров для создания новых ЯП и языков разметки стараюсь избегать (пока успешно), т.к. слишком легко сделать ненужный велосипед, который нужно будет как-то поддерживать и в котором потом никто не разберется. Хотя полезные применения всему этому, безусловно, есть.
Хм. Интерпретаторы эзотерические языков считаются? :-) По-моему, это не совсем тот парсер, о котором вы спрашиваете.
На самом деле мне очень интересны случаи, когда парсеры создавались для решения бизнес задач. Например, я случай, когда создание своей легкой встраиваемой VM и своего языка для этой VM помогло защитить программу от взломов: важная часть алгоритма была написана под эту VM и сильно усложняла reverse engineering.
Если вы написали комментарий о создании парсеров и вас интересует скидка (5%) — пишите в личку.
Если вы написали комментарий о создании парсеров и вас интересует скидка (5%) — пишите в личку.
Писал парсер объектного языка запросов (типа HQL в Hibernate) с целью его трансляции в обычный SQL. Также делал попытки написать свой язык программирования. Думаю, что многие мечтали сделать что-то свое, но вот у меня пока нет особого результата.
писал, довольно много разных парсеров, под разные нужды, на нескольких языках (конкретно, c, cpp, php, c#). чаще всего парсить приходилось ответ от каких-либо web ресурсов, реже — конфиги. по мере возможности (а это довольно часто) использую для этого regexpы.
ИМХО, хотелось бы, чтобы веб-проекты поддерживали отдачу в json, сие существенно облегчает задачу легального парсинга.
ИМХО, хотелось бы, чтобы веб-проекты поддерживали отдачу в json, сие существенно облегчает задачу легального парсинга.
писал парсер soap wsdl иногда даже к нему возвращаюсь.
Во что WSDL транслировался? XSLT не хватало?
XSLT вообще из другой оперы на основе WSDL клиент строит библиотеку прокси классов и моделей с ними в свою очередь общается адаптер который отдает данные на тонкий клиент и принимает от него данные на вход. Классы и модели динамически генерируются при каждом изменении WSDL.
Как выяснилось на практике базовый пхп клиент soap мягко выражаясь далеко не оптимальное решение и приходиться писать свое решение.
Как выяснилось на практике базовый пхп клиент soap мягко выражаясь далеко не оптимальное решение и приходиться писать свое решение.
Много всего писал :)
И для существующего языка (Си) — лексический анализатор + синтаксический парсинг. Никаких lex'ов и yacc'ов, всё самостоялтельно )
И для своей поделки, простенькое ООП-расширение Си, где-то между плюсов и Obj-C, на более сложные вещи пока меня не хватает.
Конфиги тоже соответственно парсил в довольно сложном формате.
Ну и как же без своих велосипедов на популярные форматы — xml(rss/atom), html.
И для существующего языка (Си) — лексический анализатор + синтаксический парсинг. Никаких lex'ов и yacc'ов, всё самостоялтельно )
И для своей поделки, простенькое ООП-расширение Си, где-то между плюсов и Obj-C, на более сложные вещи пока меня не хватает.
Конфиги тоже соответственно парсил в довольно сложном формате.
Ну и как же без своих велосипедов на популярные форматы — xml(rss/atom), html.
Ага, мы в универе тоже лексический анализатор + синтаксический разбор по разным моделям делали. Мне пришлось писать детерминированный нисходящий и восходящий разбор для трансляции из Си в Паскаль и наоборот. Правда, грамматики писались только для пары простых операторов и циклов/условий. Написано было все криво — но аж для трех человек, так что комментарий стоял на каждый блок в три строки :).
Ну а потом, на работе, все эти знания пригодились и для парсинга сложных по структуре страниц (лукэтми не отдавал полный RSS, приходилось брать по ссылкам из фида всю страницу и вытаскивать контент, попутно обрезая кучу всего — а формат постов у них там чуть ли не вручную изменяется, и мусора полно разного чуть ли не в каждом новом посте), и для уравнений, которые должны были решаться прямо в инпутах программы.
Что уж говорить о регэкспах — регулярками можно решить любую проблему, кроме тех, что
возникает при их использовании. Сейчас вот мучаюсь, расширяя PHPWord своим классом шаблонизатора (они поленились написать что-то кроме вставки переменных — ни условий, ни циклов), чтобы из шаблонов docx печатать договора. Вот дойдет до меня, что вложенных условий регулярками не сделаешь, начну писать парсер :). Но это уже, наверное, после того, как прикручу ODF, а может, и doc (ну очень не хватает такой же универсальности, как и в PHPExcel).
Ой, что-то я разбалаился. Простите.
Ну а потом, на работе, все эти знания пригодились и для парсинга сложных по структуре страниц (лукэтми не отдавал полный RSS, приходилось брать по ссылкам из фида всю страницу и вытаскивать контент, попутно обрезая кучу всего — а формат постов у них там чуть ли не вручную изменяется, и мусора полно разного чуть ли не в каждом новом посте), и для уравнений, которые должны были решаться прямо в инпутах программы.
Что уж говорить о регэкспах — регулярками можно решить любую проблему, кроме тех, что
возникает при их использовании. Сейчас вот мучаюсь, расширяя PHPWord своим классом шаблонизатора (они поленились написать что-то кроме вставки переменных — ни условий, ни циклов), чтобы из шаблонов docx печатать договора. Вот дойдет до меня, что вложенных условий регулярками не сделаешь, начну писать парсер :). Но это уже, наверное, после того, как прикручу ODF, а может, и doc (ну очень не хватает такой же универсальности, как и в PHPExcel).
Ой, что-то я разбалаился. Простите.
Писал парсер формулы для создания ее рисунка в нормальном виде.
Писал на PHP парсер сложных плейсхолдеров и условных блоков для SQL-запросов.
Писал парсеры для перевода файлов из одного формата данных в другой, а также писал свой XML-парсер, который активно использую.
Да. пишу в комментариях, пользовался ANTLR, этот инструмент генерирует код парсера на некоторых популярных языках, имеет графическую среду разработки ANTLTWorks с дебагером и визуализацией дерева.
Писал парсер для языка BSDL описания граничного сканирования печатных плат (для тестирования), это подмножество VHDL
Писал парсер для языка BSDL описания граничного сканирования печатных плат (для тестирования), это подмножество VHDL
Писал компилятор для своего процессора на питоне.
Да, для формата DXF. Конечная цель — разобрать файл и нарисовать картинку в собственной программе. Наибольшие трудности возникли со сплайнами, но и они в итоге были побеждены.
Программа фактически являлась пользовательским интерфейсом для вывода картинки для вырезания её лазером по металлу. Не гравировка, а именно вырезание деталей, хотя гравировку тоже можно было делать.
Программа фактически являлась пользовательским интерфейсом для вывода картинки для вырезания её лазером по металлу. Не гравировка, а именно вырезание деталей, хотя гравировку тоже можно было делать.
Время от времени пишу парсеры, чтобы слить 100500 pdf'ок с сайта или столько же роликов с какого-либо ресурса, чтобы иметь к контенту доступ оффлайн. wget + bash + sed (возможно еще и clive, если слить нужно много роликов с youtube) — идеальный набор юного парсера для этих целей (:
Каждый веб-программист рано или поздно пишет парсер: либо для работы, либо для себя.
По-моему, это очевидно.
По-моему, это очевидно.
Да, для языка разметки
Да, для разбора сложного конфига
Да, для извлечения данных (например, микроформаты)
писал свой HTML-Render
Да, для разбора сложного конфига
Да, для извлечения данных (например, микроформаты)
писал свой HTML-Render
Писал довольно много простейших парсеров, вроде вытаскивания каких то параметров из конфигов и прочей мелочи. Однако был и довольно интересный калькулятор компилятор математических выражений, с возможностью определения констант, реализацией своих функций, и прочими мелочёвками вроде вывода промежуточных значений, нано-микро матлаб в общем :), до рисование графиков дело правда не дошло, но суть не в этом. Интересен он тем что весь разбор выражений был писан ручками с использованием функционала std::wstring безо всяких regexp. Реализация скажем так доставляла :)
Писал транслятор некоего обобщённого SQL в MSSQL и Oracle.
Писал парсер нашего проекта для генерации страниц в dokuwiki с описанием классов и методов.
Помню забавный случай, когда пришлось писать на C++(он наиболее знаком) конвертор из FoxPro в Java довольно простого, но большого модуля.
Помню забавный случай, когда пришлось писать на C++(он наиболее знаком) конвертор из FoxPro в Java довольно простого, но большого модуля.
Парсер HTTP-запросов; парсер HTML; парсер плейлистов для плееров iRiver. И все это на VB, что лишь добавляло «остроты» процессу…
В качестве курсового проекта в институте делал интерпретатор PHP :D
Ну и писал парсеры для многочисленных сайтов, но это скорее не парсер, а «бот». Бот не спамерский конечно. А для облегчения жизни контрибуторов фотобанков.
Ну и писал парсеры для многочисленных сайтов, но это скорее не парсер, а «бот». Бот не спамерский конечно. А для облегчения жизни контрибуторов фотобанков.
изобретал свой язык разметки — аналог markdown, более приспособленный для русской раскладки.
по сей день вполне успешно используется на одном форуме, почти полностью вытеснив традиционные бб-коды (оставленные как альтернативный вариант форматирования на выбор пользователя).
по сей день вполне успешно используется на одном форуме, почти полностью вытеснив традиционные бб-коды (оставленные как альтернативный вариант форматирования на выбор пользователя).
На 1 курсе писал интерпретатор для придуманного на скучных лекциях языка Lex (некотое подобие ассемблера :) Тогда мне казалось, что я реально что-то новое изобретаю :)
Вот сортировка пузырьком на Lex'е:
Чисто кому-нить посмеяться — ссылка на архив с интерпретатором и 15 примеров программ на Lex rghost.ru/5279136
Писан на Delphi 7
Вот сортировка пузырьком на Lex'е:
// ПУЗЫРЬКОВАЯ СОРТИРОВКА
FREEST
VAR N
SET N 10
VAR[] A N
CALL STARTRAND // RANDOMIZE LIKE
VAR VAL
VAR I
SET I 0
LABEL IAGAIN
ABOVEEQU I N
IFGOTO IEND
PAR 20
CALL RAND
RETVAL VAL
SUB VAL 10 // VAL = RANDOM[-10..10]
SET[] A I VAL // A[I] = VAL
WRITE "A[" WRITE I WRITE "] = " WRITELN VAL
ADD I 1
GOTO IAGAIN
LABEL IEND
VAR J
VAR N-1
SET N-1 N
SUB N-1 1
VAR A[J]
VAR A[J+1]
VAR J+1
VAR K
SET K 0
LABEL KAGAIN
ABOVEEQU K N
IFGOTO KEND
SET J 0
LABEL JAGAIN
ABOVEEQU J N-1
IFGOTO JEND
GET[] A J
RETVAL A[J]
SET J+1 J
ADD J+1 1
GET[] A J+1
RETVAL A[J+1]
LESSEQU A[J] A[J+1]
IFGOTO JINC
SET[] A J A[J+1] // SWAP(A[J], A[J+1])
SET[] A J+1 A[J]
LABEL JINC
ADD J 1
GOTO JAGAIN
LABEL JEND
ADD K 1
GOTO KAGAIN
LABEL KEND
NEXTLN
VAR M
SET M 0
LABEL MAGAIN
ABOVEEQU M N
IFGOTO MEND
GET[] A M
RETVAL VAL
WRITE "A[" WRITE M WRITE "] = " WRITELN VAL
ADD M 1
GOTO MAGAIN
LABEL MEND
Чисто кому-нить посмеяться — ссылка на архив с интерпретатором и 15 примеров программ на Lex rghost.ru/5279136
Писан на Delphi 7
Писал кодогенератор для своей программы: был специальный формат для шаблона, и для данных, которые по шаблону генерировали код. Очень много ручной работы получилось избежать. Конечный язык генерируемого текста — С++. Генератор был так же написан на С++.
Уточните, все что на регэкспах, за парсер не считается?
Писал непарсер для trace-файлов от Oracle, на JS. Еще непарсер логов одной софтины (для профилирования), на awk. Все на регэкспах. Хотя контекст, например, присутствовал.
Писал непарсер для trace-файлов от Oracle, на JS. Еще непарсер логов одной софтины (для профилирования), на awk. Все на регэкспах. Хотя контекст, например, присутствовал.
Один раз вшторило сделать транслятор с паскаля в ассемблерный код некоего виртуального ассемблера приставки chip-8 (глянуть на вики). О приставке той я писал уже один раз, довольно примитивная вешь — всего то 35 опкодов. Без деления/умножения, фактически без сравнения и тд. Но у меня в моем паскале было много всего.
Однако треугольник Серпинского с помощью моего Паскаля можно было зафигачить без проблем:

А вот его исходный код для моего паскаля:
Ну а ини-файлы еще в децтве канешно разбирали сложные. Ну, к примеру когда свой файловый коммандер писал для OS/2. Но увы, сорцы похерились. Да даже exe тоже. Начиналось все конечно с коммандера под дос — там хоть конфиг и был попроще, но парсинг тоже присутствовал. Такой он был тащемто:

Да ваще много чего парсить приходилось. Хоть бы тот же html, ибо свой браузер писали, xml… Много чего.
А ща да, регекспы и ноу проблем. Но мне проще самому, не приучен я к хорошему видимо ))
Однако треугольник Серпинского с помощью моего Паскаля можно было зафигачить без проблем:

А вот его исходный код для моего паскаля:
Program Triangle;
{ C8PASCAL example - Realtime rendering Serpinski triangle }
const
pixel : Byte = #10000000; {8x1 sprite: one pixel}
var
x, y : byte;
xminusone : byte; {x-1 constant}
oddeven : array[0..63];
gasket : array[0..63];
begin
SetHigh; {Set SCHIP mode 128x64}
gasket[0]:=1; {set initial value}
DrawSprite(63,0,1,^pixel); {draw fist pixel}
for y:=1 to 63 do begin {from Y := 1 to 63 do}
for x:=1 to y+1 do begin {form X := 1 to Y+1 do}
xminusone := x-1; {calculate X-1 constant}
oddeven[x]:= gasket[xminusone] xor gasket[x+1];
gasket[xminusone] := oddeven[xminusone];
if oddeven[x]=1 then {if 1 then draw pixel}
begin
DrawSprite(x+63,y,1,^pixel); {draw in right side}
DrawSprite(63-x,y,1,^pixel); {mirror to the ledt side}
end;
end;
end;
end.
Ну а ини-файлы еще в децтве канешно разбирали сложные. Ну, к примеру когда свой файловый коммандер писал для OS/2. Но увы, сорцы похерились. Да даже exe тоже. Начиналось все конечно с коммандера под дос — там хоть конфиг и был попроще, но парсинг тоже присутствовал. Такой он был тащемто:

Да ваще много чего парсить приходилось. Хоть бы тот же html, ибо свой браузер писали, xml… Много чего.
А ща да, регекспы и ноу проблем. Но мне проще самому, не приучен я к хорошему видимо ))
Крутота) Когда-то качал архив курсовых работ какого-то университета. Так там каждый студент писал компилятор, который на выходе давал исполняемый com-файл. Один даже студент отличился и написал транслятор в PE (!) причем какого-то своего вычурного языка) Завидовал им, что у нас не было на курсе такого
Я когда-то писал на лабах компилятор языка pipl (pipl isn't a programming language), в котором было много от ОБЕРОНа, борн-шелла и перла. Компилировался он в упрощённый Форт, которых интерпретировался моим же интерпретатором. Компилятор был написан на Сях, интерпретатор — на Паскале.
Я, увы, не учился на программиста в полном смысле этого слова. И в данный момент работаю грузчиком. Да, да — простым московским грузчиком. Почему? Все просто — у меня зарплата гораздо больше зарплаты узкосистемного программиста (которая более-менее меня устраивает). Веб и все эти джавы с питонами — не для меня. Не могу, просто коробит. SQL-ли тоже… Мне проще все свое написать, базу данных тем более. Но увы, никому нах это не нужно — везде же обязательные требования — пыхопе, яйаво, мускул и подобное. Не хочу! Заколебала эта виртуализация, эта мускуль. Под свою задачу я пишу полностью решение от и до без использования каких-то там CMS и прочих тормозов. Да, пускай велосипед, но он 1) уникален. 2) в разы быстрее. 3) экспириенс.
ну да. а крутые автомеханики, они тоже не разбираются во всяких заумных заморских системах. самые матерые — вытачивают поршневые системы напильником, и сами мотают обмотки генераторов.
только вот проволоку вытянут… ах, нет же! надо еще сперва медной руды добыть!
и шины варят. берут там арматуру, каучук всякий, нефть сырец. и варят, ага.
только вот беда — неспециалистам не понять. не ценят они такой титанический труд.
только вот проволоку вытянут… ах, нет же! надо еще сперва медной руды добыть!
и шины варят. берут там арматуру, каучук всякий, нефть сырец. и варят, ага.
только вот беда — неспециалистам не понять. не ценят они такой титанический труд.
Пишу анализатор С++ кода для теории языков программирования…
Для себя парсеров ЯП писал много. Для работы знания пригодились только раз — разбор юниксовых конфигов на JavaCC.
В университете писал на С++ интерпретатор Паскаля (облегченного, конечно) — это подходит?
А так ещё приходилось разбирать ini-файлы, HTML, XML… стандартные в общем вещи.
А так ещё приходилось разбирать ini-файлы, HTML, XML… стандартные в общем вещи.
Написал за полтора месяца 100 парсеров интернет-магазинов для infoskidka.ru
аппликация аутентифицировалась vkontakte, ходила по страничкам, парсила контент, сохраняла в виде реляционной модели, строила отчет.
Подпиливал парсер Common Lisp'а для своего проекта, используя встроенные в язык средства.
Писал на C парсер для встраиваемого Tcl. Правда потом нам кто-то показал Jim и велосипед умер за ненадобностью.
Писал на C парсер для встраиваемого Tcl. Правда потом нам кто-то показал Jim и велосипед умер за ненадобностью.
А где вариант «Да, лабораторная в универе»?
О, отличный вопрос! Парсеры меня преследуют всю мою карьеру :) В разное время писал парсеры для разных форматов данных для обмена между разными системами, парсер html-страниц для выдирания нужной инфы в автоматическом режиме, парсер для хитрых конфигов одной хитрой проги. Регулярные выражения рулят со страшной силой :)
Много чего делали. Из наиболее заметного: компилятор своего языка К++, транслятор для ассемблера, встроенный язык шелл скриптов.
В проекте так же было свое расширение С++ позволяющее делать из обычных классов RPC (автоматическая кодогенерация, прокси объекыт и др). Просто подключается хедер, а потом:
class CMyClass {
public:
remote int DoSmth(int param1, char* param2, out int& result) index (1);
remote int DoAnother(in TMyStruct* struct1) index (2);
int DoSmthLocal();
};
Соответственно, с т.з. кода все выглядело прозрачно. Просто получаем инстанцию объекта и вызываем методы как обычно.
В проекте так же было свое расширение С++ позволяющее делать из обычных классов RPC (автоматическая кодогенерация, прокси объекыт и др). Просто подключается хедер, а потом:
class CMyClass {
public:
remote int DoSmth(int param1, char* param2, out int& result) index (1);
remote int DoAnother(in TMyStruct* struct1) index (2);
int DoSmthLocal();
};
Соответственно, с т.з. кода все выглядело прозрачно. Просто получаем инстанцию объекта и вызываем методы как обычно.
Делал ассемблер для простенького PIC-микроконтроллера. lex-ы, yacc-и не использовал. Очень помогла быстро сориентироваться в задаче вот эта книга.
Писал парсер для разбора, модификации и сборки реплеев для Warcraft III TFT.
Писал парсер для разбора реплеев Heroes of Newerth.
По работе писал парсеры для коммутаторов Siemens EWSD и многих других, которых уже не припомню.
Писал парсер для разбора реплеев Heroes of Newerth.
По работе писал парсеры для коммутаторов Siemens EWSD и многих других, которых уже не припомню.
Парсеры для пауков.
Писал транслятор для MULTOS Assembler в 2003-м. Там стек-машина, команд немного, но зато сделал полноценную сборку байт-кода, генерацию листингов и т.д.
на php, для наглого тыра контента :)
Рассказываю. Регулярно вожусь с VivaCore. А скидка не нужна. Я и так там буду с докладом "Статический анализ C++ кода". :-)
Я предлагаю разделять парсеры, КАКИЕ парсеры, чего? Хотя бы вспомнить классификацию Хомского. Одно дело — «парсер», который с хтмл странички снимает все картинки, ища нагугленным регекспом урлы в теге image.
Другое дело — парсер какой-то контекстно-свободной (или может даже зависимой?) грамматики какого-то формального языка.
Другое дело — парсер какой-то контекстно-свободной (или может даже зависимой?) грамматики какого-то формального языка.
Классификация Хомского в реальной жизни почти не применима, так она задает классификацию грамматик, а на практике нужны парсеры. Парсер от грамматики отличается тем, что по мере разбора производит семантические действия (строит AST), в то время как грамматика позволяет производить только валидацию текста.
Подход к созданию парсеров, отталкиваясь от грамматики (lex/yacc), так неудобно использовать именно из-за того, что в основе академический подход: грамматика определяет множество валидных текстом и грамматика определяет парсер этих текстов. В прикладном программировании намного более удобен подход: парсер определяет множество валидных текстов (грамматику задается неявно). В конце концов, нужен парсер, а не грамматика, поэтому нужно описывать парсер, а не грамматику.
Такого подхода придерживаются инструменты поддерживающие PEG нотацию, или парсер-комбинаторы, например, parsec. И они просто удобнее, чем, например, antlr. Выигрыш получается более, чем в три раза.
Подход к созданию парсеров, отталкиваясь от грамматики (lex/yacc), так неудобно использовать именно из-за того, что в основе академический подход: грамматика определяет множество валидных текстом и грамматика определяет парсер этих текстов. В прикладном программировании намного более удобен подход: парсер определяет множество валидных текстов (грамматику задается неявно). В конце концов, нужен парсер, а не грамматика, поэтому нужно описывать парсер, а не грамматику.
Такого подхода придерживаются инструменты поддерживающие PEG нотацию, или парсер-комбинаторы, например, parsec. И они просто удобнее, чем, например, antlr. Выигрыш получается более, чем в три раза.
Ууу, чего только не писал… JSON, ini, с-подобный язык для скриптов, CSV, html (именно парсер, а не regexp), формат векторных пиктограмм одной из коммерческих ГИС (вошло в другою комерческую ГИС), и даже плагины/сохранёнки Morrowind (включая разбор байткода его скриптов) :)
По своим проектам приходится частенько писать XML/Html парсерс в том числе. Ну и по мелочи тоже. А как же можно обойтись без парсинга чего-либо в любом более-менее крупном продукте?
255 человек создавало свой язык программирования?
Sign up to leave a comment.
Приходилось ли вам писать парсеры?