| ... | ... | @@ -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 | | ``` |