summaryrefslogtreecommitdiff
path: root/colm
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-06 00:05:47 +0000
committerAdrian Thurston <thurston@complang.org>2013-03-06 00:05:47 +0000
commite6b964bd4533dc34eba5cca173c7415b3a769c9f (patch)
treee63e1bb46117ac71713f692b9b71a4c1b876797c /colm
parent96413c44db6cd584813e355bb3bbef023cb581f6 (diff)
downloadcolm-e6b964bd4533dc34eba5cca173c7415b3a769c9f.tar.gz
some work on the bootstrap1 parser: basic productions
Diffstat (limited to 'colm')
-rw-r--r--colm/bootstrap0.cc64
-rw-r--r--colm/bootstrap0.h5
-rw-r--r--colm/colm.lm12
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]