Auf der Webseite AST explorer kann man sich für verschiedene Sprachen (Rust, Markdown, SQL, Javascript, JSON, RegExp, CSS, PHP, …) den Abstract Syntax Tree ansehen und hindurch navigieren. Das ist wahnsinnig hilfreich, um zu verstehen, wie ein Compiler eine Eingabe (ein Programm) deutet.
Ein Abstract Syntax Tree ist die technische Darstellung einer Eingabe, die für
einen Compiler zu Auswertung genutzt wird. Ein Compiler liest ein Programm als
eine Folge von Zeichen ein und zerlegt diese – anhand einer Grammatik, die die
Syntax beschreibt – in zusammengehörige Teile – Tokens genannt. Auf einem fn
func() { loop { println!("Hallo"); } }
wird ein
Statement {
type = Type::FunctionDefinition,
body = [
Statement {
type = Type::Loop,
body = [
Statement {
type = Type::FunctionCall,
name = "println!",
args = [
Expression {
type = ConstString,
value = "Hallo",
} ] } ] } ] }
Durch eben diese Verschachtelung entsteht ein Gebilde, das sich wie ein Baum von einem Ausgangspunkt aus, immer mehr bis in die Spitzen hin verzweigt. Jeder Compiler hat auch abhängig von der Sprache seine eigene Form dieses Syntaxbaums.
Dieser AST ist die Grundlage der Arbeit des Compilers, wenn er Variablen erkennt, ihnen Speicher zuweist und bei Benutzung den Typ prüft, oder Optimierungen vornimmt und später den Code generiert. Wenn Compiler über fehlende Klammern, falsche Operatoren oder unbekannte Schlüsselworte klagen, dann konnten sie im Regelwerk (der Grammatik) keine passende Regel finden, um aus der Eingabe einen Eintrag im AST zu erzeugen.