Перейти к содержимому

Parse c что это

  • автор:

Парсер C кода

Поиск парсера для C кода – по-прежнему увлекательное занятие. Для Win32.Utf8 мне нужен был парсер для анализа заголовочных файлов Win32 API и извлечения из них прототипов функций и объявлений структур. Требований к нему было не очень много:

  1. Разбор заголовка размером 2-3MB (размер windows.h после препроцессора) должен занимать разумное время – 20-30 секунд на типичной машине. В моем случае в качестве эталона выступает Athlon XP 1.5GHz;
  2. Требовалось умение работать с нестандартными расширениями C — __declspec и прочим;
  3. Парсер должен извлекать SAL описания параметров функций и членов структур;
  4. Результат разбора должен быть удобен для последующего анализа;

Очевидный вариант – адаптировать парсер из GCC был отброшен сразу. Это не совсем тривиально, да и адаптировать его под себя не просто. Другой интересный вариант – использовать GCC-XML был также отвергнут из-за несовместимости с пунктами 2 и 3. Вывод напрашивался один – придётся писать собственный парсер.

Встала другая проблема какой парсер генератор использовать. Поскольку в качестве основного языка для проекты был выбран Python, то и рассматривались варианты генерирующие код на Python (или позволяющие писать код правил на Python). В финал вышли три претендента: PLY, SPARK и DParser.

PLY – полный аналог пары Lex и Yacc. PLY устраивал почти всем, кроме того факта, что он базируется на алгоритме LALR. Грамматика языка C не однозначна с точки зрения LALR и поэтому без специальных ухищрений парсить C код с помощью Yacc не получается.

C С++ в этом плане вообще беда. Его грамматика ещё более неоднозначна и с LR/LALR алгоритмами совсем не уживается.

В отличие от PLY, SPARK использует алгоритм Earley и может справиться с неоднозначной грамматикой без особых проблем. Подвох, однако, заключается в том, что сложность этого алгоритма – O(_n_3). Отзывы о SPARK это только подтверждали – медленный.

Несмотря на это я решил попробовать. Проведённый эксперимент показал, что SPARK вовсе даже и не медленный. Он ОЧЕНЬ И ОЧЕНЬ медленный. И к тому же охочий до памяти.

Memory usage by SPARK-based parser of C code.

При попытке разобрать заголовок размером 2.5MB SPARK почти сразу израсходовал свободные 1.5GB памяти. Через несколько секунд, поняв, что так просто от назойливого приложения не отделаться, система сбросила в swap всё что могла. Освободившиеся два гигабайта были сожраны без промедления, после чего система впала в депрессию. Положение спасла ошибка в грамматике. Парсер поперхнулся на незнакомом слове «extern» и вывалился.

Интересно также, что на стареньком Althon XP график использования памяти рисовал симпатичную логарифмическую кривую. 🙂

DParser тоже использует O(_n_3) алгоритм — GLR (Generalized LR), что не предвещало ничего хорошего. Впрочем GLR может быть значительно быстрее Earley в случае «почти детерминированной грамматики», включая грамматику C. К сожалению DParser не совсем тривиально подключается к Python под Windows. Так что и DParser пришлось исключить.

Осталась проблема как совместить неоднозначную грамматику C и PLY. Корень проблемы заключается в ключевом слове «typedef», вернее способности C объявлять новые типы с его помощью. Конструкции вроде:

typedef int foo; foo; foo x; volatile foo; int foo; 

Parsec — отечественный разработчик и производитель решений в области СКУД и идентификации

Может быть использована как СКУД на небольшом предприятии или как система безопасности, обслуживающая крупную международную компанию с объектами в разных странах.

Продукты ParsecNET3

  • Сетевые контроллеры доступа
  • Сетевые охранные контроллеры
  • Сетевые считыватели
  • Интерфейсы
  • Дополнительные модули
  • Интеграция
  • Топология
  • Конфигуратор СКУД
  • Программное обеспечение

Proximity считыватели

Считыватели бесконтактных карт в различном исполнении. Широкий выбор дизайна и цветовой гаммы, уникальные исполнения считывателей — все эти качества позволяют найти решение практически для любого объекта и обеспечить великолепные технические и пользовательские характеристики.

Продукты Proximity считыватели

  • Считыватели карт EM Marin и HID Prox
  • Считыватели смарт-карт Mifare
  • Считыватели карт Motorola
  • Специальные решения

Дальняя идентификация

Система регистрации объектов на больших расстояниях. Контроль автотранспорта при въезде и выезде, контроль трафика на автомобильных дорогах, мониторинг объектов.

Продукты Дальняя идентификация

  • Считыватели дальней идентификации
  • Активные метки

СКУД ParsecNET Office

Система контроля и управления доступом для небольших объектов с простыми задачами, например, офисных помещений.

Контроль до 16 точек прохода, до 5 рабочих станций, учет рабочего времени.

Продукты СКУД ParsecNET Office

  • Сетевые контроллеры доступа
  • Сетевые считыватели
  • Интерфейсы
  • Дополнительные модули
  • Топология
  • Программное обеспечение

MyHTML — HTML парсер на «голом» Си с поддержкой POSIX Threads

image

Как можно было догадаться из заголовка речь пойдет о парсинге HTML (далее хтмл).

Как-то появилась у меня идея «Х», но для её реализации нужен посчитанный DOM со всеми стилями и плюшками. Гугление и яндексение ничего хорошего не показало. Есть всякие обвёртки для WebKit, но они работают не на всех платформах, да и сильно обрезанные. Существуют проекты где WebKit завёрнут в некий фронтэнд с которым ты работаешь через JavaScript. Что-то было испробовано, но результат был плачевным. Потребление ресурсов чего только стоило.

  1. Отрисовщик (Render) хтмл без диких зависимостей. Только отрисовщик, сеть ложилась бы на пользователя. Иначе говоря, полный расчёт хтмл до момента рисования в окошке.
  2. Возможность приладить обвёртку для JavaScript движка
  3. Возможность легко сделать обвёртку для других языков программирования

