Tag. Weiss jemand, wo es eine Step by Step Anleitung zum Programmieren eines Parsers gibt? Alternativ würde mir auch eine ausführliche Beschreinbung der Funtionsweise eines P. ausreichen.
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Hi!
Was für ein Parser soll's denn sein?
Ein Parser für Textadventures vielleicht. :)
Da hab' ich selbst mal was zustande gebracht zu 64er-Zeiten und da gab's zwei hervorragende Sonderhefte des 64er-Magazins zu, die ich sogar noch im Schrank habe... ;-)
Ok, jetzt mal etwas ernster.
Nach meiner ureigenenen Interpretation ist ein Parser (nur) der Teil eines Compilers, der die einzelnen Wörter aus dem Quelltext extrahiert und in Tolkens (ich hoffe, das schreibt man so) umwandelt.
Er sucht Befehlswörter, Kommandos (das können auch einfache Rechenoperatoren sein) und erkennt Konstanten (numerische Werte oder Zeichenketten).
Dabei filtert er Syntax-Fehler aus (z.B. "Unbekanntes Wort/Befehl gefunden" oder "Fehler bei Wandlung einer Zahl"). Aus jedem Wort das er erkennt macht er ein Tolken.
Im Einfachsten Fall arbeitet er Wortweise und reicht die gewandelten Tolkens an den Semantik-Check weiter. Eine Zeilenbasierte Vorgehensweise wäre auch denkbar, dann werden mehrere Tolkens in einem Rutsch weitergegeben.
In dieser Stufe wird dann getestet, ob die "Reihenfolge" der Tolkens einen Sinn ergibt und entsprechende Fehler ausgegeben (z.B. "IF ohne THEN" oder "Eine Variable wird erwartet").
Dann kommt der eigentliche Compiler und wandelt die Tolkens in ausführbaren Code um (das kann natürlich ein PCode sein). An dieser Stelle kann man natürlich auch direkt den Interpreter ansprechen.
Mit dieser Vorgenhensweise bin ich bisher immer klar gekommen, wenn es darum ging, Anweisungsfolgen aus einer Textdatei zu lesen und in Programmanweisungen umzusetzen. Ob man damit nun einen Roboter steuert oder einen Drachen bekämpft ist eigentlich egal. ;-)
Bis denn
Andreas
Das weiss ich ja alles. (übrigens Tolkens sind Tokens!)
Es würde mich aber mal interessieren, wie man vorgehen muss, wenn man aus Java Quellcode in Echtzeit schlüsselwörter hervorheben kann.
-> Snytaxhighlighting
so wie in der Delphi IDE oder in VC++
Dazu will ich ne Übersicht über alle Klassen präsentieren, was kein Problem ist, wenn ich wüsste, wie ich einen Parser oder Scanner oder so stricken kann.
Es müsste Ja jede Tastatureingabe ausgewertet werden. Muss dabei jedesmal der ganze Text durchgescannt werden? Wie ermittle ich denn die Schlüsselwörter, wenn ich ein Stück Text habe? Mit nem Array, wo alle Wörter drinnstehen wohl kaum, das wird zu langsam. Hoffe mein eigentliches Problem ist klargeworden. Suche also nach kongreten Algorythmen.
>Tolkens
Nee - lass das "l" weg, dann isses richtig: Token(s)
Volker
Danke, für die Berichtigung.
Wenn sich das Teil "Frodo" nennen würde, wär mir das nicht passiert. ;-)
Bis denn
Andreas
Hi JamesBomb!
Ok, jetzt verstehe ich auch worum's geht. ;-)
Aber im Prinzip kennst du die Lösung: es sind deine "Befürchtungen".
Das Parsen wird bei den bekannten IDEs (und auch bei den Online-Rechtschreibkorrekturen) wohl tatsächlich bei jedem Tastendruck ausgelöst. Evtl. kann man den eigentlichen Parsinganstoss auch auf das Eingeben von Trennzeichen (Spaces, Punkte usw.) beschränken.
Zum Zeitpunkt der Eingabe muss dann nur die gerade aktuelle Zeile neu geparst werden. (Ich weiss nicht, ob hier eine IDE das Parsen über mehrere Zeilen unterstützt, ich hab' einfach noch nicht daraf geachtet.)
Um einen Array mit den Schlüsselworten (oder eine irgendwie verwaltete Wortliste) wirst du nicht herumkommen. Wie sollte es auch sonst funktionieren? ;-)
Die Geschwindigkeit ist hier warscheinlich nicht das grosse Problem (mein Bruder hat das Parsen zum Eingabezeitpunkt schon in compiliertem Basic auf dem C64 umgesetzt, zwar nur mit knapp 100 Schlüssel-wörtern, aber es funktionierte).
Hier ist dann ein schneller Suchvorgang gefragt. Ich denke eine sortierte Schlüsselwort-Liste in Kombination mit binärem Suchen und einem einfachen Hash-Algorythmus (der die ersten zwei Buchstaben eines Wortes für die Einschränkung der Suche im Array verwendet) ist hier ausreichend.
Das eigentliche Syntaxhighlighting würde ich dann über Steuerzeichen realisieren, die in den Quelltext eingefügt werden. Z.B. ein Steuerzeichen für "Färbe nächstes Wort gelb" usw..
Dann muss man sich zum Zeitpunkt der Anzeige nicht mit dem eigentlichen Parsen beschäftigen.
Umgesetzt hab' ich das aber selbst noch nie. Deshalb kann ich dir auch keinen fertigen Algorythmus presentieren.
Bis denn
Andreas