@@ -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,16 +4112,14 @@ 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
{
4093
4118
const cloppers = asm_node .cloppers .toSliceConst ();
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,14 +4188,16 @@ 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 );
4169
4196
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 = "[" });
0 commit comments