Как стать автором
Обновить

Комментарии 47

Кстати, парсинг PHP возможен с помощью Tokenizer.
Какая выгода от этого?
А какая выгода от лямбда-выражений?
Действительно, какая?
Советую спорсить об этом поисковые системы так это выходит за рамки данной статьи, да и найдете вы больше интересного чем я могу рассказать.
Можно, к примеру, сделать движок для создания простецких сайтов. Взять HTML и усовершенствовать функционалом include'ов и прочего, к примеру. А потом бац, запустили скрипт - сайт сгенерировался (и можно еще чтоб сам обновлялся дописать чтоб полностью не перезаливать).

И тогда небольшие сайты из нескольких страниц станет делать в дальнейшем легче и веселее :-)
+ они не будут сервак всякими там пхпами грузить.
Может и не только для простецких)
НЛО прилетело и опубликовало эту надпись здесь
это абстрактная программа? иначе какой ее смысл ?
Это эксперимент.
с таким ником и спрашивать, какой смысл в абстрактности?
Я думаю, что рано или поздно вам придётся написать полноценный парсер PHP. Подумайте, что сделает ваш обработчик лямбда-выражений со следующей строкой:

echo "`What a curious feeling!' said Alice; `I must be shutting up like a telescope.'";

Для того, чтобы распознать, что в этом случае выражение находится в строке, нужно распознать начало строки. А ведь начало строки — это не просто " или ', они тоже бывают в строках, экранированные... Так проблемы цепляются одна за другую как снежный ком и придётся писать полноценный парсер.
Это не решение. Это эксперимент. Я написал в конце статьи что по-хорошему надо использовать парсер, но в качестве эксперимента такой подход вполне подойдет, вы не согласны?
Согласен. Для практического применения могу порекомендовать взять обычный препроцессор C (например cpp из gcc) и посмотреть на библиотеки Boost, там сделаны очень интересные вещи при помощи одного только препроцессора. Ещё можно посмотреть на m4, очень мощный макропроцессор.
Думаю, не зря в C препроцессор встроили. Встроить его в PHP совсем не так сложно как кажется.
Уже всё встроили. Пишем исходники в файлы .phpm и используем вот такое правило для make:

%.php: %.phpm
$(CPP) -x c -P $< -o $@
Очень занятно) Но, думаю, мои статьи о кодогенерации не ограничатся препроцессингом)
Ещё раз советую вам, хотя бы поверхностно просмотрите документацию m4 (действительно, очень мощный, на нём сделан autoconf — а это все скрипты configure, к которым мы так привыкли) и библиотеки Boost для препроцессора Си. Скорее всего, там будет вся нужная вам функциональность.

У вас есть идея, отлично. Но ваш подход страдает. Для того, чтобы реализовать, казалось бы, простейшую подстановку текста (пример из статьи), оказывается, нужно хотя бы знать, где в файле с исходным кодом находятся строки в кавычках. А с усложнением добавляемого синтаксиса потребуется знать о файле исходника гораздо больше — и это будет очень-очень сложно сделать при помощи простых строковых функций типа strpos() и substr(). Вам следовало бы почитать несколько книжек о том, как писать компиляторы. Для тех задач, которые вы ставите перед собой, это просто необходимо, иначе вскоре такой препроцессор превратится в большую пачку этих str*() в которых вы сами не разберётесь уже через месяц после того, как написали.

(Да, я помню, это эксперимент. Но эксперименты должны всё-таки служить накоплению знаний/навыков, необходимых для "настоящей работы").
Токены я обрабатывал, интерпретаторы и трансляторы писал, спасибо) Просто если я об этом начну рассказывать - это в статью не уместить и мало кому будет понятно. Я лишь показал направление - кому будет интересно - найдет и парсер и макропроцессор) Это не проблема для того, кто заинтересуется)
По-моему, наоборот, многим программистам было бы очень полезно узнать, что тексты обрабатываются не только регулярными выражениями.
Думаю, на эту тему можно будет написать статью, но уже в другой раздел :-)
Как сейчас помню, в мане по cpp написано, что не стоит использовать его для чего-то кроме C. И они правы.
Спорное утверждение. В принципе, ничего довольно интересного при помощи cpp в php и не сделаешь. Но есть m4, макропроцессор общего назначения.
Автору спасибо. Значит таки в хорошем русле двигаетесь :-)
;-) Ну хорошо, что есть понимающие.
Что-то я не очень понимаю. Мне кажется подобные "эксперименты" разумно ставить используя lex + bison, и, соответственно, на gnu Си.
Почему?
Идея препроцессора PHP, написанного на PHP мне тоже когда-то приходила в мою светлую голову. Сам не доводил ее до хоть какого-то майлстоуна - терял к ней интерес, т.к. свободное время всегда хотелось проводить за более здоровыми занятиями -)

