войти зарегистрироваться

КомпиляторыРазрабатываем компилятор для учебного языка Cool на языке C# под .NET (Часть 1) из песочницы

Введение


Здравствуй, уважаемый хабраюзер.
Я хотел бы тебе представить материал о практическом создании компилятора, который будет транслировать код, написанный на языке Cool, в код виртуальной машины CIL (Common Intermediate Language) под платформу .NET.
Данный материал я решил разбить на две части из-за лени все сразу это описывать

В первой части будет описан процесс написания грамматики с учетом приоритетов операторов в среде ANTLR, а также генерации лексера и парсера под язык C#. Также в ней будут рассмотрены подводные камни, которые встретились у меня на пути. Таким образом я постараюсь хоть кому-нибудь сэкономить время.

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

JavaScriptАзы Dojo на примере самодельного Хабра-парсера из песочницы

Введение


image
Приветствую читателей.
В ходе разработки проекта, мне понадобилось сделать небольшой парсер для смежного сайта.
Незадолго до этого командой было принято решение использовать фреймворк Dojo
В результате размышлений родилась идея сделать красивый парсер Хабра, заодно осовоив Dojo и решив проблему экономии трафика для мобильного (часто читаю в пути).
Данное руководство несёт чисто практический характер и не претендует на идеальность исполнения.

PythonGrab — python библиотека для парсинга сайтов

Лет пять-шесть назад, когда я ещё программировал преимущественно на PHP, я начал использовать библиотеку curl для парсинга сайтов. Мне нужен был инструмент, который позволял эмулировать сессию пользователя на сайте, отсылать заголовки обычного браузера, давать удобный способ отсылки POST-запросов. Сначала я пытался использовать напрямую curl-расширение, но его интерфейс оказался очень неудобным и я написал обёртку с более простым интерфейсом. Время шло, я пересел на python и столкнулся с таким же дубовым API curl-расширения. Пришлось переписать обёртку на python.

*nixПарсер на shell с обходом XOR-шифрования при авторизации из песочницы

Недавно возникла необходимость в парсере интернет-счета банковской карты для дальнейшего уведомления об операциях посредством смс\e-mail. Сделать это было решено по-быстрому шел-скриптом, который будет парсить страницу со счетом с определенной периодичностью при помощи задания в cron, а в случае изменения баланса счета — высылать сообщение на мобильный телефон или e-mail. Ничего сложного на первый взгляд, однако в ходе написания пришлось решить некоторые сложности, о которых вы сможете прочесть под катом.

Open sourceEmacs нарушал GPL с 2009 года

Редактор Emacs, флагманский продукт GNU и самая знаменитая разработка Ричарда Столлмана, как оказалось, нарушает лицензию GPL с 28.09.2009 г, когда в комплекте с программой началось распространение бинарников без исходных кодов.

Речь идёт о пакете CEDET для анализа статичного кода. Версии Emacs 23.2 и 23.3 содержали синтаксические анализаторы (парсеры), созданные программой bison по грамматикам, без приложения соответствующих грамматик. Технически, сами эти парсеры можно считать исходным кодом (они компилируются и пригодны для чтения человеком), хотя фактически они таковыми не являются — видимо, из-за этого и произошла путаница в толковании условий лицензии GPL. Сокрушаться по поводу такого «нарушения» могут только самые принципиальные люди вроде Ричарда Столлмана.

«Мы совершили очень серьёзную ошибку, — написал Ричард Столлман в рассылке emacs-devel. — Каждый, кто распространял эти версии Emacs, нарушал GPL не по своей вине. Нам нужно исправить данные релизы ретроспективно (или удалить их), и нужно сделать это немедленно. Я вижу два быстрых способа исправить релизы: удалить скомпилированные файлы или добавить для них исходные коды».

Разработчики Emacs не знают, куда пропали исходники CEDET, они уже начали поиски. Сам Ричард Столлман не имеет отношения к разработке Emacs с 2008 года.

WordpressПлагин Links2Tabs: открываем и просматриваем все ссылки одним кликом

Здравствуй Хабр!

