| ... | @@ -1,176 +0,0 @@ |
| 1 | # Language Reference |
| 2 | |
| 3 | ## Grammar |
| 4 | |
| 5 | ``` |
| 6 | Root = many(TopLevelItem) "EOF" |
| 7 | |
| 8 | TopLevelItem = ErrorValueDecl | CompTimeExpression(Block) | TopLevelDecl | TestDecl |
| 9 | |
| 10 | TestDecl = "test" String Block |
| 11 | |
| 12 | TopLevelDecl = option(VisibleMod) (FnDef | ExternDecl | GlobalVarDecl | UseDecl) |
| 13 | |
| 14 | ErrorValueDecl = "error" Symbol ";" |
| 15 | |
| 16 | GlobalVarDecl = VariableDeclaration ";" |
| 17 | |
| 18 | VariableDeclaration = option("comptime") ("var" | "const") Symbol option(":" TypeExpr) "=" Expression |
| 19 | |
| 20 | ContainerMember = (ContainerField | FnDef | GlobalVarDecl) |
| 21 | |
| 22 | ContainerField = Symbol option(":" Expression) "," |
| 23 | |
| 24 | UseDecl = "use" Expression ";" |
| 25 | |
| 26 | ExternDecl = "extern" option(String) (FnProto | VariableDeclaration) ";" |
| 27 | |
| 28 | FnProto = option("coldcc" | "nakedcc" | "stdcallcc") "fn" option(Symbol) ParamDeclList option("->" TypeExpr) |
| 29 | |
| 30 | VisibleMod = "pub" | "export" |
| 31 | |
| 32 | FnDef = option("inline" | "extern") FnProto Block |
| 33 | |
| 34 | ParamDeclList = "(" list(ParamDecl, ",") ")" |
| 35 | |
| 36 | ParamDecl = option("noalias" | "comptime") option(Symbol ":") (TypeExpr | "...") |
| 37 | |
| 38 | Block = "{" many(Statement) option(Expression) "}" |
| 39 | |
| 40 | Statement = Label | VariableDeclaration ";" | Defer(Block) | Defer(Expression) ";" | BlockExpression(Block) | Expression ";" | ";" |
| 41 | |
| 42 | Label = Symbol ":" |
| 43 | |
| 44 | TypeExpr = PrefixOpExpression | "var" |
| 45 | |
| 46 | BlockOrExpression = Block | Expression |
| 47 | |
| 48 | Expression = ReturnExpression | BreakExpression | AssignmentExpression |
| 49 | |
| 50 | AsmExpression = "asm" option("volatile") "(" String option(AsmOutput) ")" |
| 51 | |
| 52 | AsmOutput = ":" list(AsmOutputItem, ",") option(AsmInput) |
| 53 | |
| 54 | AsmInput = ":" list(AsmInputItem, ",") option(AsmClobbers) |
| 55 | |
| 56 | AsmOutputItem = "[" Symbol "]" String "(" (Symbol | "->" TypeExpr) ")" |
| 57 | |
| 58 | AsmInputItem = "[" Symbol "]" String "(" Expression ")" |
| 59 | |
| 60 | AsmClobbers= ":" list(String, ",") |
| 61 | |
| 62 | UnwrapExpression = BoolOrExpression (UnwrapMaybe | UnwrapError) | BoolOrExpression |
| 63 | |
| 64 | UnwrapMaybe = "??" Expression |
| 65 | |
| 66 | UnwrapError = "%%" option("|" Symbol "|") Expression |
| 67 | |
| 68 | AssignmentExpression = UnwrapExpression AssignmentOperator UnwrapExpression | UnwrapExpression |
| 69 | |
| 70 | AssignmentOperator = "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "*%=" | "+%=" | "-%=" | "<<%=" |
| 71 | |
| 72 | BlockExpression(body) = Block | IfExpression(body) | TryExpression(body) | TestExpression(body) | WhileExpression(body) | ForExpression(body) | SwitchExpression | CompTimeExpression(body) |
| 73 | |
| 74 | CompTimeExpression(body) = "comptime" body |
| 75 | |
| 76 | SwitchExpression = "switch" "(" Expression ")" "{" many(SwitchProng) "}" |
| 77 | |
| 78 | SwitchProng = (list(SwitchItem, ",") | "else") "=>" option("|" option("*") Symbol "|") Expression "," |
| 79 | |
| 80 | SwitchItem = Expression | (Expression "..." Expression) |
| 81 | |
| 82 | ForExpression(body) = option("inline") "for" "(" Expression ")" option("|" option("*") Symbol option("," Symbol) "|") body option("else" BlockExpression(body)) |
| 83 | |
| 84 | BoolOrExpression = BoolAndExpression "or" BoolOrExpression | BoolAndExpression |
| 85 | |
| 86 | ReturnExpression = option("%") "return" option(Expression) |
| 87 | |
| 88 | BreakExpression = "break" option(Expression) |
| 89 | |
| 90 | Defer(body) = option("%") "defer" body |
| 91 | |
| 92 | IfExpression(body) = "if" "(" Expression ")" body option("else" BlockExpression(body)) |
| 93 | |
| 94 | TryExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body "else" "|" Symbol "|" BlockExpression(body) |
| 95 | |
| 96 | TestExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" BlockExpression(body)) |
| 97 | |
| 98 | WhileExpression(body) = option("inline") "while" "(" Expression ")" option("|" option("*") Symbol "|") option(":" "(" Expression ")") body option("else" option("|" Symbol "|") BlockExpression(body)) |
| 99 | |
| 100 | BoolAndExpression = ComparisonExpression "and" BoolAndExpression | ComparisonExpression |
| 101 | |
| 102 | ComparisonExpression = BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression |
| 103 | |
| 104 | ComparisonOperator = "==" | "!=" | "<" | ">" | "<=" | ">=" |
| 105 | |
| 106 | BinaryOrExpression = BinaryXorExpression "|" BinaryOrExpression | BinaryXorExpression |
| 107 | |
| 108 | BinaryXorExpression = BinaryAndExpression "^" BinaryXorExpression | BinaryAndExpression |
| 109 | |
| 110 | BinaryAndExpression = BitShiftExpression "&" BinaryAndExpression | BitShiftExpression |
| 111 | |
| 112 | BitShiftExpression = AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression |
| 113 | |
| 114 | BitShiftOperator = "<<" | ">>" | "<<%" |
| 115 | |
| 116 | AdditionExpression = MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression |
| 117 | |
| 118 | AdditionOperator = "+" | "-" | "++" | "+%" | "-%" |
| 119 | |
| 120 | MultiplyExpression = CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression |
| 121 | |
| 122 | CurlySuffixExpression = TypeExpr option(ContainerInitExpression) |
| 123 | |
| 124 | MultiplyOperator = "*" | "/" | "%" | "**" | "*%" |
| 125 | |
| 126 | PrefixOpExpression = PrefixOp PrefixOpExpression | SuffixOpExpression |
| 127 | |
| 128 | SuffixOpExpression = PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression) |
| 129 | |
| 130 | FieldAccessExpression = "." Symbol |
| 131 | |
| 132 | FnCallExpression = "(" list(Expression, ",") ")" |
| 133 | |
| 134 | ArrayAccessExpression = "[" Expression "]" |
| 135 | |
| 136 | SliceExpression = "[" Expression ".." option(Expression) "]" |
| 137 | |
| 138 | ContainerInitExpression = "{" ContainerInitBody "}" |
| 139 | |
| 140 | ContainerInitBody = list(StructLiteralField, ",") | list(Expression, ",") |
| 141 | |
| 142 | StructLiteralField = "." Symbol "=" Expression |
| 143 | |
| 144 | PrefixOp = "!" | "-" | "~" | "*" | ("&" option("const") option("volatile")) | "?" | "%" | "%%" | "??" | "-%" |
| 145 | |
| 146 | PrimaryExpression = Integer | Float | String | CharLiteral | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression(BlockOrExpression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | (option("extern") FnProto) | AsmExpression | ("error" "." Symbol) | ContainerDecl |
| 147 | |
| 148 | ArrayType = "[" option(Expression) "]" option("const") TypeExpr |
| 149 | |
| 150 | GotoExpression = "goto" Symbol |
| 151 | |
| 152 | GroupedExpression = "(" Expression ")" |
| 153 | |
| 154 | KeywordLiteral = "true" | "false" | "null" | "continue" | "undefined" | "error" | "this" | "unreachable" |
| 155 | |
| 156 | ContainerDecl = option("extern" | "packed") ("struct" | "enum" | "union") "{" many(ContainerMember) "}" |
| 157 | ``` |
| 158 | |
| 159 | ## Operator Precedence |
| 160 | |
| 161 | ``` |
| 162 | x() x[] x.y |
| 163 | !x -x -%x ~x *x &x ?x %x %%x ??x |
| 164 | x{} |
| 165 | * / % ** *% |
| 166 | + - ++ +% -% |
| 167 | << >> |
| 168 | & |
| 169 | ^ |
| 170 | | |
| 171 | == != < > <= >= |
| 172 | and |
| 173 | or |
| 174 | ?? %% |
| 175 | = *= /= %= += -= <<= >>= &= ^= |= |
| 176 | ``` |