Dies ist Teil einer Reihe von Fragen, die sich auf das Schwesterprojekt des Abstraktionsprojekts konzentrieren, das darauf abzielt, die im Sprachdesign verwendeten Konzepte in Form eines Frameworks zu abstrahieren. Das Schwesterprojekt heißt OILexer und zielt darauf ab, einen Parser aus Grammatikdateien ohne die Verwendung von Code-Injection für Übereinstimmungen zu erstellen.
Einige andere Seiten zu diesen Fragen, die sich auf die strukturelle Typisierung beziehen, können hier angezeigt werden . Die Benutzerfreundlichkeit finden Sie hier . Das Meta-Thema, das mit einer Anfrage zum Framework und dem richtigen Ort zum Posten verbunden ist, finden Sie hier .
Ich komme zu dem Punkt, an dem ich anfangen werde, den Analysebaum aus einer bestimmten Grammatik zu extrahieren, gefolgt von einem Parser für rekursiven Abstieg, der DFA verwendet, um Vorwärtspfade zu erkennen (ähnlich wie bei LL (*) von ANTLR 4) Ich dachte, ich würde es öffnen, um einen Einblick zu bekommen.
Welche Funktionen sind in einem Parser-Compiler ideal?
Bisher gibt es hier einen kurzen Überblick über die Implementierung:
- Vorlagen
- Schauen Sie voraus, um zu wissen, was an einem bestimmten Punkt gültig ist.
- Regel 'Deliteralisierung', bei der die Literale in Regeln übernommen und aufgelöst werden, von welchem Token sie stammen.
- Nichtdeterministische Automaten
- Deterministische Automaten
- Einfache lexikalische Zustandsmaschine zur Tokenerkennung
- Methoden zur Token-Automatisierung:
- Scan - nützlich für Kommentare: Kommentar: = "/ *" Scan ("* /");
- Subtrahieren - Nützlich für Bezeichner: Bezeichner: = Subtrahieren (IdentifierBody, Schlüsselwörter);
- Stellt sicher, dass der Bezeichner keine Schlüsselwörter akzeptiert.
- Codieren - Codiert eine Automatisierung als eine Reihe X der Anzahl der Basis-N-Übergänge.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Lässt ein Unicode hexadezimal mit hexadezimalen 4-Übergängen entkommen. Der Unterschied zwischen diesem und: [0-9A-Fa-f] {4} ist die resultierende Automatisierung mit Encode, die den zulässigen Satz von Hexadezimalwerten auf den Bereich von IdentifierCharNoEscape beschränkt. Wenn Sie also \ u005c angeben, akzeptiert die Codierungsversion den Wert nicht. Solche Dinge haben eine ernsthafte Einschränkung: Sparsam verwenden. Die daraus resultierende Automatisierung kann sehr komplex sein.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
Was nicht implementiert ist, ist die CST-Generierung. Ich muss die deterministischen Automatisierungen anpassen, um den richtigen Kontext zu übernehmen, damit dies funktioniert.
Für alle Interessierten habe ich einen hübschen Ausdruck der Originalform des T * y♯-Projekts hochgeladen . Jede Datei sollte mit jeder anderen Datei verknüpft sein. Ich habe begonnen, die einzelnen Regeln zu verknüpfen, um sie zu befolgen, aber es hätte viel zu lange gedauert (wäre einfacher zu automatisieren gewesen!).
Wenn mehr Kontext benötigt wird, posten Sie bitte entsprechend.
Bearbeiten 5-14-2013 : Ich habe Code geschrieben, um GraphViz-Diagramme für die Zustandsautomaten in einer bestimmten Sprache zu erstellen. Hier ist ein GraphViz-Digraph des AssemblyPart . Die in der Sprachbeschreibung verknüpften Mitglieder sollten in ihrem relativen Ordner eine rulename.txt mit dem Digraphen für diese Regel haben. Einige der Sprachbeschreibungen haben sich geändert, seit ich das Beispiel veröffentlicht habe. Dies ist auf die Vereinfachung der Grammatik zurückzuführen. Hier ist ein interessantes Grafikbild .