| ... | @@ -5,7 +5,7 @@ | ... | @@ -5,7 +5,7 @@ |
| 5 | ``` | 5 | ``` |
| 6 | Root = many(TopLevelItem) "EOF" | 6 | Root = many(TopLevelItem) "EOF" |
| 7 | | 7 | |
| 8 | TopLevelItem = ErrorValueDecl | CompTimeExpression | TopLevelDecl | TestDecl | 8 | TopLevelItem = ErrorValueDecl | CompTimeExpression(Block) | TopLevelDecl | TestDecl |
| 9 | | 9 | |
| 10 | TestDecl = "test" String Block | 10 | TestDecl = "test" String Block |
| 11 | | 11 | |
| ... | @@ -21,7 +21,7 @@ VariableDeclaration = option("comptime") ("var" | "const") Symbol option(":" Typ | ... | @@ -21,7 +21,7 @@ VariableDeclaration = option("comptime") ("var" | "const") Symbol option(":" Typ |
| 21 | | 21 | |
| 22 | ContainerMember = (ContainerField | FnDef | GlobalVarDecl) | 22 | ContainerMember = (ContainerField | FnDef | GlobalVarDecl) |
| 23 | | 23 | |
| 24 | ContainerField = Symbol option(":" Expression) ",") | 24 | ContainerField = Symbol option(":" Expression) "," |
| 25 | | 25 | |
| 26 | UseDecl = "use" Expression ";" | 26 | UseDecl = "use" Expression ";" |
| 27 | | 27 | |
| ... | @@ -37,17 +37,15 @@ ParamDeclList = "(" list(ParamDecl, ",") ")" | ... | @@ -37,17 +37,15 @@ ParamDeclList = "(" list(ParamDecl, ",") ")" |
| 37 | | 37 | |
| 38 | ParamDecl = option("noalias" | "comptime") option(Symbol ":") (TypeExpr | "...") | 38 | ParamDecl = option("noalias" | "comptime") option(Symbol ":") (TypeExpr | "...") |
| 39 | | 39 | |
| 40 | Block = "{" list(option(Statement), ";") "}" | 40 | Block = "{" many(Statement) option(Expression) "}" |
| 41 | | 41 | |
| 42 | Statement = Label | VariableDeclaration ";" | Defer ";" | NonBlockExpression ";" | BlockExpression | 42 | Statement = Label | VariableDeclaration ";" | Defer(Block) | Defer(Expression) ";" | BlockExpression(Block) | Expression ";" | ";" |
| 43 | | 43 | |
| 44 | Label = Symbol ":" | 44 | Label = Symbol ":" |
| 45 | | 45 | |
| 46 | Expression = BlockExpression | NonBlockExpression | | |
| 47 | | | |
| 48 | TypeExpr = PrefixOpExpression | "var" | 46 | TypeExpr = PrefixOpExpression | "var" |
| 49 | | 47 | |
| 50 | NonBlockExpression = ReturnExpression | AssignmentExpression | 48 | Expression = ReturnExpression | AssignmentExpression |
| 51 | | 49 | |
| 52 | AsmExpression = "asm" option("volatile") "(" String option(AsmOutput) ")" | 50 | AsmExpression = "asm" option("volatile") "(" String option(AsmOutput) ")" |
| 53 | | 51 | |
| ... | @@ -71,9 +69,9 @@ AssignmentExpression = UnwrapExpression AssignmentOperator UnwrapExpression | Un | ... | @@ -71,9 +69,9 @@ AssignmentExpression = UnwrapExpression AssignmentOperator UnwrapExpression | Un |
| 71 | | 69 | |
| 72 | AssignmentOperator = "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "*%=" | "+%=" | "-%=" | "<<%=" | 70 | AssignmentOperator = "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "*%=" | "+%=" | "-%=" | "<<%=" |
| 73 | | 71 | |
| 74 | BlockExpression = IfExpression | Block | WhileExpression | ForExpression | SwitchExpression | CompTimeExpression | TryExpression | 72 | BlockExpression(body) = Block | IfExpression(body) | TryExpression(body) | WhileExpression(body) | ForExpression(body) | SwitchExpression | CompTimeExpression(body) |
| 75 | | 73 | |
| 76 | CompTimeExpression = option("comptime") Expression | 74 | CompTimeExpression(body) = "comptime" body |
| 77 | | 75 | |
| 78 | SwitchExpression = "switch" "(" Expression ")" "{" many(SwitchProng) "}" | 76 | SwitchExpression = "switch" "(" Expression ")" "{" many(SwitchProng) "}" |
| 79 | | 77 | |
| ... | @@ -81,25 +79,23 @@ SwitchProng = (list(SwitchItem, ",") | "else") "=>" option("|" option("*") Symbo | ... | @@ -81,25 +79,23 @@ SwitchProng = (list(SwitchItem, ",") | "else") "=>" option("|" option("*") Symbo |
| 81 | | 79 | |
| 82 | SwitchItem = Expression | (Expression "..." Expression) | 80 | SwitchItem = Expression | (Expression "..." Expression) |
| 83 | | 81 | |
| 84 | WhileExpression = option("inline") "while" "(" Expression option(";" Expression) ")" Expression | 82 | WhileExpression(body) = option("inline") "while" "(" Expression option(";" Expression) ")" body |
| 85 | | 83 | |
| 86 | ForExpression = option("inline") "for" "(" Expression ")" option("|" option("*") Symbol option("," Symbol) "|") Expression | 84 | ForExpression(body) = option("inline") "for" "(" Expression ")" option("|" option("*") Symbol option("," Symbol) "|") body |
| 87 | | 85 | |
| 88 | BoolOrExpression = BoolAndExpression "or" BoolOrExpression | BoolAndExpression | 86 | BoolOrExpression = BoolAndExpression "or" BoolOrExpression | BoolAndExpression |
| 89 | | 87 | |
| 90 | ReturnExpression = option("%" | "?") "return" option(Expression) | 88 | ReturnExpression = option("%" | "?") "return" option(Expression) |
| 91 | | 89 | |
| 92 | Defer = option("%" | "?") "defer" Expression | 90 | Defer(body) = option("%" | "?") "defer" body |
| 93 | | | |
| 94 | IfExpression = IfVarExpression | IfBoolExpression | | |
| 95 | | 91 | |
| 96 | IfBoolExpression = "if" "(" Expression ")" Expression option(Else) | 92 | IfExpression(body) = IfVarExpression(body) | IfBoolExpression(body) |
| 97 | | 93 | |
| 98 | TryExpression = "try" "(" option(("const" | "var") option("*") Symbol "=") Expression ")" Expression option("else" option("|" Symbol "|") Expression) | 94 | IfBoolExpression(body) = "if" "(" Expression ")" body option("else" body) |
| 99 | | 95 | |
| 100 | IfVarExpression = "if" "(" ("const" | "var") option("*") Symbol option(":" TypeExpr) "?=" Expression ")" Expression Option(Else) | 96 | TryExpression(body) = "try" "(" option(("const" | "var") option("*") Symbol "=") Expression ")" body option("else" option("|" Symbol "|") body) |
| 101 | | 97 | |
| 102 | Else = "else" Expression | 98 | IfVarExpression(body) = "if" "(" ("const" | "var") option("*") Symbol option(":" TypeExpr) "?=" Expression ")" body Option("else" body) |
| 103 | | 99 | |
| 104 | BoolAndExpression = ComparisonExpression "and" BoolAndExpression | ComparisonExpression | 100 | BoolAndExpression = ComparisonExpression "and" BoolAndExpression | ComparisonExpression |
| 105 | | 101 | |
| ... | @@ -147,7 +143,7 @@ StructLiteralField = "." Symbol "=" Expression | ... | @@ -147,7 +143,7 @@ StructLiteralField = "." Symbol "=" Expression |
| 147 | | 143 | |
| 148 | PrefixOp = "!" | "-" | "~" | "*" | ("&" option("const") option("volatile")) | "?" | "%" | "%%" | "??" | "-%" | 144 | PrefixOp = "!" | "-" | "~" | "*" | ("&" option("const") option("volatile")) | "?" | "%" | "%%" | "??" | "-%" |
| 149 | | 145 | |
| 150 | PrimaryExpression = Number | String | CharLiteral | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | Symbol | ("@" Symbol FnCallExpression) | ArrayType | (option("extern") FnProto) | AsmExpression | ("error" "." Symbol) | ContainerDecl | 146 | PrimaryExpression = Number | String | CharLiteral | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression(Expression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | (option("extern") FnProto) | AsmExpression | ("error" "." Symbol) | ContainerDecl |
| 151 | | 147 | |
| 152 | ArrayType = "[" option(Expression) "]" option("const") TypeExpr | 148 | ArrayType = "[" option(Expression) "]" option("const") TypeExpr |
| 153 | | 149 | |
| ... | @@ -158,7 +154,6 @@ GroupedExpression = "(" Expression ")" | ... | @@ -158,7 +154,6 @@ GroupedExpression = "(" Expression ")" |
| 158 | KeywordLiteral = "true" | "false" | "null" | "break" | "continue" | "undefined" | "error" | "type" | "this" | "unreachable" | 154 | KeywordLiteral = "true" | "false" | "null" | "break" | "continue" | "undefined" | "error" | "type" | "this" | "unreachable" |
| 159 | | 155 | |
| 160 | ContainerDecl = option("extern" | "packed") ("struct" | "enum" | "union") "{" many(ContainerMember) "}" | 156 | ContainerDecl = option("extern" | "packed") ("struct" | "enum" | "union") "{" many(ContainerMember) "}" |
| 161 | | | |
| 162 | ``` | 157 | ``` |
| 163 | | 158 | |
| 164 | ## Operator Precedence | 159 | ## Operator Precedence |