diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-16 22:35:21 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-16 22:35:21 -0400 |
commit | f8b1a7560f0b4563603a12afc27535da2d3825a2 (patch) | |
tree | 3015946367825363107217531828390a31676a5f /colm | |
parent | 7f759a228a78d7127075d8e0dc494cfd329fe4a7 (diff) | |
download | colm-f8b1a7560f0b4563603a12afc27535da2d3825a2.tar.gz |
pass the colm grammar filename to the second stage as an argument
Diffstat (limited to 'colm')
-rw-r--r-- | colm/Makefile.am | 4 | ||||
-rw-r--r-- | colm/consinit.cc | 35 | ||||
-rw-r--r-- | colm/loadcolm.cc | 6 | ||||
-rw-r--r-- | colm/loadcolm.h | 7 | ||||
-rw-r--r-- | colm/main.cc | 6 |
5 files changed, 43 insertions, 15 deletions
diff --git a/colm/Makefile.am b/colm/Makefile.am index 88f377e1..6d7c1d4f 100644 --- a/colm/Makefile.am +++ b/colm/Makefile.am @@ -70,7 +70,7 @@ bootstrap1_SOURCES = \ main.cc bootstrap1_LDADD = libprog.a libcolm.a -colm_CXXFLAGS = $(common_CFLAGS) +colm_CXXFLAGS = $(common_CFLAGS) -DLOAD_SRC colm_CFLAGS = $(common_CFLAGS) colm_SOURCES = \ loadsrc.h loadsrc.cc \ @@ -88,7 +88,7 @@ exports1.h: parse1.c exports1.cc: parse1.c parse2.c: bootstrap1 colm.lm - $(builddir)/bootstrap1 -L -o parse2.c -e exports2.h -c exports2.cc < colm.lm + $(builddir)/bootstrap1 -L -o parse2.c -e exports2.h -c exports2.cc colm.lm exports2.h: parse2.c exports2.cc: parse2.c diff --git a/colm/consinit.cc b/colm/consinit.cc index fe5090a7..477eb552 100644 --- a/colm/consinit.cc +++ b/colm/consinit.cc @@ -673,20 +673,43 @@ void ConsInit::startProd() void ConsInit::parseInput( StmtList *stmtList ) { + /* Parse the "start" def. */ NamespaceQual *nspaceQual = NamespaceQual::cons( namespaceStack.top() ); TypeRef *typeRef = TypeRef::cons( internal, nspaceQual, String("start"), RepeatNone ); - LangVarRef *varRef = LangVarRef::cons( internal, new QualItemVect, String("stdin") ); - LangExpr *expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::VarRefType, varRef ) ); + /* Pop argv, this yields the file name . */ + ExprVect *popArgs = new ExprVect; + QualItemVect *popQual = new QualItemVect; + popQual->append( QualItem( internal, String( "argv" ), QualItem::Dot ) ); + + LangVarRef *popRef = LangVarRef::cons( internal, popQual, String("pop") ); + LangExpr *pop = LangExpr::cons( LangTerm::cons( InputLoc(), popRef, popArgs ) ); - ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, expr ); + /* Construct a literal string 'r', for second arg to open. */ + ConsItem *modeConsItem = ConsItem::cons( internal, ConsItem::InputText, String("r") ); + ConsItemList *modeCons = new ConsItemList; + modeCons->append( modeConsItem ); + LangExpr *modeExpr = LangExpr::cons( LangTerm::cons( internal, modeCons ) ); + + /* Call open. */ + QualItemVect *openQual = new QualItemVect; + LangVarRef *openRef = LangVarRef::cons( internal, openQual, String("open") ); + ExprVect *openArgs = new ExprVect; + openArgs->append( pop ); + openArgs->append( modeExpr ); + LangExpr *open = LangExpr::cons( LangTerm::cons( InputLoc(), openRef, openArgs ) ); + + /* Construct a list containing the open stream. */ + ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, open ); ConsItemList *list = ConsItemList::cons( consItem ); + /* Will capture the parser to "P" */ ObjectField *objField = ObjectField::cons( internal, 0, String("P") ); - expr = parseCmd( internal, false, objField, typeRef, 0, list ); - LangStmt *stmt = LangStmt::cons( internal, LangStmt::ExprType, expr ); - stmtList->append( stmt ); + /* Parse the above list. */ + LangExpr *parseExpr = parseCmd( internal, false, objField, typeRef, 0, list ); + LangStmt *parseStmt = LangStmt::cons( internal, LangStmt::ExprType, parseExpr ); + stmtList->append( parseStmt ); } void ConsInit::exportTree( StmtList *stmtList ) diff --git a/colm/loadcolm.cc b/colm/loadcolm.cc index 3c3071ba..a6295404 100644 --- a/colm/loadcolm.cc +++ b/colm/loadcolm.cc @@ -300,9 +300,13 @@ void LoadColm::go() { StmtList *stmtList = new StmtList; + const char *argv[2]; + argv[0] = inputFileName; + argv[1] = 0; + colmInit( 0 ); ColmProgram *program = colmNewProgram( &main_runtimeData ); - colmRunProgram( program, 0, 0 ); + colmRunProgram( program, 1, argv ); /* Extract the parse tree. */ start Start = ColmTree( program ); diff --git a/colm/loadcolm.h b/colm/loadcolm.h index b9958858..0b641a24 100644 --- a/colm/loadcolm.h +++ b/colm/loadcolm.h @@ -38,11 +38,14 @@ struct LoadColm : public BaseParser { - LoadColm( Compiler *pd ) + LoadColm( Compiler *pd, const char *inputFileName ) : - BaseParser(pd) + BaseParser(pd), + inputFileName(inputFileName) {} + const char *inputFileName; + /* Constructing the colm language data structures from the the parse tree. */ LexFactor *walkLexFactor( lex_factor &LexFactorTree ); LexFactorNeg *walkLexFactorNeg( lex_factor_neg &LexFactorNegTree ); diff --git a/colm/main.cc b/colm/main.cc index 0bec7033..f5760926 100644 --- a/colm/main.cc +++ b/colm/main.cc @@ -554,9 +554,7 @@ int main(int argc, const char **argv) } -#if defined(CONS_INIT) -#elif defined(LOAD_COLM) -#else +#if defined(CONS_COLM) || defined(LOAD_SRC) /* Open the input file for reading. */ if ( inputFileName == 0 ) { error() << "colm: no input file given" << endl; @@ -579,7 +577,7 @@ int main(int argc, const char **argv) #if defined(CONS_INIT) ConsInit *parser = new ConsInit( pd ); #elif defined(LOAD_COLM) - LoadColm *parser = new LoadColm( pd ); + LoadColm *parser = new LoadColm( pd, inputFileName ); #else LoadSource *parser = new LoadSource( pd, inputFileName ); #endif |