Я пытаюсь создать метаязык для написания кода разметки (например, xml и html), который может быть непосредственно встроен в код C / C ++.
Вот простой пример, написанный на этом языке, я называю его WDI (интерфейс веб-разработки):
/*
* Simple wdi/html sample source code
*/
#include <mySite>
string name = "myName";
string toCapital(string str);
html
{
head {
title { mySiteTitle; }
link(rel="stylesheet", href="style.css");
}
body(id="default") {
// Page content wrapper
div(id="wrapper", class="some_class") {
h1 { "Hello, " + toCapital(name) + "!"; }
// Lists post
ul(id="post_list") {
for(post in posts) {
li { a(href=post.getID()) { post.tilte; } }
}
}
}
}
}
По сути, это модифицированный источник C с удобным интерфейсом для html.
Как вы можете видеть, традиционный стиль, основанный на тегах, заменяется на C-подобные команды с блоками, разделенными фигурными скобками.
Мне нужно построить интерпретатор, чтобы перевести этот код в HTML и вставить его в C, чтобы он мог быть скомпилирован. Часть C остается нетронутой.
Внутри источника wdi нет необходимости использовать print, каждый оператор return будет использоваться для вывода (в функции printf).
Вывод программы будет чистый HTML-код.
Так, например, тег заголовка 1 будет преобразован следующим образом:
h1 { "Hello, " + toCapital(name) + "!"; }
// would become:
printf("<h1>Hello, %s!</h1>", toCapital(name));
Моя главная цель - создать интерпретатор для перевода источника wdi в html, например:
tag(attributes) {content}
=> <tag attributes>content</tag>
Во-вторых, html-код, возвращаемый интерпретатором, должен быть вставлен в C-код с помощью printfs. Переменные и функции, которые встречаются внутри wdi, также должны быть отсортированы, чтобы использовать их в качестве параметров printf (случай toCapital (name) в исходном коде).
Я ищу эффективный (я хочу создать быстрый парсер) способ создания лексера и парсера для wdi. Уже попробовал flex и bison, но я не уверен, что они лучшие инструменты. Есть ли хорошие альтернативы? Каков наилучший способ создать такого переводчика? Можете ли вы посоветовать краткую литературу по этому вопросу?