@@ -256,9 +256,9 @@ auto to_string_view(passing_style pass) -> std::string_view {
256
256
257
257
struct expression_list_node
258
258
{
259
- source_position open_paren = {};
260
- source_position close_paren = {};
261
- bool inside_initializer = false ;
259
+ token const * open_paren = {};
260
+ token const * close_paren = {};
261
+ bool inside_initializer = false ;
262
262
263
263
struct term {
264
264
passing_style pass = {};
@@ -277,8 +277,8 @@ struct expression_list_node
277
277
auto position () const -> source_position
278
278
{
279
279
// Make sure this got set
280
- assert (open_paren != source_position () );
281
- return open_paren;
280
+ assert (open_paren);
281
+ return open_paren-> position () ;
282
282
}
283
283
284
284
auto visit (auto & v, int depth) -> void
@@ -910,8 +910,8 @@ auto compound_statement_node::visit(auto& v, int depth) -> void
910
910
911
911
struct parameter_declaration_node
912
912
{
913
- source_position pos;
914
- passing_style pass = passing_style::in;
913
+ source_position pos = {} ;
914
+ passing_style pass = passing_style::in;
915
915
916
916
enum class modifier { none=0 , implicit, virtual_, override_, final_ };
917
917
modifier mod = modifier::none;
@@ -926,14 +926,15 @@ struct parameter_declaration_node
926
926
927
927
struct parameter_declaration_list_node
928
928
{
929
- source_position pos_open_paren ;
930
- source_position pos_close_paren ;
929
+ token const * open_paren = {} ;
930
+ token const * close_paren = {} ;
931
931
932
932
std::vector<std::unique_ptr<parameter_declaration_node>> parameters;
933
933
934
934
auto position () const -> source_position
935
935
{
936
- return pos_open_paren;
936
+ assert (open_paren);
937
+ return open_paren->position ();
937
938
}
938
939
939
940
auto visit (auto & v, int depth) -> void
@@ -1507,6 +1508,7 @@ class parser
1507
1508
// G id-expression
1508
1509
// G literal
1509
1510
// G '(' expression-list ')'
1511
+ // G '{' expression-list '}'
1510
1512
// G unnamed-declaration
1511
1513
// G
1512
1514
auto primary_expression ()
@@ -1539,23 +1541,28 @@ class parser
1539
1541
return n;
1540
1542
}
1541
1543
1542
- if (curr ().type () == lexeme::LeftParen)
1544
+ if (curr ().type () == lexeme::LeftParen
1545
+ // If in the future (not now) we want to experiment with braced-expressions
1546
+ // || curr().type() == lexeme::LeftBrace
1547
+ )
1543
1548
{
1544
1549
bool inside_initializer = (peek (-1 )->type () == lexeme::Assignment);
1545
- auto open_paren = curr ().position ();
1550
+ auto open_paren = &curr ();
1551
+ auto close = close_paren_type (open_paren->type ());
1552
+ auto close_text = [&] () -> std::string { if (close == lexeme::RightParen) { return " )" ; } return " }" ; }();
1546
1553
next ();
1547
1554
auto expr_list = expression_list (open_paren, inside_initializer);
1548
1555
if (!expr_list) {
1549
1556
error (" unexpected text - ( is not followed by an expression-list" );
1550
1557
next ();
1551
1558
return {};
1552
1559
}
1553
- if (curr ().type () != lexeme::RightParen ) {
1554
- error (" unexpected text - expression-list is not terminated by ) " );
1560
+ if (curr ().type () != close_paren_type (open_paren-> type ()) ) {
1561
+ error (" unexpected text - expression-list is not terminated by " + close_text );
1555
1562
next ();
1556
1563
return {};
1557
1564
}
1558
- expr_list->close_paren = curr (). position ();
1565
+ expr_list->close_paren = & curr ();
1559
1566
next ();
1560
1567
n->expr = std::move (expr_list);
1561
1568
return n;
@@ -1656,7 +1663,7 @@ class parser
1656
1663
1657
1664
if (term.op ->type () == lexeme::LeftBracket)
1658
1665
{
1659
- term.expr_list = expression_list (term.op -> position () );
1666
+ term.expr_list = expression_list (term.op );
1660
1667
if (!term.expr_list ) {
1661
1668
error (" subscript expression [ ] must not be empty" );
1662
1669
return {};
@@ -1665,13 +1672,13 @@ class parser
1665
1672
error (" unexpected text - [ is not properly matched by ]" );
1666
1673
return {};
1667
1674
}
1668
- term.expr_list ->close_paren = curr (). position ();
1675
+ term.expr_list ->close_paren = & curr ();
1669
1676
term.op_close = &curr ();
1670
1677
next ();
1671
1678
}
1672
1679
else if (term.op ->type () == lexeme::LeftParen)
1673
1680
{
1674
- term.expr_list = expression_list (term.op -> position () );
1681
+ term.expr_list = expression_list (term.op );
1675
1682
if (!term.expr_list ) {
1676
1683
error (" ( is not followed by a valid expression list" );
1677
1684
return {};
@@ -1680,7 +1687,7 @@ class parser
1680
1687
error (" unexpected text - ( is not properly matched by )" );
1681
1688
return {};
1682
1689
}
1683
- term.expr_list ->close_paren = curr (). position ();
1690
+ term.expr_list ->close_paren = & curr ();
1684
1691
term.op_close = &curr ();
1685
1692
next ();
1686
1693
}
@@ -2008,7 +2015,7 @@ class parser
2008
2015
// G parameter-direction? expression
2009
2016
// G expression-list ',' expression
2010
2017
// G
2011
- auto expression_list (source_position open_paren, bool inside_initializer = false ) -> std::unique_ptr<expression_list_node> {
2018
+ auto expression_list (token const * open_paren, bool inside_initializer = false ) -> std::unique_ptr<expression_list_node> {
2012
2019
auto pass = passing_style::in;
2013
2020
auto n = std::make_unique<expression_list_node>();
2014
2021
n->open_paren = open_paren;
@@ -2391,7 +2398,6 @@ class parser
2391
2398
// it doesn't destabilize any regression tests
2392
2399
)
2393
2400
{
2394
- error (" expected ; at end of statement" );
2395
2401
return {};
2396
2402
}
2397
2403
if (curr ().type () == lexeme::Semicolon) {
@@ -2848,7 +2854,6 @@ class parser
2848
2854
}
2849
2855
2850
2856
else {
2851
- // next();
2852
2857
return {};
2853
2858
}
2854
2859
}
@@ -2870,6 +2875,9 @@ class parser
2870
2875
2871
2876
auto n = std::make_unique<compound_statement_node>();
2872
2877
2878
+ // Remember current position, in case this isn't a valid statement
2879
+ auto start_pos = pos;
2880
+
2873
2881
// In the case where this is a declaration initializer with
2874
2882
// = {
2875
2883
// on the same line, we want to remember our start position
@@ -2886,7 +2894,7 @@ class parser
2886
2894
while (curr ().type () != lexeme::RightBrace) {
2887
2895
auto s = statement (true );
2888
2896
if (!s) {
2889
- error ( " invalid statement in compound-statement " );
2897
+ pos = start_pos; // backtrack
2890
2898
return {};
2891
2899
}
2892
2900
n->statements .push_back ( std::move (s) );
@@ -3011,7 +3019,7 @@ class parser
3011
3019
}
3012
3020
3013
3021
auto n = std::make_unique<parameter_declaration_list_node>();
3014
- n->pos_open_paren = curr (). position ();
3022
+ n->open_paren = & curr ();
3015
3023
next ();
3016
3024
3017
3025
auto param = std::make_unique<parameter_declaration_node>();
@@ -3035,7 +3043,7 @@ class parser
3035
3043
return {};
3036
3044
}
3037
3045
3038
- n->pos_close_paren = curr (). position ();
3046
+ n->close_paren = & curr ();
3039
3047
next ();
3040
3048
return n;
3041
3049
}
0 commit comments