English
Студия Артемия Лебедева представляет…
parser


Последние новостиПтичкаИз раздела FAQ
[17 ноября 2009]  Выпущена версия 3.4.0:

Parser3 теперь собирается и работает как 64-битное приложение (внимание, при этом расходуется больше памяти, т.е. мы продолжаем рекомендовать пользоваться 32-битной версией, если установлены библиотеки поддержки выполнения 32-битных приложений).

Сделано большое количество оптимизаций. Теперь без использования ^memory:compact[] потребление памяти существенно уменьшено, а скорость выполнения увеличена.

У метода @GET[] теперь можно указать один параметр, через который методу будет доступен контекст обращения к объекту. Благодаря этому внутри данного метода можно будет определить контекст, в котором происходит обращение к объекту и выдать соответствующее значение. Например, можно будет отличить, когда объект запрашивается в скалярном числовом контексте (expression), когда в bool-контексте, когда объект проверяется на def, когда от него хотят получить хеш, таблицу или файл.

Больше нельзя создать пользовательский класс, являющийся потомком системного класса. Это не так страшно как может показаться, т.к. во первых далеко не всё можно было реализовать, унаследовавшись от системного класса, а во вторых, используя возможности, предоставляемые теперь свойствами @GET_DEFAULT[] и @GET[] легко сэмулировать наследование от системного класса (в документацию добавлен пример создания класса с функционалом, аналогичным классу table). Внимание, это несовместимое с предыдущей версией изменение. Если вы наследовались от системных классов, вам придётся переделать это.

Каждый метод должен будет или возвращать результат через $result во всех вариантах своего выполнения или не использовать $result вовсе. Внимание, это несовместимое с предыдущей версией изменение и вам необходимо исправить ваш код.

Все регулярные выражения теперь автоматически подвергаются дополнительной обработке (pcre_study), что в некоторых случаях обеспечивает существенный прирост в скорости поиска по шаблону.

Добавлен класс regex. С его помощью можно создавать объект-шаблон и использовать его многократно в ^строка.match[шаблон;...] или ^file:list[...;шаблон], что исключает повторную его компиляцию.

Добавлен статический класс reflection. С помощью его методов стало возможно получать информацию о классах (системных и пользовательских) и их методах. Например, можно получить: базовый класс объекта или класса, список всех классов, список статических полей класса, список динамических полей объекта, список всех методов определённого класса, список переменных метода пользовательского класса или минимально необходимое и максимально допустимое число параметров метода системного класса, узнать как вызывается метод (динамически или статически).

