Próbuję utworzyć metajęzyk do pisania kodu znaczników (takiego jak xml i html), który może być bezpośrednio osadzony w kodzie C/C++. Oto prosty przykład napisany w tym języku, ja to nazywam WDI (interfejs Web Development):Jak skutecznie zbudować interpretera (lexer + parser) w C?
/*
* 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; } }
}
}
}
}
}
Zasadniczo jest źródłem C z przyjazny dla użytkownika interfejs dla HTML. Jak widać, tradycyjny styl oparty na znacznikach jest zastępowany stylem C, z blokami ograniczonymi przez nawiasy klamrowe. Potrzebuję zbudować tłumacza, aby przetłumaczyć ten kod na html i później wstawić go do C, aby mógł zostać skompilowany. Część C pozostaje nienaruszona. Wewnątrz źródła wdi nie ma potrzeby używania wydruków, każda instrukcja zwrotu będzie używana do wyprowadzania (w funkcji printf). Wynik programu będzie czysty kod html.
Tak więc, na przykład pozycji 1 tag zostanie przekształcona tak:
h1 { "Hello, " + toCapital(name) + "!"; }
// would become:
printf("<h1>Hello, %s!</h1>", toCapital(name));
Moim głównym celem jest stworzenie tłumacza do przetłumaczenia WDI źródła html tak:
tag(attributes) {content}
=><tag attributes>content</tag>
Po drugie kod html zwrócony przez interpreter musi zostać wstawiony do kodu C za pomocą printfs. Zmienne i funkcje, które występują wewnątrz programu wdi, należy również posortować w celu użycia ich jako parametrów printf (przypadek toCapital (name) w źródle próbki).
Poszukuję wydajnego (chcę utworzyć szybki parser) sposób tworzenia leksykonu i analizatora składni dla wdi. Już wypróbowany flex i żubr, ale nie jestem pewien, czy są to najlepsze narzędzia. Czy są jakieś dobre alternatywy? Jaki jest najlepszy sposób na stworzenie takiego tłumacza? Czy możesz doradzić jakąś krótką literaturę na ten temat?
Imho, flex i bizon to prawdopodobnie najlepsze narzędzia do pracy. – ereOn
Naprawdę nie pytasz o kompilator WDI-> C? Nie brzmi to tak, jakbyś chciał bezpośrednio wykonać kod WDI, ale raczej przekonwertować go na C, a następnie wprowadzić kod C do kompilatora C. –
Zgadza się! WDI powinien zostać przekonwertowany na C. Ale myślę, że implementacja byłaby podobna, dlatego też chciałbym stworzyć tylko interpreter do użytku i testowania html. – Rizo