Приходилось ли вам писать парсеры?

     

    Only registered users can participate in poll. Log in, please.

    Приходилось ли вам писать парсеры?

    • 20.9%Да, для существующего языка программирования462
    • 11.5%Да, создавал свой язык программирования255
    • 34.8%Да, для языка разметки770
    • 26.3%Да, для разбора сложного конфига581
    • 45.9%Да, для извлечения данных (например, микроформаты)1015
    • 1%Да, расскажу в комментариях (за лучший комментарий скидка на addconf в питере)23
    • 16.4%Нет, только regexp363
    • 12.7%Нет281
    Share post

    Similar posts

    Comments 72

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

              Интересно какие цели вы преследовали, обучение, бизнес-задачи?
                0
                Я, например, писал редактор кода для скриптов на подмножестве C# и там возникала задача, для которой код нужно было парсить. Уж не помню зачем. Впрочем, то было во времена второй версии языка, которая была значительно проще текущей четвертой.
                +1
                Писал парсеры для DSLей для своих проектов — code.google.com/p/octalforty-wizardby/ и code.google.com/p/octalforty-chinchillin/
                  0
                  На bison в универе делал штуку для символьных вычислений на C/C++ (вычисление выражений, символьное дифференцирование и тд).

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

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

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

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

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

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

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

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

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

                                                                    Писал непарсер для trace-файлов от Oracle, на JS. Еще непарсер логов одной софтины (для профилирования), на awk. Все на регэкспах. Хотя контекст, например, присутствовал.
                                                                      +6
                                                                      Один раз вшторило сделать транслятор с паскаля в ассемблерный код некоего виртуального ассемблера приставки 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… Много чего.

                                                                      А ща да, регекспы и ноу проблем. Но мне проще самому, не приучен я к хорошему видимо ))
                                                                        0
                                                                        Крутота) Когда-то качал архив курсовых работ какого-то университета. Так там каждый студент писал компилятор, который на выходе давал исполняемый com-файл. Один даже студент отличился и написал транслятор в PE (!) причем какого-то своего вычурного языка) Завидовал им, что у нас не было на курсе такого
                                                                          0
                                                                          Я когда-то писал на лабах компилятор языка pipl (pipl isn't a programming language), в котором было много от ОБЕРОНа, борн-шелла и перла. Компилировался он в упрощённый Форт, которых интерпретировался моим же интерпретатором. Компилятор был написан на Сях, интерпретатор — на Паскале.
                                                                            0
                                                                            Я, увы, не учился на программиста в полном смысле этого слова. И в данный момент работаю грузчиком. Да, да — простым московским грузчиком. Почему? Все просто — у меня зарплата гораздо больше зарплаты узкосистемного программиста (которая более-менее меня устраивает). Веб и все эти джавы с питонами — не для меня. Не могу, просто коробит. SQL-ли тоже… Мне проще все свое написать, базу данных тем более. Но увы, никому нах это не нужно — везде же обязательные требования — пыхопе, яйаво, мускул и подобное. Не хочу! Заколебала эта виртуализация, эта мускуль. Под свою задачу я пишу полностью решение от и до без использования каких-то там CMS и прочих тормозов. Да, пускай велосипед, но он 1) уникален. 2) в разы быстрее. 3) экспириенс.
                                                                              0
                                                                              ну да. а крутые автомеханики, они тоже не разбираются во всяких заумных заморских системах. самые матерые — вытачивают поршневые системы напильником, и сами мотают обмотки генераторов.
                                                                              только вот проволоку вытянут… ах, нет же! надо еще сперва медной руды добыть!
                                                                              и шины варят. берут там арматуру, каучук всякий, нефть сырец. и варят, ага.

                                                                              только вот беда — неспециалистам не понять. не ценят они такой титанический труд.
                                                                          0
                                                                          Пишу анализатор С++ кода для теории языков программирования…
                                                                            0
                                                                            Для себя парсеров ЯП писал много. Для работы знания пригодились только раз — разбор юниксовых конфигов на JavaCC.
                                                                              +1
                                                                              В университете писал на С++ интерпретатор Паскаля (облегченного, конечно) — это подходит?

                                                                              А так ещё приходилось разбирать ini-файлы, HTML, XML… стандартные в общем вещи.
                                                                                –4
                                                                                Написал за полтора месяца 100 парсеров интернет-магазинов для infoskidka.ru
                                                                                  +1
                                                                                  аппликация аутентифицировалась vkontakte, ходила по страничкам, парсила контент, сохраняла в виде реляционной модели, строила отчет.
                                                                                    0
                                                                                    Подпиливал парсер Common Lisp'а для своего проекта, используя встроенные в язык средства.

                                                                                    Писал на C парсер для встраиваемого Tcl. Правда потом нам кто-то показал Jim и велосипед умер за ненадобностью.
                                                                                      0
                                                                                      А где вариант «Да, лабораторная в универе»?
                                                                                        +1
                                                                                        О, отличный вопрос! Парсеры меня преследуют всю мою карьеру :) В разное время писал парсеры для разных форматов данных для обмена между разными системами, парсер html-страниц для выдирания нужной инфы в автоматическом режиме, парсер для хитрых конфигов одной хитрой проги. Регулярные выражения рулят со страшной силой :)
                                                                                          +1
                                                                                          Много чего делали. Из наиболее заметного: компилятор своего языка К++, транслятор для ассемблера, встроенный язык шелл скриптов.

                                                                                          В проекте так же было свое расширение С++ позволяющее делать из обычных классов 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();
                                                                                          };

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

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

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

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

                                                                                                                Only users with full accounts can post comments. Log in, please.