Grammatiksprache
Die Grammatiksprache Aether
Aether beschreibt eine Sprache vollständig in einer Datei: ihre Tokens, ihre Syntax, den Umgang mit Leerraum und welche Teile einer Übereinstimmung erhalten bleiben. Namen in Großbuchstaben sind Tokens, die ein Lexer erkennt; Namen in Kleinbuchstaben sind Regeln, die ein Parser über diesen Tokens erkennt.
Ein erster Blick
Diese Grammatik liest eine kleine Einstellungsdatei — Zeilen der Form name = wert, mit Kommentaren:
@grammar "settings" @root document @skip TRIVIA COMMENT := "#" (!"\n" .)* TRIVIA := (SPACE | COMMENT)* TRUE := "true" FALSE := "false" NAME := [a-z_] [a-z0-9_]* NUMBER := DIGIT+ STRING := "\"" (!"\"" .)* "\"" document := TRIVIA? entry* TRIVIA? entry := key:NAME "=" value:value value := TRUE | FALSE | NUMBER | STRING
@grammarbenennt die Grammatik und@rootdie Regel, bei der das Erkennen beginnt. Beide sind Pflicht, in dieser Reihenfolge.@skip TRIVIAerlaubt Leerraum und Kommentare zwischen je zwei Teilen einer Regel.COMMENTbisSTRINGsind Tokens.TRUEsteht absichtlich vorNAME: Beide passen auftrue, und das frühere gewinnt.document,entryundvaluesind Regeln. Das"="in Anführungszeichen wird ohne Deklaration zu einem eigenen Token.key:undvalue:benennen die Teile eines Eintrags, auf die es bei der Weiterverarbeitung ankommt.
# service port = 8080 debug = true name = "api"
ok
true = 1
1:1: unexpected "true" -- did not expect more input here 1 | true = 1 | ^
Gestaltung
- Lexer und Parser in einer Datei. Die Schreibweise entscheidet, was was ist; eine getrennte Token-Datei, die man synchron halten müsste, gibt es nicht.
- Immer zwei Stufen. Tokens nehmen die längste Übereinstimmung, Regeln die erste passende Alternative — jede Stufe behält ihre eigene einfache Regel.
- Leerraum ist eine Einstellung, keine Fleißarbeit. Ein Pragma macht jede Regel tolerant dafür; ein Präfix verbietet ihn dort, wo zwei Teile aneinanderstoßen müssen.
- Nur Syntax. Eine Grammatik sagt, was gültig ist, und benennt die Teile; was sie bedeuten, wird anderswo entschieden.
- Notausgänge, deutlich markiert. Wo eine Sprache ihre Syntax mitten in der Datei ändert, übergibt
@nativeein Token oder eine Regel an handgeschriebenen Code.
Eckdaten
| Eigenschaft | Wert |
|---|---|
| Endung | .aether |
| Kodierung | UTF-8; Namen sind ASCII, Zeichenketten und Klassen dürfen jedes Zeichen enthalten |
| Kopf | @grammar "name", dann @root regel — Pflicht, in dieser Reihenfolge |
| Kommentare | ; bis zum Zeilenende |
| Ergebnis | Ein Lexer und ein Parser — standardmäßig PEG, auf Wunsch LR oder GLR |
| Implementierung | Ichor, das .aether-Dateien kompiliert |
In Aether geschrieben
Auf diesen Seiten
- Aufbau — Kopf, Pragmas, Kommentare, Namen, Definitionen und vordefinierte Tokens.
- Ausdrücke — Operatoren, Zeichenketten, Zeichenklassen, Wiederholung, Vorausschau und Regex-Literale.
- Lexen und Parsen — längste Übereinstimmung, geordnete Auswahl, Leerraum, Erfassungen, Layout und Engines.
- Notausgänge —
@keywords,@refineund@native. - Grammatik — Aether in Aether geschrieben, und wo die Implementierung von der Referenz abweicht.