Месяц тому писал как можно много сайтов на одной странице разместить для пересылки и открытия одним кликом.

На днях вышел Вордпрес плагин, который делает следующее.

1. Сканирует каждый пост и / или страницу и находит там все ссылки.

2. Группирует эти ссылки в одну.

3. Внизу поста добавляет линк, при нажатии на который всё открывается в табах одним кликом.

About Habr

Вопрос: зачем мне и моим читателям это нужно?

АлгоритмыСоздание синтаксического анализатора (парсера) по контекстно-свободным грамматикам из песочницы

Пару лет назад я собирался написать интерпретатор Пролога на Delphi. Я решил начать с создания парсера. Написание анализатора специально под Пролог показалось мне жутко сложным, казалось, легче будет написать универсальный анализатор и синтаксис Пролога к нему. Ну, так как это все безумно сложно и долго, я забросил эту задумку. А вот парсер остался. Здесь я расскажу про его написание.

Цель: написать синтаксический анализатор, поддерживающий контекстно-свободные грамматики. Также парсер может выполнять какие-то действия (связанные, например, с интерпретацией) в процессе анализа — т. н. «пользовательская часть» парсера.

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

Добро пожаловать в Главу 2 учебника «Создание языка программирования с LLVM». В этой главе мы увидим, как использовать лексический анализатор, созданный в Главе 1, чтобы построить полный синтаксический анализатор для нашего языка Kaleidoscope. После того, как у нас будет готов парсер, мы будем строить Abstract Syntax Tree (AST) (Абстрактное синтаксическое дерево).

Информационная безопасностьПочему в MySQL нет встроенного в парсер контроллера инъекций?

Я вот чего давно не могу понять — почему MySQL до сих пор не встроила защиту от инъекция прямо в парсер? Ведь ее парсер в любом случае разбирает запрос любой сложности на составляющие и точно знает, куда какое значение пойдет. Что мешает, скажем, сделать вот так:

mysql_query_safe("
SELECT * FROM table1
LEFT JOIN table2 ON (table1.field = table2.field)
WHERE name = $1 AND id=$2 AND time = $3
", "habra'1", "blablabla", "NOW()");


Парсер знает, что name — строковое поле. Значит, он автоматически экранирует одиночные кавычки и окружит значение обычными кавычками. Далее, парсер знает что id — числовое поле и выдаст ошибку, что ему посылают строку. И, наконец, парсер знает, что time — это поле типа DATETIME, а NOW() — это функция, выдающая время, и не будет окружать данное значение кавычками.

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

UPD: Я идиот, всё это есть, но почти никто не знает. В комментариях хорошие ликбезы.

RubyWatir: простой парсинг сложных сайтов

imageКаждый, кто пишет парсеры, знает, что можно распарсить сто сайтов, а на сто-первом застрять на несколько дней. Структура очередного отмороженного сайта может быть сколь угодно сложной, и, когда дело касается сжатых javascript-ов и ajax-запросов, расшифровать их и извлечь информацию с помощью обычного curl-а и регекспов становится дороже самой информации.

Грубо говоря, проблема в том, что в браузере работает javascript, а на сервере его нет. Нужно либо писать интерпретатор js на одном из серверных языков (jParser и jTokenizer), либо ставить на сервер браузер, посылать в него запросы и вытаскивать итоговое dom-дерево.

В древности в таких случаях мы строили свой велосипед: на отдельной машине запускали браузер, в нем js, который постоянно стучался на сервер и получал от него задания (джобы), сам сайт грузился в iframe, а скрипт извне отправлял dom-дерево ифрейма обратно на сервер.

Сейчас появились более продвинутые средства — xulrunner (crowbar) и watir. Первый — безголовый firefox. У crowbar есть даже ff-плагин для визуального выделения нужных данных, который генерит специальный парсер-js-код, однако там не поддерживаются cookies, а допиливать неохота. Watir позиционируется разработчиками как средство отладки, но мы будем его использовать по прямому назначению и в качестве примера вытащим какие-нибудь данные с сайта travelocity.com.