In den Kommentaren sagen Sie, dass die von Ihnen vorgeschlagene Sprache (ich nenne sie Ext-C, für Extended C) eine DSL ist, die für ein begrenztes Publikum gedacht ist (Sie selbst, Ihre Studenten), dann werden Sie das auch tun müssen:
- Schreiben Sie einen Code zum Parsen von Ext-C, der erkennt, welche Teile reines C und welche Teile Ext-C sind.
- Schreiben Sie den C-Code-Generator, der die Übersetzung von Ext-C in C darstellt.
- Bauen Sie ihn zu einem Präprozessor zusammen, der Ext-C-Quelldateien liest und C-Quelldateien schreibt.
- Schreiben Sie ein Compiler-Skript (oder ein Programm), das das Parsen von Argumenten und die Ausführung des Ext-C-Präprozessors auf den Ext-C-Dateien übernimmt, bevor der C-Compiler für den Rest der Übersetzung ausgeführt wird.
をご覧ください。 Cfront als eine mögliche Quelle für Ideen.
Es gibt ein Skript "esql", das die Kompilierung steuert, und einen Präprozessor "esqlc", der die ESQL/C-Quellen analysiert und den entsprechenden C-Code erzeugt. Programmierer führen das Skript 'esql' aus, um ESQL/C-Programme zu kompilieren; sie führen das Programm 'esqlc' nicht manuell aus, es sei denn, sie haben eine ungewöhnlich perverse und masochistische Ader.
Beachten Sie, dass die Integration mit einem Debugger eine der schwierigsten Aufgaben einer DSL ist. Sie können Ihren Präprozessor veranlassen, ' #line
Richtlinien', was manchmal hilfreich und manchmal hinderlich ist. (In meinem Arsenal von Skripten habe ich eines, das auskommentiert #line
Direktiven; ich verwende sie, wenn ich den C-Zwischencode debuggen muss, aber dennoch auf den ursprünglichen Quellcode zurückgreifen kann). Sie können auch sehen, wie lex und yacc (und Varianten) dies in ihrer Ausgabe handhaben. Es ist auch eine gute Idee, den Präprozessor die Zwischendatei standardmäßig aufräumen zu lassen (bei erfolgreicher Kompilierung), aber eine Option anzubieten, so dass die Zwischendatei zur Überprüfung verfügbar bleibt. Beachten Sie, dass wenn Ihr Präprozessor nicht garantiert, dass die gesamte Ausgabe gültiges C ist - weil er nur Teile der Eingabe in die Ausgabe kopiert, ohne sie zu validieren, wie es ein C-Compiler tun würde - dann müssen Sie sicherstellen, dass die Benutzer (Programmierer) erkennen können, wo der Fehler in der Originaldatei liegt, selbst wenn der Fehler vom C-Compiler und nicht vom Ext-C-Compiler entdeckt wird.
Die IBM Informix 4GL-Programmiersprache ist eine vollständige Sprache, die von ihrem primären Compiler vollständig geparst wird, der dann (etwas stark vereinfachend) C-Code erzeugt. Es gibt ein Skript c4gl
zur Kontrolle der Kompilierung und Verknüpfung sowie einen Präprozessor/Compiler i4glc1
(und, weil ich zu sehr vereinfacht habe, i4glc2
, i4glc3
y i4glc4
auch). Wenn der generierte C-Code nicht kompiliert werden kann, ist das ein Fehler im I4GL-Compiler - es ist nicht die Schuld des Benutzers.