Портирование шаблонного механизма Django к C

Я недавно записал простой и крошечный встроенный сервер HTTP для своего приложения C++ (QT), и я играл немного с http-синтаксическим-анализатором Ry и любил его. Этот парень является сумасшедшим.

Таким образом, я сказал мне: "Эй! Почему не портируют django движок шаблонов на C?" Это было бы потрясающим! Я знаю, это не будет легкая задача (нисколько, я знаю), но я действительно любил бы реализовывать это. Таким образом, я приехал сюда для вдохновения, идей, мнений...

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

Миллион благодарностей времена!

P.S. Простые фрагменты кода и ссылки на инструменты и освобождают, очень приветствуются!

P.P.S. Я уже знаю о grantlee, я смотрел в его источники. Хорошо... это - C++, и это характерно для QT.

10
задан sandra 30 May 2010 в 15:16
поделиться

1 ответ

Хм, я не вижу причин, по которым что-либо в коде шаблонов django было бы трудно реализовать на C. Синтаксис шаблонов выглядит немного питоническим, но на самом деле это не python; они реализовали свой собственный парсер для него. Поэтому первым местом, где стоит искать, будет реализация шаблонов django на python. Там на самом деле не так много кода, и его достаточно легко понять.

Конечно, C будет гораздо более многословным. То, что вы пишете - это именно компилятор: он считывает некоторый код (шаблоны django) и записывает некоторый код на другом языке (html). Поэтому вся документация, которую вы можете найти о написании компиляторов на C (т.е. токенизаторы + парсеры + генераторы кода), актуальна.

Сначала вы, вероятно, захотите сгенерировать синтаксическое дерево. Синтаксис шаблонов django очень регулярный... каждый {% whatever %} блок имеет соответствующий {% endwhatever %} блок, так что ваш парсер может фактически сгенерировать дерево, не зная, что все whatever ключевые слова могут быть.

Затем вы проходите по дереву, выполняя фазу "code gen" для каждого блока. Например, вы кодируете {% if %}, проверяя значение параметра if, и печатая либо его содержимое, либо ничего, в зависимости от того, истинно или ложно предложение if. И так далее с циклами while, фильтрами, блоками и т. д.

Учтите, что все это - большая работа... Вы не думали просто встроить интерпретатор python в вашу программу на C? (Серьезно! Это не так уж сложно сделать, поскольку интерпретатор python имеет открытый исходный код.)

.
6
ответ дан 4 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: