|
|
@@ -134,6 +134,8 @@
|
|
|
%type <Nonnull<Expression*>> and_expression
|
|
|
%type <Nonnull<Expression*>> or_lhs
|
|
|
%type <Nonnull<Expression*>> or_expression
|
|
|
+%type <Nonnull<Expression*>> statement_expression
|
|
|
+%type <Nonnull<Expression*>> if_expression
|
|
|
%type <Nonnull<Expression*>> expression
|
|
|
%type <Nonnull<GenericBinding*>> generic_binding
|
|
|
%type <std::vector<Nonnull<AstNode*>>> deduced_params
|
|
|
@@ -216,6 +218,7 @@
|
|
|
SEMICOLON
|
|
|
SLASH
|
|
|
STRING
|
|
|
+ THEN
|
|
|
TRUE
|
|
|
TYPE
|
|
|
UNDERSCORE
|
|
|
@@ -477,12 +480,20 @@ or_expression:
|
|
|
std::vector<Nonnull<Expression*>>({$1, $3}));
|
|
|
}
|
|
|
;
|
|
|
-expression:
|
|
|
+statement_expression:
|
|
|
ref_deref_expression
|
|
|
| predicate_expression
|
|
|
| and_expression
|
|
|
| or_expression
|
|
|
;
|
|
|
+if_expression:
|
|
|
+ statement_expression
|
|
|
+| IF expression THEN if_expression ELSE if_expression
|
|
|
+ { $$ = arena->New<IfExpression>(context.source_loc(), $2, $4, $6); }
|
|
|
+;
|
|
|
+expression:
|
|
|
+ if_expression
|
|
|
+;
|
|
|
designator: PERIOD identifier { $$ = $2; }
|
|
|
;
|
|
|
paren_expression: paren_expression_base
|
|
|
@@ -645,11 +656,11 @@ clause_list:
|
|
|
}
|
|
|
;
|
|
|
statement:
|
|
|
- expression EQUAL expression SEMICOLON
|
|
|
+ statement_expression EQUAL expression SEMICOLON
|
|
|
{ $$ = arena->New<Assign>(context.source_loc(), $1, $3); }
|
|
|
| VAR pattern EQUAL expression SEMICOLON
|
|
|
{ $$ = arena->New<VariableDefinition>(context.source_loc(), $2, $4); }
|
|
|
-| expression SEMICOLON
|
|
|
+| statement_expression SEMICOLON
|
|
|
{ $$ = arena->New<ExpressionStatement>(context.source_loc(), $1); }
|
|
|
| if_statement
|
|
|
{ $$ = $1; }
|