Pull to refresh

Comments 72

Писал шаблонизатор, а зачем вам результаты этого опроса?
Возможно, в свой доклад включу. Шаблонизатор для души писали или по работе?
Шаблонизатор для души. Моя душа негодует.
И да, писал мини-парсер SQL-запросов для удобного ORM, что-то типа того, что j_wayne ниже сказал.
Не совсем написание, скорее генерация, использовался javaCC. Правда, сгенерированный парсер пришлось допиливать напильником. Задача — разбор выражений, сходных с WHERE-блоком SQL, для фильтрации выборок на клиентской стороне (толстый клиент).
Интересно, то есть вы создали язык запросов для своего приложения?
Я думаю почти все писали парсер для какого-нибудь сайта или странички.
для этого дела должно с головой regexp хватить
Кстати, я ожидал, что будет больше тех, кто пытался создать свои языки, чем тех, кто писал разборщики для существующих.

Интересно какие цели вы преследовали, обучение, бизнес-задачи?
Я, например, писал редактор кода для скриптов на подмножестве C# и там возникала задача, для которой код нужно было парсить. Уж не помню зачем. Впрочем, то было во времена второй версии языка, которая была значительно проще текущей четвертой.
На bison в универе делал штуку для символьных вычислений на C/C++ (вычисление выражений, символьное дифференцирование и тд).

На практике написания парсеров для создания новых ЯП и языков разметки стараюсь избегать (пока успешно), т.к. слишком легко сделать ненужный велосипед, который нужно будет как-то поддерживать и в котором потом никто не разберется. Хотя полезные применения всему этому, безусловно, есть.
так же писал парсер, но для численного дифференцирования\интегрирования различными методами (скажем, метод Рунге-Кутты, где итерационная формула подсчёта следующей точки проинтергированной функции и формула интегрируемой функции с её пределами обрабатывается парсером).
Хм. Интерпретаторы эзотерические языков считаются? :-) По-моему, это не совсем тот парсер, о котором вы спрашиваете.
О, авторы топиков «Пишем интерпретатор бреинфака на ...» подтягиваются
Ну что вы, я предпочитаю более мертвые языки.
Если считается, то хорошо, ибо я писал на ассемблере.
На самом деле мне очень интересны случаи, когда парсеры создавались для решения бизнес задач. Например, я случай, когда создание своей легкой встраиваемой VM и своего языка для этой VM помогло защитить программу от взломов: важная часть алгоритма была написана под эту VM и сильно усложняла reverse engineering.

Если вы написали комментарий о создании парсеров и вас интересует скидка (5%) — пишите в личку.
Писал парсер объектного языка запросов (типа HQL в Hibernate) с целью его трансляции в обычный SQL. Также делал попытки написать свой язык программирования. Думаю, что многие мечтали сделать что-то свое, но вот у меня пока нет особого результата.
писал, довольно много разных парсеров, под разные нужды, на нескольких языках (конкретно, c, cpp, php, c#). чаще всего парсить приходилось ответ от каких-либо web ресурсов, реже — конфиги. по мере возможности (а это довольно часто) использую для этого regexpы.

ИМХО, хотелось бы, чтобы веб-проекты поддерживали отдачу в json, сие существенно облегчает задачу легального парсинга.
писал парсер soap wsdl иногда даже к нему возвращаюсь.
Во что WSDL транслировался? XSLT не хватало?
XSLT вообще из другой оперы на основе WSDL клиент строит библиотеку прокси классов и моделей с ними в свою очередь общается адаптер который отдает данные на тонкий клиент и принимает от него данные на вход. Классы и модели динамически генерируются при каждом изменении WSDL.
Как выяснилось на практике базовый пхп клиент soap мягко выражаясь далеко не оптимальное решение и приходиться писать свое решение.
Много всего писал :)
И для существующего языка (Си) — лексический анализатор + синтаксический парсинг. Никаких lex'ов и yacc'ов, всё самостоялтельно )
И для своей поделки, простенькое ООП-расширение Си, где-то между плюсов и Obj-C, на более сложные вещи пока меня не хватает.
Конфиги тоже соответственно парсил в довольно сложном формате.
Ну и как же без своих велосипедов на популярные форматы — xml(rss/atom), html.
Ага, мы в универе тоже лексический анализатор + синтаксический разбор по разным моделям делали. Мне пришлось писать детерминированный нисходящий и восходящий разбор для трансляции из Си в Паскаль и наоборот. Правда, грамматики писались только для пары простых операторов и циклов/условий. Написано было все криво — но аж для трех человек, так что комментарий стоял на каждый блок в три строки :).

