mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 16:11:06 +01:00
Switch Expression to use inheritance+cast (#712)
Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
committed by
GitHub
co-authored by
Geoff Romer
parent
4e0307efbc
commit
dbcd6ad20d
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user