After some investigations and experiments now I can present an
working
scanner and simple parser for C source and header files, written in
Pascal.
Sample applications for the CScan library include an C preprocessor and
an converter for C header files into Pascal (OPL). While I'm
concentrating
on the extension of the core library into an cross
compiler, everybody is invited to write and contribute further
applications
and tools around that library. You can download
the source code and documentation of the WinToPas library and sample
applications
and use it in your own non-commercial projects. Some documentation is also available, sorry for
the complicated download.
In the first step a number of input modules shall be implemented, which convert a given source into the internal representation. Such modules exist already, but mostly for binary sources (objects, libraries, executables) which have a simple common structure. Input modules for source code are harder to implement, depending on the syntax and semantics of the specific programming language. Much code can be taken from open source compilers, but unfortunately many of these compilers are written in the source language, so that no automatic translation of that code is possible in this step.
In further steps output modules will be added, with a source code generator for OPL in the first place. At the same time the cross compiler machine will be continuously improved, with analyzation and transformation capabilities, and with more support for the input and output modules.
Currently I have to merge several existing decompiler and cross compiler projects, in order to create a commonly usable cross compiler machine. That's why no source code is available yet, but feel free to tell me your urgent needs, perhaps one of my older projects will be helpful to you.
Beim Schreiben dieses Programms ist mir eine Ähnlichkeit mit meinen alten Discompilern aufgefallen, die alle in GFA-Basic geschrieben sind. Das ist auch der Anlaß für die Entwicklung eines Konverters, ich brauche diese Quellen in einer neueren Programmiersprache. Momentan verwende ich Delphi (Pascal), und das soll daher auch die erste Ziel-Sprache für den Konverter sein. Später kann dann eine ganze Menge von Tools herauskommen, die entweder compilierte Programme oder Quelltexte einlesen, in eine allgemeine Darstellung (Baum) umwandeln, und dann in irgendeiner anderen Programmiersprache wieder ausgeben. Quelltexte, Maschinencode und auch Token-Code sind dabei nur unterschiedlicher Input, die Weiterbehandlung ist weitgehend identisch!
Dazu kommt ein erster Ansatz für ein Konvertierungsprogramm,
das ein Basic-Programm in eine Baumstruktur konvertieren und
anschließend
in einer anderen Programmiersprache wieder ausgeben soll. Das Einlesen
von *.GFA Dateien funktioniert halbwegs, die meisten Fehler
dürften
sich durch Ändern der Tabellen beheben lassen. Gleitkommazahlen
funktionieren
noch nicht, das sollte aber leicht zu korrigieren sein. Der Baum und
die
Ausgabe ist permanent in Arbeit, daher zunächst keine weiteren
Kommentare
hierzu.
Die Bedienung ist etwas erklärungsbedürftig. Vor allem
benötigt
man eine DOSe mit Windows/32, um das Programm laufen zu lassen, auf ST
und Windows/16 kann ich derzeit keine Rücksicht nehmen.
Dann kann man eine Datei (*.GFA) vom Explorer in die linke Hälfte
des Fensters herüberziehen, um diese zu öffnen. GFA-Basic 2.0
mit *.BAS Dateien ist vorgesehen, der zugehörige Code muß
aber
noch angepaßt werden.
Im linken Teil des Fensters erscheint dann eine Liste aller Symbole
(Variablen, Unterprogramme...), die später zum Navigieren im Code
verwendet werden soll.
Im rechten Teil des Fensters erscheint ein etwas entarteter Baum des
eingelesenen Programms. Die Breite der einzelnen Knoten kann man mit
dem
Schieber im oberen Teil des Fensters einstellen. Die Navigation im Baum
erfolgt mit den Cursor-Tasten, relativ zu dem in der linken oberen Ecke
angezeigten Knoten.
Der Token-Zweig enthält von links nach rechts das Hauptprogramm
und alle Unterprogramme, darunter alle zugehörigen Statements, die
(später) noch weiter verzästelt werden sollen.
Beim Bewegen der Maus werden in der unten liegenden Statuszeile
Einzelheiten
zu dem jeweiligen Knoten angezeigt.
Weitere Funktionen sollen laufend dazukommen, wie das Navigieren zu
einem doppelt angeklickten Knoten, und ein Kontext-Menü (rechte
Maustaste)
für jeden Knoten.
Das wars bis jetzt, viel Spaß wünscht