diff --git a/ci/azure/linux_script b/ci/azure/linux_script index 065576bef4..857e87cab8 100755 --- a/ci/azure/linux_script +++ b/ci/azure/linux_script @@ -89,7 +89,7 @@ release/bin/zig build test-fmt -Denable-qemu -Denable-wasmtime release/bin/zig build test-stage2 -Denable-qemu -Denable-wasmtime # Look for HTML errors. -tidy -qe ../zig-cache/langref.html +tidy --drop-empty-elements no -qe ../zig-cache/langref.html if [ "${BUILD_REASON}" != "PullRequest" ]; then # Produce the experimental std lib documentation. diff --git a/doc/docgen.zig b/doc/docgen.zig index 0ba44df267..1b4058ae4c 100644 --- a/doc/docgen.zig +++ b/doc/docgen.zig @@ -313,6 +313,7 @@ const SyntaxBlock = struct { const SourceType = enum { zig, c, + peg, javascript, }; }; @@ -666,6 +667,8 @@ fn genToc(allocator: *Allocator, tokenizer: *Tokenizer) !Toc { source_type = SyntaxBlock.SourceType.zig; } else if (mem.eql(u8, source_type_str, "c")) { source_type = SyntaxBlock.SourceType.c; + } else if (mem.eql(u8, source_type_str, "peg")) { + source_type = SyntaxBlock.SourceType.peg; } else if (mem.eql(u8, source_type_str, "javascript")) { source_type = SyntaxBlock.SourceType.javascript; } else { @@ -864,6 +867,21 @@ fn isType(name: []const u8) bool { return false; } +const start_line = ""; +const end_line = ""; + +fn writeEscapedLines(out: anytype, text: []const u8) !void { + for (text) |char| { + if (char == '\n') { + try out.writeAll(end_line); + try out.writeAll("\n"); + try out.writeAll(start_line); + } else { + try writeEscaped(out, &[_]u8{char}); + } + } +} + fn tokenizeAndPrintRaw( allocator: *Allocator, docgen_tokenizer: *Tokenizer, @@ -873,7 +891,8 @@ fn tokenizeAndPrintRaw( ) !void { const src_non_terminated = mem.trim(u8, raw_src, " \n"); const src = try allocator.dupeZ(u8, src_non_terminated); - try out.writeAll(""); + + try out.writeAll("" ++ start_line); var tokenizer = std.zig.Tokenizer.init(src); var index: usize = 0; var next_tok_is_fn = false; @@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw( const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n"); const comment_end = if (comment_end_off) |o| comment_start + o else token.loc.start; - try writeEscaped(out, src[index..comment_start]); + try writeEscapedLines(out, src[index..comment_start]); try out.writeAll(""); try writeEscaped(out, src[comment_start..comment_end]); try out.writeAll(""); @@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw( continue; } - try writeEscaped(out, src[index..token.loc.start]); + try writeEscapedLines(out, src[index..token.loc.start]); switch (token.tag) { .eof => break, @@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw( }, .string_literal, - .multiline_string_literal_line, .char_literal, => { try out.writeAll(""); @@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw( try out.writeAll(""); }, + .multiline_string_literal_line => { + if (src[token.loc.end - 1] == '\n') { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start .. token.loc.end - 1]); + try out.writeAll("" ++ end_line ++ "\n" ++ start_line); + } else { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start..token.loc.end]); + try out.writeAll(""); + } + }, + .builtin => { try out.writeAll(""); try writeEscaped(out, src[token.loc.start..token.loc.end]); @@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw( } index = token.loc.end; } - try out.writeAll(""); + try out.writeAll(end_line ++ ""); } fn tokenizeAndPrint( @@ -1126,9 +1156,9 @@ fn printSourceBlock(allocator: *Allocator, docgen_tokenizer: *Tokenizer, out: an const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end]; const trimmed_raw_source = mem.trim(u8, raw_source, " \n"); - try out.writeAll(""); - try writeEscaped(out, trimmed_raw_source); - try out.writeAll(""); + try out.writeAll("" ++ start_line); + try writeEscapedLines(out, trimmed_raw_source); + try out.writeAll(end_line ++ ""); }, } try out.writeAll(""); @@ -1142,15 +1172,15 @@ fn printShell(out: anytype, shell_content: []const u8) !void { while (iter.next()) |orig_line| { const line = mem.trimRight(u8, orig_line, " "); if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') { - try out.print("$ {s}\n", .{std.mem.trimLeft(u8, line[1..], " ")}); + try out.print(start_line ++ "$ {s}" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")}); } else if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] == '\\') { - try out.print("$ {s}\n", .{std.mem.trimLeft(u8, line[1..], " ")}); + try out.print(start_line ++ "$ {s}" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")}); cmd_cont = true; } else if (line.len > 0 and line[line.len - 1] != '\\' and cmd_cont) { - try out.print("{s}\n", .{line}); + try out.print(start_line ++ "{s}" ++ end_line ++ "\n", .{line}); cmd_cont = false; } else { - try out.print("{s}\n", .{line}); + try out.print(start_line ++ "{s}" ++ end_line ++ "\n", .{line}); } } @@ -1701,7 +1731,7 @@ test "shell parsed" { \\$ zig build test.zig ; const expected = - \\Shell$ zig build test.zig + \\Shell$ zig build test.zig \\ ; @@ -1709,6 +1739,7 @@ test "shell parsed" { defer buffer.deinit(); try printShell(buffer.writer(), shell_out); + std.log.emerg("{s}", .{buffer.items}); try testing.expectEqualSlices(u8, expected, buffer.items); } { @@ -1717,8 +1748,8 @@ test "shell parsed" { \\build output ; const expected = - \\Shell$ zig build test.zig - \\build output + \\Shell$ zig build test.zig + \\build output \\ ; @@ -1735,9 +1766,9 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig - \\build output - \\$ ./test + \\Shell$ zig build test.zig + \\build output + \\$ ./test \\ ; @@ -1755,10 +1786,10 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\ - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\ + \\$ ./test + \\output \\ ; @@ -1775,9 +1806,9 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
"); + + try out.writeAll("" ++ start_line); var tokenizer = std.zig.Tokenizer.init(src); var index: usize = 0; var next_tok_is_fn = false; @@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw( const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n"); const comment_end = if (comment_end_off) |o| comment_start + o else token.loc.start; - try writeEscaped(out, src[index..comment_start]); + try writeEscapedLines(out, src[index..comment_start]); try out.writeAll(""); try writeEscaped(out, src[comment_start..comment_end]); try out.writeAll(""); @@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw( continue; } - try writeEscaped(out, src[index..token.loc.start]); + try writeEscapedLines(out, src[index..token.loc.start]); switch (token.tag) { .eof => break, @@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw( }, .string_literal, - .multiline_string_literal_line, .char_literal, => { try out.writeAll(""); @@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw( try out.writeAll(""); }, + .multiline_string_literal_line => { + if (src[token.loc.end - 1] == '\n') { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start .. token.loc.end - 1]); + try out.writeAll("" ++ end_line ++ "\n" ++ start_line); + } else { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start..token.loc.end]); + try out.writeAll(""); + } + }, + .builtin => { try out.writeAll(""); try writeEscaped(out, src[token.loc.start..token.loc.end]); @@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw( } index = token.loc.end; } - try out.writeAll(""); + try out.writeAll(end_line ++ "
" ++ start_line); var tokenizer = std.zig.Tokenizer.init(src); var index: usize = 0; var next_tok_is_fn = false; @@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw( const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n"); const comment_end = if (comment_end_off) |o| comment_start + o else token.loc.start; - try writeEscaped(out, src[index..comment_start]); + try writeEscapedLines(out, src[index..comment_start]); try out.writeAll(""); try writeEscaped(out, src[comment_start..comment_end]); try out.writeAll(""); @@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw( continue; } - try writeEscaped(out, src[index..token.loc.start]); + try writeEscapedLines(out, src[index..token.loc.start]); switch (token.tag) { .eof => break, @@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw( }, .string_literal, - .multiline_string_literal_line, .char_literal, => { try out.writeAll(""); @@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw( try out.writeAll(""); }, + .multiline_string_literal_line => { + if (src[token.loc.end - 1] == '\n') { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start .. token.loc.end - 1]); + try out.writeAll("" ++ end_line ++ "\n" ++ start_line); + } else { + try out.writeAll(""); + try writeEscaped(out, src[token.loc.start..token.loc.end]); + try out.writeAll(""); + } + }, + .builtin => { try out.writeAll(""); try writeEscaped(out, src[token.loc.start..token.loc.end]); @@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw( } index = token.loc.end; } - try out.writeAll("
"); - try writeEscaped(out, trimmed_raw_source); - try out.writeAll("
" ++ start_line); + try writeEscapedLines(out, trimmed_raw_source); + try out.writeAll(end_line ++ "
$ zig build test.zig + \\Shell$ zig build test.zig \\ ; @@ -1709,6 +1739,7 @@ test "shell parsed" { defer buffer.deinit(); try printShell(buffer.writer(), shell_out); + std.log.emerg("{s}", .{buffer.items}); try testing.expectEqualSlices(u8, expected, buffer.items); } { @@ -1717,8 +1748,8 @@ test "shell parsed" { \\build output ; const expected = - \\Shell$ zig build test.zig - \\build output + \\Shell$ zig build test.zig + \\build output \\ ; @@ -1735,9 +1766,9 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig - \\build output - \\$ ./test + \\Shell$ zig build test.zig + \\build output + \\$ ./test \\ ; @@ -1755,10 +1786,10 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\ - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\ + \\$ ./test + \\output \\ ; @@ -1775,9 +1806,9 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig \\
$ zig build test.zig - \\build output + \\Shell$ zig build test.zig + \\build output \\ ; @@ -1735,9 +1766,9 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig - \\build output - \\$ ./test + \\Shell$ zig build test.zig + \\build output + \\$ ./test \\ ; @@ -1755,10 +1786,10 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\ - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\ + \\$ ./test + \\output \\ ; @@ -1775,9 +1806,9 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig + \\build output \\
$ zig build test.zig - \\build output - \\$ ./test + \\Shell$ zig build test.zig + \\build output + \\$ ./test \\ ; @@ -1755,10 +1786,10 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\ - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\ + \\$ ./test + \\output \\ ; @@ -1775,9 +1806,9 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig + \\build output + \\$ ./test \\
$ zig build test.zig - \\ - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\ + \\$ ./test + \\output \\ ; @@ -1775,9 +1806,9 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig + \\ + \\$ ./test + \\output \\
$ zig build test.zig - \\$ ./test - \\output + \\Shell$ zig build test.zig + \\$ ./test + \\output \\ ; @@ -1796,11 +1827,11 @@ test "shell parsed" { \\output ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig + \\$ ./test + \\output \\
$ zig build test.zig \ - \\ --build-option - \\build output - \\$ ./test - \\output + \\Shell$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\ ; @@ -1819,10 +1850,10 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig \ + \\ --build-option + \\build output + \\$ ./test + \\output \\
$ zig build test.zig \ - \\ --build-option1 \ - \\ --build-option2 - \\$ ./test + \\Shell$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\ ; @@ -1838,8 +1869,8 @@ test "shell parsed" { \\$ ./test ; const expected = - \\Shell$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig \ + \\ --build-option1 \ + \\ --build-option2 + \\$ ./test \\
$ zig build test.zig \ - \\$ ./test + \\Shell$ zig build test.zig \ + \\$ ./test \\ ; @@ -1856,9 +1887,9 @@ test "shell parsed" { \\$1 ; const expected = - \\Shell$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig \ + \\$ ./test \\
$ zig build test.zig - \\$ ./test - \\$1 + \\Shell$ zig build test.zig + \\$ ./test + \\$1 \\ ; @@ -1873,7 +1904,7 @@ test "shell parsed" { \\$zig build test.zig ; const expected = - \\Shell$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$ zig build test.zig + \\$ ./test + \\$1 \\
$zig build test.zig + \\Shell$zig build test.zig \\ ; diff --git a/doc/langref.html.in b/doc/langref.html.in index 4c4c24a005..4fbc4ef302 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -170,6 +170,9 @@ background: #a8b9cc; color: #000; } + figcaption.peg-cap { + background: #fcdba5; + } figcaption.javascript-cap { background: #365d95; color: #fff; @@ -196,6 +199,25 @@ visibility: visible; } + pre { + counter-reset: line; + } + pre .line:before { + counter-increment: line; + content: counter(line); + display: inline-block; + padding-right: 1em; + width: 2em; + text-align: right; + color: #999; + } + th pre code { + background: none; + } + th .line:before { + display: none; + } + @media (prefers-color-scheme: dark) { body{ background:#121212; @@ -269,6 +291,10 @@ background-color: #b27306; color: #000; } + figcaption.peg-cap { + background-color: #b27306; + color: #000; + } figcaption.shell-cap { background: #2a2a2a; color: #fff; @@ -11844,35 +11870,35 @@ fn readU32Be() u32 {} {#header_close#} {#header_open|Grammar#} - Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while - +{#end_syntax_block#} {#header_close#} {#header_open|Zen#}
$zig build test.zig \\
Root <- skip container_doc_comment? ContainerMembers eof + {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) ContainerDeclarations - <- TestDecl ContainerDeclarations + <- TestDecl ContainerDeclarations / TopLevelComptime ContainerDeclarations / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations / -TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block +TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block -TopLevelComptime <- doc_comment? 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_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? 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 +VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON -ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / 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? VarDecl / KEYWORD_comptime BlockExprStatement / KEYWORD_nosuspend BlockExprStatement / KEYWORD_suspend BlockExprStatement @@ -11884,50 +11910,50 @@ Statement / AssignExpr SEMICOLON IfStatement - <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) -LabeledStatement <- BlockLabel? (Block / LoopStatement) +LabeledStatement <- BlockLabel? (Block / LoopStatement) -LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) +LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) ForStatement - <- ForPrefix BlockExpr ( KEYWORD_else Statement )? + <- ForPrefix BlockExpr ( KEYWORD_else Statement )? / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) WhileStatement - <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? + <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) BlockExprStatement - <- BlockExpr + <- BlockExpr / AssignExpr SEMICOLON -BlockExpr <- BlockLabel? Block +BlockExpr <- BlockLabel? Block # *** Expression Level *** -AssignExpr <- Expr (AssignOp Expr)? +AssignExpr <- Expr (AssignOp Expr)? -Expr <- BoolOrExpr +Expr <- BoolOrExpr -BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* +BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* -BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* +BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* -CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? +CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? -BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* +BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* -BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* +BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* -AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* +AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* -MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* +MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* -PrefixExpr <- PrefixOp* PrimaryExpr +PrefixExpr <- PrefixOp* PrimaryExpr PrimaryExpr - <- AsmExpr + <- AsmExpr / IfExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr @@ -11939,33 +11965,33 @@ PrimaryExpr / Block / CurlySuffixExpr -IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? +IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? -Block <- LBRACE Statement* RBRACE +Block <- LBRACE Statement* RBRACE -LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) +LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) -ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? +ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? -WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? +WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? -CurlySuffixExpr <- TypeExpr InitList? +CurlySuffixExpr <- TypeExpr InitList? InitList - <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE + <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE / LBRACE Expr (COMMA Expr)* COMMA? RBRACE / LBRACE RBRACE -TypeExpr <- PrefixTypeOp* ErrorUnionExpr +TypeExpr <- PrefixTypeOp* ErrorUnionExpr -ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? +ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments + <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments / PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr - <- BUILTINIDENTIFIER FnCallArguments + <- BUILTINIDENTIFIER FnCallArguments / CHAR_LITERAL / ContainerDecl / DOT IDENTIFIER @@ -11985,94 +12011,93 @@ PrimaryTypeExpr / STRINGLITERAL / SwitchExpr -ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto +ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto -ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE +ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE -GroupedExpr <- LPAREN Expr RPAREN +GroupedExpr <- LPAREN Expr RPAREN -IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? LabeledTypeExpr - <- BlockLabel Block + <- BlockLabel Block / BlockLabel? LoopTypeExpr -LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) +LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) -ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? +ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? -WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? +WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? -SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE +SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE # *** Assembly *** -AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN +AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN -AsmOutput <- COLON AsmOutputList AsmInput? +AsmOutput <- COLON AsmOutputList AsmInput? -AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN +AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN -AsmInput <- COLON AsmInputList AsmClobbers? +AsmInput <- COLON AsmInputList AsmClobbers? -AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN +AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON StringList # *** Helper grammar *** -BreakLabel <- COLON IDENTIFIER +BreakLabel <- COLON IDENTIFIER -BlockLabel <- IDENTIFIER COLON +BlockLabel <- IDENTIFIER COLON -FieldInit <- DOT IDENTIFIER EQUAL Expr +FieldInit <- DOT IDENTIFIER EQUAL Expr -WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN +WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN -LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN +LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN # Fn specific -CallConv <- KEYWORD_callconv LPAREN Expr RPAREN +CallConv <- KEYWORD_callconv LPAREN Expr RPAREN ParamDecl - <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType + <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType / DOT3 ParamType - <- KEYWORD_anytype + <- KEYWORD_anytype / TypeExpr # Control flow prefixes -IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? +IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? -WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? +WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? -ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload +ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload # Payloads -Payload <- PIPE IDENTIFIER PIPE +Payload <- PIPE IDENTIFIER PIPE -PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE +PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE -PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE +PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE # Switch specific -SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr +SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr SwitchCase - <- SwitchItem (COMMA SwitchItem)* COMMA? + <- SwitchItem (COMMA SwitchItem)* COMMA? / KEYWORD_else -SwitchItem <- Expr (DOT3 Expr)? +SwitchItem <- Expr (DOT3 Expr)? # Operators AssignOp - <- ASTERISKEQUAL + <- ASTERISKEQUAL / SLASHEQUAL / PERCENTEQUAL / PLUSEQUAL / MINUSEQUAL / LARROW2EQUAL - / LARROW2PIPEEQUAL / RARROW2EQUAL / AMPERSANDEQUAL / CARETEQUAL @@ -12083,7 +12108,7 @@ AssignOp / EQUAL CompareOp - <- EQUALEQUAL + <- EQUALEQUAL / EXCLAMATIONMARKEQUAL / LARROW / RARROW @@ -12091,36 +12116,33 @@ CompareOp / RARROWEQUAL BitwiseOp - <- AMPERSAND + <- AMPERSAND / CARET / PIPE / KEYWORD_orelse / KEYWORD_catch Payload? BitShiftOp - <- LARROW2 + <- LARROW2 / RARROW2 AdditionOp - <- PLUS + <- PLUS / MINUS / PLUS2 / PLUSPERCENT / MINUSPERCENT - / PLUSPIPE - / MINUSPIPE MultiplyOp - <- PIPE2 + <- PIPE2 / ASTERISK / SLASH / PERCENT / ASTERISK2 / ASTERISKPERCENT - / ASTERISKPIPE PrefixOp - <- EXCLAMATIONMARK + <- EXCLAMATIONMARK / MINUS / TILDE / MINUSPERCENT @@ -12129,86 +12151,86 @@ PrefixOp / KEYWORD_await PrefixTypeOp - <- QUESTIONMARK + <- QUESTIONMARK / KEYWORD_anyframe MINUSRARROW / 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? (COLON Expr)?)?)? RBRACKET + <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET / DOT IDENTIFIER / DOTASTERISK / DOTQUESTIONMARK -FnCallArguments <- LPAREN ExprList RPAREN +FnCallArguments <- LPAREN ExprList RPAREN # Ptr specific -SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET +SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET PtrTypeStart - <- ASTERISK + <- ASTERISK / ASTERISK2 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET -ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET +ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET # ContainerDecl specific -ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE +ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE ContainerDeclType - <- KEYWORD_struct + <- KEYWORD_struct / KEYWORD_opaque / KEYWORD_enum (LPAREN Expr RPAREN)? / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? # Alignment -ByteAlign <- KEYWORD_align LPAREN Expr RPAREN +ByteAlign <- KEYWORD_align LPAREN Expr RPAREN # Lists -IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? +IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)? -SwitchProngList <- (SwitchProng COMMA)* SwitchProng? +SwitchProngList <- (SwitchProng COMMA)* SwitchProng? -AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? +AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? -AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? +AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? +StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? -ParamDeclList <- (ParamDecl COMMA)* ParamDecl? +ParamDeclList <- (ParamDecl COMMA)* ParamDecl? -ExprList <- (Expr COMMA)* Expr? +ExprList <- (Expr COMMA)* Expr? # *** Tokens *** -eof <- !. -bin <- [01] -bin_ <- '_'? bin -oct <- [0-7] -oct_ <- '_'? oct -hex <- [0-9a-fA-F] -hex_ <- '_'? hex -dec <- [0-9] -dec_ <- '_'? dec +eof <- !. +bin <- [01] +bin_ <- '_'? bin +oct <- [0-7] +oct_ <- '_'? oct +hex <- [0-9a-fA-F] +hex_ <- '_'? hex +dec <- [0-9] +dec_ <- '_'? dec -bin_int <- bin bin_* -oct_int <- oct oct_* -dec_int <- dec dec_* -hex_int <- hex hex_* +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] +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 @@ -12222,7 +12244,7 @@ oxC2_oxDF <- [\302-\337] # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF] # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF] -mb_utf8_literal <- +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 @@ -12232,164 +12254,156 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177] +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 - <- mb_utf8_literal + <- mb_utf8_literal / char_escape / ascii_char_not_nl_slash_squote string_char - <- char_escape - / [^\\"\n] + <- char_escape + / [^\\"\n] -container_doc_comment <- ('//!' [^\n]* [ \n]*)+ -doc_comment <- ('///' [^\n]* [ \n]*)+ -line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ("\\\\" [^\n]* [ \n]*)+ -skip <- ([ \n] / 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 +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- "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 + <- "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" bin_int skip - / "0o" oct_int skip - / "0x" hex_int 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 + <- STRINGLITERALSINGLE / (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 + <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip + / "@\"" string_char* "\"" skip +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip -AMPERSAND <- '&' ![=] skip -AMPERSANDEQUAL <- '&=' skip -ASTERISK <- '*' ![*%=] skip -ASTERISK2 <- '**' skip -ASTERISKEQUAL <- '*=' skip -ASTERISKPERCENT <- '*%' ![=] skip -ASTERISKPERCENTEQUAL <- '*%=' skip -ASTERISKPIPE <- '*|' ![=] skip -ASTERISKPIPEEQUAL <- '*|=' skip -CARET <- '^' ![=] skip -CARETEQUAL <- '^=' skip -COLON <- ':' skip -COMMA <- ',' skip -DOT <- '.' ![*.?] skip -DOT2 <- '..' ![.] skip -DOT3 <- '...' skip -DOTASTERISK <- '.*' skip -DOTQUESTIONMARK <- '.?' skip -EQUAL <- '=' ![>=] skip -EQUALEQUAL <- '==' skip -EQUALRARROW <- '=>' skip -EXCLAMATIONMARK <- '!' ![=] skip -EXCLAMATIONMARKEQUAL <- '!=' skip -LARROW <- '<' ![<=] skip -LARROW2 <- '<<' ![=] skip -LARROW2PIPE <- '<<|' ![=] skip -LARROW2PIPEEQUAL <- '<<|=' ![=] skip -LARROW2EQUAL <- '<<=' skip -LARROWEQUAL <- '<=' skip -LBRACE <- '{' skip -LBRACKET <- '[' skip -LPAREN <- '(' skip -MINUS <- '-' ![%=>] skip -MINUSEQUAL <- '-=' skip -MINUSPERCENT <- '-%' ![=] skip -MINUSPERCENTEQUAL <- '-%=' skip -MINUSPIPE <- '-|' ![=] skip -MINUSPIPEEQUAL <- '-|=' skip -MINUSRARROW <- '->' skip -PERCENT <- '%' ![=] skip -PERCENTEQUAL <- '%=' skip -PIPE <- '|' ![|=] skip -PIPE2 <- '||' skip -PIPEEQUAL <- '|=' skip -PLUS <- '+' ![%+=] skip -PLUS2 <- '++' skip -PLUSEQUAL <- '+=' skip -PLUSPERCENT <- '+%' ![=] skip -PLUSPERCENTEQUAL <- '+%=' skip -PLUSPIPE <- '+|' ![=] skip -PLUSPIPEEQUAL <- '+|=' skip -LETTERC <- 'c' skip -QUESTIONMARK <- '?' skip -RARROW <- '>' ![>=] skip -RARROW2 <- '>>' ![=] skip -RARROW2EQUAL <- '>>=' skip -RARROWEQUAL <- '>=' skip -RBRACE <- '}' skip -RBRACKET <- ']' skip -RPAREN <- ')' skip -SEMICOLON <- ';' skip -SLASH <- '/' ![=] skip -SLASHEQUAL <- '/=' skip -TILDE <- '~' skip +AMPERSAND <- '&' ![=] skip +AMPERSANDEQUAL <- '&=' skip +ASTERISK <- '*' ![*%=] skip +ASTERISK2 <- '**' skip +ASTERISKEQUAL <- '*=' skip +ASTERISKPERCENT <- '*%' ![=] skip +ASTERISKPERCENTEQUAL <- '*%=' skip +CARET <- '^' ![=] skip +CARETEQUAL <- '^=' skip +COLON <- ':' skip +COMMA <- ',' skip +DOT <- '.' ![*.?] skip +DOT2 <- '..' ![.] skip +DOT3 <- '...' skip +DOTASTERISK <- '.*' skip +DOTQUESTIONMARK <- '.?' skip +EQUAL <- '=' ![>=] skip +EQUALEQUAL <- '==' skip +EQUALRARROW <- '=>' skip +EXCLAMATIONMARK <- '!' ![=] skip +EXCLAMATIONMARKEQUAL <- '!=' skip +LARROW <- '<' ![<=] skip +LARROW2 <- '<<' ![=] skip +LARROW2EQUAL <- '<<=' skip +LARROWEQUAL <- '<=' skip +LBRACE <- '{' skip +LBRACKET <- '[' skip +LPAREN <- '(' skip +MINUS <- '-' ![%=>] skip +MINUSEQUAL <- '-=' skip +MINUSPERCENT <- '-%' ![=] skip +MINUSPERCENTEQUAL <- '-%=' skip +MINUSRARROW <- '->' skip +PERCENT <- '%' ![=] skip +PERCENTEQUAL <- '%=' skip +PIPE <- '|' ![|=] skip +PIPE2 <- '||' skip +PIPEEQUAL <- '|=' skip +PLUS <- '+' ![%+=] skip +PLUS2 <- '++' skip +PLUSEQUAL <- '+=' skip +PLUSPERCENT <- '+%' ![=] skip +PLUSPERCENTEQUAL <- '+%=' skip +LETTERC <- 'c' skip +QUESTIONMARK <- '?' skip +RARROW <- '>' ![>=] skip +RARROW2 <- '>>' ![=] skip +RARROW2EQUAL <- '>>=' skip +RARROWEQUAL <- '>=' skip +RBRACE <- '}' skip +RBRACKET <- ']' skip +RPAREN <- ')' skip +SEMICOLON <- ';' skip +SLASH <- '/' ![=] skip +SLASHEQUAL <- '/=' skip +TILDE <- '~' skip -end_of_word <- ![a-zA-Z0-9_] skip -KEYWORD_align <- 'align' end_of_word -KEYWORD_allowzero <- 'allowzero' end_of_word -KEYWORD_and <- 'and' end_of_word -KEYWORD_anyframe <- 'anyframe' end_of_word -KEYWORD_anytype <- 'anytype' end_of_word -KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word -KEYWORD_break <- 'break' end_of_word -KEYWORD_callconv <- 'callconv' end_of_word -KEYWORD_catch <- 'catch' end_of_word -KEYWORD_comptime <- 'comptime' end_of_word -KEYWORD_const <- 'const' end_of_word -KEYWORD_continue <- 'continue' end_of_word -KEYWORD_defer <- 'defer' end_of_word -KEYWORD_else <- 'else' end_of_word -KEYWORD_enum <- 'enum' end_of_word -KEYWORD_errdefer <- 'errdefer' end_of_word -KEYWORD_error <- 'error' end_of_word -KEYWORD_export <- 'export' end_of_word -KEYWORD_extern <- 'extern' end_of_word -KEYWORD_fn <- 'fn' end_of_word -KEYWORD_for <- 'for' end_of_word -KEYWORD_if <- 'if' end_of_word -KEYWORD_inline <- 'inline' end_of_word -KEYWORD_noalias <- 'noalias' end_of_word -KEYWORD_nosuspend <- 'nosuspend' end_of_word -KEYWORD_noinline <- 'noinline' end_of_word -KEYWORD_opaque <- 'opaque' end_of_word -KEYWORD_or <- 'or' end_of_word -KEYWORD_orelse <- 'orelse' end_of_word -KEYWORD_packed <- 'packed' end_of_word -KEYWORD_pub <- 'pub' end_of_word -KEYWORD_resume <- 'resume' end_of_word -KEYWORD_return <- 'return' end_of_word -KEYWORD_linksection <- 'linksection' end_of_word -KEYWORD_struct <- 'struct' end_of_word -KEYWORD_suspend <- 'suspend' end_of_word -KEYWORD_switch <- 'switch' end_of_word -KEYWORD_test <- 'test' end_of_word -KEYWORD_threadlocal <- 'threadlocal' end_of_word -KEYWORD_try <- 'try' end_of_word -KEYWORD_union <- 'union' end_of_word -KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word -KEYWORD_var <- 'var' end_of_word -KEYWORD_volatile <- 'volatile' end_of_word -KEYWORD_while <- 'while' end_of_word +end_of_word <- ![a-zA-Z0-9_] skip +KEYWORD_align <- 'align' end_of_word +KEYWORD_allowzero <- 'allowzero' end_of_word +KEYWORD_and <- 'and' end_of_word +KEYWORD_anyframe <- 'anyframe' end_of_word +KEYWORD_anytype <- 'anytype' end_of_word +KEYWORD_asm <- 'asm' end_of_word +KEYWORD_async <- 'async' end_of_word +KEYWORD_await <- 'await' end_of_word +KEYWORD_break <- 'break' end_of_word +KEYWORD_callconv <- 'callconv' end_of_word +KEYWORD_catch <- 'catch' end_of_word +KEYWORD_comptime <- 'comptime' end_of_word +KEYWORD_const <- 'const' end_of_word +KEYWORD_continue <- 'continue' end_of_word +KEYWORD_defer <- 'defer' end_of_word +KEYWORD_else <- 'else' end_of_word +KEYWORD_enum <- 'enum' end_of_word +KEYWORD_errdefer <- 'errdefer' end_of_word +KEYWORD_error <- 'error' end_of_word +KEYWORD_export <- 'export' end_of_word +KEYWORD_extern <- 'extern' end_of_word +KEYWORD_fn <- 'fn' end_of_word +KEYWORD_for <- 'for' end_of_word +KEYWORD_if <- 'if' end_of_word +KEYWORD_inline <- 'inline' end_of_word +KEYWORD_noalias <- 'noalias' end_of_word +KEYWORD_nosuspend <- 'nosuspend' end_of_word +KEYWORD_noinline <- 'noinline' end_of_word +KEYWORD_opaque <- 'opaque' end_of_word +KEYWORD_or <- 'or' end_of_word +KEYWORD_orelse <- 'orelse' end_of_word +KEYWORD_packed <- 'packed' end_of_word +KEYWORD_pub <- 'pub' end_of_word +KEYWORD_resume <- 'resume' end_of_word +KEYWORD_return <- 'return' end_of_word +KEYWORD_linksection <- 'linksection' end_of_word +KEYWORD_struct <- 'struct' end_of_word +KEYWORD_suspend <- 'suspend' end_of_word +KEYWORD_switch <- 'switch' end_of_word +KEYWORD_test <- 'test' end_of_word +KEYWORD_threadlocal <- 'threadlocal' end_of_word +KEYWORD_try <- 'try' end_of_word +KEYWORD_union <- 'union' end_of_word +KEYWORD_unreachable <- 'unreachable' end_of_word +KEYWORD_usingnamespace <- 'usingnamespace' end_of_word +KEYWORD_var <- 'var' end_of_word +KEYWORD_volatile <- 'volatile' end_of_word +KEYWORD_while <- 'while' end_of_word -keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe +keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else @@ -12398,11 +12412,10 @@ keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection - / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch - / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try - / KEYWORD_union / KEYWORD_unreachable + / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test + / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while -