zig/doc/langref.md

177 lines
5.9 KiB
Markdown
Raw Normal View History

2015-12-10 06:20:31 +08:00
# Language Reference
## Grammar
```
Root = many(TopLevelItem) "EOF"
2015-12-10 06:20:31 +08:00
TopLevelItem = ErrorValueDecl | CompTimeExpression(Block) | TopLevelDecl | TestDecl
TestDecl = "test" String Block
2017-04-13 15:07:58 +08:00
TopLevelDecl = option(VisibleMod) (FnDef | ExternDecl | GlobalVarDecl | UseDecl)
ErrorValueDecl = "error" Symbol ";"
GlobalVarDecl = VariableDeclaration ";"
2016-01-05 07:57:22 +08:00
VariableDeclaration = option("comptime") ("var" | "const") Symbol option(":" TypeExpr) "=" Expression
2017-02-04 00:39:24 +08:00
ContainerMember = (ContainerField | FnDef | GlobalVarDecl)
ContainerField = Symbol option(":" Expression) ","
2016-01-11 02:48:54 +08:00
UseDecl = "use" Expression ";"
2015-12-10 06:20:31 +08:00
ExternDecl = "extern" option(String) (FnProto | VariableDeclaration) ";"
2015-12-10 06:20:31 +08:00
FnProto = option("coldcc" | "nakedcc" | "stdcallcc") "fn" option(Symbol) ParamDeclList option("->" TypeExpr)
2015-12-10 06:20:31 +08:00
VisibleMod = "pub" | "export"
2015-12-10 06:20:31 +08:00
FnDef = option("inline" | "extern") FnProto Block
2015-12-10 06:20:31 +08:00
ParamDeclList = "(" list(ParamDecl, ",") ")"
2015-12-10 06:20:31 +08:00
ParamDecl = option("noalias" | "comptime") option(Symbol ":") (TypeExpr | "...")
2015-12-10 06:20:31 +08:00
Block = "{" many(Statement) option(Expression) "}"
2015-12-10 06:20:31 +08:00
Statement = Label | VariableDeclaration ";" | Defer(Block) | Defer(Expression) ";" | BlockExpression(Block) | Expression ";" | ";"
2015-12-10 06:20:31 +08:00
Label = Symbol ":"
2015-12-10 06:20:31 +08:00
2016-09-08 12:24:48 +08:00
TypeExpr = PrefixOpExpression | "var"
BlockOrExpression = Block | Expression
Expression = ReturnExpression | BreakExpression | AssignmentExpression
2015-12-11 06:34:38 +08:00
AsmExpression = "asm" option("volatile") "(" String option(AsmOutput) ")"
2015-12-11 06:34:38 +08:00
AsmOutput = ":" list(AsmOutputItem, ",") option(AsmInput)
2015-12-11 06:34:38 +08:00
AsmInput = ":" list(AsmInputItem, ",") option(AsmClobbers)
2015-12-11 06:34:38 +08:00
AsmOutputItem = "[" Symbol "]" String "(" (Symbol | "->" TypeExpr) ")"
2015-12-11 18:55:26 +08:00
AsmInputItem = "[" Symbol "]" String "(" Expression ")"
2015-12-11 18:55:26 +08:00
AsmClobbers= ":" list(String, ",")
2015-12-10 06:20:31 +08:00
UnwrapExpression = BoolOrExpression (UnwrapMaybe | UnwrapError) | BoolOrExpression
2016-02-07 10:28:11 +08:00
UnwrapMaybe = "??" Expression
2016-01-26 04:53:40 +08:00
UnwrapError = "%%" option("|" Symbol "|") Expression
2016-01-26 04:53:40 +08:00
AssignmentExpression = UnwrapExpression AssignmentOperator UnwrapExpression | UnwrapExpression
2015-12-13 09:17:27 +08:00
AssignmentOperator = "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "*%=" | "+%=" | "-%=" | "<<%="
2015-12-10 06:20:31 +08:00
BlockExpression(body) = Block | IfExpression(body) | TryExpression(body) | TestExpression(body) | WhileExpression(body) | ForExpression(body) | SwitchExpression | CompTimeExpression(body)
CompTimeExpression(body) = "comptime" body
2015-12-25 05:37:43 +08:00
SwitchExpression = "switch" "(" Expression ")" "{" many(SwitchProng) "}"
2015-12-10 06:20:31 +08:00
2016-11-24 15:44:03 +08:00
SwitchProng = (list(SwitchItem, ",") | "else") "=>" option("|" option("*") Symbol "|") Expression ","
SwitchItem = Expression | (Expression "..." Expression)
2015-12-10 06:20:31 +08:00
ForExpression(body) = option("inline") "for" "(" Expression ")" option("|" option("*") Symbol option("," Symbol) "|") body option("else" BlockExpression(body))
BoolOrExpression = BoolAndExpression "or" BoolOrExpression | BoolAndExpression
ReturnExpression = option("%") "return" option(Expression)
2015-12-10 06:20:31 +08:00
BreakExpression = "break" option(Expression)
Defer(body) = option("%") "defer" body
2015-12-27 06:05:27 +08:00
IfExpression(body) = "if" "(" Expression ")" body option("else" BlockExpression(body))
2015-12-10 06:20:31 +08:00
TryExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body "else" "|" Symbol "|" BlockExpression(body)
2017-02-03 06:09:27 +08:00
TestExpression(body) = "if" "(" Expression ")" option("|" option("*") Symbol "|") body option("else" BlockExpression(body))
2015-12-10 06:20:31 +08:00
WhileExpression(body) = option("inline") "while" "(" Expression ")" option("|" option("*") Symbol "|") option(":" "(" Expression ")") body option("else" option("|" Symbol "|") BlockExpression(body))
BoolAndExpression = ComparisonExpression "and" BoolAndExpression | ComparisonExpression
2015-12-10 06:20:31 +08:00
ComparisonExpression = BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression
2015-12-10 06:20:31 +08:00
ComparisonOperator = "==" | "!=" | "<" | ">" | "<=" | ">="
2015-12-10 06:20:31 +08:00
BinaryOrExpression = BinaryXorExpression "|" BinaryOrExpression | BinaryXorExpression
2015-12-10 06:20:31 +08:00
BinaryXorExpression = BinaryAndExpression "^" BinaryXorExpression | BinaryAndExpression
2015-12-10 06:20:31 +08:00
BinaryAndExpression = BitShiftExpression "&" BinaryAndExpression | BitShiftExpression
2015-12-10 06:20:31 +08:00
BitShiftExpression = AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression
2015-12-10 06:20:31 +08:00
BitShiftOperator = "<<" | ">>" | "<<%"
2015-12-10 06:20:31 +08:00
AdditionExpression = MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression
2015-12-10 06:20:31 +08:00
AdditionOperator = "+" | "-" | "++" | "+%" | "-%"
2015-12-10 06:20:31 +08:00
MultiplyExpression = CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression
CurlySuffixExpression = TypeExpr option(ContainerInitExpression)
2015-12-10 06:20:31 +08:00
MultiplyOperator = "*" | "/" | "%" | "**" | "*%"
2015-12-10 06:20:31 +08:00
PrefixOpExpression = PrefixOp PrefixOpExpression | SuffixOpExpression
2015-12-10 06:20:31 +08:00
SuffixOpExpression = PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression)
FieldAccessExpression = "." Symbol
2015-12-10 06:20:31 +08:00
FnCallExpression = "(" list(Expression, ",") ")"
2015-12-10 06:20:31 +08:00
ArrayAccessExpression = "[" Expression "]"
2015-12-10 06:20:31 +08:00
SliceExpression = "[" Expression ".." option(Expression) "]"
ContainerInitExpression = "{" ContainerInitBody "}"
2016-01-14 09:15:51 +08:00
ContainerInitBody = list(StructLiteralField, ",") | list(Expression, ",")
2016-01-14 09:15:51 +08:00
StructLiteralField = "." Symbol "=" Expression
2015-12-10 06:20:31 +08:00
PrefixOp = "!" | "-" | "~" | "*" | ("&" option("const") option("volatile")) | "?" | "%" | "%%" | "??" | "-%"
2015-12-24 15:00:23 +08:00
2017-06-27 02:41:47 +08:00
PrimaryExpression = Integer | Float | String | CharLiteral | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression(BlockOrExpression) | Symbol | ("@" Symbol FnCallExpression) | ArrayType | (option("extern") FnProto) | AsmExpression | ("error" "." Symbol) | ContainerDecl
2015-12-24 15:00:23 +08:00
ArrayType = "[" option(Expression) "]" option("const") TypeExpr
2015-12-10 06:20:31 +08:00
GotoExpression = "goto" Symbol
GroupedExpression = "(" Expression ")"
2015-12-10 06:20:31 +08:00
KeywordLiteral = "true" | "false" | "null" | "continue" | "undefined" | "error" | "this" | "unreachable"
2016-12-19 05:56:50 +08:00
2017-02-04 00:39:24 +08:00
ContainerDecl = option("extern" | "packed") ("struct" | "enum" | "union") "{" many(ContainerMember) "}"
2015-12-10 06:20:31 +08:00
```
## Operator Precedence
```
x() x[] x.y
!x -x -%x ~x *x &x ?x %x %%x ??x
x{}
* / % ** *%
+ - ++ +% -%
2015-12-10 06:20:31 +08:00
<< >>
&
^
|
== != < > <= >=
and
or
2016-01-26 04:53:40 +08:00
?? %%
2017-03-27 02:48:23 +08:00
= *= /= %= += -= <<= >>= &= ^= |=
2015-12-10 06:20:31 +08:00
```