Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
|
Re: [Tipps gesucht] Parser erstellen
7. Feb 2007, 17:58
Hi,
ehrlich gesagt wäre bei dem was Du vorhast mein erster Tipp an Dich, das Programmieren noch weiter nach hinten zu schieben. Deinem Code fehlt schon jegliche Einrückung (such mal nach dem Begriff Codestil). Das wird sich bei einem Vorhaben der Größe "Parser-bauen" doch deutlich bemerkbar machen (nicht positiv).
Genauso wichtig ist es sich gut mit der Planung auseinander zu setzen. Jeder Fehler, den Du in der Planungsphase machst, wirkt sich irgendwann aus. Je später das der Fall ist, desto mehr Dinge sind von einer Änderung betroffen (das kann viel Zeit und Nerven kosten).
An sich solltest Du Dir vielleicht erstmal anschauen, wie ein Compiler normalerweise aufgebaut ist (geht ein wenig weiter als ein reiner Parser, aber mehr Wissen schadet hier schon nicht). An sich arbeitet man immer in mehreren Stufen, mit mehreren Komponenten.
An erster Stelle kommt hier i.d.R. die Zerlegung in Token. Aus diesen setzt Du dann einen Syntaxbaum zusammen, der es Dir dann auch schon mal ermöglicht, dass Du Syntaktische Fehler entdeckst.
Danach kannst Du Dich dann auf die Suche nach semantischen Fehlern machen. Eventuell würdest hier vorher noch einen Desuggarer einsetzen, der alle verwendeten Elemente erst in eine einfachere Normalform bringt.
Erst danach solltest Du mit dem echten Parsen anfangen. Was die Variablen angeht, so solltest Du Dir eine schönere Zuordnung überlegen. Vorallem aber ist eine statische Struktur hier völlig ungeeignet. Du reservierst eine Menge Speicher 1.000.000 * sizeOf(TVariablen), wobei ein guter Teil davon wohl ungenutzt bleiben dürfte. Ganz schlecht ist es dann auch jedes mal über 1.000.000 Werte zu iterieren, um eine Variable zu finden. Sehr viel geeigneter sind hier dyn. Strukturen (Listen/Bäume). Diese sind in ihrer Größe nicht beschränkt. TList wäre z.B. eine Möglichkeit, hier werden Zeiger in einem verwalteten Array abgespeichert. Dass sich hinter einer TList ein Array verbirgt ist für dich transparent, Delphi passt die Größe dyn. an den Bedarf an.
Noch geeigneter dürfte aber TStringList sein. Eine TStringlist ist in erster Linie eine einfache Liste von Strings. Man kann allerdings jedem String eine Objekt-Referenz assoziativ zuweisen. Diese Referenz steht immer an der gleichen Stelle, wie der String, dem sie zugeordnet wurde. Zu jedem String lässt sich dann die Position in der Liste und damit auch die Referenz ermitteln. Damit kannst Du also sehr einfach über den Namen direkt auf eine assozierte Variable zugreifen.
Etwas schneller geht das ganze dann mit der THashedStringList oder einem Dictionary (alzaimar hat mal eins gepostet), die beide mit einem Hash arbeiten und die Position eines Strings darüber schneller ermitteln können.
Ansonsten lohnt es sich für Dich vielleicht auch gleich dir den Aufbau und die Verwaltung eines Heaps anzuschauen.
Wie man es an sich so richtig richtig macht siehst Du allerdings am Besten, wenn Du hier fertige funktionierende Parser anschaust. Da gibt es ja auch im OpenSource bereich einige, allerdings dürfte deren Komplexität teilweise schon recht hoch sein. Nach Erklärungen zu suchen lohnt sich aber immer!
Gruß Der Unwissende
|