summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-05-07 11:54:29 -0400
committerAdrian Thurston <thurston@colm.net>2018-05-07 11:54:29 -0400
commit7b441a6c7f2c9704b9d536a739f1b91893167df5 (patch)
treec3f76777deafd8b5dd010913202d19bc6afe2143
parentff797d903459b690c8c3035b601a3808afa4ccac (diff)
downloadcolm-7b441a6c7f2c9704b9d536a739f1b91893167df5.tar.gz
removed XML and postfix print, implemented remaining print with send
Removed the XML and postfix print forms. The functionality is now achieved with xml(), xmlac() and postfix() functions. Now implementing the print and prints using the send expression. All printing is now handled via the send instructions.
-rw-r--r--src/colm.lm8
-rw-r--r--src/loadcolm.cc98
-rw-r--r--src/resolve.cc4
3 files changed, 74 insertions, 36 deletions
diff --git a/src/colm.lm b/src/colm.lm
index 3f719686..2bd4497a 100644
--- a/src/colm.lm
+++ b/src/colm.lm
@@ -8,9 +8,6 @@ lex
token IGNORE / 'ignore' /
token PRINT / 'print' /
token PRINTS / 'prints' /
- token PRINT_XML / 'print_xml' /
- token PRINT_XML_AC / 'print_xml_ac' /
- token PRINT_DUMP / 'print_dump' /
token PARSE / 'parse' /
token REDUCE / 'reduce' /
token READ_REDUCE /'read_reduce'/
@@ -580,10 +577,7 @@ def var_def
def print_stmt
[PRINT POPEN call_arg_list PCLOSE] :Tree
-| [PRINTS POPEN call_arg_list PCLOSE] :PrintStream
-| [PRINT_XML POPEN call_arg_list PCLOSE] :Xml
-| [PRINT_XML_AC POPEN call_arg_list PCLOSE] :XmlAc
-| [PRINT_DUMP POPEN call_arg_list PCLOSE] :Dump
+| [PRINTS POPEN var_ref COMMA call_arg_list PCLOSE] :PrintStream
| [PRINT accumulate] :Accum
def expr_stmt
diff --git a/src/loadcolm.cc b/src/loadcolm.cc
index 9f47789f..c04d4c7b 100644
--- a/src/loadcolm.cc
+++ b/src/loadcolm.cc
@@ -291,9 +291,9 @@ struct LoadColm
case statement::BareSend: {
NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() );
QualItemVect *qualItemVect = new QualItemVect;
- String id = "Output";
+
LangVarRef *varRef = LangVarRef::cons( InputLoc(),
- curNspace(), curStruct(), curScope(), nspaceQual, qualItemVect, id );
+ curNspace(), curStruct(), curScope(), nspaceQual, qualItemVect, String("Output") );
ConsItemList *list = walkAccumulate( Statement.accumulate() );
bool eof = walkOptEos( Statement.opt_eos() );
@@ -1271,39 +1271,79 @@ struct LoadColm
return callArgVect;
}
+ ConsItemList *walkCallArgSeqAccum( call_arg_seq callArgSeq )
+ {
+ ConsItemList *consItemList = new ConsItemList;
+ while ( callArgSeq != 0 ) {
+ code_expr codeExpr = callArgSeq.code_expr();
+
+// LangExpr *expr = walkCodeExpr( codeExpr );
+// callArgVect->append( new CallArg(expr) );
+
+ bool trim = false; //walkTrim( consEl.opt_no_trim() );
+ LangExpr *consExpr = walkCodeExpr( codeExpr );
+ ConsItem *consItem = ConsItem::cons( consExpr->loc,
+ ConsItem::ExprType, consExpr, trim );
+ consItemList->append( consItem );
+
+ callArgSeq = callArgSeq._call_arg_seq();
+ }
+ return consItemList;
+ }
+
+ ConsItemList *walkCallArgListAccum( call_arg_list callArgList )
+ {
+ return walkCallArgSeqAccum( callArgList.call_arg_seq() );
+ }
+
LangStmt *walkPrintStmt( print_stmt &printStmt )
{
- if ( printStmt.prodName() == print_stmt::Accum ) {
+ LangStmt *stmt = 0;
+ switch ( printStmt.prodName() ) {
+ case print_stmt::Accum: {
+ InputLoc loc = printStmt.PRINT().loc();
+
+ NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() );
+ QualItemVect *qualItemVect = new QualItemVect;
+ LangVarRef *varRef = LangVarRef::cons( loc, curNspace(), curStruct(),
+ curScope(), nspaceQual, qualItemVect, String("stdout") );
+
ConsItemList *list = walkAccumulate( printStmt.accumulate() );
- return LangStmt::cons( printStmt.PRINT().loc(), LangStmt::PrintAccum, list );
+
+ bool eof = false; //walkOptEos( StmtOrFactor.opt_eos() );
+ LangExpr *expr = send( loc, varRef, list, eof );
+ stmt = LangStmt::cons( loc, LangStmt::ExprType, expr );
+ break;
}
- else {
- CallArgVect *exprVect = walkCallArgList( printStmt.call_arg_list() );
+ case print_stmt::Tree: {
+ InputLoc loc = printStmt.PRINT().loc();
- LangStmt::Type type = LangStmt::PrintType;
- switch ( printStmt.prodName() ) {
- case print_stmt::Tree:
- type = LangStmt::PrintType;
- break;
- case print_stmt::PrintStream:
- type = LangStmt::PrintStreamType;
- break;
- case print_stmt::Xml:
- type = LangStmt::PrintXMLType;
- break;
- case print_stmt::XmlAc:
- type = LangStmt::PrintXMLACType;
- break;
- case print_stmt::Dump:
- type = LangStmt::PrintDumpType;
- break;
- case print_stmt::Accum:
- /* unreachable (see above) */
- break;
- }
-
- return LangStmt::cons( printStmt.POPEN().loc(), type, exprVect );
+ NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() );
+ QualItemVect *qualItemVect = new QualItemVect;
+ LangVarRef *varRef = LangVarRef::cons( loc, curNspace(), curStruct(),
+ curScope(), nspaceQual, qualItemVect, String("stdout") );
+
+ ConsItemList *list = walkCallArgListAccum( printStmt.call_arg_list() );
+
+
+ bool eof = false; //walkOptEos( StmtOrFactor.opt_eos() );
+ LangExpr *expr = send( loc, varRef, list, eof );
+ stmt = LangStmt::cons( loc, LangStmt::ExprType, expr );
+ break;
}
+ case print_stmt::PrintStream: {
+ LangVarRef *varRef = walkVarRef( printStmt.var_ref() );
+
+ ConsItemList *list = walkCallArgListAccum( printStmt.call_arg_list() );
+
+ InputLoc loc = printStmt.PRINTS().loc();
+
+ bool eof = false; //walkOptEos( StmtOrFactor.opt_eos() );
+ LangExpr *expr = send( loc, varRef, list, eof );
+ stmt = LangStmt::cons( loc, LangStmt::ExprType, expr );
+ break;
+ }}
+ return stmt;
}
QualItemVect *walkQual( qual &Qual )
diff --git a/src/resolve.cc b/src/resolve.cc
index dff0c27d..324a78bd 100644
--- a/src/resolve.cc
+++ b/src/resolve.cc
@@ -560,6 +560,10 @@ void LangTerm::resolve( Compiler *pd )
break;
case SendType:
+// for ( CallArgVect::Iter pex = exprPtrVect->last(); pex.gtb(); pex-- )
+// (*pex)->expr->resolve( pd );
+ parserText->list->resolve( pd );
+ break;
case SendTreeType:
case EmbedStringType:
break;