authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-10-12 14:21:28-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-10-12 14:21:28-04:00
log7f006287ae89b97ff0ca977f64744ea344ec94fd
tree5433857fca10e754807031651cc04fd5aa6432e7
parent5af7ae1dc45a4adafe72a91c1f849d599a6ff3eb
parent2e244c90b3277ae25c8c31d44e41be57ac85dc34
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #9878 from pfgithub/patch-4

Add line numbers to langref

3 files changed, 359 insertions(+), 315 deletions(-)

ci/azure/linux_script+1-1
......@@ -89,7 +89,7 @@ release/bin/zig build test-fmt -Denable-qemu -Denable-wasmtime
8989release/bin/zig build test-stage2 -Denable-qemu -Denable-wasmtime
9090
9191# Look for HTML errors.
92tidy -qe ../zig-cache/langref.html
92tidy --drop-empty-elements no -qe ../zig-cache/langref.html
9393
9494if [ "${BUILD_REASON}" != "PullRequest" ]; then
9595 # Produce the experimental std lib documentation.
doc/docgen.zig+71-40
......@@ -313,6 +313,7 @@ const SyntaxBlock = struct {
313313 const SourceType = enum {
314314 zig,
315315 c,
316 peg,
316317 javascript,
317318 };
318319};
......@@ -666,6 +667,8 @@ fn genToc(allocator: *Allocator, tokenizer: *Tokenizer) !Toc {
666667 source_type = SyntaxBlock.SourceType.zig;
667668 } else if (mem.eql(u8, source_type_str, "c")) {
668669 source_type = SyntaxBlock.SourceType.c;
670 } else if (mem.eql(u8, source_type_str, "peg")) {
671 source_type = SyntaxBlock.SourceType.peg;
669672 } else if (mem.eql(u8, source_type_str, "javascript")) {
670673 source_type = SyntaxBlock.SourceType.javascript;
671674 } else {
......@@ -864,6 +867,21 @@ fn isType(name: []const u8) bool {
864867 return false;
865868}
866869
870const start_line = "<span class=\"line\">";
871const end_line = "</span>";
872
873fn writeEscapedLines(out: anytype, text: []const u8) !void {
874 for (text) |char| {
875 if (char == '\n') {
876 try out.writeAll(end_line);
877 try out.writeAll("\n");
878 try out.writeAll(start_line);
879 } else {
880 try writeEscaped(out, &[_]u8{char});
881 }
882 }
883}
884
867885fn tokenizeAndPrintRaw(
868886 allocator: *Allocator,
869887 docgen_tokenizer: *Tokenizer,
......@@ -873,7 +891,8 @@ fn tokenizeAndPrintRaw(
873891) !void {
874892 const src_non_terminated = mem.trim(u8, raw_src, " \n");
875893 const src = try allocator.dupeZ(u8, src_non_terminated);
876 try out.writeAll("<code>");
894
895 try out.writeAll("<code>" ++ start_line);
877896 var tokenizer = std.zig.Tokenizer.init(src);
878897 var index: usize = 0;
879898 var next_tok_is_fn = false;
......@@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw(
888907 const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n");
889908 const comment_end = if (comment_end_off) |o| comment_start + o else token.loc.start;
890909
891 try writeEscaped(out, src[index..comment_start]);
910 try writeEscapedLines(out, src[index..comment_start]);
892911 try out.writeAll("<span class=\"tok-comment\">");
893912 try writeEscaped(out, src[comment_start..comment_end]);
894913 try out.writeAll("</span>");
......@@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw(
897916 continue;
898917 }
899918
900 try writeEscaped(out, src[index..token.loc.start]);
919 try writeEscapedLines(out, src[index..token.loc.start]);
901920 switch (token.tag) {
902921 .eof => break,
903922
......@@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw(
963982 },
964983
965984 .string_literal,
966 .multiline_string_literal_line,
967985 .char_literal,
968986 => {
969987 try out.writeAll("<span class=\"tok-str\">");
......@@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw(
971989 try out.writeAll("</span>");
972990 },
973991
992 .multiline_string_literal_line => {
993 if (src[token.loc.end - 1] == '\n') {
994 try out.writeAll("<span class=\"tok-str\">");
995 try writeEscaped(out, src[token.loc.start .. token.loc.end - 1]);
996 try out.writeAll("</span>" ++ end_line ++ "\n" ++ start_line);
997 } else {
998 try out.writeAll("<span class=\"tok-str\">");
999 try writeEscaped(out, src[token.loc.start..token.loc.end]);
1000 try out.writeAll("</span>");
1001 }
1002 },
1003
9741004 .builtin => {
9751005 try out.writeAll("<span class=\"tok-builtin\">");
9761006 try writeEscaped(out, src[token.loc.start..token.loc.end]);
......@@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw(
11031133 }
11041134 index = token.loc.end;
11051135 }
1106 try out.writeAll("</code>");
1136 try out.writeAll(end_line ++ "</code>");
11071137}
11081138
11091139fn tokenizeAndPrint(
......@@ -1126,9 +1156,9 @@ fn printSourceBlock(allocator: *Allocator, docgen_tokenizer: *Tokenizer, out: an
11261156 const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end];
11271157 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");
11281158
1129 try out.writeAll("<code>");
1130 try writeEscaped(out, trimmed_raw_source);
1131 try out.writeAll("</code>");
1159 try out.writeAll("<code>" ++ start_line);
1160 try writeEscapedLines(out, trimmed_raw_source);
1161 try out.writeAll(end_line ++ "</code>");
11321162 },
11331163 }
11341164 try out.writeAll("</pre></figure>");
......@@ -1142,15 +1172,15 @@ fn printShell(out: anytype, shell_content: []const u8) !void {
11421172 while (iter.next()) |orig_line| {
11431173 const line = mem.trimRight(u8, orig_line, " ");
11441174 if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') {
1145 try out.print("$ <kbd>{s}</kbd>\n", .{std.mem.trimLeft(u8, line[1..], " ")});
1175 try out.print(start_line ++ "$ <kbd>{s}</kbd>" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")});
11461176 } else if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] == '\\') {
1147 try out.print("$ <kbd>{s}\n", .{std.mem.trimLeft(u8, line[1..], " ")});
1177 try out.print(start_line ++ "$ <kbd>{s}" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")});
11481178 cmd_cont = true;
11491179 } else if (line.len > 0 and line[line.len - 1] != '\\' and cmd_cont) {
1150 try out.print("{s}</kbd>\n", .{line});
1180 try out.print(start_line ++ "{s}</kbd>" ++ end_line ++ "\n", .{line});
11511181 cmd_cont = false;
11521182 } else {
1153 try out.print("{s}\n", .{line});
1183 try out.print(start_line ++ "{s}" ++ end_line ++ "\n", .{line});
11541184 }
11551185 }
11561186
......@@ -1701,7 +1731,7 @@ test "shell parsed" {
17011731 \\$ zig build test.zig
17021732 ;
17031733 const expected =
1704 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1734 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
17051735 \\</samp></pre></figure>
17061736 ;
17071737
......@@ -1709,6 +1739,7 @@ test "shell parsed" {
17091739 defer buffer.deinit();
17101740
17111741 try printShell(buffer.writer(), shell_out);
1742 std.log.emerg("{s}", .{buffer.items});
17121743 try testing.expectEqualSlices(u8, expected, buffer.items);
17131744 }
17141745 {
......@@ -1717,8 +1748,8 @@ test "shell parsed" {
17171748 \\build output
17181749 ;
17191750 const expected =
1720 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1721 \\build output
1751 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1752 \\<span class="line">build output</span>
17221753 \\</samp></pre></figure>
17231754 ;
17241755
......@@ -1735,9 +1766,9 @@ test "shell parsed" {
17351766 \\$ ./test
17361767 ;
17371768 const expected =
1738 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1739 \\build output
1740 \\$ <kbd>./test</kbd>
1769 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1770 \\<span class="line">build output</span>
1771 \\<span class="line">$ <kbd>./test</kbd></span>
17411772 \\</samp></pre></figure>
17421773 ;
17431774
......@@ -1755,10 +1786,10 @@ test "shell parsed" {
17551786 \\output
17561787 ;
17571788 const expected =
1758 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1759 \\
1760 \\$ <kbd>./test</kbd>
1761 \\output
1789 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1790 \\<span class="line"></span>
1791 \\<span class="line">$ <kbd>./test</kbd></span>
1792 \\<span class="line">output</span>
17621793 \\</samp></pre></figure>
17631794 ;
17641795
......@@ -1775,9 +1806,9 @@ test "shell parsed" {
17751806 \\output
17761807 ;
17771808 const expected =
1778 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1779 \\$ <kbd>./test</kbd>
1780 \\output
1809 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1810 \\<span class="line">$ <kbd>./test</kbd></span>
1811 \\<span class="line">output</span>
17811812 \\</samp></pre></figure>
17821813 ;
17831814
......@@ -1796,11 +1827,11 @@ test "shell parsed" {
17961827 \\output
17971828 ;
17981829 const expected =
1799 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \
1800 \\ --build-option</kbd>
1801 \\build output
1802 \\$ <kbd>./test</kbd>
1803 \\output
1830 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1831 \\<span class="line"> --build-option</kbd></span>
1832 \\<span class="line">build output</span>
1833 \\<span class="line">$ <kbd>./test</kbd></span>
1834 \\<span class="line">output</span>
18041835 \\</samp></pre></figure>
18051836 ;
18061837
......@@ -1819,10 +1850,10 @@ test "shell parsed" {
18191850 \\$ ./test
18201851 ;
18211852 const expected =
1822 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \
1823 \\ --build-option1 \
1824 \\ --build-option2</kbd>
1825 \\$ <kbd>./test</kbd>
1853 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1854 \\<span class="line"> --build-option1 \</span>
1855 \\<span class="line"> --build-option2</kbd></span>
1856 \\<span class="line">$ <kbd>./test</kbd></span>
18261857 \\</samp></pre></figure>
18271858 ;
18281859
......@@ -1838,8 +1869,8 @@ test "shell parsed" {
18381869 \\$ ./test
18391870 ;
18401871 const expected =
1841 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \
1842 \\$ ./test</kbd>
1872 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1873 \\<span class="line">$ ./test</kbd></span>
18431874 \\</samp></pre></figure>
18441875 ;
18451876
......@@ -1856,9 +1887,9 @@ test "shell parsed" {
18561887 \\$1
18571888 ;
18581889 const expected =
1859 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
1860 \\$ <kbd>./test</kbd>
1861 \\$1
1890 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1891 \\<span class="line">$ <kbd>./test</kbd></span>
1892 \\<span class="line">$1</span>
18621893 \\</samp></pre></figure>
18631894 ;
18641895
......@@ -1873,7 +1904,7 @@ test "shell parsed" {
18731904 \\$zig build test.zig
18741905 ;
18751906 const expected =
1876 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$zig build test.zig
1907 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$zig build test.zig</span>
18771908 \\</samp></pre></figure>
18781909 ;
18791910
doc/langref.html.in+287-274
......@@ -170,6 +170,9 @@
170170 background: #a8b9cc;
171171 color: #000;
172172 }
173 figcaption.peg-cap {
174 background: #fcdba5;
175 }
173176 figcaption.javascript-cap {
174177 background: #365d95;
175178 color: #fff;
......@@ -196,6 +199,25 @@
196199 visibility: visible;
197200 }
198201
202 pre {
203 counter-reset: line;
204 }
205 pre .line:before {
206 counter-increment: line;
207 content: counter(line);
208 display: inline-block;
209 padding-right: 1em;
210 width: 2em;
211 text-align: right;
212 color: #999;
213 }
214 th pre code {
215 background: none;
216 }
217 th .line:before {
218 display: none;
219 }
220
199221 @media (prefers-color-scheme: dark) {
200222 body{
201223 background:#121212;
......@@ -269,6 +291,10 @@
269291 background-color: #b27306;
270292 color: #000;
271293 }
294 figcaption.peg-cap {
295 background-color: #b27306;
296 color: #000;
297 }
272298 figcaption.shell-cap {
273299 background: #2a2a2a;
274300 color: #fff;
......@@ -11844,35 +11870,35 @@ fn readU32Be() u32 {}
1184411870 {#header_close#}
1184511871
1184611872 {#header_open|Grammar#}
11847 <pre><code>Root &lt;- skip container_doc_comment? ContainerMembers eof
11873 {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof
1184811874
1184911875# *** Top level ***
11850ContainerMembers &lt;- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)
11876ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)
1185111877
1185211878ContainerDeclarations
11853 &lt;- TestDecl ContainerDeclarations
11879 <- TestDecl ContainerDeclarations
1185411880 / TopLevelComptime ContainerDeclarations
1185511881 / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations
1185611882 /
1185711883
11858TestDecl &lt;- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block
11884TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block
1185911885
11860TopLevelComptime &lt;- doc_comment? KEYWORD_comptime BlockExpr
11886TopLevelComptime <- doc_comment? KEYWORD_comptime BlockExpr
1186111887
1186211888TopLevelDecl
11863 &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
11889 <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
1186411890 / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl
1186511891 / KEYWORD_usingnamespace Expr SEMICOLON
1186611892
11867FnProto &lt;- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
11893FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
1186811894
11869VarDecl &lt;- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
11895VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
1187011896
11871ContainerField &lt;- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / TypeExpr) ByteAlign?)? (EQUAL Expr)?
11897ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / TypeExpr) ByteAlign?)? (EQUAL Expr)?
1187211898
1187311899# *** Block Level ***
1187411900Statement
11875 &lt;- KEYWORD_comptime? VarDecl
11901 <- KEYWORD_comptime? VarDecl
1187611902 / KEYWORD_comptime BlockExprStatement
1187711903 / KEYWORD_nosuspend BlockExprStatement
1187811904 / KEYWORD_suspend BlockExprStatement
......@@ -11884,50 +11910,50 @@ Statement
1188411910 / AssignExpr SEMICOLON
1188511911
1188611912IfStatement
11887 &lt;- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
11913 <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
1188811914 / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
1188911915
11890LabeledStatement &lt;- BlockLabel? (Block / LoopStatement)
11916LabeledStatement <- BlockLabel? (Block / LoopStatement)
1189111917
11892LoopStatement &lt;- KEYWORD_inline? (ForStatement / WhileStatement)
11918LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement)
1189311919
1189411920ForStatement
11895 &lt;- ForPrefix BlockExpr ( KEYWORD_else Statement )?
11921 <- ForPrefix BlockExpr ( KEYWORD_else Statement )?
1189611922 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
1189711923
1189811924WhileStatement
11899 &lt;- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
11925 <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
1190011926 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
1190111927
1190211928BlockExprStatement
11903 &lt;- BlockExpr
11929 <- BlockExpr
1190411930 / AssignExpr SEMICOLON
1190511931
11906BlockExpr &lt;- BlockLabel? Block
11932BlockExpr <- BlockLabel? Block
1190711933
1190811934# *** Expression Level ***
11909AssignExpr &lt;- Expr (AssignOp Expr)?
11935AssignExpr <- Expr (AssignOp Expr)?
1191011936
11911Expr &lt;- BoolOrExpr
11937Expr <- BoolOrExpr
1191211938
11913BoolOrExpr &lt;- BoolAndExpr (KEYWORD_or BoolAndExpr)*
11939BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)*
1191411940
11915BoolAndExpr &lt;- CompareExpr (KEYWORD_and CompareExpr)*
11941BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)*
1191611942
11917CompareExpr &lt;- BitwiseExpr (CompareOp BitwiseExpr)?
11943CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)?
1191811944
11919BitwiseExpr &lt;- BitShiftExpr (BitwiseOp BitShiftExpr)*
11945BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)*
1192011946
11921BitShiftExpr &lt;- AdditionExpr (BitShiftOp AdditionExpr)*
11947BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)*
1192211948
11923AdditionExpr &lt;- MultiplyExpr (AdditionOp MultiplyExpr)*
11949AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)*
1192411950
11925MultiplyExpr &lt;- PrefixExpr (MultiplyOp PrefixExpr)*
11951MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)*
1192611952
11927PrefixExpr &lt;- PrefixOp* PrimaryExpr
11953PrefixExpr <- PrefixOp* PrimaryExpr
1192811954
1192911955PrimaryExpr
11930 &lt;- AsmExpr
11956 <- AsmExpr
1193111957 / IfExpr
1193211958 / KEYWORD_break BreakLabel? Expr?
1193311959 / KEYWORD_comptime Expr
......@@ -11939,33 +11965,33 @@ PrimaryExpr
1193911965 / Block
1194011966 / CurlySuffixExpr
1194111967
11942IfExpr &lt;- IfPrefix Expr (KEYWORD_else Payload? Expr)?
11968IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
1194311969
11944Block &lt;- LBRACE Statement* RBRACE
11970Block <- LBRACE Statement* RBRACE
1194511971
11946LoopExpr &lt;- KEYWORD_inline? (ForExpr / WhileExpr)
11972LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr)
1194711973
11948ForExpr &lt;- ForPrefix Expr (KEYWORD_else Expr)?
11974ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
1194911975
11950WhileExpr &lt;- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
11976WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
1195111977
11952CurlySuffixExpr &lt;- TypeExpr InitList?
11978CurlySuffixExpr <- TypeExpr InitList?
1195311979
1195411980InitList
11955 &lt;- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
11981 <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
1195611982 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
1195711983 / LBRACE RBRACE
1195811984
11959TypeExpr &lt;- PrefixTypeOp* ErrorUnionExpr
11985TypeExpr <- PrefixTypeOp* ErrorUnionExpr
1196011986
11961ErrorUnionExpr &lt;- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
11987ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
1196211988
1196311989SuffixExpr
11964 &lt;- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments
11990 <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments
1196511991 / PrimaryTypeExpr (SuffixOp / FnCallArguments)*
1196611992
1196711993PrimaryTypeExpr
11968 &lt;- BUILTINIDENTIFIER FnCallArguments
11994 <- BUILTINIDENTIFIER FnCallArguments
1196911995 / CHAR_LITERAL
1197011996 / ContainerDecl
1197111997 / DOT IDENTIFIER
......@@ -11985,94 +12011,93 @@ PrimaryTypeExpr
1198512011 / STRINGLITERAL
1198612012 / SwitchExpr
1198712013
11988ContainerDecl &lt;- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
12014ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
1198912015
11990ErrorSetDecl &lt;- KEYWORD_error LBRACE IdentifierList RBRACE
12016ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE
1199112017
11992GroupedExpr &lt;- LPAREN Expr RPAREN
12018GroupedExpr <- LPAREN Expr RPAREN
1199312019
11994IfTypeExpr &lt;- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
12020IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
1199512021
1199612022LabeledTypeExpr
11997 &lt;- BlockLabel Block
12023 <- BlockLabel Block
1199812024 / BlockLabel? LoopTypeExpr
1199912025
12000LoopTypeExpr &lt;- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
12026LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
1200112027
12002ForTypeExpr &lt;- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
12028ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
1200312029
12004WhileTypeExpr &lt;- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
12030WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
1200512031
12006SwitchExpr &lt;- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
12032SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
1200712033
1200812034# *** Assembly ***
12009AsmExpr &lt;- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN
12035AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN
1201012036
12011AsmOutput &lt;- COLON AsmOutputList AsmInput?
12037AsmOutput <- COLON AsmOutputList AsmInput?
1201212038
12013AsmOutputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
12039AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
1201412040
12015AsmInput &lt;- COLON AsmInputList AsmClobbers?
12041AsmInput <- COLON AsmInputList AsmClobbers?
1201612042
12017AsmInputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
12043AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
1201812044
12019AsmClobbers &lt;- COLON StringList
12045AsmClobbers <- COLON StringList
1202012046
1202112047# *** Helper grammar ***
12022BreakLabel &lt;- COLON IDENTIFIER
12048BreakLabel <- COLON IDENTIFIER
1202312049
12024BlockLabel &lt;- IDENTIFIER COLON
12050BlockLabel <- IDENTIFIER COLON
1202512051
12026FieldInit &lt;- DOT IDENTIFIER EQUAL Expr
12052FieldInit <- DOT IDENTIFIER EQUAL Expr
1202712053
12028WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN
12054WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN
1202912055
12030LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN
12056LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN
1203112057
1203212058# Fn specific
12033CallConv &lt;- KEYWORD_callconv LPAREN Expr RPAREN
12059CallConv <- KEYWORD_callconv LPAREN Expr RPAREN
1203412060
1203512061ParamDecl
12036 &lt;- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
12062 <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
1203712063 / DOT3
1203812064
1203912065ParamType
12040 &lt;- KEYWORD_anytype
12066 <- KEYWORD_anytype
1204112067 / TypeExpr
1204212068
1204312069# Control flow prefixes
12044IfPrefix &lt;- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
12070IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
1204512071
12046WhilePrefix &lt;- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
12072WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
1204712073
12048ForPrefix &lt;- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
12074ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
1204912075
1205012076# Payloads
12051Payload &lt;- PIPE IDENTIFIER PIPE
12077Payload <- PIPE IDENTIFIER PIPE
1205212078
12053PtrPayload &lt;- PIPE ASTERISK? IDENTIFIER PIPE
12079PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
1205412080
12055PtrIndexPayload &lt;- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
12081PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
1205612082
1205712083
1205812084# Switch specific
12059SwitchProng &lt;- SwitchCase EQUALRARROW PtrPayload? AssignExpr
12085SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr
1206012086
1206112087SwitchCase
12062 &lt;- SwitchItem (COMMA SwitchItem)* COMMA?
12088 <- SwitchItem (COMMA SwitchItem)* COMMA?
1206312089 / KEYWORD_else
1206412090
12065SwitchItem &lt;- Expr (DOT3 Expr)?
12091SwitchItem <- Expr (DOT3 Expr)?
1206612092
1206712093# Operators
1206812094AssignOp
12069 &lt;- ASTERISKEQUAL
12095 <- ASTERISKEQUAL
1207012096 / SLASHEQUAL
1207112097 / PERCENTEQUAL
1207212098 / PLUSEQUAL
1207312099 / MINUSEQUAL
1207412100 / LARROW2EQUAL
12075 / LARROW2PIPEEQUAL
1207612101 / RARROW2EQUAL
1207712102 / AMPERSANDEQUAL
1207812103 / CARETEQUAL
......@@ -12083,7 +12108,7 @@ AssignOp
1208312108 / EQUAL
1208412109
1208512110CompareOp
12086 &lt;- EQUALEQUAL
12111 <- EQUALEQUAL
1208712112 / EXCLAMATIONMARKEQUAL
1208812113 / LARROW
1208912114 / RARROW
......@@ -12091,36 +12116,33 @@ CompareOp
1209112116 / RARROWEQUAL
1209212117
1209312118BitwiseOp
12094 &lt;- AMPERSAND
12119 <- AMPERSAND
1209512120 / CARET
1209612121 / PIPE
1209712122 / KEYWORD_orelse
1209812123 / KEYWORD_catch Payload?
1209912124
1210012125BitShiftOp
12101 &lt;- LARROW2
12126 <- LARROW2
1210212127 / RARROW2
1210312128
1210412129AdditionOp
12105 &lt;- PLUS
12130 <- PLUS
1210612131 / MINUS
1210712132 / PLUS2
1210812133 / PLUSPERCENT
1210912134 / MINUSPERCENT
12110 / PLUSPIPE
12111 / MINUSPIPE
1211212135
1211312136MultiplyOp
12114 &lt;- PIPE2
12137 <- PIPE2
1211512138 / ASTERISK
1211612139 / SLASH
1211712140 / PERCENT
1211812141 / ASTERISK2
1211912142 / ASTERISKPERCENT
12120 / ASTERISKPIPE
1212112143
1212212144PrefixOp
12123 &lt;- EXCLAMATIONMARK
12145 <- EXCLAMATIONMARK
1212412146 / MINUS
1212512147 / TILDE
1212612148 / MINUSPERCENT
......@@ -12129,86 +12151,86 @@ PrefixOp
1212912151 / KEYWORD_await
1213012152
1213112153PrefixTypeOp
12132 &lt;- QUESTIONMARK
12154 <- QUESTIONMARK
1213312155 / KEYWORD_anyframe MINUSRARROW
1213412156 / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1213512157 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
1213612158 / ArrayTypeStart
1213712159
1213812160SuffixOp
12139 &lt;- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET
12161 <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET
1214012162 / DOT IDENTIFIER
1214112163 / DOTASTERISK
1214212164 / DOTQUESTIONMARK
1214312165
12144FnCallArguments &lt;- LPAREN ExprList RPAREN
12166FnCallArguments <- LPAREN ExprList RPAREN
1214512167
1214612168# Ptr specific
12147SliceTypeStart &lt;- LBRACKET (COLON Expr)? RBRACKET
12169SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
1214812170
1214912171PtrTypeStart
12150 &lt;- ASTERISK
12172 <- ASTERISK
1215112173 / ASTERISK2
1215212174 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
1215312175
12154ArrayTypeStart &lt;- LBRACKET Expr (COLON Expr)? RBRACKET
12176ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
1215512177
1215612178# ContainerDecl specific
12157ContainerDeclAuto &lt;- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE
12179ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE
1215812180
1215912181ContainerDeclType
12160 &lt;- KEYWORD_struct
12182 <- KEYWORD_struct
1216112183 / KEYWORD_opaque
1216212184 / KEYWORD_enum (LPAREN Expr RPAREN)?
1216312185 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
1216412186
1216512187# Alignment
12166ByteAlign &lt;- KEYWORD_align LPAREN Expr RPAREN
12188ByteAlign <- KEYWORD_align LPAREN Expr RPAREN
1216712189
1216812190# Lists
12169IdentifierList &lt;- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)?
12191IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)?
1217012192
12171SwitchProngList &lt;- (SwitchProng COMMA)* SwitchProng?
12193SwitchProngList <- (SwitchProng COMMA)* SwitchProng?
1217212194
12173AsmOutputList &lt;- (AsmOutputItem COMMA)* AsmOutputItem?
12195AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem?
1217412196
12175AsmInputList &lt;- (AsmInputItem COMMA)* AsmInputItem?
12197AsmInputList <- (AsmInputItem COMMA)* AsmInputItem?
1217612198
12177StringList &lt;- (STRINGLITERAL COMMA)* STRINGLITERAL?
12199StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
1217812200
12179ParamDeclList &lt;- (ParamDecl COMMA)* ParamDecl?
12201ParamDeclList <- (ParamDecl COMMA)* ParamDecl?
1218012202
12181ExprList &lt;- (Expr COMMA)* Expr?
12203ExprList <- (Expr COMMA)* Expr?
1218212204
1218312205# *** Tokens ***
12184eof &lt;- !.
12185bin &lt;- [01]
12186bin_ &lt;- '_'? bin
12187oct &lt;- [0-7]
12188oct_ &lt;- '_'? oct
12189hex &lt;- [0-9a-fA-F]
12190hex_ &lt;- '_'? hex
12191dec &lt;- [0-9]
12192dec_ &lt;- '_'? dec
12193
12194bin_int &lt;- bin bin_*
12195oct_int &lt;- oct oct_*
12196dec_int &lt;- dec dec_*
12197hex_int &lt;- hex hex_*
12198
12199ox80_oxBF &lt;- [\200-\277]
12200oxF4 &lt;- '\364'
12201ox80_ox8F &lt;- [\200-\217]
12202oxF1_oxF3 &lt;- [\361-\363]
12203oxF0 &lt;- '\360'
12204ox90_0xBF &lt;- [\220-\277]
12205oxEE_oxEF &lt;- [\356-\357]
12206oxED &lt;- '\355'
12207ox80_ox9F &lt;- [\200-\237]
12208oxE1_oxEC &lt;- [\341-\354]
12209oxE0 &lt;- '\340'
12210oxA0_oxBF &lt;- [\240-\277]
12211oxC2_oxDF &lt;- [\302-\337]
12206eof <- !.
12207bin <- [01]
12208bin_ <- '_'? bin
12209oct <- [0-7]
12210oct_ <- '_'? oct
12211hex <- [0-9a-fA-F]
12212hex_ <- '_'? hex
12213dec <- [0-9]
12214dec_ <- '_'? dec
12215
12216bin_int <- bin bin_*
12217oct_int <- oct oct_*
12218dec_int <- dec dec_*
12219hex_int <- hex hex_*
12220
12221ox80_oxBF <- [\200-\277]
12222oxF4 <- '\364'
12223ox80_ox8F <- [\200-\217]
12224oxF1_oxF3 <- [\361-\363]
12225oxF0 <- '\360'
12226ox90_0xBF <- [\220-\277]
12227oxEE_oxEF <- [\356-\357]
12228oxED <- '\355'
12229ox80_ox9F <- [\200-\237]
12230oxE1_oxEC <- [\341-\354]
12231oxE0 <- '\340'
12232oxA0_oxBF <- [\240-\277]
12233oxC2_oxDF <- [\302-\337]
1221212234
1221312235# From https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/
1221412236# First Byte Second Byte Third Byte Fourth Byte
......@@ -12222,7 +12244,7 @@ oxC2_oxDF &lt;- [\302-\337]
1222212244# [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF]
1222312245# 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF]
1222412246
12225mb_utf8_literal &lt;-
12247mb_utf8_literal <-
1222612248 oxF4 ox80_ox8F ox80_oxBF ox80_oxBF
1222712249 / oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF
1222812250 / oxF0 ox90_0xBF ox80_oxBF ox80_oxBF
......@@ -12232,164 +12254,156 @@ mb_utf8_literal &lt;-
1223212254 / oxE0 oxA0_oxBF ox80_oxBF
1223312255 / oxC2_oxDF ox80_oxBF
1223412256
12235ascii_char_not_nl_slash_squote &lt;- [\000-\011\013-\046-\050-\133\135-\177]
12257ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177]
1223612258
1223712259char_escape
12238 &lt;- &quot;\\x&quot; hex hex
12239 / &quot;\\u{&quot; hex+ &quot;}&quot;
12240 / &quot;\\&quot; [nr\\t'&quot;]
12260 <- "\\x" hex hex
12261 / "\\u{" hex+ "}"
12262 / "\\" [nr\\t'"]
1224112263char_char
12242 &lt;- mb_utf8_literal
12264 <- mb_utf8_literal
1224312265 / char_escape
1224412266 / ascii_char_not_nl_slash_squote
1224512267
1224612268string_char
12247 &lt;- char_escape
12248 / [^\\&quot;\n]
12269 <- char_escape
12270 / [^\\"\n]
1224912271
12250container_doc_comment &lt;- ('//!' [^\n]* [ \n]*)+
12251doc_comment &lt;- ('///' [^\n]* [ \n]*)+
12252line_comment &lt;- '//' ![!/][^\n]* / '////' [^\n]*
12253line_string &lt;- (&quot;\\\\&quot; [^\n]* [ \n]*)+
12254skip &lt;- ([ \n] / line_comment)*
12272container_doc_comment <- ('//!' [^\n]* [ \n]*)+
12273doc_comment <- ('///' [^\n]* [ \n]*)+
12274line_comment <- '//' ![!/][^\n]* / '////' [^\n]*
12275line_string <- ("\\\\" [^\n]* [ \n]*)+
12276skip <- ([ \n] / line_comment)*
1225512277
12256CHAR_LITERAL &lt;- &quot;'&quot; char_char &quot;'&quot; skip
12278CHAR_LITERAL <- "'" char_char "'" skip
1225712279FLOAT
12258 &lt;- &quot;0x&quot; hex_int &quot;.&quot; hex_int ([pP] [-+]? dec_int)? skip
12259 / dec_int &quot;.&quot; dec_int ([eE] [-+]? dec_int)? skip
12260 / &quot;0x&quot; hex_int &quot;.&quot;? [pP] [-+]? dec_int skip
12261 / dec_int &quot;.&quot;? [eE] [-+]? dec_int skip
12280 <- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)? skip
12281 / dec_int "." dec_int ([eE] [-+]? dec_int)? skip
12282 / "0x" hex_int [pP] [-+]? dec_int skip
12283 / dec_int [eE] [-+]? dec_int skip
1226212284INTEGER
12263 &lt;- &quot;0b&quot; bin_int skip
12264 / &quot;0o&quot; oct_int skip
12265 / &quot;0x&quot; hex_int skip
12285 <- "0b" bin_int skip
12286 / "0o" oct_int skip
12287 / "0x" hex_int skip
1226612288 / dec_int skip
12267STRINGLITERALSINGLE &lt;- &quot;\&quot;&quot; string_char* &quot;\&quot;&quot; skip
12289STRINGLITERALSINGLE <- "\"" string_char* "\"" skip
1226812290STRINGLITERAL
12269 &lt;- STRINGLITERALSINGLE
12291 <- STRINGLITERALSINGLE
1227012292 / (line_string skip)+
1227112293IDENTIFIER
12272 &lt;- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
12273 / &quot;@\&quot;&quot; string_char* &quot;\&quot;&quot; skip
12274BUILTINIDENTIFIER &lt;- &quot;@&quot;[A-Za-z_][A-Za-z0-9_]* skip
12275
12276
12277AMPERSAND &lt;- '&amp;' ![=] skip
12278AMPERSANDEQUAL &lt;- '&amp;=' skip
12279ASTERISK &lt;- '*' ![*%=] skip
12280ASTERISK2 &lt;- '**' skip
12281ASTERISKEQUAL &lt;- '*=' skip
12282ASTERISKPERCENT &lt;- '*%' ![=] skip
12283ASTERISKPERCENTEQUAL &lt;- '*%=' skip
12284ASTERISKPIPE &lt;- '*|' ![=] skip
12285ASTERISKPIPEEQUAL &lt;- '*|=' skip
12286CARET &lt;- '^' ![=] skip
12287CARETEQUAL &lt;- '^=' skip
12288COLON &lt;- ':' skip
12289COMMA &lt;- ',' skip
12290DOT &lt;- '.' ![*.?] skip
12291DOT2 &lt;- '..' ![.] skip
12292DOT3 &lt;- '...' skip
12293DOTASTERISK &lt;- '.*' skip
12294DOTQUESTIONMARK &lt;- '.?' skip
12295EQUAL &lt;- '=' ![&gt;=] skip
12296EQUALEQUAL &lt;- '==' skip
12297EQUALRARROW &lt;- '=&gt;' skip
12298EXCLAMATIONMARK &lt;- '!' ![=] skip
12299EXCLAMATIONMARKEQUAL &lt;- '!=' skip
12300LARROW &lt;- '&lt;' ![&lt;=] skip
12301LARROW2 &lt;- '&lt;&lt;' ![=] skip
12302LARROW2PIPE &lt;- '&lt;&lt;|' ![=] skip
12303LARROW2PIPEEQUAL &lt;- '&lt;&lt;|=' ![=] skip
12304LARROW2EQUAL &lt;- '&lt;&lt;=' skip
12305LARROWEQUAL &lt;- '&lt;=' skip
12306LBRACE &lt;- '{' skip
12307LBRACKET &lt;- '[' skip
12308LPAREN &lt;- '(' skip
12309MINUS &lt;- '-' ![%=&gt;] skip
12310MINUSEQUAL &lt;- '-=' skip
12311MINUSPERCENT &lt;- '-%' ![=] skip
12312MINUSPERCENTEQUAL &lt;- '-%=' skip
12313MINUSPIPE &lt;- '-|' ![=] skip
12314MINUSPIPEEQUAL &lt;- '-|=' skip
12315MINUSRARROW &lt;- '-&gt;' skip
12316PERCENT &lt;- '%' ![=] skip
12317PERCENTEQUAL &lt;- '%=' skip
12318PIPE &lt;- '|' ![|=] skip
12319PIPE2 &lt;- '||' skip
12320PIPEEQUAL &lt;- '|=' skip
12321PLUS &lt;- '+' ![%+=] skip
12322PLUS2 &lt;- '++' skip
12323PLUSEQUAL &lt;- '+=' skip
12324PLUSPERCENT &lt;- '+%' ![=] skip
12325PLUSPERCENTEQUAL &lt;- '+%=' skip
12326PLUSPIPE &lt;- '+|' ![=] skip
12327PLUSPIPEEQUAL &lt;- '+|=' skip
12328LETTERC &lt;- 'c' skip
12329QUESTIONMARK &lt;- '?' skip
12330RARROW &lt;- '&gt;' ![&gt;=] skip
12331RARROW2 &lt;- '&gt;&gt;' ![=] skip
12332RARROW2EQUAL &lt;- '&gt;&gt;=' skip
12333RARROWEQUAL &lt;- '&gt;=' skip
12334RBRACE &lt;- '}' skip
12335RBRACKET &lt;- ']' skip
12336RPAREN &lt;- ')' skip
12337SEMICOLON &lt;- ';' skip
12338SLASH &lt;- '/' ![=] skip
12339SLASHEQUAL &lt;- '/=' skip
12340TILDE &lt;- '~' skip
12341
12342end_of_word &lt;- ![a-zA-Z0-9_] skip
12343KEYWORD_align &lt;- 'align' end_of_word
12344KEYWORD_allowzero &lt;- 'allowzero' end_of_word
12345KEYWORD_and &lt;- 'and' end_of_word
12346KEYWORD_anyframe &lt;- 'anyframe' end_of_word
12347KEYWORD_anytype &lt;- 'anytype' end_of_word
12348KEYWORD_asm &lt;- 'asm' end_of_word
12349KEYWORD_async &lt;- 'async' end_of_word
12350KEYWORD_await &lt;- 'await' end_of_word
12351KEYWORD_break &lt;- 'break' end_of_word
12352KEYWORD_callconv &lt;- 'callconv' end_of_word
12353KEYWORD_catch &lt;- 'catch' end_of_word
12354KEYWORD_comptime &lt;- 'comptime' end_of_word
12355KEYWORD_const &lt;- 'const' end_of_word
12356KEYWORD_continue &lt;- 'continue' end_of_word
12357KEYWORD_defer &lt;- 'defer' end_of_word
12358KEYWORD_else &lt;- 'else' end_of_word
12359KEYWORD_enum &lt;- 'enum' end_of_word
12360KEYWORD_errdefer &lt;- 'errdefer' end_of_word
12361KEYWORD_error &lt;- 'error' end_of_word
12362KEYWORD_export &lt;- 'export' end_of_word
12363KEYWORD_extern &lt;- 'extern' end_of_word
12364KEYWORD_fn &lt;- 'fn' end_of_word
12365KEYWORD_for &lt;- 'for' end_of_word
12366KEYWORD_if &lt;- 'if' end_of_word
12367KEYWORD_inline &lt;- 'inline' end_of_word
12368KEYWORD_noalias &lt;- 'noalias' end_of_word
12369KEYWORD_nosuspend &lt;- 'nosuspend' end_of_word
12370KEYWORD_noinline &lt;- 'noinline' end_of_word
12371KEYWORD_opaque &lt;- 'opaque' end_of_word
12372KEYWORD_or &lt;- 'or' end_of_word
12373KEYWORD_orelse &lt;- 'orelse' end_of_word
12374KEYWORD_packed &lt;- 'packed' end_of_word
12375KEYWORD_pub &lt;- 'pub' end_of_word
12376KEYWORD_resume &lt;- 'resume' end_of_word
12377KEYWORD_return &lt;- 'return' end_of_word
12378KEYWORD_linksection &lt;- 'linksection' end_of_word
12379KEYWORD_struct &lt;- 'struct' end_of_word
12380KEYWORD_suspend &lt;- 'suspend' end_of_word
12381KEYWORD_switch &lt;- 'switch' end_of_word
12382KEYWORD_test &lt;- 'test' end_of_word
12383KEYWORD_threadlocal &lt;- 'threadlocal' end_of_word
12384KEYWORD_try &lt;- 'try' end_of_word
12385KEYWORD_union &lt;- 'union' end_of_word
12386KEYWORD_unreachable &lt;- 'unreachable' end_of_word
12387KEYWORD_usingnamespace &lt;- 'usingnamespace' end_of_word
12388KEYWORD_var &lt;- 'var' end_of_word
12389KEYWORD_volatile &lt;- 'volatile' end_of_word
12390KEYWORD_while &lt;- 'while' end_of_word
12391
12392keyword &lt;- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
12294 <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
12295 / "@\"" string_char* "\"" skip
12296BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip
12297
12298
12299AMPERSAND <- '&' ![=] skip
12300AMPERSANDEQUAL <- '&=' skip
12301ASTERISK <- '*' ![*%=] skip
12302ASTERISK2 <- '**' skip
12303ASTERISKEQUAL <- '*=' skip
12304ASTERISKPERCENT <- '*%' ![=] skip
12305ASTERISKPERCENTEQUAL <- '*%=' skip
12306CARET <- '^' ![=] skip
12307CARETEQUAL <- '^=' skip
12308COLON <- ':' skip
12309COMMA <- ',' skip
12310DOT <- '.' ![*.?] skip
12311DOT2 <- '..' ![.] skip
12312DOT3 <- '...' skip
12313DOTASTERISK <- '.*' skip
12314DOTQUESTIONMARK <- '.?' skip
12315EQUAL <- '=' ![>=] skip
12316EQUALEQUAL <- '==' skip
12317EQUALRARROW <- '=>' skip
12318EXCLAMATIONMARK <- '!' ![=] skip
12319EXCLAMATIONMARKEQUAL <- '!=' skip
12320LARROW <- '<' ![<=] skip
12321LARROW2 <- '<<' ![=] skip
12322LARROW2EQUAL <- '<<=' skip
12323LARROWEQUAL <- '<=' skip
12324LBRACE <- '{' skip
12325LBRACKET <- '[' skip
12326LPAREN <- '(' skip
12327MINUS <- '-' ![%=>] skip
12328MINUSEQUAL <- '-=' skip
12329MINUSPERCENT <- '-%' ![=] skip
12330MINUSPERCENTEQUAL <- '-%=' skip
12331MINUSRARROW <- '->' skip
12332PERCENT <- '%' ![=] skip
12333PERCENTEQUAL <- '%=' skip
12334PIPE <- '|' ![|=] skip
12335PIPE2 <- '||' skip
12336PIPEEQUAL <- '|=' skip
12337PLUS <- '+' ![%+=] skip
12338PLUS2 <- '++' skip
12339PLUSEQUAL <- '+=' skip
12340PLUSPERCENT <- '+%' ![=] skip
12341PLUSPERCENTEQUAL <- '+%=' skip
12342LETTERC <- 'c' skip
12343QUESTIONMARK <- '?' skip
12344RARROW <- '>' ![>=] skip
12345RARROW2 <- '>>' ![=] skip
12346RARROW2EQUAL <- '>>=' skip
12347RARROWEQUAL <- '>=' skip
12348RBRACE <- '}' skip
12349RBRACKET <- ']' skip
12350RPAREN <- ')' skip
12351SEMICOLON <- ';' skip
12352SLASH <- '/' ![=] skip
12353SLASHEQUAL <- '/=' skip
12354TILDE <- '~' skip
12355
12356end_of_word <- ![a-zA-Z0-9_] skip
12357KEYWORD_align <- 'align' end_of_word
12358KEYWORD_allowzero <- 'allowzero' end_of_word
12359KEYWORD_and <- 'and' end_of_word
12360KEYWORD_anyframe <- 'anyframe' end_of_word
12361KEYWORD_anytype <- 'anytype' end_of_word
12362KEYWORD_asm <- 'asm' end_of_word
12363KEYWORD_async <- 'async' end_of_word
12364KEYWORD_await <- 'await' end_of_word
12365KEYWORD_break <- 'break' end_of_word
12366KEYWORD_callconv <- 'callconv' end_of_word
12367KEYWORD_catch <- 'catch' end_of_word
12368KEYWORD_comptime <- 'comptime' end_of_word
12369KEYWORD_const <- 'const' end_of_word
12370KEYWORD_continue <- 'continue' end_of_word
12371KEYWORD_defer <- 'defer' end_of_word
12372KEYWORD_else <- 'else' end_of_word
12373KEYWORD_enum <- 'enum' end_of_word
12374KEYWORD_errdefer <- 'errdefer' end_of_word
12375KEYWORD_error <- 'error' end_of_word
12376KEYWORD_export <- 'export' end_of_word
12377KEYWORD_extern <- 'extern' end_of_word
12378KEYWORD_fn <- 'fn' end_of_word
12379KEYWORD_for <- 'for' end_of_word
12380KEYWORD_if <- 'if' end_of_word
12381KEYWORD_inline <- 'inline' end_of_word
12382KEYWORD_noalias <- 'noalias' end_of_word
12383KEYWORD_nosuspend <- 'nosuspend' end_of_word
12384KEYWORD_noinline <- 'noinline' end_of_word
12385KEYWORD_opaque <- 'opaque' end_of_word
12386KEYWORD_or <- 'or' end_of_word
12387KEYWORD_orelse <- 'orelse' end_of_word
12388KEYWORD_packed <- 'packed' end_of_word
12389KEYWORD_pub <- 'pub' end_of_word
12390KEYWORD_resume <- 'resume' end_of_word
12391KEYWORD_return <- 'return' end_of_word
12392KEYWORD_linksection <- 'linksection' end_of_word
12393KEYWORD_struct <- 'struct' end_of_word
12394KEYWORD_suspend <- 'suspend' end_of_word
12395KEYWORD_switch <- 'switch' end_of_word
12396KEYWORD_test <- 'test' end_of_word
12397KEYWORD_threadlocal <- 'threadlocal' end_of_word
12398KEYWORD_try <- 'try' end_of_word
12399KEYWORD_union <- 'union' end_of_word
12400KEYWORD_unreachable <- 'unreachable' end_of_word
12401KEYWORD_usingnamespace <- 'usingnamespace' end_of_word
12402KEYWORD_var <- 'var' end_of_word
12403KEYWORD_volatile <- 'volatile' end_of_word
12404KEYWORD_while <- 'while' end_of_word
12405
12406keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
1239312407 / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await
1239412408 / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime
1239512409 / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else
......@@ -12398,11 +12412,10 @@ keyword &lt;- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
1239812412 / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline
1239912413 / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed
1240012414 / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
12401 / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch
12402 / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try
12403 / KEYWORD_union / KEYWORD_unreachable
12415 / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test
12416 / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable
1240412417 / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while
12405</code></pre>
12418{#end_syntax_block#}
1240612419 {#header_close#}
1240712420 {#header_open|Zen#}
1240812421 <ul>