mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Generic functions, first baby step (#658)
* generic functions: progress on parser and AST * finished first baby step * revisions based on reviews * Update executable_semantics/interpreter/interpreter.cpp Co-authored-by: Jon Meow <46229924+jonmeow@users.noreply.github.com> * Symbol => VariableType Co-authored-by: Jon Meow <46229924+jonmeow@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
co-authored by
Jon Meow
parent
cc56afb79e
commit
864b3bde02
@@ -70,6 +70,7 @@ genrule(
|
||||
],
|
||||
cmd = "M4=$(M4) $(BISON) " +
|
||||
"--output=$(location parser.cpp) " +
|
||||
"--report=state " +
|
||||
"--defines=$(location parser.h) " +
|
||||
"$(location parser.ypp)",
|
||||
toolchains = [
|
||||
|
||||
@@ -135,6 +135,7 @@ operand_start [(A-Za-z0-9_"]
|
||||
"." return yy::parser::make_PERIOD(context.current_token_position);
|
||||
"," return yy::parser::make_COMMA(context.current_token_position);
|
||||
";" return yy::parser::make_SEMICOLON(context.current_token_position);
|
||||
":!" return yy::parser::make_COLON_BANG(context.current_token_position);
|
||||
":" return yy::parser::make_COLON(context.current_token_position);
|
||||
|
||||
/*
|
||||
|
||||
@@ -98,6 +98,9 @@ void yy::parser::error(const location_type&, const std::string& message) {
|
||||
%type <const Carbon::Statement*> optional_else
|
||||
%type <const Carbon::Statement*> statement_list
|
||||
%type <const Carbon::Expression*> expression
|
||||
%type <Carbon::GenericBinding> generic_binding
|
||||
%type <std::vector<Carbon::GenericBinding>> deduced_params
|
||||
%type <std::vector<Carbon::GenericBinding>> deduced_param_list
|
||||
%type <const Carbon::Expression*> pattern
|
||||
%type <const Carbon::Expression*> return_type
|
||||
%type <const Carbon::Expression*> paren_expression
|
||||
@@ -167,12 +170,13 @@ void yy::parser::error(const location_type&, const std::string& message) {
|
||||
PERIOD "."
|
||||
COMMA ","
|
||||
SEMICOLON ";"
|
||||
COLON_BANG ":!"
|
||||
COLON ":"
|
||||
;
|
||||
|
||||
%precedence FNARROW
|
||||
%precedence "{" "}"
|
||||
%precedence ":" "," DBLARROW
|
||||
%precedence ":!" ":" "," DBLARROW
|
||||
%left OR AND
|
||||
%nonassoc EQUAL_EQUAL
|
||||
%left "+" "-"
|
||||
@@ -372,20 +376,46 @@ return_type:
|
||||
| ARROW expression %prec FNARROW
|
||||
{ $$ = $2; }
|
||||
;
|
||||
generic_binding:
|
||||
identifier ":!" expression
|
||||
{
|
||||
$$ = Carbon::GenericBinding({.name = std::move($1), .type = $3});
|
||||
}
|
||||
;
|
||||
deduced_param_list:
|
||||
// Empty
|
||||
{ $$ = std::vector<Carbon::GenericBinding>(); }
|
||||
| generic_binding
|
||||
{
|
||||
$$ = std::vector<Carbon::GenericBinding>();
|
||||
$$.push_back($1);
|
||||
}
|
||||
| generic_binding "," deduced_param_list
|
||||
{
|
||||
$$ = $3;
|
||||
$$.push_back($1);
|
||||
}
|
||||
;
|
||||
deduced_params:
|
||||
// Empty
|
||||
{ $$ = std::vector<Carbon::GenericBinding>(); }
|
||||
| "[" deduced_param_list "]"
|
||||
{ $$ = $2; }
|
||||
;
|
||||
function_definition:
|
||||
FN identifier tuple return_type "{" statement_list "}"
|
||||
{ $$ = Carbon::FunctionDefinition(yylineno, $2, $3, $4, $6); }
|
||||
| FN identifier tuple DBLARROW expression ";"
|
||||
FN identifier deduced_params tuple return_type "{" statement_list "}"
|
||||
{ $$ = Carbon::FunctionDefinition(yylineno, $2, $3, $4, $5, $7); }
|
||||
| FN identifier deduced_params tuple DBLARROW expression ";"
|
||||
{
|
||||
$$ = Carbon::FunctionDefinition(
|
||||
yylineno, $2, $3,
|
||||
yylineno, $2, $3, $4,
|
||||
Carbon::Expression::MakeAutoTypeLiteral(yylineno),
|
||||
Carbon::Statement::MakeReturn(yylineno, $5));
|
||||
Carbon::Statement::MakeReturn(yylineno, $6));
|
||||
}
|
||||
;
|
||||
function_declaration:
|
||||
FN identifier tuple return_type ";"
|
||||
{ $$ = Carbon::FunctionDefinition(yylineno, $2, $3, $4, 0); }
|
||||
FN identifier deduced_params tuple return_type ";"
|
||||
{ $$ = Carbon::FunctionDefinition(yylineno, $2, $3, $4, $5, 0); }
|
||||
;
|
||||
variable_declaration: identifier ":" expression
|
||||
{ $$ = Carbon::Member::MakeFieldMember(yylineno, $1, $3); }
|
||||
|
||||
Reference in New Issue
Block a user