Pratt-Parsing ist eine Blackbox – und genau das ist der Punkt

Pratt parsing is a black box

Wer sich durch Pratt-Parsing-Tutorials quält, lernt meist nur den Algorithmus kennen – dabei passen die entscheidenden neun Zeilen problemlos in jedes Projekt. Der eigentliche Gewinn liegt im Denkmodell: Semantische Aktionen werden nicht an Produktionsregeln, sondern direkt an Terminals gebunden, an nuds und leds. Das beseitigt Linksrekursion, Backtracking und mehrfaches Ausführen von Aktionen und macht Makros sowie selbst erweiterbare Sprachen möglich.

Pratt takes parsing which is a really complicated thing and reduces it to one simple question: What do we expect to see to the left of a token?
  1. vinipsmaker

    Autor hier.

    Ich habe fast ein Jahr lang Pratt-Parsing in einer makrolastigen Sprache verwendet, die ich entwickelt habe, bevor ich mich schließlich hingesetzt und meine Gedanken zum Pratt-Parsing aufgeschrieben habe. Der Code ist momentan geschlossen, weil ich nicht möchte, dass LLMs auf meinem Code trainieren, bevor 0.1 erreicht ist, aber ich werde ihn später wieder Open Source machen.

    Ich beantworte gerne Fragen.

  2. e12e

    Ich würde gerne etwas mehr darüber sehen, wie es im Vergleich zu PEG oder etwas wie Ohm/Ometa abschneidet – habe ich recht mit der Annahme, dass man so ziemlich die Vorteile einer lesbaren Grammatik als Dokumentation aufgibt?

    Vielleicht muss ich einfach etwas super Einfaches wie einen Taschenrechner mit Ausdrücken nebeneinander sehen, um den Kompromiss zu begreifen?

    https://ohmjs.org/

  3. ghusbands

    Ich habe in meiner Zeit ein paar Pratt-Parser geschrieben. Man braucht keinen Lexer und man kann mehr Parser-Zustände haben, als durch 'nud' und 'led' impliziert werden. Sie können unglaublich erweiterbar sein. Wenn man zum Beispiel den Ausdruck "{a:1, b:2}" parsen kann, dann hat man natürlicherweise einen Expr-Zustand (nud), einen Between-Zustand (led) und einen DictKey-Zustand; dieser akzeptiert anfangs vielleicht nur einen Identifier und einen Doppelpunkt, bevor er in den Expr-Zustand rekursiert, aber man könnte später dynamische Ausdrücke hinzufügen, vielleicht über ein Makro, um [expr] als Schlüssel zu unterstützen.

Mehr von diesem Tag

2026-11-03