Как эмулировать логику и синтаксис C в шаблонизаторе (препроцессоре)? - PullRequest
0 голосов
/ 21 марта 2012

У нас есть пользовательский C шаблонизатор для обработки веб-шаблонов.Допустим, у нас есть файл «index.html» со ​​следующим содержимым:

{% #include <stdio.h> %}

<!doctype html>
<html>
    <head><title>{{ title }}</title></head>
    <body>
        {{ body }}
        {% printf("test"); %}
        {% printf("test2") %}
        {% printf("test3"); %}
        {%
            printf("test4");
            printf("test5");
        %}
        {%
            printf("test6");
            printf("test7")
        %}
        {% printf("%d", isalpha('a')); %}
    </body>
</html>

Когда механизм шаблонов вызывается (инициализируется), он сканирует все файлы в определенной папке «views».Файл index.html находится в этой папке.Он сканируется и кэшируется в памяти основной программы, которая вызвала механизм шаблонов.

Когда выполняется запрос , вызывается функция работы механизма шаблонов.Функция принимает кэшированный код и массив из переменных с их типами и значениями в качестве параметров, а возвращает постоянный символ буфер с обновленными переменными и логическими операциями.Для простоты предположим, что логические операции имеют синтаксис {{...}} , соответственно, {% ...%} .

Нужно уметь использовать функции C и общую логику на языке разметки.Вы даже должны быть в состоянии определить функции в шаблонах.Если что-то пойдет не так, переменная или логическая операция должны вернуть void .Конечный результат нашей названной страницы «index.html» с «body» и «title» в качестве переменных {{body}} и {{title}} соответственно должен выглядеть следующим образом:

<!doctype html>
<html>
    <head><title>title</title></head>
    <body>
        bodytesttest3test4test5
    </body>
</html>

Как можно эмулировать логику и синтаксис языка Си?Это возможно?Вам нужно зайти так далеко, чтобы разработать собственную библиотеку операций и вызовов языка или есть более простое решение?Каков наилучший способ реализации такого решения?

1 Ответ

1 голос
/ 21 марта 2012

Есть два подхода. И то, и другое не так просто реализовать. Первый, немного более простой подход - генерировать C из файлов шаблонов, а затем использовать компилятор, такой как GCC, для генерации общего объекта. Этот общий объект может быть загружен с помощью dlopen() / dlsym() для генерации HTML-кода.

Второй, более сложный, но гораздо более гибкий подход - реализовать интерпретатор, интерпретирующий «язык шаблонов». Об этом вы можете прочитать в сборочных документах и ​​книгах по компиляции (например, «Книга Дракона»).

Конечно, вы также можете попробовать встроить, например, интерпретатор PHP, но это тоже имеет недостатки.

«Лучший путь» не существует. Это сильно зависит от того, что вы хотите. Я бы для себя внедрил бы переводчика, я думаю. Создание .so файлов мне кажется «грязным».

...