authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-19 19:15:36-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-19 19:15:36-07:00
log17e574fec60b5e675a8ac69d197f1cc28336056c
tree37018e6393360b4f5b185c6d6d9bbdd3c573ec4a
parent890714b8ca0f57d11520469419866829b48de439

add switch statement to language reference


1 files changed, 60 insertions(+), 54 deletions(-)

doc/langref.md+60-54
...@@ -30,139 +30,145 @@ zig | C equivalent | Description...@@ -30,139 +30,145 @@ zig | C equivalent | Description
30## Grammar30## Grammar
3131
32```32```
33Root : many(TopLevelDecl) token(EOF)33Root : many(TopLevelDecl) "EOF"
3434
35TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | VariableDeclaration35TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | VariableDeclaration
3636
37VariableDeclaration : option(FnVisibleMod) (token(Var) | token(Const)) token(Symbol) (token(Eq) Expression | token(Colon) PrefixOpExpression option(token(Eq) Expression))37VariableDeclaration : option(FnVisibleMod) ("var" | "const") "symbol" ("=" Expression | ":" PrefixOpExpression option("=" Expression))
3838
39ContainerDecl : many(Directive) option(FnVisibleMod) (token(Struct) | token(Enum)) token(Symbol) token(LBrace) many(StructMember) token(RBrace)39ContainerDecl : many(Directive) option(FnVisibleMod) ("struct" | "enum") "Symbol" "{" many(StructMember) "}"
4040
41StructMember: StructField | FnDecl41StructMember: StructField | FnDecl
4242
43StructField : token(Symbol) option(token(Colon) Expression) token(Comma))43StructField : "Symbol" option(":" Expression) ",")
4444
45Import : many(Directive) token(Import) token(String) token(Semicolon)45Import : many(Directive) "import" "String" ";"
4646
47RootExportDecl : many(Directive) token(Export) token(Symbol) token(String) token(Semicolon)47RootExportDecl : many(Directive) "export" "Symbol" "String" ";"
4848
49ExternBlock : many(Directive) token(Extern) token(LBrace) many(FnDecl) token(RBrace)49ExternBlock : many(Directive) "extern" "{" many(FnDecl) "}"
5050
51FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(PrefixOpExpression)51FnProto : many(Directive) option(FnVisibleMod) "fn" "Symbol" ParamDeclList option(PrefixOpExpression)
5252
53Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)53Directive : "#" "Symbol" "(" "String" ")"
5454
55FnVisibleMod : token(Pub) | token(Export)55FnVisibleMod : "pub" | "export"
5656
57FnDecl : FnProto token(Semicolon)57FnDecl : FnProto ";"
5858
59FnDef : FnProto token(FatArrow) Block59FnDef : FnProto "=>" Block
6060
61ParamDeclList : token(LParen) list(ParamDecl, token(Comma)) token(RParen)61ParamDeclList : "(" list(ParamDecl, ",") ")"
6262
63ParamDecl : option(token(NoAlias)) token(Symbol) token(Colon) PrefixOpExpression | token(Ellipsis)63ParamDecl : option("noalias") "Symbol" ":" PrefixOpExpression | "..."
6464
65Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)65Block : "{" list(option(Statement), ";") "}"
6666
67Statement : Label | VariableDeclaration token(Semicolon) | NonBlockExpression token(Semicolon) | BlockExpression67Statement : Label | VariableDeclaration ";" | NonBlockExpression ";" | BlockExpression
6868
69Label: token(Symbol) token(Colon)69Label: "Symbol" ":"
7070
71Expression : BlockExpression | NonBlockExpression71Expression : BlockExpression | NonBlockExpression
7272
73NonBlockExpression : ReturnExpression | AssignmentExpression73NonBlockExpression : ReturnExpression | AssignmentExpression
7474
75AsmExpression : token(Asm) option(token(Volatile)) token(LParen) token(String) option(AsmOutput) token(RParen)75AsmExpression : "asm" option("volatile") "(" "String" option(AsmOutput) ")"
7676
77AsmOutput : token(Colon) list(AsmOutputItem, token(Comma)) option(AsmInput)77AsmOutput : ":" list(AsmOutputItem, ",") option(AsmInput)
7878
79AsmInput : token(Colon) list(AsmInputItem, token(Comma)) option(AsmClobbers)79AsmInput : ":" list(AsmInputItem, ",") option(AsmClobbers)
8080
81AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) PrefixOpExpression) token(RParen)81AsmOutputItem : "[" "Symbol" "]" "String" "(" ("Symbol" | "->" PrefixOpExpression) ")"
8282
83AsmInputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) Expression token(RParen)83AsmInputItem : "[" "Symbol" "]" "String" "(" Expression ")"
8484
85AsmClobbers: token(Colon) list(token(String), token(Comma))85AsmClobbers: ":" list("String", ",")
8686
87UnwrapMaybeExpression : BoolOrExpression token(DoubleQuestionMark) BoolOrExpression | BoolOrExpression87UnwrapMaybeExpression : BoolOrExpression "??" BoolOrExpression | BoolOrExpression
8888
89AssignmentExpression : UnwrapMaybeExpression AssignmentOperator UnwrapMaybeExpression | UnwrapMaybeExpression89AssignmentExpression : UnwrapMaybeExpression AssignmentOperator UnwrapMaybeExpression | UnwrapMaybeExpression
9090
91AssignmentOperator : 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) 91AssignmentOperator : "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "&&=" | "||="
9292
93BlockExpression : IfExpression | Block | WhileExpression | ForExpression93BlockExpression : IfExpression | Block | WhileExpression | ForExpression | SwitchExpression
9494
95WhileExpression : token(While) token(LParen) Expression token(RParen) Expression95SwitchExpression : "switch" "(" Expression ")" "{" many(SwitchProng) "}"
9696
97ForExpression : token(For) token(LParen) Symbol token(Comma) Expression option(token(Comma) token(Symbol)) token(RParen) Expression97SwitchProng : (list(SwitchItem, ",") | "else") option("(" "Symbol" ")") "=>" Expression ","
9898
99BoolOrExpression : BoolAndExpression token(BoolOr) BoolOrExpression | BoolAndExpression99SwitchItem : Expression | (Expression "..." Expression)
100100
101ReturnExpression : token(Return) option(Expression)101WhileExpression : "while" "(" Expression ")" Expression
102
103ForExpression : "for" "(" "Symbol" "," Expression option("," "Symbol") ")" Expression
104
105BoolOrExpression : BoolAndExpression "||" BoolOrExpression | BoolAndExpression
106
107ReturnExpression : "return" option(Expression)
102108
103IfExpression : IfVarExpression | IfBoolExpression109IfExpression : IfVarExpression | IfBoolExpression
104110
105IfBoolExpression : token(If) token(LParen) Expression token(RParen) Expression option(Else)111IfBoolExpression : "if" "(" Expression ")" Expression option(Else)
106112
107IfVarExpression : token(If) token(LParen) (token(Const) | token(Var)) token(Symbol) option(token(Colon) PrefixOpExpression) Token(MaybeAssign) Expression token(RParen) Expression Option(Else)113IfVarExpression : "if" "(" ("const" | "var") "Symbol" option(":" PrefixOpExpression) "?=" Expression ")" Expression Option(Else)
108114
109Else : token(Else) Expression115Else : "else" Expression
110116
111BoolAndExpression : ComparisonExpression token(BoolAnd) BoolAndExpression | ComparisonExpression117BoolAndExpression : ComparisonExpression "&&" BoolAndExpression | ComparisonExpression
112118
113ComparisonExpression : BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression119ComparisonExpression : BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression
114120
115ComparisonOperator : token(BoolEq) | token(BoolNotEq) | token(BoolLessThan) | token(BoolGreaterThan) | token(BoolLessEqual) | token(BoolGreaterEqual)121ComparisonOperator : "==" | "!=" | "<" | ">" | "<=" | ">="
116122
117BinaryOrExpression : BinaryXorExpression token(BinOr) BinaryOrExpression | BinaryXorExpression123BinaryOrExpression : BinaryXorExpression "|" BinaryOrExpression | BinaryXorExpression
118124
119BinaryXorExpression : BinaryAndExpression token(BinXor) BinaryXorExpression | BinaryAndExpression125BinaryXorExpression : BinaryAndExpression "^" BinaryXorExpression | BinaryAndExpression
120126
121BinaryAndExpression : BitShiftExpression token(Ampersand) BinaryAndExpression | BitShiftExpression127BinaryAndExpression : BitShiftExpression "&" BinaryAndExpression | BitShiftExpression
122128
123BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression129BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression
124130
125BitShiftOperator : token(BitShiftLeft) | token(BitShiftRight)131BitShiftOperator : "<<" | ">>"
126132
127AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression133AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression
128134
129AdditionOperator : token(Plus) | token(Minus)135AdditionOperator : "+" | "-"
130136
131MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression137MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression
132138
133CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression)139CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression)
134140
135MultiplyOperator : token(Star) | token(Slash) | token(Percent)141MultiplyOperator : "*" | "/" | "%"
136142
137PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression143PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression
138144
139SuffixOpExpression : PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression)145SuffixOpExpression : PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression)
140146
141FieldAccessExpression : token(Dot) token(Symbol)147FieldAccessExpression : "." "Symbol"
142148
143FnCallExpression : token(LParen) list(Expression, token(Comma)) token(RParen)149FnCallExpression : "(" list(Expression, ",") ")"
144150
145ArrayAccessExpression : token(LBracket) Expression token(RBracket)151ArrayAccessExpression : "[" Expression "]"
146152
147SliceExpression : token(LBracket) Expression token(Ellipsis) option(Expression) token(RBracket) option(token(Const))153SliceExpression : "[" Expression "..." option(Expression) "]" option("const")
148154
149ContainerInitExpression : token(LBrace) ContainerInitBody token(RBrace)155ContainerInitExpression : "{" ContainerInitBody "}"
150156
151ContainerInitBody : list(StructLiteralField, token(Comma)) | list(Expression, token(Comma))157ContainerInitBody : list(StructLiteralField, ",") | list(Expression, ",")
152158
153StructLiteralField : token(Dot) token(Symbol) token(Eq) Expression159StructLiteralField : "." "Symbol" "=" Expression
154160
155PrefixOp : token(Not) | token(Dash) | token(Tilde) | token(Star) | (token(Ampersand) option(token(Const))) | token(QuestionMark)161PrefixOp : "!" | "-" | "~" | "*" | ("&" option("const")) | "?"
156162
157PrimaryExpression : token(Number) | token(String) | token(CharLiteral) | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | token(Symbol) | (token(AtSign) token(Symbol) FnCallExpression) | ArrayType | AsmExpression163PrimaryExpression : "Number" | "String" | "CharLiteral" | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | "Symbol" | ("@" "Symbol" FnCallExpression) | ArrayType | AsmExpression
158164
159ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) PrefixOpExpression165ArrayType : "[" option(Expression) "]" option("const") PrefixOpExpression
160166
161GotoExpression: token(Goto) token(Symbol)167GotoExpression: "goto" "Symbol"
162168
163GroupedExpression : token(LParen) Expression token(RParen)169GroupedExpression : "(" Expression ")"
164170
165KeywordLiteral : token(True) | token(False) | token(Null) | token(Break) | token(Continue)171KeywordLiteral : "true" | "false" | "null" | "break" | "continue"
166```172```
167173
168## Operator Precedence174## Operator Precedence