LALR-Parsergeneratoren wie der/das nach Haskell kompilierende happy generieren üblicherweise tabellenbasierte Parser.
Bei SLL-Grammatiken verzichtet man hingegen häufig auf Parsergeneratoren (die tabellenbasierte Parser generieren) und programmiert die Grammatik als Rekursive Abstiegsparser aus. Ähnlich wie bei kompiliert vs. interpretiert ergibt sich operational ein Geschwindigkeitsvorteil bei erhöhter Code-Größe. Außerdem muss keine generatorspezifische eDSL für die Beschreibung der Grammatik erlernt werden, denn die Grammatik ist klar aus der Struktur des Parsers ableitbar.
Das Analog zu ausprogrammiertem Rekursivem Abstieg für LALR ist Rekursiver
Mit Rekursivem Aufstieg-Abstieg (
Das Problem der fehlenden Wartbarkeit von Hand war damit noch nicht gelöst; das schaffte aber ScalaBison (2010), indem sie den Parser aus den Zuständen eines üblichen LALR-Parsergenerators heraus generierten.
Parallel gab es in der Welt der funktionalen Programmierung Anstrengungen, ein Verfahren zur Generierung eines typsicheren, ausprogrammierten LR Parsers direkt aus Eigenschaften von LR-Grammatiken abzuleiten: Derivation of a Typed Functional LR Parser (2005). Continuation-passing style verhilft hier zu einem typsicheren Rekursivem Aufstiegsparser.
Aufgabe:
In dieser Arbeit soll happy um ein Backend erweitert werden, das einen Rekursiven Aufstiegs-Abstiegsparser generiert. Der generierte Parser soll
- typsicher im Sinne von Typed LR sein
- Nutzen aus happy's bestehenden Algorithmen zur Vereinfachung der Parserzustände schlagen
- In der Lage dazu sein, im GHC benutzt zu werden
- Optional: Besser durch den GHC optimierbar sein als der tabellenbasierte Parser
- Optional: Vergleichbare Code-Größe aufweisen
Voraussetzungen
Gute Haskell-KenntnisseSchlüsselworte
Haskell, Parsergenerator Veröffentlichungen
Veröffentlichung |
A Typed Recursive Ascent-Descent Backend for Happy |
Betreuer
Wissenschaftliche Mitarbeiter |
---|
Sebastian Graf |
Studenten
Ehemalige Hiwis |
---|
David Knothe |