Add parsing of let/in.
This commit is contained in:
parent
63f82a1c64
commit
74f54abf5b
|
@ -125,8 +125,8 @@ struct ast_let : public ast {
|
||||||
definition_group definitions;
|
definition_group definitions;
|
||||||
ast_ptr in;
|
ast_ptr in;
|
||||||
|
|
||||||
ast_let(ast_ptr i, definition_group g)
|
ast_let(definition_group g, ast_ptr i)
|
||||||
: in(std::move(i)), definitions(std::move(g)) {}
|
: definitions(std::move(g)), in(std::move(i)) {}
|
||||||
|
|
||||||
void print(int indent, std::ostream& to) const;
|
void print(int indent, std::ostream& to) const;
|
||||||
void find_free(type_mgr& mgr, type_env_ptr& env, std::set<std::string>& into);
|
void find_free(type_mgr& mgr, type_env_ptr& env, std::set<std::string>& into);
|
||||||
|
|
23
12/parser.y
23
12/parser.y
|
@ -22,6 +22,8 @@ extern yy::parser::symbol_type yylex();
|
||||||
%token DATA
|
%token DATA
|
||||||
%token CASE
|
%token CASE
|
||||||
%token OF
|
%token OF
|
||||||
|
%token LET
|
||||||
|
%token IN
|
||||||
%token OCURLY
|
%token OCURLY
|
||||||
%token CCURLY
|
%token CCURLY
|
||||||
%token OPAREN
|
%token OPAREN
|
||||||
|
@ -40,8 +42,9 @@ extern yy::parser::symbol_type yylex();
|
||||||
%type <std::vector<branch_ptr>> branches
|
%type <std::vector<branch_ptr>> branches
|
||||||
%type <std::vector<constructor_ptr>> constructors
|
%type <std::vector<constructor_ptr>> constructors
|
||||||
%type <std::vector<parsed_type_ptr>> typeList
|
%type <std::vector<parsed_type_ptr>> typeList
|
||||||
|
%type <definition_group> definitions
|
||||||
%type <parsed_type_ptr> type nonArrowType typeListElement
|
%type <parsed_type_ptr> type nonArrowType typeListElement
|
||||||
%type <ast_ptr> aAdd aMul case app appBase
|
%type <ast_ptr> aAdd aMul case let app appBase
|
||||||
%type <definition_data_ptr> data
|
%type <definition_data_ptr> data
|
||||||
%type <definition_defn_ptr> defn
|
%type <definition_defn_ptr> defn
|
||||||
%type <branch_ptr> branch
|
%type <branch_ptr> branch
|
||||||
|
@ -53,17 +56,13 @@ extern yy::parser::symbol_type yylex();
|
||||||
%%
|
%%
|
||||||
|
|
||||||
program
|
program
|
||||||
: definitions { }
|
: definitions { global_defs = std::move($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
definitions
|
definitions
|
||||||
: definitions definition { }
|
: definitions defn { $$ = std::move($1); auto name = $2->name; $$.defs_defn[name] = std::move($2); }
|
||||||
| definition { }
|
| definitions data { $$ = std::move($1); auto name = $2->name; $$.defs_data[name] = std::move($2); }
|
||||||
;
|
| %empty { $$ = definition_group(); }
|
||||||
|
|
||||||
definition
|
|
||||||
: defn { auto name = $1->name; global_defs.defs_defn[name] = std::move($1); }
|
|
||||||
| data { auto name = $1->name; global_defs.defs_data[name] = std::move($1); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
defn
|
defn
|
||||||
|
@ -100,6 +99,12 @@ appBase
|
||||||
| UID { $$ = ast_ptr(new ast_uid(std::move($1))); }
|
| UID { $$ = ast_ptr(new ast_uid(std::move($1))); }
|
||||||
| OPAREN aAdd CPAREN { $$ = std::move($2); }
|
| OPAREN aAdd CPAREN { $$ = std::move($2); }
|
||||||
| case { $$ = std::move($1); }
|
| case { $$ = std::move($1); }
|
||||||
|
| let { $$ = std::move($1); }
|
||||||
|
;
|
||||||
|
|
||||||
|
let
|
||||||
|
: LET OCURLY definitions CCURLY IN OCURLY aAdd CCURLY
|
||||||
|
{ $$ = ast_ptr(new ast_let(std::move($3), std::move($7))); }
|
||||||
;
|
;
|
||||||
|
|
||||||
case
|
case
|
||||||
|
|
|
@ -22,6 +22,8 @@ defn { return yy::parser::make_DEFN(); }
|
||||||
data { return yy::parser::make_DATA(); }
|
data { return yy::parser::make_DATA(); }
|
||||||
case { return yy::parser::make_CASE(); }
|
case { return yy::parser::make_CASE(); }
|
||||||
of { return yy::parser::make_OF(); }
|
of { return yy::parser::make_OF(); }
|
||||||
|
let { return yy::parser::make_LET(); }
|
||||||
|
in { return yy::parser::make_IN(); }
|
||||||
\{ { return yy::parser::make_OCURLY(); }
|
\{ { return yy::parser::make_OCURLY(); }
|
||||||
\} { return yy::parser::make_CCURLY(); }
|
\} { return yy::parser::make_CCURLY(); }
|
||||||
\( { return yy::parser::make_OPAREN(); }
|
\( { return yy::parser::make_OPAREN(); }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user