![]() |
Re: Wie am besten Parsen?
Moin Malo,
als erstes solltest Du Dir mal darüber Gedanken machen, was für Bestandteile die Sprache haben soll, und wie diese aufgebaut sein sollen. Beispiel: Bezeichner (für Variablen, Keywords, Datentypen): Regel : dürfen nur aus Buchstaben und Ziffern bestehen, müssen mit einem Buchstaben anfangen. Zahlen: Regel : dürfen nur aus Ziffern bestehen, müssen mit einer Ziffer ungleich 0 beginnen, Wertebereich von / bis. Strings: Regel : müssen mit ' beginnen, müssen mit ' enden. Operatoren: Regel : erlaubt sind +,-,*,/,=,; (in Deinem Beispiel noch $ als Kennzeichen, dass eine Variable folgt) Jeder dieser Bestandteile ist ein Token, dass sich aus Typ und Attribut zusammensetzt. Bei einem Bezeichner wäre das dann z.B. Typ: Bezeichner, Attribut: EineIntVariable oder das =: Typ: Operator Zuweisung, Attribut: <Keines erforderlich> Wenn Du jetzt also Deine Bestandteile und die Regeln, wie sie gebildet werden hast, kannst Du anfangen die Quelldatei "auseianderzunehmen". Hierbei musst Du dann Zeichen für Zeichen durchgehen, und bei jedem entscheiden, wie es weitergehen kann. Wieder auf Dein Beispiel bezogen: Du triffst auf ein i (das aus int). Da es sich um einen Buchstaben handelt, muss es sich um irgendeinen Bezeichner handeln. Jetzt kannst Du also von hier aus, bis zum ersten Trennzeichen durchgehen (hier ein Blank), und hast anschliessend Deinen Bezeichner int. 1. Token: IDENTIFIER:int Als nächstes triffst Du auf $ 2. Token: OperatorVariable:$ jetzt folgt wieder ein Bezeichner usw. Wenn Du auf einen Kommentar triffst, kannst Du diesen natürlich überlesen, denn er hat ja mit dem Ablauf nichts zu tun. Als Interpreter solltest Du eine ganze Zeile am Stück in Token verwandeln (gekennzeichnet bei Dir durch ;), und kannst anschliessend darangehen die Zeile auszuwerten: 1. Token ist ein Datentyp => jetzt muss ein $ folgen => jetzt muss ein Bezeichner folgen, der kein Keyword ist (hier: OK, kann in die Liste der Variablen als integer-Variable aufgenommen werden) => jetzt muss ein logisches Zeilenende folgen Jetzt bis zum "physikalischen"-Zeilenende (#13#10) wieder von Vorne, da nur noch ein Kommentar folgt geht's weiter: Ist diese aufgespalten: 1. Token ein $ => Jetzt muss eine Variable folgen. In der Liste ist diese, als kann es weitergehen, sonst Fehler => Jetzt muss eine Zuweisung folgen. => Da es sich um eine integer-Variable handelt, muss jetzt ein numerischer Ausdruck folgen (Variablen, Zahlen, Operatoren) => eine 10, also wird der Variablen in der Liste jetzt dieser Wert zugeordnet. .... Das ist jetzt nur einmal grob vereinfacht dargestellt. Als Suchbegriffe zu diesem Thema kannst Du es mal mit Compilerbau, DEA (Determinierender endlicher Automat), Zustandsautomat versuchen. Zum Thema ![]() Im Moment zur Hand habe ich diesen ![]() |
Re: Wie am besten Parsen?
Zitat:
auch, wenn ich noch nicht viel sinnvolles zu "Tokenizer" gefunden hab (es soll zwar eine tokenizer.pas geben, die ich jedoch noch nicht gefunden hab), ist das mal ein vernünftiger Ansatz. Prinzipiell könnte ich ja den ganzen Quellcode in StringListen packen (eventuell für jede Zeile eine eigene, also bis zum Semikolon immer, aber darüber kann man ja noch diskutieren). Dann prüfe ich einen Eintrag nach dem anderen, ob die in die Syntax passt. Aber das ist mal 'ne Idee... :thumb: //edit: Auf Christians Beitrag antworte ich später noch mal, hab grad nich so viel zeit... |
Re: Wie am besten Parsen?
Moin Malo,
wenn Du erst einmal weisst aus was sich die Sprache zusammensetzen soll ist ein Tokenizer noch das kleinste Übel ;-) |
Re: Wie am besten Parsen?
der tokenizer muss doch den text nur mit den begrenzungszeichen [' ',';',','] zerteilen. und am besten noch sagen, welches begrenzungszeichen es denn war.
|
Re: Wie am besten Parsen?
@DGL
und sie siehts anstatt mit
Delphi-Quellcode:
hiermit aus?
x := 1;
Delphi-Quellcode:
Da brauchst du als Trennzeichen '', was dann aber jedes Zeichen separiert.
x:=1;
Gut, in einer "Anfangssprache" kann man halt erzwingen, damit man Leerzeichen setzen muss air |
Re: Wie am besten Parsen?
Zitat:
|
Re: Wie am besten Parsen?
Zitat:
Zitat:
Ob man bei Strings nun ' oder " oder was ganz anderes verwendet, ist eher nebensächlich. Das, wo ich mir bisher die wenigsten Gedanken drüber gemacht hab, sind die Operatoren, die ja die wichtigsten sind... ;) Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
@Airblader: Verkompliziere das bitte nicht unnötig. Ich will dann halt immer Leerzeilen als Begrenzung haben, basta :mrgreen: Gehört meiner Meinung auch zum guten Programmierstil... alles so eng zu schreiben ist eklig :? |
Re: Wie am besten Parsen?
Moin malo,
Zitat:
Wenn Du in einem C(++)-Quelltext auf eine 0 triffst, kann es sein, dass es sich um eine einfach dezimale 0 handelt, es könnte aber auch der Beginn einer hexadezimalen Zahl (0x, 0X) oder einer oktalen Zahl sein. ;-) Mal abgesehen davon, dass auch Gleitkommazahlen mit einer 0 beginnen können... Was die Tokenliste angeht: Ich habe es (vereinfacht) so gelöst: Ein Aufzählungstyp der die verschiedenen Tokentypen enthält. Ein Recordtyp der Typ und Attribut enthält. Eine Klasse, die ein dynamisches Array des Recordtypen enthält, und für die sonstige Verwaltung der Token zuständig ist. (z.B. Add, Delete, Insert...) |
Re: Wie am besten Parsen?
@malo
gehört für mich auch dazu, aber in praktisch allen sprachen ist es erlaubt/möglich. Da es ja deine Sprache ist, ist es dann aber auch deine Sache ;) air |
Re: Wie am besten Parsen?
Zitat:
Obwohl... grade eben kommt mir dazu die Idee, gezielt nach solchen Konstruktionen zu suchen (vor dem Aufteilen in StringListen!) und einfach Leerzeichen davor und dahinter setzen :mrgreen: Problem wären dann nur ähnliche Konstruktionen in Strings :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz