Можно, к примеру, сделать движок для создания простецких сайтов. Взять HTML и усовершенствовать функционалом include'ов и прочего, к примеру. А потом бац, запустили скрипт - сайт сгенерировался (и можно еще чтоб сам обновлялся дописать чтоб полностью не перезаливать).
И тогда небольшие сайты из нескольких страниц станет делать в дальнейшем легче и веселее :-)
+ они не будут сервак всякими там пхпами грузить.
Я думаю, что рано или поздно вам придётся написать полноценный парсер PHP. Подумайте, что сделает ваш обработчик лямбда-выражений со следующей строкой:
echo "`What a curious feeling!' said Alice; `I must be shutting up like a telescope.'";
Для того, чтобы распознать, что в этом случае выражение находится в строке, нужно распознать начало строки. А ведь начало строки это не просто " или ', они тоже бывают в строках, экранированные... Так проблемы цепляются одна за другую как снежный ком и придётся писать полноценный парсер.
Это не решение. Это эксперимент. Я написал в конце статьи что по-хорошему надо использовать парсер, но в качестве эксперимента такой подход вполне подойдет, вы не согласны?
Согласен. Для практического применения могу порекомендовать взять обычный препроцессор C (например cpp из gcc) и посмотреть на библиотеки Boost, там сделаны очень интересные вещи при помощи одного только препроцессора. Ещё можно посмотреть на m4, очень мощный макропроцессор.
Ещё раз советую вам, хотя бы поверхностно просмотрите документацию m4 (действительно, очень мощный, на нём сделан autoconf а это все скрипты configure, к которым мы так привыкли) и библиотеки Boost для препроцессора Си. Скорее всего, там будет вся нужная вам функциональность.
У вас есть идея, отлично. Но ваш подход страдает. Для того, чтобы реализовать, казалось бы, простейшую подстановку текста (пример из статьи), оказывается, нужно хотя бы знать, где в файле с исходным кодом находятся строки в кавычках. А с усложнением добавляемого синтаксиса потребуется знать о файле исходника гораздо больше и это будет очень-очень сложно сделать при помощи простых строковых функций типа strpos() и substr(). Вам следовало бы почитать несколько книжек о том, как писать компиляторы. Для тех задач, которые вы ставите перед собой, это просто необходимо, иначе вскоре такой препроцессор превратится в большую пачку этих str*() в которых вы сами не разберётесь уже через месяц после того, как написали.
(Да, я помню, это эксперимент. Но эксперименты должны всё-таки служить накоплению знаний/навыков, необходимых для "настоящей работы").
Токены я обрабатывал, интерпретаторы и трансляторы писал, спасибо) Просто если я об этом начну рассказывать - это в статью не уместить и мало кому будет понятно. Я лишь показал направление - кому будет интересно - найдет и парсер и макропроцессор) Это не проблема для того, кто заинтересуется)
Идея препроцессора PHP, написанного на PHP мне тоже когда-то приходила в мою светлую голову. Сам не доводил ее до хоть какого-то майлстоуна - терял к ней интерес, т.к. свободное время всегда хотелось проводить за более здоровыми занятиями -)
А мысли были совершенно разные - от ввода неймспейсов в PHP до интеграции языка с SQL-выраженями, выполняющими простые запросы к CSV-файлам.
Автору респект за проведенный эксперимент! Наш инструмент разработки в наших руках, что позволяет буквально каждому вносить в него полезные изменения и делиться ими со стаждущей общественностью ;-)
Вот это я и пытаюсь донести. Каждый может использовать те подходы, которые ему нравятся, придумывать себе выражения, которые для него более интуитивны. И работая над проектом параллельно работать над кодогенератором. И от каждого проекта будет вклад в генератор :-)
Кодогенерация на препроцессоре HTML... В результате полученный код будет так же невозможно отлаживать, как то, что "компилируют" смарти (если не брать smarty console в расчёт).
Мне кажется, что совсем наоборот) Можно кодогенерировать в режиме DEBUG и в общем режиме, можно дописывать нужные конструкции и символы в зависимости от условий) Все зависит от идеи и прямоты рук)
Да, однако в случае ошибки в исходном шаблоне практически невозможно понять, в каком месте исходного шаблона допущена ошибка, так как сообщения PHP говорят о странных ошибках в странных и ужасных сгенерированных файлах, которые ничего общего не имеют с моим красивым исходным кодом.
Моё мнение таково: если вам нужна кодогенерация, то вы, скорее всего, выбрали неправильный язык для своих задач. В Ruby или Java есть возможность построения DSL Domain Specific Language. На мой взгляд, этот подход гораздо более продуктивен, нежели кодогенерация.
Ошибочно считать PHP просто препроцессором HTML. Да, это местами глючный и корявый язык, но это язык. На PHP можно писать демоны, shell-скрипты, приложения с графическим интерфейсом Qt - да что угодно.
Сделать хороший дебаг в интерпретаторе или компиляторе на PHP возможно, используя эксепшны - это всего лишь вопрос проектирования, надо оно вам или нет, но отнюдь не ограничение среды разработки.
Кому вы это рассказываете?) Можно-то много чего, только смысла в этом всём мало. Шелл-скрипты я ещё понимаю, а вот демоны и GUI на qt/gtk - уже нет. Кстати, попробуйте отловить простейший варнинг с помощью try-catch.
Для отлова обычных ошибок внутри try-catch я стал бы использовать свой обработчик ошибок, заданный функцией set_error_handler()
Обработчик может ловить ошибку и вываливать исключение.
Насчет того, ради чего стоит использовать PHP, а ради чего нет - согласен, всему есть своя область применения. Никому ж не придет в голову написать, скажем, принт-сервер на Javascript, хотя, может быть, это и возможно. Я писал про разные возможности применения PHP просто, чтобы проиллюстрировать свое мнение, что PHP это довольно сильный инструмент для разработки.
Думаю, тут как раз и проявляется сущность PHP. Он хорош для небольших проектов, а для сложноструктурированных плохо подходит. Тут и два вида обработки ошибок, которые вообще друг с другом не согласуются и от этого сложно их вообще использовать более-менее обоснованно)
Практическое применение