Ну а потом, на работе, все эти знания пригодились и для парсинга сложных по структуре страниц (лукэтми не отдавал полный RSS, приходилось брать по ссылкам из фида всю страницу и вытаскивать контент, попутно обрезая кучу всего — а формат постов у них там чуть ли не вручную изменяется, и мусора полно разного чуть ли не в каждом новом посте), и для уравнений, которые должны были решаться прямо в инпутах программы.

Что уж говорить о регэкспах — регулярками можно решить любую проблему, кроме тех, что
возникает при их использовании. Сейчас вот мучаюсь, расширяя PHPWord своим классом шаблонизатора (они поленились написать что-то кроме вставки переменных — ни условий, ни циклов), чтобы из шаблонов docx печатать договора. Вот дойдет до меня, что вложенных условий регулярками не сделаешь, начну писать парсер :). Но это уже, наверное, после того, как прикручу ODF, а может, и doc (ну очень не хватает такой же универсальности, как и в PHPExcel).

Ой, что-то я разбалаился. Простите.
Писал парсер формулы для создания ее рисунка в нормальном виде.
Писал на PHP парсер сложных плейсхолдеров и условных блоков для SQL-запросов.
Писал парсеры для перевода файлов из одного формата данных в другой, а также писал свой XML-парсер, который активно использую.
Да. пишу в комментариях, пользовался ANTLR, этот инструмент генерирует код парсера на некоторых популярных языках, имеет графическую среду разработки ANTLTWorks с дебагером и визуализацией дерева.
Писал парсер для языка BSDL описания граничного сканирования печатных плат (для тестирования), это подмножество VHDL
Писал компилятор для своего процессора на питоне.
Да, для формата DXF. Конечная цель — разобрать файл и нарисовать картинку в собственной программе. Наибольшие трудности возникли со сплайнами, но и они в итоге были побеждены.
Программа фактически являлась пользовательским интерфейсом для вывода картинки для вырезания её лазером по металлу. Не гравировка, а именно вырезание деталей, хотя гравировку тоже можно было делать.
Время от времени пишу парсеры, чтобы слить 100500 pdf'ок с сайта или столько же роликов с какого-либо ресурса, чтобы иметь к контенту доступ оффлайн. wget + bash + sed (возможно еще и clive, если слить нужно много роликов с youtube) — идеальный набор юного парсера для этих целей (:
Каждый веб-программист рано или поздно пишет парсер: либо для работы, либо для себя.
По-моему, это очевидно.
Да, для языка разметки
Да, для разбора сложного конфига
Да, для извлечения данных (например, микроформаты)

писал свой HTML-Render
Писал довольно много простейших парсеров, вроде вытаскивания каких то параметров из конфигов и прочей мелочи. Однако был и довольно интересный калькулятор компилятор математических выражений, с возможностью определения констант, реализацией своих функций, и прочими мелочёвками вроде вывода промежуточных значений, нано-микро матлаб в общем :), до рисование графиков дело правда не дошло, но суть не в этом. Интересен он тем что весь разбор выражений был писан ручками с использованием функционала std::wstring безо всяких regexp. Реализация скажем так доставляла :)
Писал транслятор некоего обобщённого SQL в MSSQL и Oracle.
Писал парсер нашего проекта для генерации страниц в dokuwiki с описанием классов и методов.

Помню забавный случай, когда пришлось писать на C++(он наиболее знаком) конвертор из FoxPro в Java довольно простого, но большого модуля.
Парсер HTTP-запросов; парсер HTML; парсер плейлистов для плееров iRiver. И все это на VB, что лишь добавляло «остроты» процессу…
В качестве курсового проекта в институте делал интерпретатор PHP :D

Ну и писал парсеры для многочисленных сайтов, но это скорее не парсер, а «бот». Бот не спамерский конечно. А для облегчения жизни контрибуторов фотобанков.
изобретал свой язык разметки — аналог markdown, более приспособленный для русской раскладки.
по сей день вполне успешно используется на одном форуме, почти полностью вытеснив традиционные бб-коды (оставленные как альтернативный вариант форматирования на выбор пользователя).
На 1 курсе писал интерпретатор для придуманного на скучных лекциях языка Lex (некотое подобие ассемблера :) Тогда мне казалось, что я реально что-то новое изобретаю :)

