]> git.lizzy.rs Git - rust.git/commitdiff
Bison grammar: add qualified path expressions
authorBrian Leibig <brian@brianleibig.com>
Wed, 11 Feb 2015 00:10:05 +0000 (16:10 -0800)
committerBrian Leibig <brian@brianleibig.com>
Wed, 11 Feb 2015 01:59:01 +0000 (17:59 -0800)
src/grammar/parser-lalr.y

index 2e83e8bccd53675f538c0f72725bf61f70754d63..26168f6f5cbd9553fc61f3a82b27e993faf55b93 100644 (file)
@@ -1309,6 +1309,7 @@ nonblock_expr
 | nonblock_expr AS ty                                           { $$ = mk_node("ExprCast", 2, $1, $3); }
 | BOX nonparen_expr                                             { $$ = mk_node("ExprBox", 1, $2); }
 | %prec BOXPLACE BOX '(' maybe_expr ')' nonblock_expr           { $$ = mk_node("ExprBox", 2, $3, $5); }
+| expr_qualified_path
 | nonblock_prefix_expr
 ;
 
@@ -1367,6 +1368,7 @@ expr
 | expr AS ty                                          { $$ = mk_node("ExprCast", 2, $1, $3); }
 | BOX nonparen_expr                                   { $$ = mk_node("ExprBox", 1, $2); }
 | %prec BOXPLACE BOX '(' maybe_expr ')' expr          { $$ = mk_node("ExprBox", 2, $3, $5); }
+| expr_qualified_path
 | block_expr
 | block
 | nonblock_prefix_expr
@@ -1426,6 +1428,7 @@ nonparen_expr
 | nonparen_expr AS ty                                 { $$ = mk_node("ExprCast", 2, $1, $3); }
 | BOX nonparen_expr                                   { $$ = mk_node("ExprBox", 1, $2); }
 | %prec BOXPLACE BOX '(' maybe_expr ')' expr          { $$ = mk_node("ExprBox", 1, $3, $5); }
+| expr_qualified_path
 | block_expr
 | block
 | nonblock_prefix_expr
@@ -1485,6 +1488,7 @@ expr_nostruct
 | expr_nostruct AS ty                                 { $$ = mk_node("ExprCast", 2, $1, $3); }
 | BOX nonparen_expr                                   { $$ = mk_node("ExprBox", 1, $2); }
 | %prec BOXPLACE BOX '(' maybe_expr ')' expr_nostruct { $$ = mk_node("ExprBox", 1, $3, $5); }
+| expr_qualified_path
 | block_expr
 | block
 | nonblock_prefix_expr_nostruct
@@ -1512,6 +1516,33 @@ nonblock_prefix_expr
 | proc_expr
 ;
 
+expr_qualified_path
+: '<' ty_sum AS trait_ref '>' MOD_SEP ident
+{
+  $$ = mk_node("ExprQualifiedPath", 3, $2, $4, $7);
+}
+| '<' ty_sum AS trait_ref '>' MOD_SEP ident generic_args
+{
+  $$ = mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8);
+}
+| SHL ty_sum AS trait_ref '>' MOD_SEP ident AS trait_ref '>' MOD_SEP ident
+{
+  $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 3, $2, $4, $7), $9, $12);
+}
+| SHL ty_sum AS trait_ref '>' MOD_SEP ident generic_args AS trait_ref '>' MOD_SEP ident
+{
+  $$ = mk_node("ExprQualifiedPath", 3, mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8), $10, $13);
+}
+| SHL ty_sum AS trait_ref '>' MOD_SEP ident AS trait_ref '>' MOD_SEP ident generic_args
+{
+  $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 3, $2, $4, $7), $9, $12, $13);
+}
+| SHL ty_sum AS trait_ref '>' MOD_SEP ident generic_args AS trait_ref '>' MOD_SEP ident generic_args
+{
+  $$ = mk_node("ExprQualifiedPath", 4, mk_node("ExprQualifiedPath", 4, $2, $4, $7, $8), $10, $13, $14);
+}
+
+
 lambda_expr
 : %prec LAMBDA
   OROR ret_ty expr                                        { $$ = mk_node("ExprFnBlock", 3, mk_none(), $2, $3); }