И я вступил в неравный бой!

  1. Парсят как душе угодно, имея исключительно своё представление об токенизации хтмл
  2. Парсят как-то следуя спецификации
  3. Парсят чётко следуя спецификации

Далее, никто не позволял вклиниться в поток (имеется ввиду хтмл) в момент парсинга. Это крайне важно для прилаживания JavaScript движка. Не буду долго объяснять, а лучше покажу почему:

Фрагмент хтмл документа:

ass="future">

Итог любого браузера с JS:

То есть, в итоге будет создан полноценный DIV элемент. К слову, токенизация тега SCRIPT то ещё дело. Мне пришлось рисовать

image

  1. Поддержка C99
  2. Возможность отделить хтмл парсер от отрисовщика чтобы использовать отдельно
  3. Без внешних зависимостей
  1. Парсер хтмл
  2. Парсер цэсс
  3. Селекторы (Selectors)
  4. Отрисовщик inline, inline-block, block, table.

В итоге, после двух-трёх лет неспешной разработки я начинаю переделывать черновой вариант в рабочий. Первым, что логично, стал хтмл парсер.

  • Асинхронно парсить HTML, обрабатывать токены, строить дерево
  • Полная поддержка HTML 5 по спецификации html.spec.whatwg.org/multipage
  • Имеем два API: «Высокого» уровня и «низкого». Первое-это публичное апи, которое имеет описание и вообще, всё как у людей, но не позволяет видеть структуры. Второе-это использование исходников напрямую.
  • Возможность манипулировать элементами: добавлять, удалять, изменять .
  • Возможность манипуляции с атрибутами элементов: добавлять, удалять, изменять
  • Поддерживает 34 кодировки на вход. На выход только UTF-8, и вся работа внутри только в UTF-8
  • Может определять кодировку текста. Сейчас доступны unicode: UTF-8, UTF-16LE, UTF-16BE (+ определение по BOM) и русские: windows-1251, koi8-r, iso-8859-5, x-mac-cyrillic, ibm866
  • Может работать в Single Mode — без тредов
  • Парсить фрагменты HTML
  • Парсить кусками (chunks). Можно отдавать резанные куски HTML (разорванные в произвольном месте) и он будет их парсить, без предварительного накопления буфера.
  • Не имеет внешних зависимостей
  • Поддерживает C99
  • Работа с памятью. Память кешируется, выделяется кусками и под объекты. К примеру, удаление десяти элементов, а потом добавление десяти других не съест память под новые

На очереди CSS парсер и Render. Делаю всё один, «бензина» должно хватить.
Любая помощь крайне приветствуется!

Спасибо за внимание! Надеюсь вам будет это полезно!

P.S.: Если сообщество проявит к этой теме интерес то могу писать узконаправленные статьи о том как работает расчёт отрисовки и с какими сложностями сталкивался/сталкиваюсь.

Идентификаторы Parsec

Идентификаторы Parsec - это активные метки используемые в системе активной дальней идентификации на базе считывателей PR-G07. В зависимости от настроек системы и типа используемой антенны метки могут читаться на расстоянии от нескольких до 50 метров. Различные конструктивные исполнения позволяют подобрать тот тип идентификатора, который наиболее подходит для конкретной инсталляции. Для автомобильных проходных наиболее подходят метки ActiveTag.2 и ActiveTag.

ActiveTag.2 - новая версия активной метки, которая существует в единственном варианте исполнения и имеет расширенные возможности по управлению индикацией. ActiveTag, в свою очередь, имеет три типа основания корпуса: для наклеивания на поверхность, для ношения в виде брелока на связке ключей и для крепления к поверхности с помощью саморезов. При использовании основания в виде брелока метка дополнительно содержит встроенный пассивный идентификатор формата EM Marin с тем же кодом, что используется в активном режиме, за счет чего брелок может использоваться и на точках прохода, оборудованных обычными proximity считывателями.

ActiveTag.2 - это новая версия активной метки для системы дальней идентификации Parsec. Активная метка выполнена в виде функционально законченного устройства в пластиковом корпусе с двумя кнопками и линзой двухцветного светодиода. В комплекте также поставляется держатель, который может быть закреплен на плоской поверхности с помощью саморезов или двухсторонней липкой ленты.

ActiveTag.I - это активная метка для системы дальней идентификации в индустриальном исполнении, что подразумевает ее применение даже в самых сложных климатических условиях. Специальный источник питания обеспечивает работу метки при температурах от -40 до +55°C, при этом срок службы самого элемента составляет не менее 5 лет.

ActiveTag - это брелок с встроенной активной меткой для использования в системе дальней идентификации, дополнительно содержащий пассивную метку формата EM Marin. Гибридная конструкция позволяет использовать брелок, как в системе дальней идентификации, так и в стандартной СКУД.

ActiveTag.B - это активная метка для работы с системами дальней идентификации с генерацией идентификационного кода при нажатии на кнопку. Такое решение позволяет исключить конфликты при самых сложных условиях инсталляции, а также увеличить срок службы малогабаритной литиевой батарейки, до 2 - 3 лет.

Свяжитесь с нашими менеджерами:

Дроваль Александр
Телефон: +7 (495) 646-24-24 ( доб. 106 )
E-mail: droval@global-sec.ru

Миров Михаил
Телефон: +7 (495) 646-24-24 ( доб. 102 )
E-mail: 117@global-sec.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *