Skip to content
lulugo19 edited this page Mar 24, 2022 · 4 revisions

Grammatik in der erweiterten Backus-Naur-Form

Die Backus-Naur-Form ist eine Metasprache zur Darstellung kontextfreier Grammatiken, die die Syntax von höheren Programmiersprachen beschreiben kann. Die Syntax von Zaubercode wird formal im Folgenden in der erweiterten Backus-Naur-Form festgehalten. Links neben dem = ist der Name einer Ableitungsregel definiert. Dieser Name ist ein Nichtterminalsymbol. Die Terminale (die einzelnen Tokens) sind in einzelnen Anführungszeichen " " geschrieben. Eine Regel definiert die Reihenfolge, welche Symbole hintereinanderkommen müssen. Der Querstrich | gibt verschiedene Alternativen an. Alles in geschweiften Klammern { } wird 0 bis n-mal wiederholt. Symbole in eckigen Klammern [ ] sind optional.

Whitespace       = " " | "\t" | "\n";
Digit            = "0" | "1" | "2" | "3" | … | "9";
DigitExceptZero  = "1" | "2" | "3" | … | "9";
DigitSequence    = Digit { Digit };
Integer          = [ "+" | "-" ] DigitExceptZero [DigitSequence] | "0";
Exponent         = "e" | "E";
Number           = Integer [ "," DigitSequence ] [ Exponent Integer ];
Text             = """ { Σ } """;
Bool             = "ja" | "nein";
List             = "{" [ Expression { ";" Expression } ] "}";
Nothing          = "°";
Literal          = Number | Text | Bool | Nothing | List;
Alphabet         = "a" | "b | … | "z" | "A" | "B" | … | "Z";
Diacritica       = "à" | "á" | "â" | "ã" | "ā" | "ă" | "ȧ" | "ä" | "ả" | "å" | "a̋" |
                   "ǎ" | "a̒" | "a̓" | "ạ" | "ḁ" | "a̦" | "a̧" | "ą" | "a̱" | "a̲";
LetterSpecial    = "ß" | "Ƒ" | "δ" | … | "Ω";
Letter           = Alphabet | LetterSpecial | Diacritica;
Identifier       = Letter { Letter | DigitSequence };
VarName          = Identifier;
AccessProperty   = VarName "->" VarName { "->" VarName }
BinOperator      = "+" | "-" | "*" | "/" | "^" | "%" | "&" | "|" | "=" | "<" | ">" |
                   ">=" | "<=" | "/=";                             
UnOperator       = "+" | "-" | "~" | "#" |;
SelfReference    = "'";
Expression       = Literal | VarName | SelfReference | AccessProperty |
                   [ "(" ] Expression [ ")" ] |
                   Expression BinOperator Expression |
                   UnOperator "(" Expression ")";
Argument         = "(" Expression ")";
Call             = Identifier [ Argument { Identifier [ Argument ] }];
ActionCall       = [ ( VarName | AccessProperty ) ":" ] Call "!";
TypeName         = Identifier;
VarDeclaration   = TypeName VarName ";";
VarAssignmentA   = VarName "<-" Expression";";
VarAssignmentB   = VarName "<-" AktionCall;
VarAssignment    = VarAssignmentA | VarAssignmentB;
VarDeclAndAssign = TypeName VarAssignment;
ConditionS       = "?" Expression CodeBlock;
Condition        = ConditionS { ConditionS } [ CodeBlock ];
LoopEndless      = "[" "]";
LoopInterval     = "[" [ VarName "<-" ] Expression ";" Expression "]" | [ ";" Expression ] "]";
LoopWhile        = "[" Expression "]";
LoopForEach      = "[" VarName "<-" Expression "]";
Loop             = ( LoopEndless | LoopInterval| LoopWhile | LoopForEach ) Codeblock;
LoopBreak        = "\" ";";
LoopContinue     = "->" ";";
Return           = "<-" Expression ";";
Terminate        = "+-" ";";
AddElement       = "++" VarName ";";
RemoveElement    = "--" VarName ";";
AddElToParent    = "<<" VarName ";";
AddElToEl        = VarName ">>" VarName ";";
Replace          = "^" TypeName";";
Destroy          = "°" ";";
SendMessage      = "$" Call "$" [ "@" VarName ] ";";
Statement        = ActionCall | VarDeclaration | VarAssignment | VarDeclAndAssign |
                   Condition | Loop | LoopBreak | Return | AddElement | RemoveElement |
                   AddElToParent | AddElToEl;     
Codeblock        = ":" { Statement } ".";
Parameter        = "(" TypName VarName ")";
ActionDef        = Identifier [ Parameter { Identifier [ Parameter ] } ] 
                  [ "->" TypeName ] CodeBlock;
PatternMatching  = Parameter | "(" ( Number | Text | Bool | PatternList ) ")";
PatternList      = "{" [ PatternMatching { ";" PatternMatching } ];
EventHandlerSin  = Identifier [ PatternMatching ] [ EventHandlerSin ];
EventHandler     = EventHandlerSin [ "&" EventHandlerSin ] CodeBlock;
BlockComment     = "§" { Σ } "§";

Clone this wiki locally