diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-06 00:05:47 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-06 00:05:47 +0000 |
commit | e6b964bd4533dc34eba5cca173c7415b3a769c9f (patch) | |
tree | e63e1bb46117ac71713f692b9b71a4c1b876797c /colm | |
parent | 96413c44db6cd584813e355bb3bbef023cb581f6 (diff) | |
download | colm-e6b964bd4533dc34eba5cca173c7415b3a769c9f.tar.gz |
some work on the bootstrap1 parser: basic productions
Diffstat (limited to 'colm')
-rw-r--r-- | colm/bootstrap0.cc | 64 | ||||
-rw-r--r-- | colm/bootstrap0.h | 5 | ||||
-rw-r--r-- | colm/colm.lm | 12 |
3 files changed, 71 insertions, 10 deletions
diff --git a/colm/bootstrap0.cc b/colm/bootstrap0.cc index 7ec70d82..acfdecf9 100644 --- a/colm/bootstrap0.cc +++ b/colm/bootstrap0.cc @@ -310,10 +310,58 @@ Production *Bootstrap0::prodProd() { ProdEl *prodEl1 = prodRefLit( "'def'" ); ProdEl *prodEl2 = prodRefName( "DefId", "id" ); - ProdEl *prodEl3 = prodRefLit( "'['" ); - ProdEl *prodEl4 = prodRefLit( "']'" ); + ProdEl *prodEl3 = prodRefName( "ProdList", "prod_list" ); - return production( prodEl1, prodEl2, prodEl3, prodEl4 ); + return production( prodEl1, prodEl2, prodEl3 ); +} + +void Bootstrap0::prodEl() +{ + ProdEl *prodEl1 = prodRefName( "Id", "id" ); + Production *prod1 = production( prodEl1 ); + definition( "prod_el", prod1 ); +} + +void Bootstrap0::prodElList() +{ + ProdEl *prodEl1 = prodRefName( "ProdElList", "prod_el_list" ); + ProdEl *prodEl2 = prodRefName( "ProdEl", "prod_el" ); + Production *prod1 = production( prodEl1, prodEl2 ); + + ProdEl *prodEl3 = prodRefName( "ProdEl", "prod_el" ); + Production *prod2 = production( prodEl3 ); + + definition( "prod_el_list", prod1, prod2 ); +} + +void Bootstrap0::prod() +{ + ProdEl *prodEl1 = prodRefLit( "'['" ); + ProdEl *prodEl2 = prodRefName( "prod_el_list" ); + ProdEl *prodEl3 = prodRefLit( "']'" ); + Production *prod1 = production( prodEl1, prodEl2, prodEl3 ); + + definition( "prod", prod1 ); +} + +void Bootstrap0::prodList() +{ + ProdEl *prodEl1 = prodRefName( "ProdList", "prod_list" ); + ProdEl *prodEl2 = prodRefLit( "'|'" ); + ProdEl *prodEl3 = prodRefName( "Prod", "prod" ); + Production *prod1 = production( prodEl1, prodEl2, prodEl3 ); + + ProdEl *prodEl4 = prodRefName( "Prod", "prod" ); + Production *prod2 = production( prodEl4 ); + + definition( "prod_list", prod1, prod2 ); +} + +void Bootstrap0::item() +{ + Production *prod1 = prodLex(); + Production *prod2 = prodProd(); + definition( "item", prod1, prod2 ); } void Bootstrap0::startProd() @@ -370,13 +418,15 @@ void Bootstrap0::go() idToken(); symbol( "'['" ); symbol( "']'" ); + symbol( "'|'" ); popRegionSet(); - Production *prod1 = prodLex(); - Production *prod2 = prodProd(); - definition( "item", prod1, prod2 ); - + prodEl(); + prodElList(); + prod(); + prodList(); + item(); startProd(); parseInput( stmtList ); diff --git a/colm/bootstrap0.h b/colm/bootstrap0.h index 1bc899bb..e0d23150 100644 --- a/colm/bootstrap0.h +++ b/colm/bootstrap0.h @@ -64,6 +64,11 @@ struct Bootstrap0 Production *prodProd(); Production *prodLex(); + void prodEl(); + void prodElList(); + void item(); + void prodList(); + void prod(); void startProd(); void go(); }; diff --git a/colm/colm.lm b/colm/colm.lm index 8a38b2cb..a2100121 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -1,6 +1,12 @@ lex end -def prod [] -def item [] -def start [] +def prod_list + [prod_list prod] +| [prod] + +def item + [prod_list] + +def start + [item] |