| ... | ... | @@ -171,7 +171,7 @@ pub const Parser = struct { |
| 171 | 171 | Semicolon: &const &const ast.Node, |
| 172 | 172 | AsmOutputItems: &ArrayList(&ast.NodeAsmOutput), |
| 173 | 173 | AsmInputItems: &ArrayList(&ast.NodeAsmInput), |
| 174 | | AsmClopperItems: &ArrayList(&ast.NodeStringLiteral), |
| 174 | AsmClopperItems: &ArrayList(&ast.Node), |
| 175 | 175 | ExprListItemOrEnd: ExprListCtx, |
| 176 | 176 | ExprListCommaOrEnd: ExprListCtx, |
| 177 | 177 | FieldInitListItemOrEnd: ListSave(&ast.NodeFieldInitializer), |
| ... | ... | @@ -301,7 +301,11 @@ pub const Parser = struct { |
| 301 | 301 | Token.Id.Keyword_test => { |
| 302 | 302 | stack.append(State.TopLevel) catch unreachable; |
| 303 | 303 | |
| 304 | | const name_token = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 304 | const name_token = self.getNextToken(); |
| 305 | const name = (try self.parseStringLiteral(arena, name_token)) ?? { |
| 306 | try self.parseError(&stack, name_token, "expected string literal, found {}", @tagName(name_token.id)); |
| 307 | continue; |
| 308 | }; |
| 305 | 309 | const lbrace = (try self.expectToken(&stack, Token.Id.LBrace)) ?? continue; |
| 306 | 310 | |
| 307 | 311 | const block = try self.createNode(arena, ast.NodeBlock, |
| ... | ... | @@ -317,7 +321,7 @@ pub const Parser = struct { |
| 317 | 321 | ast.NodeTestDecl { |
| 318 | 322 | .base = undefined, |
| 319 | 323 | .test_token = token, |
| 320 | | .name = &(try self.createLiteral(arena, ast.NodeStringLiteral, name_token)).base, |
| 324 | .name = name, |
| 321 | 325 | .body_node = &block.base, |
| 322 | 326 | } |
| 323 | 327 | ); |
| ... | ... | @@ -389,15 +393,12 @@ pub const Parser = struct { |
| 389 | 393 | continue; |
| 390 | 394 | }, |
| 391 | 395 | Token.Id.Keyword_extern => { |
| 392 | | const lib_name_token = self.getNextToken(); |
| 393 | 396 | const lib_name = blk: { |
| 394 | | if (lib_name_token.id == Token.Id.StringLiteral) { |
| 395 | | const res = try self.createLiteral(arena, ast.NodeStringLiteral, lib_name_token); |
| 396 | | break :blk &res.base; |
| 397 | | } else { |
| 397 | const lib_name_token = self.getNextToken(); |
| 398 | break :blk (try self.parseStringLiteral(arena, lib_name_token)) ?? { |
| 398 | 399 | self.putBackToken(lib_name_token); |
| 399 | 400 | break :blk null; |
| 400 | | } |
| 401 | }; |
| 401 | 402 | }; |
| 402 | 403 | |
| 403 | 404 | stack.append(State { |
| ... | ... | @@ -1504,10 +1505,6 @@ pub const Parser = struct { |
| 1504 | 1505 | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeFloatLiteral, token)).base); |
| 1505 | 1506 | continue; |
| 1506 | 1507 | }, |
| 1507 | | Token.Id.StringLiteral => { |
| 1508 | | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeStringLiteral, token)).base); |
| 1509 | | continue; |
| 1510 | | }, |
| 1511 | 1508 | Token.Id.CharLiteral => { |
| 1512 | 1509 | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeCharLiteral, token)).base); |
| 1513 | 1510 | continue; |
| ... | ... | @@ -1536,24 +1533,8 @@ pub const Parser = struct { |
| 1536 | 1533 | dest_ptr.store(&(try self.createLiteral(arena, ast.NodeUnreachable, token)).base); |
| 1537 | 1534 | continue; |
| 1538 | 1535 | }, |
| 1539 | | Token.Id.MultilineStringLiteralLine => { |
| 1540 | | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeMultilineStringLiteral, |
| 1541 | | ast.NodeMultilineStringLiteral { |
| 1542 | | .base = undefined, |
| 1543 | | .tokens = ArrayList(Token).init(arena), |
| 1544 | | } |
| 1545 | | ); |
| 1546 | | try node.tokens.append(token); |
| 1547 | | while (true) { |
| 1548 | | const multiline_str = self.getNextToken(); |
| 1549 | | if (multiline_str.id != Token.Id.MultilineStringLiteralLine) { |
| 1550 | | self.putBackToken(multiline_str); |
| 1551 | | break; |
| 1552 | | } |
| 1553 | | |
| 1554 | | try node.tokens.append(multiline_str); |
| 1555 | | } |
| 1556 | | continue; |
| 1536 | Token.Id.StringLiteral, Token.Id.MultilineStringLiteralLine => { |
| 1537 | dest_ptr.store((try self.parseStringLiteral(arena, token)) ?? unreachable); |
| 1557 | 1538 | }, |
| 1558 | 1539 | Token.Id.LParen => { |
| 1559 | 1540 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeGroupedExpression, |
| ... | ... | @@ -1781,7 +1762,12 @@ pub const Parser = struct { |
| 1781 | 1762 | break :blk true; |
| 1782 | 1763 | }; |
| 1783 | 1764 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 1784 | | const template = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1765 | |
| 1766 | const template_token = self.getNextToken(); |
| 1767 | const template = (try self.parseStringLiteral(arena, template_token)) ?? { |
| 1768 | try self.parseError(&stack, template_token, "expected string literal, found {}", @tagName(template_token.id)); |
| 1769 | continue; |
| 1770 | }; |
| 1785 | 1771 | // TODO parse template |
| 1786 | 1772 | |
| 1787 | 1773 | const node = try self.createToDestNode(arena, dest_ptr, ast.NodeAsm, |
| ... | ... | @@ -1793,7 +1779,7 @@ pub const Parser = struct { |
| 1793 | 1779 | //.tokens = ArrayList(ast.NodeAsm.AsmToken).init(arena), |
| 1794 | 1780 | .outputs = ArrayList(&ast.NodeAsmOutput).init(arena), |
| 1795 | 1781 | .inputs = ArrayList(&ast.NodeAsmInput).init(arena), |
| 1796 | | .cloppers = ArrayList(&ast.NodeStringLiteral).init(arena), |
| 1782 | .cloppers = ArrayList(&ast.Node).init(arena), |
| 1797 | 1783 | .rparen = undefined, |
| 1798 | 1784 | } |
| 1799 | 1785 | ); |
| ... | ... | @@ -1881,7 +1867,12 @@ pub const Parser = struct { |
| 1881 | 1867 | |
| 1882 | 1868 | const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 1883 | 1869 | _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue; |
| 1884 | | const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1870 | |
| 1871 | const constraint_token = self.getNextToken(); |
| 1872 | const constraint = (try self.parseStringLiteral(arena, constraint_token)) ?? { |
| 1873 | try self.parseError(&stack, constraint_token, "expected string literal, found {}", @tagName(constraint_token.id)); |
| 1874 | continue; |
| 1875 | }; |
| 1885 | 1876 | |
| 1886 | 1877 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 1887 | 1878 | try stack.append(State { .ExpectToken = Token.Id.RParen }); |
| ... | ... | @@ -1890,7 +1881,7 @@ pub const Parser = struct { |
| 1890 | 1881 | ast.NodeAsmOutput { |
| 1891 | 1882 | .base = undefined, |
| 1892 | 1883 | .symbolic_name = try self.createLiteral(arena, ast.NodeIdentifier, symbolic_name), |
| 1893 | | .constraint = try self.createLiteral(arena, ast.NodeStringLiteral, constraint), |
| 1884 | .constraint = constraint, |
| 1894 | 1885 | .kind = undefined, |
| 1895 | 1886 | } |
| 1896 | 1887 | ); |
| ... | ... | @@ -1926,7 +1917,12 @@ pub const Parser = struct { |
| 1926 | 1917 | |
| 1927 | 1918 | const symbolic_name = (try self.expectToken(&stack, Token.Id.Identifier)) ?? continue; |
| 1928 | 1919 | _ = (try self.expectToken(&stack, Token.Id.RBracket)) ?? continue; |
| 1929 | | const constraint = (try self.expectToken(&stack, Token.Id.StringLiteral)) ?? continue; |
| 1920 | |
| 1921 | const constraint_token = self.getNextToken(); |
| 1922 | const constraint = (try self.parseStringLiteral(arena, constraint_token)) ?? { |
| 1923 | try self.parseError(&stack, constraint_token, "expected string literal, found {}", @tagName(constraint_token.id)); |
| 1924 | continue; |
| 1925 | }; |
| 1930 | 1926 | |
| 1931 | 1927 | _ = (try self.expectToken(&stack, Token.Id.LParen)) ?? continue; |
| 1932 | 1928 | try stack.append(State { .ExpectToken = Token.Id.RParen }); |
| ... | ... | @@ -1935,7 +1931,7 @@ pub const Parser = struct { |
| 1935 | 1931 | ast.NodeAsmInput { |
| 1936 | 1932 | .base = undefined, |
| 1937 | 1933 | .symbolic_name = try self.createLiteral(arena, ast.NodeIdentifier, symbolic_name), |
| 1938 | | .constraint = try self.createLiteral(arena, ast.NodeStringLiteral, constraint), |
| 1934 | .constraint = constraint, |
| 1939 | 1935 | .expr = undefined, |
| 1940 | 1936 | } |
| 1941 | 1937 | ); |
| ... | ... | @@ -1944,13 +1940,13 @@ pub const Parser = struct { |
| 1944 | 1940 | }, |
| 1945 | 1941 | |
| 1946 | 1942 | State.AsmClopperItems => |items| { |
| 1947 | | const string = self.getNextToken(); |
| 1948 | | if (string.id != Token.Id.StringLiteral) { |
| 1949 | | self.putBackToken(string); |
| 1943 | const string_token = self.getNextToken(); |
| 1944 | const string = (try self.parseStringLiteral(arena, string_token)) ?? { |
| 1945 | self.putBackToken(string_token); |
| 1950 | 1946 | continue; |
| 1951 | | } |
| 1947 | }; |
| 1948 | try items.append(string); |
| 1952 | 1949 | |
| 1953 | | try items.append(try self.createLiteral(arena, ast.NodeStringLiteral, string)); |
| 1954 | 1950 | stack.append(State { .AsmClopperItems = items }) catch unreachable; |
| 1955 | 1951 | try stack.append(State { .IfToken = Token.Id.Comma }); |
| 1956 | 1952 | }, |
| ... | ... | @@ -2742,6 +2738,37 @@ pub const Parser = struct { |
| 2742 | 2738 | } |
| 2743 | 2739 | } |
| 2744 | 2740 | |
| 2741 | fn parseStringLiteral(self: &Parser, arena: &mem.Allocator, token: &const Token) !?&ast.Node { |
| 2742 | switch (token.id) { |
| 2743 | Token.Id.StringLiteral => { |
| 2744 | return &(try self.createLiteral(arena, ast.NodeStringLiteral, token)).base; |
| 2745 | }, |
| 2746 | Token.Id.MultilineStringLiteralLine => { |
| 2747 | const node = try self.createNode(arena, ast.NodeMultilineStringLiteral, |
| 2748 | ast.NodeMultilineStringLiteral { |
| 2749 | .base = undefined, |
| 2750 | .tokens = ArrayList(Token).init(arena), |
| 2751 | } |
| 2752 | ); |
| 2753 | try node.tokens.append(token); |
| 2754 | while (true) { |
| 2755 | const multiline_str = self.getNextToken(); |
| 2756 | if (multiline_str.id != Token.Id.MultilineStringLiteralLine) { |
| 2757 | self.putBackToken(multiline_str); |
| 2758 | break; |
| 2759 | } |
| 2760 | |
| 2761 | try node.tokens.append(multiline_str); |
| 2762 | } |
| 2763 | |
| 2764 | return &node.base; |
| 2765 | }, |
| 2766 | // TODO: We shouldn't need a cast, but: |
| 2767 | // zig: /home/jc/Documents/zig/src/ir.cpp:7962: TypeTableEntry* ir_resolve_peer_types(IrAnalyze*, AstNode*, IrInstruction**, size_t): Assertion `err_set_type != nullptr' failed. |
| 2768 | else => return (?&ast.Node)(null), |
| 2769 | } |
| 2770 | } |
| 2771 | |
| 2745 | 2772 | fn parseBlockExpr(self: &Parser, stack: &ArrayList(State), arena: &mem.Allocator, dest_ptr: &const DestPtr, token: &const Token) !bool { |
| 2746 | 2773 | switch (token.id) { |
| 2747 | 2774 | Token.Id.Keyword_suspend => { |
| ... | ... | @@ -4085,8 +4112,6 @@ pub const Parser = struct { |
| 4085 | 4112 | try stream.write("volatile "); |
| 4086 | 4113 | } |
| 4087 | 4114 | |
| 4088 | | try stream.print("({}", self.tokenizer.getTokenSlice(asm_node.template)); |
| 4089 | | |
| 4090 | 4115 | try stack.append(RenderState { .Indent = indent }); |
| 4091 | 4116 | try stack.append(RenderState { .Text = ")" }); |
| 4092 | 4117 | { |
| ... | ... | @@ -4094,7 +4119,7 @@ pub const Parser = struct { |
| 4094 | 4119 | var i = cloppers.len; |
| 4095 | 4120 | while (i != 0) { |
| 4096 | 4121 | i -= 1; |
| 4097 | | try stack.append(RenderState { .Expression = &cloppers[i].base }); |
| 4122 | try stack.append(RenderState { .Expression = cloppers[i] }); |
| 4098 | 4123 | |
| 4099 | 4124 | if (i != 0) { |
| 4100 | 4125 | try stack.append(RenderState { .Text = ", " }); |
| ... | ... | @@ -4163,6 +4188,8 @@ pub const Parser = struct { |
| 4163 | 4188 | try stack.append(RenderState.PrintIndent); |
| 4164 | 4189 | try stack.append(RenderState { .Indent = indent + indent_delta}); |
| 4165 | 4190 | try stack.append(RenderState { .Text = "\n" }); |
| 4191 | try stack.append(RenderState { .Expression = asm_node.template }); |
| 4192 | try stack.append(RenderState { .Text = "(" }); |
| 4166 | 4193 | }, |
| 4167 | 4194 | ast.Node.Id.AsmInput => { |
| 4168 | 4195 | const asm_input = @fieldParentPtr(ast.NodeAsmInput, "base", base); |
| ... | ... | @@ -4170,7 +4197,7 @@ pub const Parser = struct { |
| 4170 | 4197 | try stack.append(RenderState { .Text = ")"}); |
| 4171 | 4198 | try stack.append(RenderState { .Expression = asm_input.expr}); |
| 4172 | 4199 | try stack.append(RenderState { .Text = " ("}); |
| 4173 | | try stack.append(RenderState { .Expression = &asm_input.constraint.base}); |
| 4200 | try stack.append(RenderState { .Expression = asm_input.constraint }); |
| 4174 | 4201 | try stack.append(RenderState { .Text = "] "}); |
| 4175 | 4202 | try stack.append(RenderState { .Expression = &asm_input.symbolic_name.base}); |
| 4176 | 4203 | try stack.append(RenderState { .Text = "["}); |
| ... | ... | @@ -4189,7 +4216,7 @@ pub const Parser = struct { |
| 4189 | 4216 | }, |
| 4190 | 4217 | } |
| 4191 | 4218 | try stack.append(RenderState { .Text = " ("}); |
| 4192 | | try stack.append(RenderState { .Expression = &asm_output.constraint.base}); |
| 4219 | try stack.append(RenderState { .Expression = asm_output.constraint }); |
| 4193 | 4220 | try stack.append(RenderState { .Text = "] "}); |
| 4194 | 4221 | try stack.append(RenderState { .Expression = &asm_output.symbolic_name.base}); |
| 4195 | 4222 | try stack.append(RenderState { .Text = "["}); |