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
signaturebadge-question-mark 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...@@ -89,7 +89,7 @@ release/bin/zig build test-fmt -Denable-qemu -Denable-wasmtime
89release/bin/zig build test-stage2 -Denable-qemu -Denable-wasmtime89release/bin/zig build test-stage2 -Denable-qemu -Denable-wasmtime
9090
91# Look for HTML errors.91# Look for HTML errors.
92tidy -qe ../zig-cache/langref.html92tidy --drop-empty-elements no -qe ../zig-cache/langref.html
9393
94if [ "${BUILD_REASON}" != "PullRequest" ]; then94if [ "${BUILD_REASON}" != "PullRequest" ]; then
95 # Produce the experimental std lib documentation.95 # Produce the experimental std lib documentation.
doc/docgen.zig+71-40
...@@ -313,6 +313,7 @@ const SyntaxBlock = struct {...@@ -313,6 +313,7 @@ const SyntaxBlock = struct {
313 const SourceType = enum {313 const SourceType = enum {
314 zig,314 zig,
315 c,315 c,
316 peg,
316 javascript,317 javascript,
317 };318 };
318};319};
...@@ -666,6 +667,8 @@ fn genToc(allocator: *Allocator, tokenizer: *Tokenizer) !Toc {...@@ -666,6 +667,8 @@ fn genToc(allocator: *Allocator, tokenizer: *Tokenizer) !Toc {
666 source_type = SyntaxBlock.SourceType.zig;667 source_type = SyntaxBlock.SourceType.zig;
667 } else if (mem.eql(u8, source_type_str, "c")) {668 } else if (mem.eql(u8, source_type_str, "c")) {
668 source_type = SyntaxBlock.SourceType.c;669 source_type = SyntaxBlock.SourceType.c;
670 } else if (mem.eql(u8, source_type_str, "peg")) {
671 source_type = SyntaxBlock.SourceType.peg;
669 } else if (mem.eql(u8, source_type_str, "javascript")) {672 } else if (mem.eql(u8, source_type_str, "javascript")) {
670 source_type = SyntaxBlock.SourceType.javascript;673 source_type = SyntaxBlock.SourceType.javascript;
671 } else {674 } else {
...@@ -864,6 +867,21 @@ fn isType(name: []const u8) bool {...@@ -864,6 +867,21 @@ fn isType(name: []const u8) bool {
864 return false;867 return false;
865}868}
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
867fn tokenizeAndPrintRaw(885fn tokenizeAndPrintRaw(
868 allocator: *Allocator,886 allocator: *Allocator,
869 docgen_tokenizer: *Tokenizer,887 docgen_tokenizer: *Tokenizer,
...@@ -873,7 +891,8 @@ fn tokenizeAndPrintRaw(...@@ -873,7 +891,8 @@ fn tokenizeAndPrintRaw(
873) !void {891) !void {
874 const src_non_terminated = mem.trim(u8, raw_src, " \n");892 const src_non_terminated = mem.trim(u8, raw_src, " \n");
875 const src = try allocator.dupeZ(u8, src_non_terminated);893 const src = try allocator.dupeZ(u8, src_non_terminated);
876 try out.writeAll("<code>");894
895 try out.writeAll("<code>" ++ start_line);
877 var tokenizer = std.zig.Tokenizer.init(src);896 var tokenizer = std.zig.Tokenizer.init(src);
878 var index: usize = 0;897 var index: usize = 0;
879 var next_tok_is_fn = false;898 var next_tok_is_fn = false;
...@@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw(...@@ -888,7 +907,7 @@ fn tokenizeAndPrintRaw(
888 const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n");907 const comment_end_off = mem.indexOf(u8, src[comment_start..token.loc.start], "\n");
889 const comment_end = if (comment_end_off) |o| comment_start + o else token.loc.start;908 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]);
892 try out.writeAll("<span class=\"tok-comment\">");911 try out.writeAll("<span class=\"tok-comment\">");
893 try writeEscaped(out, src[comment_start..comment_end]);912 try writeEscaped(out, src[comment_start..comment_end]);
894 try out.writeAll("</span>");913 try out.writeAll("</span>");
...@@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw(...@@ -897,7 +916,7 @@ fn tokenizeAndPrintRaw(
897 continue;916 continue;
898 }917 }
899918
900 try writeEscaped(out, src[index..token.loc.start]);919 try writeEscapedLines(out, src[index..token.loc.start]);
901 switch (token.tag) {920 switch (token.tag) {
902 .eof => break,921 .eof => break,
903922
...@@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw(...@@ -963,7 +982,6 @@ fn tokenizeAndPrintRaw(
963 },982 },
964983
965 .string_literal,984 .string_literal,
966 .multiline_string_literal_line,
967 .char_literal,985 .char_literal,
968 => {986 => {
969 try out.writeAll("<span class=\"tok-str\">");987 try out.writeAll("<span class=\"tok-str\">");
...@@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw(...@@ -971,6 +989,18 @@ fn tokenizeAndPrintRaw(
971 try out.writeAll("</span>");989 try out.writeAll("</span>");
972 },990 },
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
974 .builtin => {1004 .builtin => {
975 try out.writeAll("<span class=\"tok-builtin\">");1005 try out.writeAll("<span class=\"tok-builtin\">");
976 try writeEscaped(out, src[token.loc.start..token.loc.end]);1006 try writeEscaped(out, src[token.loc.start..token.loc.end]);
...@@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw(...@@ -1103,7 +1133,7 @@ fn tokenizeAndPrintRaw(
1103 }1133 }
1104 index = token.loc.end;1134 index = token.loc.end;
1105 }1135 }
1106 try out.writeAll("</code>");1136 try out.writeAll(end_line ++ "</code>");
1107}1137}
11081138
1109fn tokenizeAndPrint(1139fn tokenizeAndPrint(
...@@ -1126,9 +1156,9 @@ fn printSourceBlock(allocator: *Allocator, docgen_tokenizer: *Tokenizer, out: an...@@ -1126,9 +1156,9 @@ fn printSourceBlock(allocator: *Allocator, docgen_tokenizer: *Tokenizer, out: an
1126 const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end];1156 const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end];
1127 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");1157 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");
11281158
1129 try out.writeAll("<code>");1159 try out.writeAll("<code>" ++ start_line);
1130 try writeEscaped(out, trimmed_raw_source);1160 try writeEscapedLines(out, trimmed_raw_source);
1131 try out.writeAll("</code>");1161 try out.writeAll(end_line ++ "</code>");
1132 },1162 },
1133 }1163 }
1134 try out.writeAll("</pre></figure>");1164 try out.writeAll("</pre></figure>");
...@@ -1142,15 +1172,15 @@ fn printShell(out: anytype, shell_content: []const u8) !void {...@@ -1142,15 +1172,15 @@ fn printShell(out: anytype, shell_content: []const u8) !void {
1142 while (iter.next()) |orig_line| {1172 while (iter.next()) |orig_line| {
1143 const line = mem.trimRight(u8, orig_line, " ");1173 const line = mem.trimRight(u8, orig_line, " ");
1144 if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') {1174 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..], " ")});
1146 } else if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] == '\\') {1176 } 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..], " ")});
1148 cmd_cont = true;1178 cmd_cont = true;
1149 } else if (line.len > 0 and line[line.len - 1] != '\\' and cmd_cont) {1179 } 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});
1151 cmd_cont = false;1181 cmd_cont = false;
1152 } else {1182 } else {
1153 try out.print("{s}\n", .{line});1183 try out.print(start_line ++ "{s}" ++ end_line ++ "\n", .{line});
1154 }1184 }
1155 }1185 }
11561186
...@@ -1701,7 +1731,7 @@ test "shell parsed" {...@@ -1701,7 +1731,7 @@ test "shell parsed" {
1701 \\$ zig build test.zig1731 \\$ zig build test.zig
1702 ;1732 ;
1703 const expected =1733 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>
1705 \\</samp></pre></figure>1735 \\</samp></pre></figure>
1706 ;1736 ;
17071737
...@@ -1709,6 +1739,7 @@ test "shell parsed" {...@@ -1709,6 +1739,7 @@ test "shell parsed" {
1709 defer buffer.deinit();1739 defer buffer.deinit();
17101740
1711 try printShell(buffer.writer(), shell_out);1741 try printShell(buffer.writer(), shell_out);
1742 std.log.emerg("{s}", .{buffer.items});
1712 try testing.expectEqualSlices(u8, expected, buffer.items);1743 try testing.expectEqualSlices(u8, expected, buffer.items);
1713 }1744 }
1714 {1745 {
...@@ -1717,8 +1748,8 @@ test "shell parsed" {...@@ -1717,8 +1748,8 @@ test "shell parsed" {
1717 \\build output1748 \\build output
1718 ;1749 ;
1719 const expected =1750 const expected =
1720 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>1751 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1721 \\build output1752 \\<span class="line">build output</span>
1722 \\</samp></pre></figure>1753 \\</samp></pre></figure>
1723 ;1754 ;
17241755
...@@ -1735,9 +1766,9 @@ test "shell parsed" {...@@ -1735,9 +1766,9 @@ test "shell parsed" {
1735 \\$ ./test1766 \\$ ./test
1736 ;1767 ;
1737 const expected =1768 const expected =
1738 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>1769 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1739 \\build output1770 \\<span class="line">build output</span>
1740 \\$ <kbd>./test</kbd>1771 \\<span class="line">$ <kbd>./test</kbd></span>
1741 \\</samp></pre></figure>1772 \\</samp></pre></figure>
1742 ;1773 ;
17431774
...@@ -1755,10 +1786,10 @@ test "shell parsed" {...@@ -1755,10 +1786,10 @@ test "shell parsed" {
1755 \\output1786 \\output
1756 ;1787 ;
1757 const expected =1788 const expected =
1758 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>1789 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1759 \\1790 \\<span class="line"></span>
1760 \\$ <kbd>./test</kbd>1791 \\<span class="line">$ <kbd>./test</kbd></span>
1761 \\output1792 \\<span class="line">output</span>
1762 \\</samp></pre></figure>1793 \\</samp></pre></figure>
1763 ;1794 ;
17641795
...@@ -1775,9 +1806,9 @@ test "shell parsed" {...@@ -1775,9 +1806,9 @@ test "shell parsed" {
1775 \\output1806 \\output
1776 ;1807 ;
1777 const expected =1808 const expected =
1778 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>1809 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1779 \\$ <kbd>./test</kbd>1810 \\<span class="line">$ <kbd>./test</kbd></span>
1780 \\output1811 \\<span class="line">output</span>
1781 \\</samp></pre></figure>1812 \\</samp></pre></figure>
1782 ;1813 ;
17831814
...@@ -1796,11 +1827,11 @@ test "shell parsed" {...@@ -1796,11 +1827,11 @@ test "shell parsed" {
1796 \\output1827 \\output
1797 ;1828 ;
1798 const expected =1829 const expected =
1799 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \1830 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1800 \\ --build-option</kbd>1831 \\<span class="line"> --build-option</kbd></span>
1801 \\build output1832 \\<span class="line">build output</span>
1802 \\$ <kbd>./test</kbd>1833 \\<span class="line">$ <kbd>./test</kbd></span>
1803 \\output1834 \\<span class="line">output</span>
1804 \\</samp></pre></figure>1835 \\</samp></pre></figure>
1805 ;1836 ;
18061837
...@@ -1819,10 +1850,10 @@ test "shell parsed" {...@@ -1819,10 +1850,10 @@ test "shell parsed" {
1819 \\$ ./test1850 \\$ ./test
1820 ;1851 ;
1821 const expected =1852 const expected =
1822 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \1853 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1823 \\ --build-option1 \1854 \\<span class="line"> --build-option1 \</span>
1824 \\ --build-option2</kbd>1855 \\<span class="line"> --build-option2</kbd></span>
1825 \\$ <kbd>./test</kbd>1856 \\<span class="line">$ <kbd>./test</kbd></span>
1826 \\</samp></pre></figure>1857 \\</samp></pre></figure>
1827 ;1858 ;
18281859
...@@ -1838,8 +1869,8 @@ test "shell parsed" {...@@ -1838,8 +1869,8 @@ test "shell parsed" {
1838 \\$ ./test1869 \\$ ./test
1839 ;1870 ;
1840 const expected =1871 const expected =
1841 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig \1872 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig \</span>
1842 \\$ ./test</kbd>1873 \\<span class="line">$ ./test</kbd></span>
1843 \\</samp></pre></figure>1874 \\</samp></pre></figure>
1844 ;1875 ;
18451876
...@@ -1856,9 +1887,9 @@ test "shell parsed" {...@@ -1856,9 +1887,9 @@ test "shell parsed" {
1856 \\$11887 \\$1
1857 ;1888 ;
1858 const expected =1889 const expected =
1859 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>1890 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$ <kbd>zig build test.zig</kbd></span>
1860 \\$ <kbd>./test</kbd>1891 \\<span class="line">$ <kbd>./test</kbd></span>
1861 \\$11892 \\<span class="line">$1</span>
1862 \\</samp></pre></figure>1893 \\</samp></pre></figure>
1863 ;1894 ;
18641895
...@@ -1873,7 +1904,7 @@ test "shell parsed" {...@@ -1873,7 +1904,7 @@ test "shell parsed" {
1873 \\$zig build test.zig1904 \\$zig build test.zig
1874 ;1905 ;
1875 const expected =1906 const expected =
1876 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$zig build test.zig1907 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp><span class="line">$zig build test.zig</span>
1877 \\</samp></pre></figure>1908 \\</samp></pre></figure>
1878 ;1909 ;
18791910
doc/langref.html.in+287-274
...@@ -170,6 +170,9 @@...@@ -170,6 +170,9 @@
170 background: #a8b9cc;170 background: #a8b9cc;
171 color: #000;171 color: #000;
172 }172 }
173 figcaption.peg-cap {
174 background: #fcdba5;
175 }
173 figcaption.javascript-cap {176 figcaption.javascript-cap {
174 background: #365d95;177 background: #365d95;
175 color: #fff;178 color: #fff;
...@@ -196,6 +199,25 @@...@@ -196,6 +199,25 @@
196 visibility: visible;199 visibility: visible;
197 }200 }
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
199 @media (prefers-color-scheme: dark) {221 @media (prefers-color-scheme: dark) {
200 body{222 body{
201 background:#121212;223 background:#121212;
...@@ -269,6 +291,10 @@...@@ -269,6 +291,10 @@
269 background-color: #b27306;291 background-color: #b27306;
270 color: #000;292 color: #000;
271 }293 }
294 figcaption.peg-cap {
295 background-color: #b27306;
296 color: #000;
297 }
272 figcaption.shell-cap {298 figcaption.shell-cap {
273 background: #2a2a2a;299 background: #2a2a2a;
274 color: #fff;300 color: #fff;
...@@ -11844,35 +11870,35 @@ fn readU32Be() u32 {}...@@ -11844,35 +11870,35 @@ fn readU32Be() u32 {}
11844 {#header_close#}11870 {#header_close#}
1184511871
11846 {#header_open|Grammar#}11872 {#header_open|Grammar#}
11847 <pre><code>Root &lt;- skip container_doc_comment? ContainerMembers eof11873 {#syntax_block|peg|grammar.y#}Root <- skip container_doc_comment? ContainerMembers eof
1184811874
11849# *** Top level ***11875# *** Top level ***
11850ContainerMembers &lt;- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)11876ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)
1185111877
11852ContainerDeclarations11878ContainerDeclarations
11853 &lt;- TestDecl ContainerDeclarations11879 <- TestDecl ContainerDeclarations
11854 / TopLevelComptime ContainerDeclarations11880 / TopLevelComptime ContainerDeclarations
11855 / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations11881 / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations
11856 /11882 /
1185711883
11858TestDecl &lt;- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block11884TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block
1185911885
11860TopLevelComptime &lt;- doc_comment? KEYWORD_comptime BlockExpr11886TopLevelComptime <- doc_comment? KEYWORD_comptime BlockExpr
1186111887
11862TopLevelDecl11888TopLevelDecl
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)
11864 / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl11890 / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl
11865 / KEYWORD_usingnamespace Expr SEMICOLON11891 / KEYWORD_usingnamespace Expr SEMICOLON
1186611892
11867FnProto &lt;- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr11893FnProto <- 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)? SEMICOLON11895VarDecl <- (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
11873# *** Block Level ***11899# *** Block Level ***
11874Statement11900Statement
11875 &lt;- KEYWORD_comptime? VarDecl11901 <- KEYWORD_comptime? VarDecl
11876 / KEYWORD_comptime BlockExprStatement11902 / KEYWORD_comptime BlockExprStatement
11877 / KEYWORD_nosuspend BlockExprStatement11903 / KEYWORD_nosuspend BlockExprStatement
11878 / KEYWORD_suspend BlockExprStatement11904 / KEYWORD_suspend BlockExprStatement
...@@ -11884,50 +11910,50 @@ Statement...@@ -11884,50 +11910,50 @@ Statement
11884 / AssignExpr SEMICOLON11910 / AssignExpr SEMICOLON
1188511911
11886IfStatement11912IfStatement
11887 &lt;- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?11913 <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
11888 / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )11914 / 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
11894ForStatement11920ForStatement
11895 &lt;- ForPrefix BlockExpr ( KEYWORD_else Statement )?11921 <- ForPrefix BlockExpr ( KEYWORD_else Statement )?
11896 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )11922 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
1189711923
11898WhileStatement11924WhileStatement
11899 &lt;- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?11925 <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
11900 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )11926 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
1190111927
11902BlockExprStatement11928BlockExprStatement
11903 &lt;- BlockExpr11929 <- BlockExpr
11904 / AssignExpr SEMICOLON11930 / AssignExpr SEMICOLON
1190511931
11906BlockExpr &lt;- BlockLabel? Block11932BlockExpr <- BlockLabel? Block
1190711933
11908# *** Expression Level ***11934# *** Expression Level ***
11909AssignExpr &lt;- Expr (AssignOp Expr)?11935AssignExpr <- Expr (AssignOp Expr)?
1191011936
11911Expr &lt;- BoolOrExpr11937Expr <- 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* PrimaryExpr11953PrefixExpr <- PrefixOp* PrimaryExpr
1192811954
11929PrimaryExpr11955PrimaryExpr
11930 &lt;- AsmExpr11956 <- AsmExpr
11931 / IfExpr11957 / IfExpr
11932 / KEYWORD_break BreakLabel? Expr?11958 / KEYWORD_break BreakLabel? Expr?
11933 / KEYWORD_comptime Expr11959 / KEYWORD_comptime Expr
...@@ -11939,33 +11965,33 @@ PrimaryExpr...@@ -11939,33 +11965,33 @@ PrimaryExpr
11939 / Block11965 / Block
11940 / CurlySuffixExpr11966 / CurlySuffixExpr
1194111967
11942IfExpr &lt;- IfPrefix Expr (KEYWORD_else Payload? Expr)?11968IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
1194311969
11944Block &lt;- LBRACE Statement* RBRACE11970Block <- 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
11954InitList11980InitList
11955 &lt;- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE11981 <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
11956 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE11982 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
11957 / LBRACE RBRACE11983 / LBRACE RBRACE
1195811984
11959TypeExpr &lt;- PrefixTypeOp* ErrorUnionExpr11985TypeExpr <- PrefixTypeOp* ErrorUnionExpr
1196011986
11961ErrorUnionExpr &lt;- SuffixExpr (EXCLAMATIONMARK TypeExpr)?11987ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
1196211988
11963SuffixExpr11989SuffixExpr
11964 &lt;- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments11990 <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments
11965 / PrimaryTypeExpr (SuffixOp / FnCallArguments)*11991 / PrimaryTypeExpr (SuffixOp / FnCallArguments)*
1196611992
11967PrimaryTypeExpr11993PrimaryTypeExpr
11968 &lt;- BUILTINIDENTIFIER FnCallArguments11994 <- BUILTINIDENTIFIER FnCallArguments
11969 / CHAR_LITERAL11995 / CHAR_LITERAL
11970 / ContainerDecl11996 / ContainerDecl
11971 / DOT IDENTIFIER11997 / DOT IDENTIFIER
...@@ -11985,94 +12011,93 @@ PrimaryTypeExpr...@@ -11985,94 +12011,93 @@ PrimaryTypeExpr
11985 / STRINGLITERAL12011 / STRINGLITERAL
11986 / SwitchExpr12012 / SwitchExpr
1198712013
11988ContainerDecl &lt;- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto12014ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
1198912015
11990ErrorSetDecl &lt;- KEYWORD_error LBRACE IdentifierList RBRACE12016ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE
1199112017
11992GroupedExpr &lt;- LPAREN Expr RPAREN12018GroupedExpr <- LPAREN Expr RPAREN
1199312019
11994IfTypeExpr &lt;- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?12020IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
1199512021
11996LabeledTypeExpr12022LabeledTypeExpr
11997 &lt;- BlockLabel Block12023 <- BlockLabel Block
11998 / BlockLabel? LoopTypeExpr12024 / 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 RBRACE12032SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
1200712033
12008# *** Assembly ***12034# *** Assembly ***
12009AsmExpr &lt;- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN12035AsmExpr <- 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) RPAREN12039AsmOutputItem <- 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 RPAREN12043AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
1201812044
12019AsmClobbers &lt;- COLON StringList12045AsmClobbers <- COLON StringList
1202012046
12021# *** Helper grammar ***12047# *** Helper grammar ***
12022BreakLabel &lt;- COLON IDENTIFIER12048BreakLabel <- COLON IDENTIFIER
1202312049
12024BlockLabel &lt;- IDENTIFIER COLON12050BlockLabel <- IDENTIFIER COLON
1202512051
12026FieldInit &lt;- DOT IDENTIFIER EQUAL Expr12052FieldInit <- DOT IDENTIFIER EQUAL Expr
1202712053
12028WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN12054WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN
1202912055
12030LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN12056LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN
1203112057
12032# Fn specific12058# Fn specific
12033CallConv &lt;- KEYWORD_callconv LPAREN Expr RPAREN12059CallConv <- KEYWORD_callconv LPAREN Expr RPAREN
1203412060
12035ParamDecl12061ParamDecl
12036 &lt;- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType12062 <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
12037 / DOT312063 / DOT3
1203812064
12039ParamType12065ParamType
12040 &lt;- KEYWORD_anytype12066 <- KEYWORD_anytype
12041 / TypeExpr12067 / TypeExpr
1204212068
12043# Control flow prefixes12069# 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 PtrIndexPayload12074ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
1204912075
12050# Payloads12076# Payloads
12051Payload &lt;- PIPE IDENTIFIER PIPE12077Payload <- PIPE IDENTIFIER PIPE
1205212078
12053PtrPayload &lt;- PIPE ASTERISK? IDENTIFIER PIPE12079PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
1205412080
12055PtrIndexPayload &lt;- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE12081PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
1205612082
1205712083
12058# Switch specific12084# Switch specific
12059SwitchProng &lt;- SwitchCase EQUALRARROW PtrPayload? AssignExpr12085SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr
1206012086
12061SwitchCase12087SwitchCase
12062 &lt;- SwitchItem (COMMA SwitchItem)* COMMA?12088 <- SwitchItem (COMMA SwitchItem)* COMMA?
12063 / KEYWORD_else12089 / KEYWORD_else
1206412090
12065SwitchItem &lt;- Expr (DOT3 Expr)?12091SwitchItem <- Expr (DOT3 Expr)?
1206612092
12067# Operators12093# Operators
12068AssignOp12094AssignOp
12069 &lt;- ASTERISKEQUAL12095 <- ASTERISKEQUAL
12070 / SLASHEQUAL12096 / SLASHEQUAL
12071 / PERCENTEQUAL12097 / PERCENTEQUAL
12072 / PLUSEQUAL12098 / PLUSEQUAL
12073 / MINUSEQUAL12099 / MINUSEQUAL
12074 / LARROW2EQUAL12100 / LARROW2EQUAL
12075 / LARROW2PIPEEQUAL
12076 / RARROW2EQUAL12101 / RARROW2EQUAL
12077 / AMPERSANDEQUAL12102 / AMPERSANDEQUAL
12078 / CARETEQUAL12103 / CARETEQUAL
...@@ -12083,7 +12108,7 @@ AssignOp...@@ -12083,7 +12108,7 @@ AssignOp
12083 / EQUAL12108 / EQUAL
1208412109
12085CompareOp12110CompareOp
12086 &lt;- EQUALEQUAL12111 <- EQUALEQUAL
12087 / EXCLAMATIONMARKEQUAL12112 / EXCLAMATIONMARKEQUAL
12088 / LARROW12113 / LARROW
12089 / RARROW12114 / RARROW
...@@ -12091,36 +12116,33 @@ CompareOp...@@ -12091,36 +12116,33 @@ CompareOp
12091 / RARROWEQUAL12116 / RARROWEQUAL
1209212117
12093BitwiseOp12118BitwiseOp
12094 &lt;- AMPERSAND12119 <- AMPERSAND
12095 / CARET12120 / CARET
12096 / PIPE12121 / PIPE
12097 / KEYWORD_orelse12122 / KEYWORD_orelse
12098 / KEYWORD_catch Payload?12123 / KEYWORD_catch Payload?
1209912124
12100BitShiftOp12125BitShiftOp
12101 &lt;- LARROW212126 <- LARROW2
12102 / RARROW212127 / RARROW2
1210312128
12104AdditionOp12129AdditionOp
12105 &lt;- PLUS12130 <- PLUS
12106 / MINUS12131 / MINUS
12107 / PLUS212132 / PLUS2
12108 / PLUSPERCENT12133 / PLUSPERCENT
12109 / MINUSPERCENT12134 / MINUSPERCENT
12110 / PLUSPIPE
12111 / MINUSPIPE
1211212135
12113MultiplyOp12136MultiplyOp
12114 &lt;- PIPE212137 <- PIPE2
12115 / ASTERISK12138 / ASTERISK
12116 / SLASH12139 / SLASH
12117 / PERCENT12140 / PERCENT
12118 / ASTERISK212141 / ASTERISK2
12119 / ASTERISKPERCENT12142 / ASTERISKPERCENT
12120 / ASTERISKPIPE
1212112143
12122PrefixOp12144PrefixOp
12123 &lt;- EXCLAMATIONMARK12145 <- EXCLAMATIONMARK
12124 / MINUS12146 / MINUS
12125 / TILDE12147 / TILDE
12126 / MINUSPERCENT12148 / MINUSPERCENT
...@@ -12129,86 +12151,86 @@ PrefixOp...@@ -12129,86 +12151,86 @@ PrefixOp
12129 / KEYWORD_await12151 / KEYWORD_await
1213012152
12131PrefixTypeOp12153PrefixTypeOp
12132 &lt;- QUESTIONMARK12154 <- QUESTIONMARK
12133 / KEYWORD_anyframe MINUSRARROW12155 / KEYWORD_anyframe MINUSRARROW
12134 / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*12156 / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
12135 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*12157 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
12136 / ArrayTypeStart12158 / ArrayTypeStart
1213712159
12138SuffixOp12160SuffixOp
12139 &lt;- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET12161 <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET
12140 / DOT IDENTIFIER12162 / DOT IDENTIFIER
12141 / DOTASTERISK12163 / DOTASTERISK
12142 / DOTQUESTIONMARK12164 / DOTQUESTIONMARK
1214312165
12144FnCallArguments &lt;- LPAREN ExprList RPAREN12166FnCallArguments <- LPAREN ExprList RPAREN
1214512167
12146# Ptr specific12168# Ptr specific
12147SliceTypeStart &lt;- LBRACKET (COLON Expr)? RBRACKET12169SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
1214812170
12149PtrTypeStart12171PtrTypeStart
12150 &lt;- ASTERISK12172 <- ASTERISK
12151 / ASTERISK212173 / ASTERISK2
12152 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET12174 / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
1215312175
12154ArrayTypeStart &lt;- LBRACKET Expr (COLON Expr)? RBRACKET12176ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
1215512177
12156# ContainerDecl specific12178# ContainerDecl specific
12157ContainerDeclAuto &lt;- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE12179ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE
1215812180
12159ContainerDeclType12181ContainerDeclType
12160 &lt;- KEYWORD_struct12182 <- KEYWORD_struct
12161 / KEYWORD_opaque12183 / KEYWORD_opaque
12162 / KEYWORD_enum (LPAREN Expr RPAREN)?12184 / KEYWORD_enum (LPAREN Expr RPAREN)?
12163 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?12185 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
1216412186
12165# Alignment12187# Alignment
12166ByteAlign &lt;- KEYWORD_align LPAREN Expr RPAREN12188ByteAlign <- KEYWORD_align LPAREN Expr RPAREN
1216712189
12168# Lists12190# 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
12183# *** Tokens ***12205# *** Tokens ***
12184eof &lt;- !.12206eof <- !.
12185bin &lt;- [01]12207bin <- [01]
12186bin_ &lt;- '_'? bin12208bin_ <- '_'? bin
12187oct &lt;- [0-7]12209oct <- [0-7]
12188oct_ &lt;- '_'? oct12210oct_ <- '_'? oct
12189hex &lt;- [0-9a-fA-F]12211hex <- [0-9a-fA-F]
12190hex_ &lt;- '_'? hex12212hex_ <- '_'? hex
12191dec &lt;- [0-9]12213dec <- [0-9]
12192dec_ &lt;- '_'? dec12214dec_ <- '_'? dec
1219312215
12194bin_int &lt;- bin bin_*12216bin_int <- bin bin_*
12195oct_int &lt;- oct oct_*12217oct_int <- oct oct_*
12196dec_int &lt;- dec dec_*12218dec_int <- dec dec_*
12197hex_int &lt;- hex hex_*12219hex_int <- hex hex_*
1219812220
12199ox80_oxBF &lt;- [\200-\277]12221ox80_oxBF <- [\200-\277]
12200oxF4 &lt;- '\364'12222oxF4 <- '\364'
12201ox80_ox8F &lt;- [\200-\217]12223ox80_ox8F <- [\200-\217]
12202oxF1_oxF3 &lt;- [\361-\363]12224oxF1_oxF3 <- [\361-\363]
12203oxF0 &lt;- '\360'12225oxF0 <- '\360'
12204ox90_0xBF &lt;- [\220-\277]12226ox90_0xBF <- [\220-\277]
12205oxEE_oxEF &lt;- [\356-\357]12227oxEE_oxEF <- [\356-\357]
12206oxED &lt;- '\355'12228oxED <- '\355'
12207ox80_ox9F &lt;- [\200-\237]12229ox80_ox9F <- [\200-\237]
12208oxE1_oxEC &lt;- [\341-\354]12230oxE1_oxEC <- [\341-\354]
12209oxE0 &lt;- '\340'12231oxE0 <- '\340'
12210oxA0_oxBF &lt;- [\240-\277]12232oxA0_oxBF <- [\240-\277]
12211oxC2_oxDF &lt;- [\302-\337]12233oxC2_oxDF <- [\302-\337]
1221212234
12213# From https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/12235# From https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/
12214# First Byte Second Byte Third Byte Fourth Byte12236# First Byte Second Byte Third Byte Fourth Byte
...@@ -12222,7 +12244,7 @@ oxC2_oxDF &lt;- [\302-\337]...@@ -12222,7 +12244,7 @@ oxC2_oxDF &lt;- [\302-\337]
12222# [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF]12244# [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF]
12223# 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF]12245# 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF]
1222412246
12225mb_utf8_literal &lt;-12247mb_utf8_literal <-
12226 oxF4 ox80_ox8F ox80_oxBF ox80_oxBF12248 oxF4 ox80_ox8F ox80_oxBF ox80_oxBF
12227 / oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF12249 / oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF
12228 / oxF0 ox90_0xBF ox80_oxBF ox80_oxBF12250 / oxF0 ox90_0xBF ox80_oxBF ox80_oxBF
...@@ -12232,164 +12254,156 @@ mb_utf8_literal &lt;-...@@ -12232,164 +12254,156 @@ mb_utf8_literal &lt;-
12232 / oxE0 oxA0_oxBF ox80_oxBF12254 / oxE0 oxA0_oxBF ox80_oxBF
12233 / oxC2_oxDF ox80_oxBF12255 / 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
12237char_escape12259char_escape
12238 &lt;- &quot;\\x&quot; hex hex12260 <- "\\x" hex hex
12239 / &quot;\\u{&quot; hex+ &quot;}&quot;12261 / "\\u{" hex+ "}"
12240 / &quot;\\&quot; [nr\\t'&quot;]12262 / "\\" [nr\\t'"]
12241char_char12263char_char
12242 &lt;- mb_utf8_literal12264 <- mb_utf8_literal
12243 / char_escape12265 / char_escape
12244 / ascii_char_not_nl_slash_squote12266 / ascii_char_not_nl_slash_squote
1224512267
12246string_char12268string_char
12247 &lt;- char_escape12269 <- char_escape
12248 / [^\\&quot;\n]12270 / [^\\"\n]
1224912271
12250container_doc_comment &lt;- ('//!' [^\n]* [ \n]*)+12272container_doc_comment <- ('//!' [^\n]* [ \n]*)+
12251doc_comment &lt;- ('///' [^\n]* [ \n]*)+12273doc_comment <- ('///' [^\n]* [ \n]*)+
12252line_comment &lt;- '//' ![!/][^\n]* / '////' [^\n]*12274line_comment <- '//' ![!/][^\n]* / '////' [^\n]*
12253line_string &lt;- (&quot;\\\\&quot; [^\n]* [ \n]*)+12275line_string <- ("\\\\" [^\n]* [ \n]*)+
12254skip &lt;- ([ \n] / line_comment)*12276skip <- ([ \n] / line_comment)*
1225512277
12256CHAR_LITERAL &lt;- &quot;'&quot; char_char &quot;'&quot; skip12278CHAR_LITERAL <- "'" char_char "'" skip
12257FLOAT12279FLOAT
12258 &lt;- &quot;0x&quot; hex_int &quot;.&quot; hex_int ([pP] [-+]? dec_int)? skip12280 <- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)? skip
12259 / dec_int &quot;.&quot; dec_int ([eE] [-+]? dec_int)? skip12281 / dec_int "." dec_int ([eE] [-+]? dec_int)? skip
12260 / &quot;0x&quot; hex_int &quot;.&quot;? [pP] [-+]? dec_int skip12282 / "0x" hex_int [pP] [-+]? dec_int skip
12261 / dec_int &quot;.&quot;? [eE] [-+]? dec_int skip12283 / dec_int [eE] [-+]? dec_int skip
12262INTEGER12284INTEGER
12263 &lt;- &quot;0b&quot; bin_int skip12285 <- "0b" bin_int skip
12264 / &quot;0o&quot; oct_int skip12286 / "0o" oct_int skip
12265 / &quot;0x&quot; hex_int skip12287 / "0x" hex_int skip
12266 / dec_int skip12288 / dec_int skip
12267STRINGLITERALSINGLE &lt;- &quot;\&quot;&quot; string_char* &quot;\&quot;&quot; skip12289STRINGLITERALSINGLE <- "\"" string_char* "\"" skip
12268STRINGLITERAL12290STRINGLITERAL
12269 &lt;- STRINGLITERALSINGLE12291 <- STRINGLITERALSINGLE
12270 / (line_string skip)+12292 / (line_string skip)+
12271IDENTIFIER12293IDENTIFIER
12272 &lt;- !keyword [A-Za-z_] [A-Za-z0-9_]* skip12294 <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
12273 / &quot;@\&quot;&quot; string_char* &quot;\&quot;&quot; skip12295 / "@\"" string_char* "\"" skip
12274BUILTINIDENTIFIER &lt;- &quot;@&quot;[A-Za-z_][A-Za-z0-9_]* skip12296BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip
1227512297
1227612298
12277AMPERSAND &lt;- '&amp;' ![=] skip12299AMPERSAND <- '&' ![=] skip
12278AMPERSANDEQUAL &lt;- '&amp;=' skip12300AMPERSANDEQUAL <- '&=' skip
12279ASTERISK &lt;- '*' ![*%=] skip12301ASTERISK <- '*' ![*%=] skip
12280ASTERISK2 &lt;- '**' skip12302ASTERISK2 <- '**' skip
12281ASTERISKEQUAL &lt;- '*=' skip12303ASTERISKEQUAL <- '*=' skip
12282ASTERISKPERCENT &lt;- '*%' ![=] skip12304ASTERISKPERCENT <- '*%' ![=] skip
12283ASTERISKPERCENTEQUAL &lt;- '*%=' skip12305ASTERISKPERCENTEQUAL <- '*%=' skip
12284ASTERISKPIPE &lt;- '*|' ![=] skip12306CARET <- '^' ![=] skip
12285ASTERISKPIPEEQUAL &lt;- '*|=' skip12307CARETEQUAL <- '^=' skip
12286CARET &lt;- '^' ![=] skip12308COLON <- ':' skip
12287CARETEQUAL &lt;- '^=' skip12309COMMA <- ',' skip
12288COLON &lt;- ':' skip12310DOT <- '.' ![*.?] skip
12289COMMA &lt;- ',' skip12311DOT2 <- '..' ![.] skip
12290DOT &lt;- '.' ![*.?] skip12312DOT3 <- '...' skip
12291DOT2 &lt;- '..' ![.] skip12313DOTASTERISK <- '.*' skip
12292DOT3 &lt;- '...' skip12314DOTQUESTIONMARK <- '.?' skip
12293DOTASTERISK &lt;- '.*' skip12315EQUAL <- '=' ![>=] skip
12294DOTQUESTIONMARK &lt;- '.?' skip12316EQUALEQUAL <- '==' skip
12295EQUAL &lt;- '=' ![&gt;=] skip12317EQUALRARROW <- '=>' skip
12296EQUALEQUAL &lt;- '==' skip12318EXCLAMATIONMARK <- '!' ![=] skip
12297EQUALRARROW &lt;- '=&gt;' skip12319EXCLAMATIONMARKEQUAL <- '!=' skip
12298EXCLAMATIONMARK &lt;- '!' ![=] skip12320LARROW <- '<' ![<=] skip
12299EXCLAMATIONMARKEQUAL &lt;- '!=' skip12321LARROW2 <- '<<' ![=] skip
12300LARROW &lt;- '&lt;' ![&lt;=] skip12322LARROW2EQUAL <- '<<=' skip
12301LARROW2 &lt;- '&lt;&lt;' ![=] skip12323LARROWEQUAL <- '<=' skip
12302LARROW2PIPE &lt;- '&lt;&lt;|' ![=] skip12324LBRACE <- '{' skip
12303LARROW2PIPEEQUAL &lt;- '&lt;&lt;|=' ![=] skip12325LBRACKET <- '[' skip
12304LARROW2EQUAL &lt;- '&lt;&lt;=' skip12326LPAREN <- '(' skip
12305LARROWEQUAL &lt;- '&lt;=' skip12327MINUS <- '-' ![%=>] skip
12306LBRACE &lt;- '{' skip12328MINUSEQUAL <- '-=' skip
12307LBRACKET &lt;- '[' skip12329MINUSPERCENT <- '-%' ![=] skip
12308LPAREN &lt;- '(' skip12330MINUSPERCENTEQUAL <- '-%=' skip
12309MINUS &lt;- '-' ![%=&gt;] skip12331MINUSRARROW <- '->' skip
12310MINUSEQUAL &lt;- '-=' skip12332PERCENT <- '%' ![=] skip
12311MINUSPERCENT &lt;- '-%' ![=] skip12333PERCENTEQUAL <- '%=' skip
12312MINUSPERCENTEQUAL &lt;- '-%=' skip12334PIPE <- '|' ![|=] skip
12313MINUSPIPE &lt;- '-|' ![=] skip12335PIPE2 <- '||' skip
12314MINUSPIPEEQUAL &lt;- '-|=' skip12336PIPEEQUAL <- '|=' skip
12315MINUSRARROW &lt;- '-&gt;' skip12337PLUS <- '+' ![%+=] skip
12316PERCENT &lt;- '%' ![=] skip12338PLUS2 <- '++' skip
12317PERCENTEQUAL &lt;- '%=' skip12339PLUSEQUAL <- '+=' skip
12318PIPE &lt;- '|' ![|=] skip12340PLUSPERCENT <- '+%' ![=] skip
12319PIPE2 &lt;- '||' skip12341PLUSPERCENTEQUAL <- '+%=' skip
12320PIPEEQUAL &lt;- '|=' skip12342LETTERC <- 'c' skip
12321PLUS &lt;- '+' ![%+=] skip12343QUESTIONMARK <- '?' skip
12322PLUS2 &lt;- '++' skip12344RARROW <- '>' ![>=] skip
12323PLUSEQUAL &lt;- '+=' skip12345RARROW2 <- '>>' ![=] skip
12324PLUSPERCENT &lt;- '+%' ![=] skip12346RARROW2EQUAL <- '>>=' skip
12325PLUSPERCENTEQUAL &lt;- '+%=' skip12347RARROWEQUAL <- '>=' skip
12326PLUSPIPE &lt;- '+|' ![=] skip12348RBRACE <- '}' skip
12327PLUSPIPEEQUAL &lt;- '+|=' skip12349RBRACKET <- ']' skip
12328LETTERC &lt;- 'c' skip12350RPAREN <- ')' skip
12329QUESTIONMARK &lt;- '?' skip12351SEMICOLON <- ';' skip
12330RARROW &lt;- '&gt;' ![&gt;=] skip12352SLASH <- '/' ![=] skip
12331RARROW2 &lt;- '&gt;&gt;' ![=] skip12353SLASHEQUAL <- '/=' skip
12332RARROW2EQUAL &lt;- '&gt;&gt;=' skip12354TILDE <- '~' skip
12333RARROWEQUAL &lt;- '&gt;=' skip12355
12334RBRACE &lt;- '}' skip12356end_of_word <- ![a-zA-Z0-9_] skip
12335RBRACKET &lt;- ']' skip12357KEYWORD_align <- 'align' end_of_word
12336RPAREN &lt;- ')' skip12358KEYWORD_allowzero <- 'allowzero' end_of_word
12337SEMICOLON &lt;- ';' skip12359KEYWORD_and <- 'and' end_of_word
12338SLASH &lt;- '/' ![=] skip12360KEYWORD_anyframe <- 'anyframe' end_of_word
12339SLASHEQUAL &lt;- '/=' skip12361KEYWORD_anytype <- 'anytype' end_of_word
12340TILDE &lt;- '~' skip12362KEYWORD_asm <- 'asm' end_of_word
1234112363KEYWORD_async <- 'async' end_of_word
12342end_of_word &lt;- ![a-zA-Z0-9_] skip12364KEYWORD_await <- 'await' end_of_word
12343KEYWORD_align &lt;- 'align' end_of_word12365KEYWORD_break <- 'break' end_of_word
12344KEYWORD_allowzero &lt;- 'allowzero' end_of_word12366KEYWORD_callconv <- 'callconv' end_of_word
12345KEYWORD_and &lt;- 'and' end_of_word12367KEYWORD_catch <- 'catch' end_of_word
12346KEYWORD_anyframe &lt;- 'anyframe' end_of_word12368KEYWORD_comptime <- 'comptime' end_of_word
12347KEYWORD_anytype &lt;- 'anytype' end_of_word12369KEYWORD_const <- 'const' end_of_word
12348KEYWORD_asm &lt;- 'asm' end_of_word12370KEYWORD_continue <- 'continue' end_of_word
12349KEYWORD_async &lt;- 'async' end_of_word12371KEYWORD_defer <- 'defer' end_of_word
12350KEYWORD_await &lt;- 'await' end_of_word12372KEYWORD_else <- 'else' end_of_word
12351KEYWORD_break &lt;- 'break' end_of_word12373KEYWORD_enum <- 'enum' end_of_word
12352KEYWORD_callconv &lt;- 'callconv' end_of_word12374KEYWORD_errdefer <- 'errdefer' end_of_word
12353KEYWORD_catch &lt;- 'catch' end_of_word12375KEYWORD_error <- 'error' end_of_word
12354KEYWORD_comptime &lt;- 'comptime' end_of_word12376KEYWORD_export <- 'export' end_of_word
12355KEYWORD_const &lt;- 'const' end_of_word12377KEYWORD_extern <- 'extern' end_of_word
12356KEYWORD_continue &lt;- 'continue' end_of_word12378KEYWORD_fn <- 'fn' end_of_word
12357KEYWORD_defer &lt;- 'defer' end_of_word12379KEYWORD_for <- 'for' end_of_word
12358KEYWORD_else &lt;- 'else' end_of_word12380KEYWORD_if <- 'if' end_of_word
12359KEYWORD_enum &lt;- 'enum' end_of_word12381KEYWORD_inline <- 'inline' end_of_word
12360KEYWORD_errdefer &lt;- 'errdefer' end_of_word12382KEYWORD_noalias <- 'noalias' end_of_word
12361KEYWORD_error &lt;- 'error' end_of_word12383KEYWORD_nosuspend <- 'nosuspend' end_of_word
12362KEYWORD_export &lt;- 'export' end_of_word12384KEYWORD_noinline <- 'noinline' end_of_word
12363KEYWORD_extern &lt;- 'extern' end_of_word12385KEYWORD_opaque <- 'opaque' end_of_word
12364KEYWORD_fn &lt;- 'fn' end_of_word12386KEYWORD_or <- 'or' end_of_word
12365KEYWORD_for &lt;- 'for' end_of_word12387KEYWORD_orelse <- 'orelse' end_of_word
12366KEYWORD_if &lt;- 'if' end_of_word12388KEYWORD_packed <- 'packed' end_of_word
12367KEYWORD_inline &lt;- 'inline' end_of_word12389KEYWORD_pub <- 'pub' end_of_word
12368KEYWORD_noalias &lt;- 'noalias' end_of_word12390KEYWORD_resume <- 'resume' end_of_word
12369KEYWORD_nosuspend &lt;- 'nosuspend' end_of_word12391KEYWORD_return <- 'return' end_of_word
12370KEYWORD_noinline &lt;- 'noinline' end_of_word12392KEYWORD_linksection <- 'linksection' end_of_word
12371KEYWORD_opaque &lt;- 'opaque' end_of_word12393KEYWORD_struct <- 'struct' end_of_word
12372KEYWORD_or &lt;- 'or' end_of_word12394KEYWORD_suspend <- 'suspend' end_of_word
12373KEYWORD_orelse &lt;- 'orelse' end_of_word12395KEYWORD_switch <- 'switch' end_of_word
12374KEYWORD_packed &lt;- 'packed' end_of_word12396KEYWORD_test <- 'test' end_of_word
12375KEYWORD_pub &lt;- 'pub' end_of_word12397KEYWORD_threadlocal <- 'threadlocal' end_of_word
12376KEYWORD_resume &lt;- 'resume' end_of_word12398KEYWORD_try <- 'try' end_of_word
12377KEYWORD_return &lt;- 'return' end_of_word12399KEYWORD_union <- 'union' end_of_word
12378KEYWORD_linksection &lt;- 'linksection' end_of_word12400KEYWORD_unreachable <- 'unreachable' end_of_word
12379KEYWORD_struct &lt;- 'struct' end_of_word12401KEYWORD_usingnamespace <- 'usingnamespace' end_of_word
12380KEYWORD_suspend &lt;- 'suspend' end_of_word12402KEYWORD_var <- 'var' end_of_word
12381KEYWORD_switch &lt;- 'switch' end_of_word12403KEYWORD_volatile <- 'volatile' end_of_word
12382KEYWORD_test &lt;- 'test' end_of_word12404KEYWORD_while <- 'while' end_of_word
12383KEYWORD_threadlocal &lt;- 'threadlocal' end_of_word12405
12384KEYWORD_try &lt;- 'try' end_of_word12406keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
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
12393 / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await12407 / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await
12394 / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime12408 / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime
12395 / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else12409 / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else
...@@ -12398,11 +12412,10 @@ keyword &lt;- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe...@@ -12398,11 +12412,10 @@ keyword &lt;- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
12398 / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline12412 / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline
12399 / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed12413 / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed
12400 / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection12414 / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
12401 / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch12415 / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test
12402 / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try12416 / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable
12403 / KEYWORD_union / KEYWORD_unreachable
12404 / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while12417 / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while
12405</code></pre>12418{#end_syntax_block#}
12406 {#header_close#}12419 {#header_close#}
12407 {#header_open|Zen#}12420 {#header_open|Zen#}
12408 <ul>12421 <ul>