А мысли были совершенно разные - от ввода неймспейсов в PHP до интеграции языка с SQL-выраженями, выполняющими простые запросы к CSV-файлам.

Автору респект за проведенный эксперимент! Наш инструмент разработки в наших руках, что позволяет буквально каждому вносить в него полезные изменения и делиться ими со стаждущей общественностью ;-)
Вот это я и пытаюсь донести. Каждый может использовать те подходы, которые ему нравятся, придумывать себе выражения, которые для него более интуитивны. И работая над проектом параллельно работать над кодогенератором. И от каждого проекта будет вклад в генератор :-)
Одна небольшая поправка
> Я не использую символ ` (он реализует упрощенный доступ к функции eval)
Обратные кавычки - это shell_exec, а не eval
Спасибо
Идея хорошая, пример неудачный, IMHO.
Кодогенерация на препроцессоре HTML... В результате полученный код будет так же невозможно отлаживать, как то, что "компилируют" смарти (если не брать smarty console в расчёт).
Мне кажется, что совсем наоборот) Можно кодогенерировать в режиме DEBUG и в общем режиме, можно дописывать нужные конструкции и символы в зависимости от условий) Все зависит от идеи и прямоты рук)
Вы хоть раз видели код, который производит Smarty или PHPaspect?
Но в Smarty вы работаете не со сгенерированным кодом, а с исходным шаблоном. Данная статья примерно о том же)
Да, однако в случае ошибки в исходном шаблоне практически невозможно понять, в каком месте исходного шаблона допущена ошибка, так как сообщения PHP говорят о странных ошибках в странных и ужасных сгенерированных файлах, которые ничего общего не имеют с моим красивым исходным кодом.
Моё мнение таково: если вам нужна кодогенерация, то вы, скорее всего, выбрали неправильный язык для своих задач. В Ruby или Java есть возможность построения DSL — Domain Specific Language. На мой взгляд, этот подход гораздо более продуктивен, нежели кодогенерация.
Версии Smarty, которые я использовать с отличной точностью указывали на ошибки) Не сталкивался с вашими проблемами к счастью)
Ошибочно считать PHP просто препроцессором HTML. Да, это местами глючный и корявый язык, но это язык. На PHP можно писать демоны, shell-скрипты, приложения с графическим интерфейсом Qt - да что угодно.
Сделать хороший дебаг в интерпретаторе или компиляторе на PHP возможно, используя эксепшны - это всего лишь вопрос проектирования, надо оно вам или нет, но отнюдь не ограничение среды разработки.
Кому вы это рассказываете?) Можно-то много чего, только смысла в этом всём мало. Шелл-скрипты я ещё понимаю, а вот демоны и GUI на qt/gtk - уже нет. Кстати, попробуйте отловить простейший варнинг с помощью try-catch.
Да я не сомневаюсь в Вашей компетенции ;-)

Для отлова обычных ошибок внутри try-catch я стал бы использовать свой обработчик ошибок, заданный функцией set_error_handler()
Обработчик может ловить ошибку и вываливать исключение.

Насчет того, ради чего стоит использовать PHP, а ради чего нет - согласен, всему есть своя область применения. Никому ж не придет в голову написать, скажем, принт-сервер на Javascript, хотя, может быть, это и возможно. Я писал про разные возможности применения PHP просто, чтобы проиллюстрировать свое мнение, что PHP это довольно сильный инструмент для разработки.
Мне вот почему-то кажется, что необходимость set_error_handler() нарушает замечательную концепцию эксепшенов...
Каким образом нарушает?
Думаю, тут как раз и проявляется сущность PHP. Он хорош для небольших проектов, а для сложноструктурированных плохо подходит. Тут и два вида обработки ошибок, которые вообще друг с другом не согласуются и от этого сложно их вообще использовать более-менее обоснованно)
Естественное расширение:

реализация метода
require_compiled(src);

Который проверяет, что скомпилированный вариант актуален (если нет, компилирует), и затем включает компилированный вариант.

Надо продумать два пункта:

1. параллельный доступ к этой функции.

2. возможно, потребуется говорить PHP-акселераторам насчёт сброса кэша.
По поводу функций для работы с файловой системой: "Изобретаем велосипед".

http://phing.info/trac/wiki/WikiStart

Добавте сюда XSL (XSLT, XPath ... ) и будет вам счастье.

Но статьи такого плана нужны. Пока не сделаешь своё, не научишся пользоваться чужим.
Разумеется такие системы уже есть. Суть статей именно в понимании принципов)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории