Pull to refresh

GridStack ­— Пример практического применения flex+bison

Reading time 31 min
Views 9.7K
Algorithms *
В последнее время на Хабре появились несколько статей, посвящённых грамматическому разбору выражений.
И это замечательно! По моему скромному мнению, каждый программист должен хоть раз в жизни написать разбор выражения. Постараюсь и я внести свою лепту в общее дело.

Методов разбора существует множество (рекомендую следующий обзор Dick Grune, Ceriel J. H. Jacobs — Parsing Techniques: A Practical Guide, ISBN 0-13-651431-6). Причём реализации методов варьируются от полностью ручных до использования автоматизированных генераторов, таких как bison, antlr, lemon и других.
В то время, как ручное написание лексических и синтаксических (далее я буду называть из лексер и парсер) разборов позволяет достичь максимальной скорости и контроля (особенно над ошибками и способами их преодоления), использование генераторов позволяет сосредоточиться непосредственно на задаче, облегчает модификацию грамматики и бережёт время. Умение владеть такими инструментами позволяет чаще прибегать к DSL (Domain Specific Language) и вообще видеть возможность их применения.

Я хочу привести пример использования bison (парсер) и flex (лексер) в реальной жизни: от возникновения задачи, до её решения.

Читать дальше →
Total votes 19: ↑18 and ↓1 +17
Comments 10

Подсветка синтаксиса для собственного языка

Reading time 4 min
Views 6.5K
Programming *
Tutorial
imageПодсветка синтаксиса — задача простая и решалась много раз. Но есть у нее одна неприятная особенность — если мы хотим подсветить синтаксис нового языка (например, языка bb-тэгов хабраредактора, или лога какой программы), то большинство решений включает создание грамматики, парсера, и затем встраивание это всего куда-нибудь. А что делать, если получить подсветку для логов желание есть, а тратить на это три часа желания нет?

Воспользоваться самым простым способом
Total votes 22: ↑19 and ↓3 +16
Comments 9

Компиляция. 1: лексер

Reading time 7 min
Views 87K
Programming *
Меня всегда завораживало таинство рождения программой программы. К сожалению, российские вузы уделяют мало внимания сей интереснейшей теме. Рассчитываю написать серию постов, в которых поэтапно создадим маленький работоспособный компилятор.

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

Далее в посте:

  1. С какой стати писать компиляторы?
  2. Общий план
  3. Анализ текста
  4. Практический пример
  5. Как это работает?
Читать дальше →
Total votes 93: ↑89 and ↓4 +85
Comments 42

Для тех, кому в IT-стартапе требуется разбор Си++-кода

Reading time 17 min
Views 15K
Intel corporate blog
Статья описывает открытую и бесплатную библиотеку VivaCore, позволяющую разбирать и анализировать код на языке Си/Си++. Библиотека может быть полезна разработчикам, начинающим свои стартапы в области создания таких инструментов как построение документации по коду, специфические расширения языка, подсчет метрик и так далее.
Читать дальше →
Total votes 41: ↑38 and ↓3 +35
Comments 17

Создание языка программирования с использованием LLVM. Часть 1: Введение и лексический анализ

Reading time 7 min
Views 55K
Compilers *
Translation
Добро пожаловать в учебник «Создание языка программирования с LLVM». Этот учебник знакомит вас с созданием простейшего языка программирования, и при этом показывает, каким оно может быть легким и интересным, а также даёт вам начальные знания, которые вы затем сможете применить на других языках программирования. Код в этом учебнике также может быть использован в качестве стартовой площадки для ваших творений с помощью LLVM.

Целью данного учебника является постепенное представление нашего языка, описание его пошагового создания. Это позволит нам охватить достаточно широкий спектр вопросов проектирования языков и использования LLVM, попутно показывая и объясняя код без огромного количества ненужных деталей.
Читать дальше →
Total votes 65: ↑61 and ↓4 +57
Comments 28

Создание языка программирования с использованием LLVM. Часть 2: Реализация парсера и AST

Reading time 20 min
Views 32K
Compilers *
Translation
Добро пожаловать в Главу 2 учебника «Создание языка программирования с LLVM». В этой главе мы увидим, как использовать лексический анализатор, созданный в Главе 1, чтобы построить полный синтаксический анализатор для нашего языка Kaleidoscope. После того, как у нас будет готов парсер, мы будем строить Abstract Syntax Tree (AST) (Абстрактное синтаксическое дерево).
Читать дальше →
Total votes 39: ↑38 and ↓1 +37
Comments 6

Основы конструирования компиляторов. Лексический анализ на C#

Reading time 4 min
Views 31K
Compilers *
Sandbox
Задачей лексического анализа является разбить входную последовательность (в моем случае код на языке «Паскаль») на слова и лексемы.

Для начала я создал 5 типизированных листов для хранения данных, а именно: идентификаторов, констант, ключевых слов, разделителей и свертки. Также необходим массив разделителей
static char[] limiters = {',', '.', '(', ')', '[', ']', ':', ';', '+', '-', '*', '/', '<', '>', '@'};

и массив ключевых слов. Я ограничился одиннадцатью ключевыми словами, так как статья написана как начальный пример реализации лексического анализа языка «Паскаль» на языке C#.
Итак, массив ключевых слов:
static string[] reservedWords = { "program", "var", "real", "integer", "begin", "for", "downto", "do", "begin", "end", "writeln" };

Читать дальше →
Total votes 23: ↑12 and ↓11 +1
Comments 7

Парсим Python код с помощью Flex и Bison

Reading time 6 min
Views 29K
Website development *Programming *C++ *
Sandbox

Вступление


Уже около двух лет я участвую в OpenSource проекте SourceAnalyzer, и вот появилась необходимость написать парсер для языка Python, который должен уметь строить граф вызовов (Call Graph) и граф зависимостей классов (Class Graph Dependency). Если точнее, граф строится с помощью других инструментов, а парсер должен лишь подготовить для этих инструментов данные.

Процесс работы над парсером был довольно занятным и мне бы хотелось поделиться с вами приобретенным опытом, а также поведать о некоторых подводных камнях, которые встретились на этапе разработки.
Читать дальше →
Total votes 52: ↑44 and ↓8 +36
Comments 28

Парсинг на языке Prolog

Reading time 7 min
Views 13K
Programming *Prolog *
Tutorial
Публикация первой части ( habrahabr.ru/post/274603 ) вызвала довольно обширную и интересную дискуссию по различным аспектам языка применения ПРОЛОГ.
Цель была – показать опытным, и не очень, программистам, что ничего сложного в Прологе нет, и каждый может его применять в работе.
Почему-то не было вопросов непосредственно по тексту публикации. Буду думать, что там все понятно.
Приступим к рассмотрению более практических аспектов программирования на языке Пролог.
Читать дальше →
Total votes 18: ↑15 and ↓3 +12
Comments 150

Экосистема: больше участников — больше прибыль! Зачем Skyeng открывает API

Reading time 6 min
Views 9.3K
Skyeng corporate blog Development of mobile applications *API *Browser extensions
UPD: новая ссылка на документацию по API

imageimageimageimage

В наших текстах мы периодически упоминаем некую «экосистему Skyeng». Настала пора разобраться, что же мы понимаем под этим термином. В этой статье мы расскажем, что такое экосистема и почему ее создатели заинтересованы в том, чтобы на ней зарабатывало как можно больше сторонних разработчиков. Ну и, конечно, покажем, где найти открытые методы нашего API, чтобы вы уже сейчас начали прикручивать наш словарь к своему приложению. И еще будет конкурс!
Читать дальше →
Total votes 14: ↑12 and ↓2 +10
Comments 22

Создаем «внешний контур» экосистемы с независимыми разработчиками: итоги конкурса Skyeng API

Reading time 8 min
Views 2.7K
Skyeng corporate blog Website development *Development of mobile applications *API *


Конкурс проектов, использующих открытый Skyeng API, подошел к концу; сегодня мы представляем победителей и призеров. Это, впрочем, лишь подготовительный этап к созданию «внешнего контура» нашей экосистемы. Мы планируем активно помогать нашим конкурсантам довести свои проекты до состояния полноценных продуктов. Зачем нам это нужно, а также кого и почему мы выбрали – в нашей статье.
Читать дальше →
Total votes 4: ↑4 and ↓0 +4
Comments 1

Устройство компилятора Swift. Часть 2

Reading time 11 min
Views 6.7K
e-legion corporate blog Programming *Compilers *Swift *Software

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

Читать дальше →
Total votes 21: ↑21 and ↓0 +21
Comments 2

Искусство парсинга или DOM своими руками

Reading time 14 min
Views 14K
C++ *XML *Algorithms *HTML *
Tutorial
Привет, Хабр! Недавно я задался идеей создать простой язык разметки наподобие markdown, который отлично подходил бы для моих задач, а именно — быстрого написания лекций с форматированием и возможностью вставки математических формул «на лету», с применением одной лишь клавиатуры. Чтобы перевести текст, написанный в таком формате, в более понятную форму, например, документ LibreOffice Writer, нужен синтаксический анализатор, проще говоря — парсер. Поскольку я привык делать велосипеды, то направился в поисковые системы с запросами «parser example», «html to DOM», «how to parse html» и др. К моему разочарованию, на всех найденных ресурсах либо приводились элементарные примеры типа калькулятора Страуструпа с рекурсивным спуском, либо использовались готовые решения, такие как flex, bison, llvm и yacc. Библиотек, предназначенных для парсинга строго определённых языков, нашлось ещё больше (gumbo, jsoup, rapidjson, инструменты Qt и др.) Ни то, ни другое не входило в мои планы по написанию парсера своей разметки на C++ с использованием лишь стандартной библиотеки, поэтому моим источником знаний об искусстве парсинга вместо электронных ресурсов стали методички технических институтов. О том, как взять текст и построить из него AST (абстрактное синтаксическое дерево), о некоторых подводных камнях, на которые я натыкался в процессе, о возможных ошибках я сегодня и расскажу.

Сразу оговорюсь, — если ваша цель — свой скриптовый язык или что ещё сложнее, этой статьи будет недостаточно для его реализации. В идеале нужно на отлично знать теорию автоматов и дискретные структуры. Но в качестве отправной точки можно пока ограничиться и моим опытом, которым я щедро поделюсь под катом. Это не совсем то, что я задумывал изначально, зато идеально подходит для примера. Парсить мы будем HTML, как простой и всем знакомый язык.
Читать дальше →
Total votes 22: ↑15 and ↓7 +8
Comments 17