zig/doc/langref.md

224 lines
8.8 KiB
Markdown
Raw Normal View History

2015-12-09 14:20:31 -08:00
# Language Reference
## Primitive Numeric Types:
zig | C equivalent | Description
-------------|------------------------|-------------------------------
bool | bool | unsigned 1-bit integer
i8 | int8_t | signed 8-bit integer
u8 | uint8_t | unsigned 8-bit integer
i16 | int16_t | signed 16-bit integer
u16 | uint16_t | unsigned 16-bit integer
i32 | int32_t | signed 32-bit integer
u32 | uint32_t | unsigned 32-bit integer
i64 | int64_t | signed 64-bit integer
u64 | uint64_t | unsigned 64-bit integer
f32 | float | 32-bit IEE754 floating point
f64 | double | 64-bit IEE754 floating point
f128 | long double | 128-bit IEE754 floating point
isize | intptr_t | signed pointer sized integer
usize | uintptr_t | unsigned pointer sized integer
c_short | short | for API compatibility with C
c_ushort | unsigned short | for API compatibility with C
c_int | int | for API compatibility with C
c_uint | unsigned int | for API compatibility with C
c_long | long | for API compatibility with C
c_ulong | unsigned long | for API compatibility with C
c_longlong | long long | for API compatibility with C
c_ulonglong | unsigned long long | for API compatibility with C
## Grammar
```
Root : many(TopLevelDecl) token(EOF)
2016-01-15 17:45:52 -08:00
TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | VariableDeclaration
VariableDeclaration : option(FnVisibleMod) (token(Var) | token(Const)) token(Symbol) (token(Eq) Expression | token(Colon) PrefixOpExpression option(token(Eq) Expression))
2016-01-10 15:58:21 -08:00
ContainerDecl : many(Directive) option(FnVisibleMod) (token(Struct) | token(Enum)) token(Symbol) token(LBrace) many(StructMember) token(RBrace)
2016-01-04 15:57:22 -08:00
StructMember: StructField | FnDecl
2016-01-13 17:15:51 -08:00
StructField : token(Symbol) option(token(Colon) Expression) token(Comma))
2016-01-10 10:48:54 -08:00
2016-01-15 17:45:52 -08:00
Import : many(Directive) token(Import) token(String) token(Semicolon)
2015-12-09 14:20:31 -08:00
RootExportDecl : many(Directive) token(Export) token(Symbol) token(String) token(Semicolon)
ExternBlock : many(Directive) token(Extern) token(LBrace) many(FnDecl) token(RBrace)
FnProto : many(Directive) option(FnVisibleMod) token(Fn) token(Symbol) ParamDeclList option(PrefixOpExpression)
2015-12-09 14:20:31 -08:00
Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)
FnVisibleMod : token(Pub) | token(Export)
FnDecl : FnProto token(Semicolon)
2016-01-13 17:15:51 -08:00
FnDef : FnProto token(FatArrow) Block
2015-12-09 14:20:31 -08:00
ParamDeclList : token(LParen) list(ParamDecl, token(Comma)) token(RParen)
ParamDecl : option(token(NoAlias)) token(Symbol) token(Colon) PrefixOpExpression | token(Ellipsis)
2015-12-09 14:20:31 -08:00
Block : token(LBrace) list(option(Statement), token(Semicolon)) token(RBrace)
Statement : Label | VariableDeclaration token(Semicolon) | NonBlockExpression token(Semicolon) | BlockExpression
Label: token(Symbol) token(Colon)
Expression : BlockExpression | NonBlockExpression
2016-01-13 17:15:51 -08:00
NonBlockExpression : ReturnExpression | AssignmentExpression
2015-12-10 14:34:38 -08:00
AsmExpression : token(Asm) option(token(Volatile)) token(LParen) token(String) option(AsmOutput) token(RParen)
AsmOutput : token(Colon) list(AsmOutputItem, token(Comma)) option(AsmInput)
AsmInput : token(Colon) list(AsmInputItem, token(Comma)) option(AsmClobbers)
AsmOutputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) (token(Symbol) | token(Arrow) PrefixOpExpression) token(RParen)
2015-12-11 02:55:26 -08:00
AsmInputItem : token(LBracket) token(Symbol) token(RBracket) token(String) token(LParen) Expression token(RParen)
2015-12-10 14:34:38 -08:00
AsmClobbers: token(Colon) list(token(String), token(Comma))
2015-12-09 14:20:31 -08:00
2016-01-13 17:15:51 -08:00
UnwrapMaybeExpression : BoolOrExpression token(DoubleQuestionMark) BoolOrExpression | BoolOrExpression
AssignmentExpression : UnwrapMaybeExpression AssignmentOperator UnwrapMaybeExpression | UnwrapMaybeExpression
2015-12-12 17:17:27 -08:00
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)
2015-12-09 14:20:31 -08:00
2015-12-24 13:37:43 -08:00
BlockExpression : IfExpression | Block | WhileExpression
WhileExpression : token(While) token(LParen) Expression token(RParen) Expression
2015-12-09 14:20:31 -08:00
BoolOrExpression : BoolAndExpression token(BoolOr) BoolOrExpression | BoolAndExpression
2015-12-09 14:20:31 -08:00
ReturnExpression : token(Return) option(Expression)
2015-12-26 14:05:27 -08:00
IfExpression : IfVarExpression | IfBoolExpression
IfBoolExpression : token(If) token(LParen) Expression token(RParen) Expression option(Else)
2015-12-09 14:20:31 -08:00
IfVarExpression : token(If) token(LParen) (token(Const) | token(Var)) token(Symbol) option(token(Colon) PrefixOpExpression) Token(MaybeAssign) Expression token(RParen) Expression Option(Else)
2015-12-09 14:20:31 -08:00
Else : token(Else) Expression
2015-12-09 14:20:31 -08:00
BoolAndExpression : ComparisonExpression token(BoolAnd) BoolAndExpression | ComparisonExpression
2015-12-09 14:20:31 -08:00
ComparisonExpression : BinaryOrExpression ComparisonOperator BinaryOrExpression | BinaryOrExpression
ComparisonOperator : token(BoolEq) | token(BoolNotEq) | token(BoolLessThan) | token(BoolGreaterThan) | token(BoolLessEqual) | token(BoolGreaterEqual)
BinaryOrExpression : BinaryXorExpression token(BinOr) BinaryOrExpression | BinaryXorExpression
2015-12-09 14:20:31 -08:00
BinaryXorExpression : BinaryAndExpression token(BinXor) BinaryXorExpression | BinaryAndExpression
2015-12-09 14:20:31 -08:00
BinaryAndExpression : BitShiftExpression token(Ampersand) BinaryAndExpression | BitShiftExpression
2015-12-09 14:20:31 -08:00
BitShiftExpression : AdditionExpression BitShiftOperator BitShiftExpression | AdditionExpression
2015-12-09 14:20:31 -08:00
BitShiftOperator : token(BitShiftLeft) | token(BitShiftRight)
2015-12-09 14:20:31 -08:00
AdditionExpression : MultiplyExpression AdditionOperator AdditionExpression | MultiplyExpression
2015-12-09 14:20:31 -08:00
AdditionOperator : token(Plus) | token(Minus)
MultiplyExpression : CurlySuffixExpression MultiplyOperator MultiplyExpression | CurlySuffixExpression
CurlySuffixExpression : PrefixOpExpression option(ContainerInitExpression)
2015-12-09 14:20:31 -08:00
MultiplyOperator : token(Star) | token(Slash) | token(Percent)
PrefixOpExpression : PrefixOp PrefixOpExpression | SuffixOpExpression
2015-12-09 14:20:31 -08:00
SuffixOpExpression : PrimaryExpression option(FnCallExpression | ArrayAccessExpression | FieldAccessExpression | SliceExpression)
FieldAccessExpression : token(Dot) token(Symbol)
2015-12-09 14:20:31 -08:00
FnCallExpression : token(LParen) list(Expression, token(Comma)) token(RParen)
ArrayAccessExpression : token(LBracket) Expression token(RBracket)
SliceExpression : token(LBracket) Expression token(Ellipsis) option(Expression) token(RBracket) option(token(Const))
2016-01-13 17:15:51 -08:00
ContainerInitExpression : token(LBrace) ContainerInitBody token(RBrace)
ContainerInitBody : list(StructLiteralField, token(Comma)) | list(Expression, token(Comma))
StructLiteralField : token(Dot) token(Symbol) token(Eq) Expression
2015-12-09 14:20:31 -08:00
2016-01-13 17:15:51 -08:00
PrefixOp : token(Not) | token(Dash) | token(Tilde) | token(Star) | (token(Ampersand) option(token(Const))) | token(QuestionMark)
2015-12-23 23:00:23 -08:00
2016-01-13 17:15:51 -08:00
PrimaryExpression : token(Number) | token(String) | token(CharLiteral) | KeywordLiteral | GroupedExpression | GotoExpression | BlockExpression | token(Symbol) | (token(AtSign) token(Symbol) FnCallExpression) | ArrayType | AsmExpression
2015-12-23 23:00:23 -08:00
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) PrefixOpExpression
2015-12-09 14:20:31 -08:00
2016-01-13 17:15:51 -08:00
GotoExpression: token(Goto) token(Symbol)
2015-12-09 14:20:31 -08:00
GroupedExpression : token(LParen) Expression token(RParen)
2016-01-13 17:15:51 -08:00
KeywordLiteral : token(True) | token(False) | token(Null) | token(Break) | token(Continue)
2015-12-09 14:20:31 -08:00
```
## Operator Precedence
```
x() x[] x.y
!x -x ~x *x &x ?x
x{}
2015-12-09 14:20:31 -08:00
* / %
+ -
<< >>
&
^
|
== != < > <= >=
&&
||
??
2015-12-12 17:17:27 -08:00
= *= /= %= += -= <<= >>= &= ^= |= &&= ||=
2015-12-09 14:20:31 -08:00
```
## Literals
### Characters and Strings
| Example | Characters | Escapes | Null Term | Type
----------------|----------|-------------|----------------|-----------|----------
Byte | 'H' | All ASCII | Byte | No | u8
UTF-8 Bytes | "hello" | All Unicode | Byte & Unicode | No | [5; u8]
UTF-8 C string | c"hello" | All Unicode | Byte & Unicode | Yes | *const u8
2015-12-09 14:20:31 -08:00
### Byte Escapes
| Name
------|----------------------------------------
2015-12-09 14:20:31 -08:00
\x7F | 8-bit character code (exactly 2 digits)
\n | Newline
\r | Carriage return
\t | Tab
\\ | Backslash
\0 | Null
\' | Single quote
\" | Double quote
### Unicode Escapes
| Name
----------|-----------------------------------------------
2015-12-09 14:20:31 -08:00
\u{7FFF} | 24-bit Unicode character code (up to 6 digits)
### Numbers
Number literals | Example | Exponentiation
--------------------|-------------|---------------
Decimal integer | 98222 | N/A
Hex integer | 0xff | N/A
Octal integer | 0o77 | N/A
Binary integer | 0b11110000 | N/A
Floating-point | 123.0E+77 | Optional
Hex floating point | TODO | TODO