Вот сортировка пузырьком на 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
Почему бы Вам не вставить сюда код решения системы линейных алгебраических уравнений на Lex.
Писал кодогенератор для своей программы: был специальный формат для шаблона, и для данных, которые по шаблону генерировали код. Очень много ручной работы получилось избежать. Конечный язык генерируемого текста — С++. Генератор был так же написан на С++.
Уточните, все что на регэкспах, за парсер не считается?

Писал непарсер для trace-файлов от Oracle, на JS. Еще непарсер логов одной софтины (для профилирования), на awk. Все на регэкспах. Хотя контекст, например, присутствовал.
Один раз вшторило сделать транслятор с паскаля в ассемблерный код некоего виртуального ассемблера приставки chip-8 (глянуть на вики). О приставке той я писал уже один раз, довольно примитивная вешь — всего то 35 опкодов. Без деления/умножения, фактически без сравнения и тд. Но у меня в моем паскале было много всего.

Однако треугольник Серпинского с помощью моего Паскаля можно было зафигачить без проблем:


А вот его исходный код для моего паскаля:
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… стандартные в общем вещи.
Написал за полтора месяца 100 парсеров интернет-магазинов для infoskidka.ru
аппликация аутентифицировалась vkontakte, ходила по страничкам, парсила контент, сохраняла в виде реляционной модели, строила отчет.
Подпиливал парсер Common Lisp'а для своего проекта, используя встроенные в язык средства.

Писал на 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();
};

Соответственно, с т.з. кода все выглядело прозрачно. Просто получаем инстанцию объекта и вызываем методы как обычно.
Делал ассемблер для простенького PIC-микроконтроллера. lex-ы, yacc-и не использовал. Очень помогла быстро сориентироваться в задаче вот эта книга.
Писал парсер для разбора, модификации и сборки реплеев для Warcraft III TFT.
Писал парсер для разбора реплеев Heroes of Newerth.
По работе писал парсеры для коммутаторов Siemens EWSD и многих других, которых уже не припомню.
Писал транслятор для MULTOS Assembler в 2003-м. Там стек-машина, команд немного, но зато сделал полноценную сборку байт-кода, генерацию листингов и т.д.
на php, для наглого тыра контента :)
Я предлагаю разделять парсеры, КАКИЕ парсеры, чего? Хотя бы вспомнить классификацию Хомского. Одно дело — «парсер», который с хтмл странички снимает все картинки, ища нагугленным регекспом урлы в теге image.

Другое дело — парсер какой-то контекстно-свободной (или может даже зависимой?) грамматики какого-то формального языка.
Классификация Хомского в реальной жизни почти не применима, так она задает классификацию грамматик, а на практике нужны парсеры. Парсер от грамматики отличается тем, что по мере разбора производит семантические действия (строит AST), в то время как грамматика позволяет производить только валидацию текста.

Подход к созданию парсеров, отталкиваясь от грамматики (lex/yacc), так неудобно использовать именно из-за того, что в основе академический подход: грамматика определяет множество валидных текстом и грамматика определяет парсер этих текстов. В прикладном программировании намного более удобен подход: парсер определяет множество валидных текстов (грамматику задается неявно). В конце концов, нужен парсер, а не грамматика, поэтому нужно описывать парсер, а не грамматику.

Такого подхода придерживаются инструменты поддерживающие PEG нотацию, или парсер-комбинаторы, например, parsec. И они просто удобнее, чем, например, antlr. Выигрыш получается более, чем в три раза.
Ууу, чего только не писал… JSON, ini, с-подобный язык для скриптов, CSV, html (именно парсер, а не regexp), формат векторных пиктограмм одной из коммерческих ГИС (вошло в другою комерческую ГИС), и даже плагины/сохранёнки Morrowind (включая разбор байткода его скриптов) :)
По своим проектам приходится частенько писать XML/Html парсерс в том числе. Ну и по мелочи тоже. А как же можно обойтись без парсинга чего-либо в любом более-менее крупном продукте?
Как раз прямо сейчас занимаюсь h2pxd — конвертером для Cython, который парсит заголовочные файлы c/c++ и генерирует Cython-овские PXD-файлы (используется pycparser)
255 человек создавало свой язык программирования?
Sign up to leave a comment.

Articles