Tiramisu Docs

AST-Überblick

Verstehen Sie den Abstract Syntax Tree des Tiramisu-Parsers mit allen Knotentypen und ihrer Struktur.

Der Tiramisu-Parser (@timeleap/tiramisu) nimmt Quelltext entgegen und erzeugt einen Abstract Syntax Tree (AST). Der AST ist ein Baum aus typisierten Knoten, der die Struktur Ihres Dokuments abbildet.

Knotentypen

Der AST besteht aus den folgenden Knotentypen:

KnotenBeschreibung
TiramisuWurzelknoten des Dokuments. Enthält alle Knoten der obersten Ebene.
ParagraphEin Textabsatz. Wird durch Leerzeilen erzeugt.
MixedTextText, der sowohl einfachen Text als auch Funktionsaufrufe enthält.
PureTextEin reines Textsegment ohne Funktionsaufrufe.
FunctionCallEin Funktionsaufruf mit einem Namen und Parametern.
ParametersDie Parameterliste eines Funktionsaufrufs.
ParameterEin einzelner Positionsparameter.
NamedParameterEin benannter Parameter (key = value).
ArrayValueEin Array-Wert ([a, b, c]).
ArrayItemEin einzelnes Element innerhalb eines Arrays.

Beispiel

Gegeben folgender Tiramisu-Quelltext:

tiramisu
bold { Hello } world

Der Parser erzeugt diesen AST:

typescript
Tiramisu
└── Paragraph
    └── MixedText
        ├── FunctionCall (name: "bold")
        │   └── Parameters
        │       └── Parameter
        │           └── PureText ("Hello")
        └── PureText (" world")

FunctionCall-Struktur

Der FunctionCall-Knoten ist das Herzstück von Tiramisu. Er hat:

  • functionName — den Namen der Funktion (Text vor der {)
  • parameters — einen Parameters-Knoten, der die Argumente der Funktion enthält

Parameter enthalten eine Liste von Parameter- und NamedParameter-Knoten. Jeder Parameter kann Text, verschachtelte Funktionsaufrufe oder Arrays enthalten.

Knotentypen importieren

Alle Knotentypen sind aus dem Parser-Paket verfügbar:

typescript
import {
  Tiramisu,
  Paragraph,
  MixedText,
  PureText,
  FunctionCall,
  Parameters,
  Parameter,
  NamedParameter,
  ArrayValue,
  ArrayItem,
} from "@timeleap/tiramisu/src/types/nodes";

Die Typprüfung von Knoten verwendet instanceof:

typescript
if (node instanceof FunctionCall) {
  console.log(node.functionName);
}