|
|
@@ -104,6 +104,7 @@ void yy::parser::error(
|
|
|
%type <const Carbon::Expression*> return_type
|
|
|
%type <const Carbon::Expression*> paren_expression
|
|
|
%type <const Carbon::Expression*> tuple
|
|
|
+%type <const Carbon::Expression*> var_compatible_expression
|
|
|
%type <Carbon::Member*> variable_declaration
|
|
|
%type <Carbon::Member*> member
|
|
|
%type <std::list<Carbon::Member*>*> member_list
|
|
|
@@ -164,7 +165,7 @@ void yy::parser::error(
|
|
|
;
|
|
|
|
|
|
%precedence "{" "}"
|
|
|
-%precedence ":" "," DBLARROW
|
|
|
+%precedence "," DBLARROW
|
|
|
%left OR AND
|
|
|
%nonassoc EQUAL_EQUAL
|
|
|
%left "+" "-"
|
|
|
@@ -183,16 +184,34 @@ pattern:
|
|
|
{ $$ = $1; }
|
|
|
;
|
|
|
expression:
|
|
|
- identifier
|
|
|
+ var_compatible_expression
|
|
|
+ { $$ = $1; }
|
|
|
+| var_compatible_expression identifier
|
|
|
+ { $$ = Carbon::Expression::MakeVarPat(yylineno, $2, $1); }
|
|
|
+| expression EQUAL_EQUAL expression
|
|
|
+ { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Eq, $1, $3); }
|
|
|
+| expression "+" expression
|
|
|
+ { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Add, $1, $3); }
|
|
|
+| expression "-" expression
|
|
|
+ { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Sub, $1, $3); }
|
|
|
+| expression AND expression
|
|
|
+ { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::And, $1, $3); }
|
|
|
+| expression OR expression
|
|
|
+ { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Or, $1, $3); }
|
|
|
+| NOT expression
|
|
|
+ { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Not, $2); }
|
|
|
+| "-" expression %prec UNARY_MINUS
|
|
|
+ { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Neg, $2); }
|
|
|
+| FNTY tuple return_type
|
|
|
+ { $$ = Carbon::Expression::MakeFunType(yylineno, $2, $3); }
|
|
|
+;
|
|
|
+// This is the subset of `expression` which can act as the type part of a
|
|
|
+// variable declaration without creating ambiguity.
|
|
|
+var_compatible_expression:
|
|
|
+ paren_expression
|
|
|
+ { $$ = $1; }
|
|
|
+| identifier
|
|
|
{ $$ = Carbon::Expression::MakeVar(yylineno, $1); }
|
|
|
-| expression designator
|
|
|
- { $$ = Carbon::Expression::MakeGetField(yylineno, $1, $2); }
|
|
|
-| expression "[" expression "]"
|
|
|
- { $$ = Carbon::Expression::MakeIndex(yylineno, $1, $3); }
|
|
|
-| expression ":" identifier
|
|
|
- { $$ = Carbon::Expression::MakeVarPat(yylineno, $3, $1); }
|
|
|
-| integer_literal
|
|
|
- { $$ = Carbon::Expression::MakeInt(yylineno, $1); }
|
|
|
| TRUE
|
|
|
{ $$ = Carbon::Expression::MakeBool(yylineno, true); }
|
|
|
| FALSE
|
|
|
@@ -207,25 +226,14 @@ expression:
|
|
|
{ $$ = Carbon::Expression::MakeAutoType(yylineno); }
|
|
|
| CONTINUATION_TYPE
|
|
|
{ $$ = Carbon::Expression::MakeContinuationType(yylineno); }
|
|
|
-| paren_expression { $$ = $1; }
|
|
|
-| expression EQUAL_EQUAL expression
|
|
|
- { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Eq, $1, $3); }
|
|
|
-| expression "+" expression
|
|
|
- { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Add, $1, $3); }
|
|
|
-| expression "-" expression
|
|
|
- { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Sub, $1, $3); }
|
|
|
-| expression AND expression
|
|
|
- { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::And, $1, $3); }
|
|
|
-| expression OR expression
|
|
|
- { $$ = Carbon::Expression::MakeBinOp(yylineno, Carbon::Operator::Or, $1, $3); }
|
|
|
-| NOT expression
|
|
|
- { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Not, $2); }
|
|
|
-| "-" expression %prec UNARY_MINUS
|
|
|
- { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Neg, $2); }
|
|
|
+| integer_literal
|
|
|
+ { $$ = Carbon::Expression::MakeInt(yylineno, $1); }
|
|
|
+| expression designator
|
|
|
+ { $$ = Carbon::Expression::MakeGetField(yylineno, $1, $2); }
|
|
|
+| expression "[" expression "]"
|
|
|
+ { $$ = Carbon::Expression::MakeIndex(yylineno, $1, $3); }
|
|
|
| expression tuple
|
|
|
{ $$ = Carbon::Expression::MakeCall(yylineno, $1, $2); }
|
|
|
-| FNTY tuple return_type
|
|
|
- { $$ = Carbon::Expression::MakeFunType(yylineno, $2, $3); }
|
|
|
;
|
|
|
designator: "." identifier { $$ = $2; }
|
|
|
;
|
|
|
@@ -340,8 +348,8 @@ function_declaration:
|
|
|
FN identifier tuple return_type ";"
|
|
|
{ $$ = MakeFunDef(yylineno, $2, $4, $3, 0); }
|
|
|
;
|
|
|
-variable_declaration: expression ":" identifier
|
|
|
- { $$ = MakeField(yylineno, $3, $1); }
|
|
|
+variable_declaration: var_compatible_expression identifier
|
|
|
+ { $$ = MakeField(yylineno, $2, $1); }
|
|
|
;
|
|
|
member: VAR variable_declaration ";"
|
|
|
{ $$ = $2; }
|