| ... | @@ -30,139 +30,145 @@ zig | C equivalent | Description | ... | @@ -30,139 +30,145 @@ zig | C equivalent | Description |
| 30 | ## Grammar | 30 | ## Grammar |
| 31 | | 31 | |
| 32 | ``` | 32 | ``` |
| 33 | Root : many(TopLevelDecl) token(EOF) | 33 | Root : many(TopLevelDecl) "EOF" |
| 34 | | 34 | |
| 35 | TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | VariableDeclaration | 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 | StructMember: StructField | FnDecl | 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 | Expression : BlockExpression | NonBlockExpression | 71 | Expression : BlockExpression | NonBlockExpression |
| 72 | | 72 | |
| 73 | NonBlockExpression : ReturnExpression | AssignmentExpression | 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 | AssignmentExpression : UnwrapMaybeExpression AssignmentOperator UnwrapMaybeExpression | UnwrapMaybeExpression | 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 | IfExpression : IfVarExpression | IfBoolExpression | 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 | ComparisonExpression : BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression | 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 | BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression | 129 | BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression |
| 124 | | 130 | |
| 125 | BitShiftOperator : token(BitShiftLeft) | token(BitShiftRight) | 131 | BitShiftOperator : "<<" | ">>" |
| 126 | | 132 | |
| 127 | AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression | 133 | AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression |
| 128 | | 134 | |
| 129 | AdditionOperator : token(Plus) | token(Minus) | 135 | AdditionOperator : "+" | "-" |
| 130 | | 136 | |
| 131 | MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression | 137 | MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression |
| 132 | | 138 | |
| 133 | CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression) | 139 | CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression) |
| 134 | | 140 | |
| 135 | MultiplyOperator : token(Star) | token(Slash) | token(Percent) | 141 | MultiplyOperator : "*" | "/" | "%" |
| 136 | | 142 | |
| 137 | PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression | 143 | PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression |
| 138 | | 144 | |
| 139 | SuffixOpExpression : PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression) | 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 | ## Operator Precedence | 174 | ## Operator Precedence |