Wie kann man effizient einen Interpreter (Lexer + Parser) in C erstellen?

8

Ich versuche, eine Metasprache zum Schreiben von Markup-Code (wie xml und html) zu erstellen, die direkt in C / C ++ - Code eingebettet werden kann. Hier ist ein einfaches Beispiel in dieser Sprache geschrieben, ich nenne es WDI (Web Development Interface):

%Vor%

Grundsätzlich ist es eine C-Quelle mit einer benutzerfreundlichen Schnittstelle für HTML. Wie Sie sehen können, wird der traditionelle Tag-basierte Stil durch C-ähnliche ersetzt, wobei die Blöcke durch geschweifte Klammern voneinander getrennt sind. Ich muss einen Interpreter bauen, um diesen Code in HTML zu übersetzen und ihn nach C einfügen, damit er kompiliert werden kann. Der C-Teil bleibt intakt. Innerhalb der wdi-Quelle ist es nicht notwendig, Ausdrucke zu verwenden, jede return-Anweisung wird für die Ausgabe verwendet (in printf-Funktion). Die Ausgabe des Programms wird sauberer HTML-Code sein.

So würde zum Beispiel ein Überschrift-1-Tag wie folgt umgewandelt:

%Vor%

Mein Hauptziel ist es, einen Interpreter zu erstellen, der wdi so in HTML übersetzt:

tag(attributes) {content} = & gt; <tag attributes>content</tag>

Zweitens muss HTML-Code, der vom Interpreter zurückgegeben wird, in C-Code mit printfs eingefügt werden. Variablen und Funktionen, die innerhalb von wdi auftreten, sollten ebenfalls sortiert werden, um sie als printf-Parameter zu verwenden (der Fall von toCapital (name) in der Beispielquelle).

Ich suche nach einem effizienten (ich möchte einen schnellen Parser erstellen) Weg, um einen Lexer und Parser für wdi zu erstellen. Habe schon Flex und Bison ausprobiert, aber da bin ich mir nicht sicher ob sie die besten Werkzeuge sind. Gibt es gute Alternativen? Was ist der beste Weg, um einen solchen Interpreter zu erstellen? Können Sie eine kurze Literatur zu diesem Thema empfehlen?

    
Rizo 20.05.2010, 16:06
quelle

4 Antworten

1

Wenn Sie das wirklich ernst meinen, wollen Sie einen vorhandenen C-Parser modifizieren. Das Edison Design Group C-Frontend könnte eine Option sein, obwohl es wirklich nur sein möchte / em> ein C (C ++) Frontend.

Eine weitere Option ist unser DMS Software Reengineering Toolkit . DMS kann mit einem C-Frontend erhalten werden, das einen vollständigen C-Parser enthält, der vollständig aus einer Grammatik stammt.

DMS bietet direkte Unterstützung beim Aufbau von Dialekten von Sprachen, und was Sie tun möchten, ist einen Dialekt von C zu bauen, so dass es Ihr Ziel unterstützen würde. DMS bietet auch viele Maschinen für den Aufbau von Übersetzern, so dass es ziemlich einfach wäre, Ihren Dialekt in echten C-Code zu übersetzen und ihn auszusenden.

    
Ira Baxter 08.06.2010, 09:51
quelle
3

Bison / Flex oder Yacc / Lex ist die traditionelle Art, es zu tun. IMHO, es gibt nichts besser für die vorliegende Aufgabe geeignet.

Beachten Sie, dass die Aufgabe nicht von einer regulären Sprache (d. h. Regex, einfaches Perl-Skript usw.) ausgeführt werden kann, so dass Sie wirklich einen Parser benötigen.

Besser, es richtig zu machen. Höchstwahrscheinlich wird ein von yacc / bison generierter Parser viel sauberer (und schneller) sein als irgendein handgefertigter rekursiver absteigender Parser.

    
Ingo 20.05.2010 16:17
quelle
1

Kann ich dieses Tutorial vorschlagen: Ссылка

Dort gibt es ein Tutorial, wie man eine eigene virtuelle Maschine erstellt, komplett mit einem Assembler und Interpreter

    
Icemanind 20.05.2010 16:17
quelle
1

Boost Spirit kann besser sein als Bison / Flex für solche Zwecke.

    
Alexandre C. 22.06.2010 12:35
quelle

Tags und Links