-
Notifications
You must be signed in to change notification settings - Fork 0
Syntax
lulugo19 edited this page Mar 24, 2022
·
4 revisions
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 = "§" { Σ } "§";