summaryrefslogtreecommitdiff
path: root/colm
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-16 22:35:21 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-16 22:35:21 -0400
commitf8b1a7560f0b4563603a12afc27535da2d3825a2 (patch)
tree3015946367825363107217531828390a31676a5f /colm
parent7f759a228a78d7127075d8e0dc494cfd329fe4a7 (diff)
downloadcolm-f8b1a7560f0b4563603a12afc27535da2d3825a2.tar.gz
pass the colm grammar filename to the second stage as an argument
Diffstat (limited to 'colm')
-rw-r--r--colm/Makefile.am4
-rw-r--r--colm/consinit.cc35
-rw-r--r--colm/loadcolm.cc6
-rw-r--r--colm/loadcolm.h7
-rw-r--r--colm/main.cc6
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