Switch Expression to use inheritance+cast (#712)

Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
Jon Meow
2021-08-06 15:43:25 -07:00
committed by GitHub
co-authored by Geoff Romer
parent 4e0307efbc
commit dbcd6ad20d
9 changed files with 527 additions and 556 deletions
+39 -39
View File
@@ -211,71 +211,71 @@ input: declaration_list
;
expression:
identifier
{ $$ = Expression::MakeIdentifierExpression(yylineno, $1); }
{ $$ = global_arena->New<IdentifierExpression>(yylineno, $1); }
| expression designator
{ $$ = Expression::MakeFieldAccessExpression(yylineno, $1, $2); }
{ $$ = global_arena->New<FieldAccessExpression>(yylineno, $1, $2); }
| expression "[" expression "]"
{ $$ = Expression::MakeIndexExpression(yylineno, $1, $3); }
{ $$ = global_arena->New<IndexExpression>(yylineno, $1, $3); }
| integer_literal
{ $$ = Expression::MakeIntLiteral(yylineno, $1); }
{ $$ = global_arena->New<IntLiteral>(yylineno, $1); }
| TRUE
{ $$ = Expression::MakeBoolLiteral(yylineno, true); }
{ $$ = global_arena->New<BoolLiteral>(yylineno, true); }
| FALSE
{ $$ = Expression::MakeBoolLiteral(yylineno, false); }
{ $$ = global_arena->New<BoolLiteral>(yylineno, false); }
| sized_type_literal
{
int val;
CHECK(llvm::to_integer(llvm::StringRef($1).substr(1), val));
CHECK($1[0] == 'i' && val == 32) << "Only i32 is supported for now: " << $1;
$$ = Expression::MakeIntTypeLiteral(yylineno);
$$ = global_arena->New<IntTypeLiteral>(yylineno);
}
| BOOL
{ $$ = Expression::MakeBoolTypeLiteral(yylineno); }
{ $$ = global_arena->New<BoolTypeLiteral>(yylineno); }
| TYPE
{ $$ = Expression::MakeTypeTypeLiteral(yylineno); }
{ $$ = global_arena->New<TypeTypeLiteral>(yylineno); }
| CONTINUATION_TYPE
{ $$ = Expression::MakeContinuationTypeLiteral(yylineno); }
{ $$ = global_arena->New<ContinuationTypeLiteral>(yylineno); }
| paren_expression { $$ = $1; }
| expression EQUAL_EQUAL expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Eq, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Eq, std::vector<const Expression*>({$1, $3})); }
| expression "+" expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Add, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Add, std::vector<const Expression*>({$1, $3})); }
| expression "-" expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Sub, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Sub, std::vector<const Expression*>({$1, $3})); }
| expression BINARY_STAR expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Mul, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Mul, std::vector<const Expression*>({$1, $3})); }
| expression AND expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::And, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::And, std::vector<const Expression*>({$1, $3})); }
| expression OR expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Or, {$1, $3}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Or, std::vector<const Expression*>({$1, $3})); }
| NOT expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Not, {$2}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Not, std::vector<const Expression*>({$2})); }
| "-" expression %prec UNARY_MINUS
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Neg, {$2}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Neg, std::vector<const Expression*>({$2})); }
| PREFIX_STAR expression
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Deref, {$2}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Deref, std::vector<const Expression*>({$2})); }
| UNARY_STAR expression %prec PREFIX_STAR
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Deref, {$2}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Deref, std::vector<const Expression*>({$2})); }
| expression tuple
{ $$ = Expression::MakeCallExpression(yylineno, $1, $2); }
{ $$ = global_arena->New<CallExpression>(yylineno, $1, $2); }
| expression POSTFIX_STAR
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Ptr, {$1}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Ptr, std::vector<const Expression*>({$1})); }
| expression UNARY_STAR
{ $$ = Expression::MakePrimitiveOperatorExpression(
yylineno, Operator::Ptr, {$1}); }
{ $$ = global_arena->New<PrimitiveOperatorExpression>(
yylineno, Operator::Ptr, std::vector<const Expression*>({$1})); }
| FNTY tuple return_type
{ $$ = Expression::MakeFunctionTypeLiteral(
{ $$ = global_arena->New<FunctionTypeLiteral>(
yylineno, $2, $3.first, $3.second); }
;
designator: "." identifier { $$ = $2; }
@@ -454,7 +454,7 @@ optional_else:
;
return_expression:
// Empty
{ $$ = {Expression::MakeTupleLiteral(yylineno, {}), true}; }
{ $$ = {global_arena->New<TupleLiteral>(yylineno), true}; }
| expression
{ $$ = {$1, false}; }
;
@@ -470,7 +470,7 @@ block:
;
return_type:
// Empty
{ $$ = {Expression::MakeTupleLiteral(yylineno, {}), true}; }
{ $$ = {global_arena->New<TupleLiteral>(yylineno), true}; }
| ARROW expression %prec FNARROW
{ $$ = {$2, false}; }
;
@@ -544,7 +544,7 @@ alternative:
| identifier
{
$$ = std::pair<std::string, const Expression*>(
$1, Expression::MakeTupleLiteral(yylineno, {}));
$1, global_arena->New<TupleLiteral>(yylineno));
}
;
alternative_list: