Commit 05b677f0c4
Changed files (1)
doc/langref.html.in
@@ -9748,7 +9748,7 @@ test "expect in release fast mode" {
to see a command-line usage help menu. This will include project-specific
options that were declared in the build.zig script.
</p>
-
+
{#header_open|Building an Executable#}
<p>This <code>build.zig</code> file is automatically generated
by <code>zig init-exe</code>.</p>
@@ -11112,40 +11112,40 @@ fn readU32Be() u32 {}
{#header_close#}
{#header_open|Grammar#}
- <pre><code>Root <- skip ContainerMembers eof
+ <pre><code>Root <- skip container_doc_comment? ContainerMembers eof
# *** Top level ***
-ContainerMembers
- <- TestDecl ContainerMembers
- / TopLevelComptime ContainerMembers
- / KEYWORD_pub? TopLevelDecl ContainerMembers
- / ContainerField COMMA ContainerMembers
- / ContainerField
+ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)
+
+ContainerDeclarations
+ <- TestDecl ContainerDeclarations
+ / TopLevelComptime ContainerDeclarations
+ / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations
/
-TestDecl <- KEYWORD_test STRINGLITERALSINGLE Block
+TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block
-TopLevelComptime <- KEYWORD_comptime BlockExpr
+TopLevelComptime <- doc_comment? KEYWORD_comptime BlockExpr
TopLevelDecl
<- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
/ (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl
/ KEYWORD_usingnamespace Expr SEMICOLON
-FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? (KEYWORD_anytype / TypeExpr)
+FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
-ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
+ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / TypeExpr) ByteAlign?)? (EQUAL Expr)?
# *** Block Level ***
Statement
<- KEYWORD_comptime? VarDecl
/ KEYWORD_comptime BlockExprStatement
/ KEYWORD_nosuspend BlockExprStatement
- / KEYWORD_suspend (SEMICOLON / BlockExprStatement)
+ / KEYWORD_suspend BlockExprStatement
/ KEYWORD_defer BlockExprStatement
- / KEYWORD_errdefer BlockExprStatement
+ / KEYWORD_errdefer Payload? BlockExprStatement
/ IfStatement
/ LabeledStatement
/ SwitchExpr
@@ -11278,7 +11278,7 @@ WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
# *** Assembly ***
-AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN
+AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN
AsmOutput <- COLON AsmOutputList AsmInput?
@@ -11301,13 +11301,15 @@ WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN
LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN
+# Fn specific
CallConv <- KEYWORD_callconv LPAREN Expr RPAREN
-ParamDecl <- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
+ParamDecl
+ <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
+ / DOT3
ParamType
<- KEYWORD_anytype
- / DOT3
/ TypeExpr
# Control flow prefixes
@@ -11397,11 +11399,12 @@ PrefixOp
PrefixTypeOp
<- QUESTIONMARK
/ KEYWORD_anyframe MINUSRARROW
- / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
+ / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
/ PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
+ / ArrayTypeStart
SuffixOp
- <- LBRACKET Expr (DOT2 Expr?)? RBRACKET
+ <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET
/ DOT IDENTIFIER
/ DOTASTERISK
/ DOTQUESTIONMARK
@@ -11409,15 +11412,17 @@ SuffixOp
FnCallArguments <- LPAREN ExprList RPAREN
# Ptr specific
-ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET
+SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
PtrTypeStart
<- ASTERISK
/ ASTERISK2
/ LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
+ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
+
# ContainerDecl specific
-ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE
+ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE
ContainerDeclType
<- KEYWORD_struct
@@ -11429,7 +11434,7 @@ ContainerDeclType
ByteAlign <- KEYWORD_align LPAREN Expr RPAREN
# Lists
-IdentifierList <- (IDENTIFIER COMMA)* IDENTIFIER?
+IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)?
SwitchProngList <- (SwitchProng COMMA)* SwitchProng?
@@ -11445,49 +11450,96 @@ ExprList <- (Expr COMMA)* Expr?
# *** Tokens ***
eof <- !.
-eol <- ('\r'? '\n') | eof
+bin <- [01]
+bin_ <- '_'? bin
+oct <- [0-7]
+oct_ <- '_'? oct
hex <- [0-9a-fA-F]
-hex_ <- ('_'/hex)
+hex_ <- '_'? hex
dec <- [0-9]
-dec_ <- ('_'/dec)
-
-dec_int <- dec (dec_* dec)?
-hex_int <- hex (hex_* dec)?
+dec_ <- '_'? dec
+
+bin_int <- bin bin_*
+oct_int <- oct oct_*
+dec_int <- dec dec_*
+hex_int <- hex hex_*
+
+ox80_oxBF <- [\200-\277]
+oxF4 <- '\364'
+ox80_ox8F <- [\200-\217]
+oxF1_oxF3 <- [\361-\363]
+oxF0 <- '\360'
+ox90_0xBF <- [\220-\277]
+oxEE_oxEF <- [\356-\357]
+oxED <- '\355'
+ox80_ox9F <- [\200-\237]
+oxE1_oxEC <- [\341-\354]
+oxE0 <- '\340'
+oxA0_oxBF <- [\240-\277]
+oxC2_oxDF <- [\302-\337]
+
+# From https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/
+# First Byte Second Byte Third Byte Fourth Byte
+# [0x00,0x7F]
+# [0xC2,0xDF] [0x80,0xBF]
+# 0xE0 [0xA0,0xBF] [0x80,0xBF]
+# [0xE1,0xEC] [0x80,0xBF] [0x80,0xBF]
+# 0xED [0x80,0x9F] [0x80,0xBF]
+# [0xEE,0xEF] [0x80,0xBF] [0x80,0xBF]
+# 0xF0 [0x90,0xBF] [0x80,0xBF] [0x80,0xBF]
+# [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF]
+# 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF]
+
+mb_utf8_literal <-
+ oxF4 ox80_ox8F ox80_oxBF ox80_oxBF
+ / oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF
+ / oxF0 ox90_0xBF ox80_oxBF ox80_oxBF
+ / oxEE_oxEF ox80_oxBF ox80_oxBF
+ / oxED ox80_ox9F ox80_oxBF
+ / oxE1_oxEC ox80_oxBF ox80_oxBF
+ / oxE0 oxA0_oxBF ox80_oxBF
+ / oxC2_oxDF ox80_oxBF
+
+ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177]
char_escape
- <- '\\x' hex hex
- / '\\u{' hex+ '}'
- / '\\' [nr\\t'"]
+ <- "\\x" hex hex
+ / "\\u{" hex+ "}"
+ / "\\" [nr\\t'"]
char_char
- <- char_escape
- / [^\\'\r\n]
+ <- mb_utf8_literal
+ / char_escape
+ / ascii_char_not_nl_slash_squote
+
string_char
<- char_escape
- / [^\\"\r\n]
+ / [^\\"\n]
-line_comment <- '//'[^\r\n]* eol
-line_string <- ('\\\\' [^\r\n]* eol skip)+
-skip <- ([ \t] / eol / line_comment)*
+container_doc_comment <- ('//!' [^\n]* [ \n]*)+
+doc_comment <- ('///' [^\n]* [ \n]*)+
+line_comment <- '//' ![!/][^\n]* / '////' [^\n]*
+line_string <- ("\\\\" [^\n]* [ \n]*)+
+skip <- ([ \n] / line_comment)*
CHAR_LITERAL <- "'" char_char "'" skip
FLOAT
- <- '0x' hex_* hex '.' hex_int ([pP] [-+]? hex_int)? skip
- / dec_int '.' dec_int ([eE] [-+]? dec_int)? skip
- / '0x' hex_* hex '.'? [pP] [-+]? hex_int skip
- / dec_int '.'? [eE] [-+]? dec_int skip
+ <- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)? skip
+ / dec_int "." dec_int ([eE] [-+]? dec_int)? skip
+ / "0x" hex_int "."? [pP] [-+]? dec_int skip
+ / dec_int "."? [eE] [-+]? dec_int skip
INTEGER
- <- '0b' [_01]* [01] skip
- / '0o' [_0-7]* [0-7] skip
- / '0x' hex_* hex skip
+ <- "0b" bin_int skip
+ / "0o" oct_int skip
+ / "0x" hex_int skip
/ dec_int skip
-STRINGLITERALSINGLE <- '"' string_char* '"' skip
+STRINGLITERALSINGLE <- "\"" string_char* "\"" skip
STRINGLITERAL
<- STRINGLITERALSINGLE
- / line_string skip
+ / (line_string skip)+
IDENTIFIER
<- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
- / '@"' string_char* '"' skip
-BUILTINIDENTIFIER <- '@'[A-Za-z_][A-Za-z0-9_]* skip
+ / "@\"" string_char* "\"" skip
+BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip
AMPERSAND <- '&' ![=] skip