Как эмулировать логику и синтаксис C в механизме шаблонов (препроцессоре)?

У нас есть собственный механизм шаблонов 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>

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

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

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

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

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


person user1254893    schedule 21.03.2012    source источник
comment
@blueshifr - Безумие? Это Спарта.   -  person user1254893    schedule 21.03.2012


Ответы (1)


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

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

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

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

person ckruse    schedule 21.03.2012