diff options
author | Adrian Thurston <thurston@colm.net> | 2019-12-27 12:33:19 +0200 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2019-12-27 12:33:19 +0200 |
commit | 7c474afdd7d5ef23f1a6ea99a54db72ae86f331c (patch) | |
tree | 7510ab9532378ce07b60726be5cc68937edd429f | |
parent | ba0569b4a80459e7d05f63115c89073eb9637537 (diff) | |
download | colm-7c474afdd7d5ef23f1a6ea99a54db72ae86f331c.tar.gz |
allow simple variable defs in colm bootstrap grammar
These are allowed, but ignored in bootstrap0 and bootstrap1. We can then use
them in the rewriter to log changes we made.
-rw-r--r-- | colm/consinit.cc | 31 | ||||
-rw-r--r-- | colm/consinit.h | 3 |
2 files changed, 32 insertions, 2 deletions
diff --git a/colm/consinit.cc b/colm/consinit.cc index 4bd6e1c6..7c719615 100644 --- a/colm/consinit.cc +++ b/colm/consinit.cc @@ -695,6 +695,30 @@ void ConsInit::optProdName() definition( "opt_prod_name", prod1, prod2 ); } +void ConsInit::prodVarDef() +{ + ProdEl *prodEl1 = prodRefName( "Name", "id" ); + ProdEl *prodEl2 = prodRefLit( "':'" ); + ProdEl *prodEl3 = prodRefName( "Type", "id" ); + Production *prod1 = production( prodEl1, prodEl2, prodEl3 ); + + definition( "prod_var_def", prod1 ); +} + +/* The prod var list we provide in a basic form, just "id: id." We won't make + * use of them in bootstrap0 or bootstrap1, They are ignored in the loader for + * bootstrap1. We want to use them in bootstrap2 during the rewrite stage. */ +void ConsInit::prodVarList() +{ + ProdEl *prodEl1 = prodRefName( "VarDefList", "prod_var_list" ); + ProdEl *prodEl2 = prodRefName( "VarDef", "prod_var_def" ); + Production *prod1 = production( prodEl1, prodEl2 ); + + Production *prod2 = production(); + + definition( "prod_var_list", prod1, prod2 ); +} + void ConsInit::prod() { ProdEl *prodEl1 = prodRefLit( "'['" ); @@ -724,9 +748,10 @@ Production *ConsInit::prodProd() { ProdEl *prodEl1 = prodRefLit( "'def'" ); ProdEl *prodEl2 = prodRefName( "DefId", "id" ); - ProdEl *prodEl3 = prodRefName( "ProdList", "prod_list" ); + ProdEl *prodEl3 = prodRefName( "ProdVarList", "prod_var_list" ); + ProdEl *prodEl4 = prodRefName( "ProdList", "prod_list" ); - return production( prodEl1, prodEl2, prodEl3 ); + return production( prodEl1, prodEl2, prodEl3, prodEl4 ); } void ConsInit::item() @@ -880,6 +905,8 @@ void ConsInit::go( long activeRealm ) prodElList(); optCommit(); optProdName(); + prodVarDef(); + prodVarList(); prod(); prodList(); ignore(); diff --git a/colm/consinit.h b/colm/consinit.h index 76ccabdf..7485445c 100644 --- a/colm/consinit.h +++ b/colm/consinit.h @@ -93,7 +93,10 @@ struct ConsInit void optProdElName(); void prodEl(); void prodElList(); + void varDefList(); void item(); + void prodVarDef(); + void prodVarList(); void prodList(); void optProdName(); void prod(); |