При загрузке файлов по HTTP с помощью конструктора ^file::load[...;http://...] теперь можно отправлять удалённому серверу файлы, для чего нужно воспользоваться добавленной опцией $.enctype[multipart/form-data] (Elik прислал patch).

Значение параметра $.method[] при загрузке файлов по HTTP с помощью конструктора ^file::load[...;http://...] теперь не чувствительно к регистру (раньше его необходимо было задавать только в верхнем регистре).

Hash теперь помнит порядок добавления в него элементов, при этом ^хеш.foreach[...]{...} перебирает элементы в этом порядке, а ^хеш._keys[...] возвращает таблицу с ключами, расположенными в том-же порядке.

При base64-декодировании в строку теперь делается проверка и, в случае обнаружения недопустимых символов в результате, выдаётся исключение (с рекомендацией декодировать в file).

Теперь производится нормализация символов перевода строки после base64-декодирования в строку.

В таблицу taint-преобразований для типа js добавлено преобразование символа с кодом \x0D в \r.

Добавлен новый вид taint-преобразований parser-code, который может быть использован для экранирования всех служебных символов с помощью символа ^.

Тело оператора ^process{...} теперь подвергается автоматическому преобразованию ^untaint[parser-code]{...}. Это несовместимое с предыдущей версией изменение: если в вашем коде в process подставлялись строки, полученные из неблагонадёжных источников (из файла, базы данных, form и т.п.) и ожидалось, код в них выполнится, то для того, чтобы всё продолжало работать, вам необходимо написать ^process{^untaint[as-is]{...}}.

В ^file:list[...] и ^строка.match[...] шаблон-регулярное выражение теперь подвергается автоматическому преобразованию ^untaint[regex]{...}. Это несовместимое с предыдущей версией изменение: если в упомянутых методах в шаблоны у вас подставлялись строки, полученные из неблагонадёжных источников (из файла, базы данных, form и т.п.), то для того, чтобы всё продолжало работать, вам необходимо вокруг подобных шаблонов написать ^untaint[as-is]{...}. Если регулярные выражения были написаны вами прямо в коде, то вам не о чем беспокоиться, т.к. всё будет продолжать работать.

Третий параметр у метода ^строка.match[...] теперь может быть задан не только в виде кода, но и в виде строки. Это работает несколько быстрее и может быть полезно в случаях, когда все найденные по шаблону вхождения нужно заменить одной и той-же строкой или просто выкусить.

Оператор ^rem{...} теперь может иметь произвольное число «параметров», и он исключается из кода на этапе компиляции. Это несовместимое с предыдущей версией изменение: если кто-то создавал свой метод/оператор с таким именем, то его необходимо переименовать, т.к. вызываться он не будет.

При записи в хешфайл, в случае превышения длины записи (ключ+значение), теперь выдаётся более внятное сообщение об ошибке.

У конструктора create класса file добавлен необязательный третий параметр, в котором с помощью опции $.charset[кодировка] можно указать кодировку букв в создаваемом объекте.

У объектов класса file, созданных с помощью конструкторов ^file::create[...], ^file::load[...] и ^file::exec/cgi[...] доступно новое поле mode, содержащее text или binary.

У nameless таблиц теперь также можно получать содержимое текущей строки в виде хеша.

У метода ^изображение.font[...] третий параметр стал не обязательным (значение ширины пробела по умолчанию теперь равно ширине gif-а). Кроме того, третий параметр теперь может быть задан в виде хеша со следующими опциями: $.space(ширина пробела), $.width(ширина букв), $.spacing(расстояние между символами).

Теперь не обязательно, чтобы конструктор был описан непосредственно у используемого класса. Достаточно, чтобы он был описан у любого предка класса.

Обращения к несуществующим классам теперь предваряются выполнением оператора @autouse[name], внутри которого можно осуществить отложенную загрузку класса.

У метода ^файл.save[mode;filespec] добавился третий хеш-параметр с опцией $.charset[...], с помощью которой можно указать кодировку, в которой необходимо сохранить файл.

У метода ^строка.save[filespec] появилась возможность в качестве второго параметра указывать хеш с опциями $.charset[...] и $.append(true).

Все имена заголовков отправляемых писем, выдаваемых браузеру HTTP-заголовков (системных и пользовательских), а также HTTP-заголовков, выдаваемых при загрузке файла с удалённого сервера, теперь подвергаются капитализации (content-type превращается в Content-Type и т.п).

Файлы, отправляемые по почте с помощью ^mail:send[], теперь по умолчанию подвергаются base64 кодированию вместо uue. Старый способ кодирования остаётся доступен с использованием опции $.format[uue].

При base64 и uue-кодировании файлов теперь расходуется меньше памяти.

В SAFE MODE при записи файлов теперь принудительно сбрасываются биты executable.

Версия скомпонована с последними версиями библиотек GC (7.1), PCRE (7.9), libxml2 (2.7.6) и libxslt (1.1.26).


Исправлен ряд ошибок:

Исправлена ошибка, из-за которой у конструктора ^file::load[...] было невозможно использовать одновременно четыре параметра, описанные в документации.

Исправлена ошибка некорректного определения кодировки, указанной в пришедшем POST запросе.

Исправлена неоптимальность в поиске по шаблону с запоминанием (круглые скобки в шаблоне). Ускорение особенно заметно при поиске по шаблону в больших текстах.

Исправлена некорректная работа ^строка.trim[...] в кодировке UTF-8 в случае, когда в списке отрезаемых символов содержались многобайтные символы (например русские буквы).

Исправлена некорректная работа методов ^изображение.font[...], ^изображение.text[...] и ^изображение.length[] в кодировке UTF-8.

Исправлена ошибка некорректной записи cookie при указании у неё bool-аттрибута со значение false.

Исправлена ошибка, из-за которой некорректно работало перекрытие свойств при статических вызовах.

Исправлена ошибка, из-за которой формировался некорректный HTTP запрос при выполнении ^file::load[...;http://...] в случае, если в указанных для отправки cookies содержался «чистый» символ перевода строки.

Исправлена ошибка, из-за которой при выполнении ^file::load[...;http://...] «чистые» символы в переданном URL и $.body не перекодировались в указанную кодировку.

Конструкция $пустая_таблица.fields теперь возвращает пустой хеш.

Исправлена ошибка, из-за которой не кодировались интернациональные имена файлов в отправляемых письмах.

Исправлена ошибка /etc/catalog:1 ... read failed на win32 (необходимо использовать новые выложенные версии xml библиотек).

Исправлена ошибка, из-за которой в некоторых случаях некорректно работало сравнение строк.

Исправлена ошибка, из-за которой не всегда корректно вычислялась длина строки при работе в UTF-8.

Исправлено несколько ошибок, приводящих к падению парсера в core в некоторых случаях.

Исправлена ошибка, из-за которой при ^таблица.flip[] в результат не пропадала последняя строка, если в последнем столбце исходной таблицы ничего не было.

Исправлена сортировка таблиц при работе в кодировке KOI8-R.



[08 июля 2009] 

Подготовьтесь к версии 3.4.0, в будет добавлено новый вид taint/untaint-преобразования parser-code. Этот вид преобразования будет экранировать все служебные символы с помощью символа ^. Кроме этого, код оператора process будет подвергаться автоматическому untaint преобразованию этого вида.

Это означает, что если у вас в ^process{...} подставлялись строки, пришедшие из неблагонадёжных источников (из файла, базы данных, form и т.п.) и ожидалось, код в них выполнится, то для того, чтобы всё продолжало работать, вам необходимо написать ^process{^untaint[as-is]{...}}.



Что такое Parser?
Parser — это технология создания сайтов с помощью простого языка. Он немного сложнее HTML, но не требует особенного умения программировать. Parser начал создаваться в Студии Лебедева в 1997 году. Сегодня подавляющее большинство сайтов, создаваемых Студией Лебедева, делаются с его помощью.

А зачем он вообще?
Язык специально спроектирован и оптимизирован для того, чтобы было удобно создавать хорошие сайты. Работа с формами, cookies, табличными файлами, базами данных и XML — часть языка, а модульность языка позволяет легко наращивать функциональность.

Если есть PHP, то для чего Parser?
PHP — это язык программирования, требующий соответствующей подготовки. На Parser могут работать далеко не профессиональные программисты. Parser именно тем и хорош, что позволяет простым смертным создавать и поддерживать сложные динамические сайты без больших затрат времени.

Я программировал на других языках, можно ли, в двух словах, что же такого удобного в Parser?
Parser в известном смысле — макроязык, в нём нет оператора print; весь текст, набранный в исходном файле, суть большой оператор print. Конструкции Parser являются погруженными в текст.
Получается, что вы не пишете программу, которая выводит текст — наоборот, в имеющийся текст вы добавляете логику, ^if(условие){действие}, и организацию, блоки(методы), на которые вы разбиваете HTML-код:

@header[]
...
@footer[]
...
@navigation[]
...
@body[]
...

Я в браузере вижу код на Parser, он не обработался, в чем может быть причина (использую веб-сервер Apache)?
Парсер все-таки не назначен обработчиком ваших документов.
Для проверки функционирования парсера наберите в адресной строке броузера:
http://ваш_сайт/cgi-bin/parser3.cgi (или .exe, для версии под Win32)
Вы должны увидеть примерно следующее:

Parser/3.x.x
Если вы это увидели, парсер скопирован куда следует, права на него установлены правильные.

Если парсер скопирован правильно и вы не забыли прописать в .htaccess инструкции, указанные в документации, возможно вы забыли разрешить апачу обработку .htaccess в файле httpd.conf с помощью инструкции AllowOverride.
Чтобы проверить, обрабатывается ли у вас .htaccess — впишите в него какую-нибудь заведомо неверную инструкцию, например «mytest», в самое начало. Если при релоаде страницы вы не увидите 500 ошибку (она обязательно появится если все настроено верно) — значит данный файл у вас не обрабатывается. Измените значение AllowOverride или обратитесь к вашему администратору.



Parser 3 — простой и удобный объектно-ориентированный язык, позволяющий быстро создавать хорошие сайты.

  • Теперь на 30% удобнее!
  • Новое ядро (переработанное и, разумеется, улучшенное)
  • Новый улучшенный синтаксис
  • Поддержка XML, XSL, XPath и DOM
  • Доступен в документированных исходных текстах
  • Расширенная поддержка баз данных
  • Поддержка объектно-ориентирующихся программистов
  • Подробная документация по языку на русском языке (160 страниц!)
  • Поддержка UTF-8