| ... | ... | @@ -30,139 +30,145 @@ zig | C equivalent | Description |
| 30 | 30 | ## Grammar |
| 31 | 31 | |
| 32 | 32 | ``` |
| 33 | | Root : many(TopLevelDecl) token(EOF) |
| 33 | Root : many(TopLevelDecl) "EOF" |
| 34 | 34 | |
| 35 | 35 | TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | VariableDeclaration |
| 36 | 36 | |
| 37 | | VariableDeclaration : option(FnVisibleMod) (token(Var) | token(Const)) token(Symbol) (token(Eq) Expression | token(Colon) PrefixOpExpression option(token(Eq) Expression)) |
| 37 | VariableDeclaration : option(FnVisibleMod) ("var" | "const") "symbol" ("=" Expression | ":" PrefixOpExpression option("=" Expression)) |
| 38 | 38 | |
| 39 | | ContainerDecl : many(Directive) option(FnVisibleMod) (token(Struct) | token(Enum)) token(Symbol) token(LBrace) many(StructMember) token(RBrace) |
| 39 | ContainerDecl : many(Directive) option(FnVisibleMod) ("struct" | "enum") "Symbol" "{" many(StructMember) "}" |
| 40 | 40 | |
| 41 | 41 | StructMember: StructField | FnDecl |
| 42 | 42 | |
| 43 | | StructField : token(Symbol) option(token(Colon) Expression) token(Comma)) |
| 43 | StructField : "Symbol" option(":" Expression) ",") |
| 44 | 44 | |
| 45 | | Import : many(Directive) token(Import) token(String) token(Semicolon) |
| 45 | Import : many(Directive) "import" "String" ";" |
| 46 | 46 | |
| 47 | | RootExportDecl : many(Directive) token(Export) token(Symbol) token(String) token(Semicolon) |
| 47 | RootExportDecl : many(Directive) "export" "Symbol" "String" ";" |
| 48 | 48 | |
| 49 | | ExternBlock : many(Directive) token(Extern) token(LBrace) many(FnDecl) token(RBrace) |
| 49 | ExternBlock : many(Directive) "extern" "{" many(FnDecl) "}" |
| 50 | 50 | |
| 51 | | FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(PrefixOpExpression) |
| 51 | FnProto : many(Directive) option(FnVisibleMod) "fn" "Symbol" ParamDeclList option(PrefixOpExpression) |
| 52 | 52 | |
| 53 | | Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen) |
| 53 | Directive : "#" "Symbol" "(" "String" ")" |
| 54 | 54 | |
| 55 | | FnVisibleMod : token(Pub) | token(Export) |
| 55 | FnVisibleMod : "pub" | "export" |
| 56 | 56 | |
| 57 | | FnDecl : FnProto token(Semicolon) |
| 57 | FnDecl : FnProto ";" |
| 58 | 58 | |
| 59 | | FnDef : FnProto token(FatArrow) Block |
| 59 | FnDef : FnProto "=>" Block |
| 60 | 60 | |
| 61 | | ParamDeclList : token(LParen) list(ParamDecl, token(Comma)) token(RParen) |
| 61 | ParamDeclList : "(" list(ParamDecl, ",") ")" |
| 62 | 62 | |
| 63 | | ParamDecl : option(token(NoAlias)) token(Symbol) token(Colon) PrefixOpExpression | token(Ellipsis) |
| 63 | ParamDecl : option("noalias") "Symbol" ":" PrefixOpExpression | "..." |
| 64 | 64 | |
| 65 | | Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace) |
| 65 | Block : "{" list(option(Statement), ";") "}" |
| 66 | 66 | |
| 67 | | Statement : Label | VariableDeclaration token(Semicolon) | NonBlockExpression token(Semicolon) | BlockExpression |
| 67 | Statement : Label | VariableDeclaration ";" | NonBlockExpression ";" | BlockExpression |
| 68 | 68 | |
| 69 | | Label: token(Symbol) token(Colon) |
| 69 | Label: "Symbol" ":" |
| 70 | 70 | |
| 71 | 71 | Expression : BlockExpression | NonBlockExpression |
| 72 | 72 | |
| 73 | 73 | NonBlockExpression : ReturnExpression | AssignmentExpression |
| 74 | 74 | |
| 75 | | AsmExpression : token(Asm) option(token(Volatile)) token(LParen) token(String) option(AsmOutput) token(RParen) |
| 75 | AsmExpression : "asm" option("volatile") "(" "String" option(AsmOutput) ")" |
| 76 | 76 | |
| 77 | | AsmOutput : token(Colon) list(AsmOutputItem, token(Comma)) option(AsmInput) |
| 77 | AsmOutput : ":" list(AsmOutputItem, ",") option(AsmInput) |
| 78 | 78 | |
| 79 | | AsmInput : token(Colon) list(AsmInputItem, token(Comma)) option(AsmClobbers) |
| 79 | AsmInput : ":" list(AsmInputItem, ",") option(AsmClobbers) |
| 80 | 80 | |
| 81 | | AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) PrefixOpExpression) token(RParen) |
| 81 | AsmOutputItem : "[" "Symbol" "]" "String" "(" ("Symbol" | "->" PrefixOpExpression) ")" |
| 82 | 82 | |
| 83 | | AsmInputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) Expression token(RParen) |
| 83 | AsmInputItem : "[" "Symbol" "]" "String" "(" Expression ")" |
| 84 | 84 | |
| 85 | | AsmClobbers: token(Colon) list(token(String), token(Comma)) |
| 85 | AsmClobbers: ":" list("String", ",") |
| 86 | 86 | |
| 87 | | UnwrapMaybeExpression : BoolOrExpression token(DoubleQuestionMark) BoolOrExpression | BoolOrExpression |
| 87 | UnwrapMaybeExpression : BoolOrExpression "??" BoolOrExpression | BoolOrExpression |
| 88 | 88 | |
| 89 | 89 | AssignmentExpression : UnwrapMaybeExpression AssignmentOperator UnwrapMaybeExpression | UnwrapMaybeExpression |
| 90 | 90 | |
| 91 | | AssignmentOperator : token(Eq) | token(TimesEq) | token(DivEq) | token(ModEq) | token(PlusEq) | token(MinusEq) | token(BitShiftLeftEq) | token(BitShiftRightEq) | token(BitAndEq) | token(BitXorEq) | token(BitOrEq) | token(BoolAndEq) | token(BoolOrEq) |
| 91 | AssignmentOperator : "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "&&=" | "||=" |
| 92 | 92 | |
| 93 | | BlockExpression : IfExpression | Block | WhileExpression | ForExpression |
| 93 | BlockExpression : IfExpression | Block | WhileExpression | ForExpression | SwitchExpression |
| 94 | 94 | |
| 95 | | WhileExpression : token(While) token(LParen) Expression token(RParen) Expression |
| 95 | SwitchExpression : "switch" "(" Expression ")" "{" many(SwitchProng) "}" |
| 96 | 96 | |
| 97 | | ForExpression : token(For) token(LParen) Symbol token(Comma) Expression option(token(Comma) token(Symbol)) token(RParen) Expression |
| 97 | SwitchProng : (list(SwitchItem, ",") | "else") option("(" "Symbol" ")") "=>" Expression "," |
| 98 | 98 | |
| 99 | | BoolOrExpression : BoolAndExpression token(BoolOr) BoolOrExpression | BoolAndExpression |
| 99 | SwitchItem : Expression | (Expression "..." Expression) |
| 100 | 100 | |
| 101 | | ReturnExpression : token(Return) option(Expression) |
| 101 | WhileExpression : "while" "(" Expression ")" Expression |
| 102 | |
| 103 | ForExpression : "for" "(" "Symbol" "," Expression option("," "Symbol") ")" Expression |
| 104 | |
| 105 | BoolOrExpression : BoolAndExpression "||" BoolOrExpression | BoolAndExpression |
| 106 | |
| 107 | ReturnExpression : "return" option(Expression) |
| 102 | 108 | |
| 103 | 109 | IfExpression : IfVarExpression | IfBoolExpression |
| 104 | 110 | |
| 105 | | IfBoolExpression : token(If) token(LParen) Expression token(RParen) Expression option(Else) |
| 111 | IfBoolExpression : "if" "(" Expression ")" Expression option(Else) |
| 106 | 112 | |
| 107 | | IfVarExpression : token(If) token(LParen) (token(Const) | token(Var)) token(Symbol) option(token(Colon) PrefixOpExpression) Token(MaybeAssign) Expression token(RParen) Expression Option(Else) |
| 113 | IfVarExpression : "if" "(" ("const" | "var") "Symbol" option(":" PrefixOpExpression) "?=" Expression ")" Expression Option(Else) |
| 108 | 114 | |
| 109 | | Else : token(Else) Expression |
| 115 | Else : "else" Expression |
| 110 | 116 | |
| 111 | | BoolAndExpression : ComparisonExpression token(BoolAnd) BoolAndExpression | ComparisonExpression |
| 117 | BoolAndExpression : ComparisonExpression "&&" BoolAndExpression | ComparisonExpression |
| 112 | 118 | |
| 113 | 119 | ComparisonExpression : BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression |
| 114 | 120 | |
| 115 | | ComparisonOperator : token(BoolEq) | token(BoolNotEq) | token(BoolLessThan) | token(BoolGreaterThan) | token(BoolLessEqual) | token(BoolGreaterEqual) |
| 121 | ComparisonOperator : "==" | "!=" | "<" | ">" | "<=" | ">=" |
| 116 | 122 | |
| 117 | | BinaryOrExpression : BinaryXorExpression token(BinOr) BinaryOrExpression | BinaryXorExpression |
| 123 | BinaryOrExpression : BinaryXorExpression "|" BinaryOrExpression | BinaryXorExpression |
| 118 | 124 | |
| 119 | | BinaryXorExpression : BinaryAndExpression token(BinXor) BinaryXorExpression | BinaryAndExpression |
| 125 | BinaryXorExpression : BinaryAndExpression "^" BinaryXorExpression | BinaryAndExpression |
| 120 | 126 | |
| 121 | | BinaryAndExpression : BitShiftExpression token(Ampersand) BinaryAndExpression | BitShiftExpression |
| 127 | BinaryAndExpression : BitShiftExpression "&" BinaryAndExpression | BitShiftExpression |
| 122 | 128 | |
| 123 | 129 | BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression |
| 124 | 130 | |
| 125 | | BitShiftOperator : token(BitShiftLeft) | token(BitShiftRight) |
| 131 | BitShiftOperator : "<<" | ">>" |
| 126 | 132 | |
| 127 | 133 | AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression |
| 128 | 134 | |
| 129 | | AdditionOperator : token(Plus) | token(Minus) |
| 135 | AdditionOperator : "+" | "-" |
| 130 | 136 | |
| 131 | 137 | MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression |
| 132 | 138 | |
| 133 | 139 | CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression) |
| 134 | 140 | |
| 135 | | MultiplyOperator : token(Star) | token(Slash) | token(Percent) |
| 141 | MultiplyOperator : "*" | "/" | "%" |
| 136 | 142 | |
| 137 | 143 | PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression |
| 138 | 144 | |
| 139 | 145 | SuffixOpExpression : PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression) |
| 140 | 146 | |
| 141 | | FieldAccessExpression : token(Dot) token(Symbol) |
| 147 | FieldAccessExpression : "." "Symbol" |
| 142 | 148 | |
| 143 | | FnCallExpression : token(LParen) list(Expression, token(Comma)) token(RParen) |
| 149 | FnCallExpression : "(" list(Expression, ",") ")" |
| 144 | 150 | |
| 145 | | ArrayAccessExpression : token(LBracket) Expression token(RBracket) |
| 151 | ArrayAccessExpression : "[" Expression "]" |
| 146 | 152 | |
| 147 | | SliceExpression : token(LBracket) Expression token(Ellipsis) option(Expression) token(RBracket) option(token(Const)) |
| 153 | SliceExpression : "[" Expression "..." option(Expression) "]" option("const") |
| 148 | 154 | |
| 149 | | ContainerInitExpression : token(LBrace) ContainerInitBody token(RBrace) |
| 155 | ContainerInitExpression : "{" ContainerInitBody "}" |
| 150 | 156 | |
| 151 | | ContainerInitBody : list(StructLiteralField, token(Comma)) | list(Expression, token(Comma)) |
| 157 | ContainerInitBody : list(StructLiteralField, ",") | list(Expression, ",") |
| 152 | 158 | |
| 153 | | StructLiteralField : token(Dot) token(Symbol) token(Eq) Expression |
| 159 | StructLiteralField : "." "Symbol" "=" Expression |
| 154 | 160 | |
| 155 | | PrefixOp : token(Not) | token(Dash) | token(Tilde) | token(Star) | (token(Ampersand) option(token(Const))) | token(QuestionMark) |
| 161 | PrefixOp : "!" | "-" | "~" | "*" | ("&" option("const")) | "?" |
| 156 | 162 | |
| 157 | | PrimaryExpression : token(Number) | token(String) | token(CharLiteral) | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | token(Symbol) | (token(AtSign) token(Symbol) FnCallExpression) | ArrayType | AsmExpression |
| 163 | PrimaryExpression : "Number" | "String" | "CharLiteral" | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | "Symbol" | ("@" "Symbol" FnCallExpression) | ArrayType | AsmExpression |
| 158 | 164 | |
| 159 | | ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) PrefixOpExpression |
| 165 | ArrayType : "[" option(Expression) "]" option("const") PrefixOpExpression |
| 160 | 166 | |
| 161 | | GotoExpression: token(Goto) token(Symbol) |
| 167 | GotoExpression: "goto" "Symbol" |
| 162 | 168 | |
| 163 | | GroupedExpression : token(LParen) Expression token(RParen) |
| 169 | GroupedExpression : "(" Expression ")" |
| 164 | 170 | |
| 165 | | KeywordLiteral : token(True) | token(False) | token(Null) | token(Break) | token(Continue) |
| 171 | KeywordLiteral : "true" | "false" | "null" | "break" | "continue" |
| 166 | 172 | ``` |
| 167 | 173 | |
| 168 | 174 | ## Operator Precedence |