summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2014-07-06 10:46:07 -0400
committerAdrian Thurston <thurston@complang.org>2014-07-06 10:46:07 -0400
commitd977f91ff7f0bb1ead98f4aae2992bdf80e3e1af (patch)
treee85bcb9c4c2dc98f2d4a0d01a7906a16f8bacfdd
parent007ebcd57612fe48a82a38c0cf0ff5e0a8c19666 (diff)
downloadcolm-d977f91ff7f0bb1ead98f4aae2992bdf80e3e1af.tar.gz
added parse_tree for sending constructed trees (orig parse behaviour)
-rw-r--r--colm.vim2
-rw-r--r--src/colm.lm2
-rw-r--r--src/consinit.cc2
-rw-r--r--src/loadcolm.cc16
-rw-r--r--src/loadinit.cc2
-rw-r--r--src/parser.cc4
-rw-r--r--src/parser.h2
-rw-r--r--src/parsetree.h3
-rw-r--r--src/resolve.cc3
-rw-r--r--src/synthesis.cc12
10 files changed, 33 insertions, 15 deletions
diff --git a/colm.vim b/colm.vim
index dde39fb7..144af5cf 100644
--- a/colm.vim
+++ b/colm.vim
@@ -57,7 +57,7 @@ syntax match tlNumber "false"
syntax keyword Type
\ commit include literal iter
\ namespace lex reducefirst global include export
- \ construct cons parse parse_stop match require send send_tree
+ \ construct cons parse parse_tree parse_stop match require send send_tree
\ preeof left right nonassoc prec context alias
\ end
diff --git a/src/colm.lm b/src/colm.lm
index 208c0fc5..4f9ed50e 100644
--- a/src/colm.lm
+++ b/src/colm.lm
@@ -11,6 +11,7 @@ lex
token PRINT_XML / 'print_xml' /
token PRINT_XML_AC / 'print_xml_ac' /
token PARSE / 'parse' /
+ token PARSE_TREE / 'parse_tree' /
token PARSE_STOP / 'parse_stop' /
token CONS / 'construct' | 'cons' /
token MATCH / 'match' /
@@ -531,6 +532,7 @@ def code_factor
| [SEND var_ref accumulate opt_eos] :Send
| [SEND_TREE var_ref accumulate opt_eos] :SendTree
| [PARSE opt_capture type_ref opt_field_init accumulate] :Parse
+| [PARSE_TREE opt_capture type_ref opt_field_init accumulate] :ParseTree
| [PARSE_STOP opt_capture type_ref opt_field_init accumulate] :ParseStop
| [CONS opt_capture type_ref opt_field_init constructor] :Cons
| [MATCH var_ref pattern] :Match
diff --git a/src/consinit.cc b/src/consinit.cc
index 81d06e22..d28a54ac 100644
--- a/src/consinit.cc
+++ b/src/consinit.cc
@@ -772,7 +772,7 @@ void ConsInit::parseInput( StmtList *stmtList )
ObjectField *objField = ObjectField::cons( internal, 0, String("P") );
/* Parse the above list. */
- LangExpr *parseExpr = parseCmd( internal, false, objField, typeRef, 0, list );
+ LangExpr *parseExpr = parseCmd( internal, false, false, objField, typeRef, 0, list );
LangStmt *parseStmt = LangStmt::cons( internal, LangStmt::ExprType, parseExpr );
stmtList->append( parseStmt );
}
diff --git a/src/loadcolm.cc b/src/loadcolm.cc
index e6dc60aa..36bc5557 100644
--- a/src/loadcolm.cc
+++ b/src/loadcolm.cc
@@ -1705,7 +1705,19 @@ struct LoadColm
FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() );
ConsItemList *list = walkAccumulate( codeFactor.accumulate() );
- expr = parseCmd( codeFactor.PARSE().loc(), false, objField,
+ expr = parseCmd( codeFactor.PARSE().loc(), false, false, objField,
+ typeRef, init, list );
+ break;
+ }
+ case code_factor::_ParseTree: {
+ /* The type we are parsing. */
+ type_ref typeRefTree = codeFactor.type_ref();
+ TypeRef *typeRef = walkTypeRef( typeRefTree );
+ ObjectField *objField = walkOptCapture( codeFactor.opt_capture() );
+ FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() );
+ ConsItemList *list = walkAccumulate( codeFactor.accumulate() );
+
+ expr = parseCmd( codeFactor.PARSE_TREE().loc(), true, false, objField,
typeRef, init, list );
break;
}
@@ -1717,7 +1729,7 @@ struct LoadColm
FieldInitVect *init = walkOptFieldInit( codeFactor.opt_field_init() );
ConsItemList *list = walkAccumulate( codeFactor.accumulate() );
- expr = parseCmd( codeFactor.PARSE_STOP().loc(), true, objField,
+ expr = parseCmd( codeFactor.PARSE_STOP().loc(), false, true, objField,
typeRef, init, list );
break;
}
diff --git a/src/loadinit.cc b/src/loadinit.cc
index 6cc76b03..1bbdcad8 100644
--- a/src/loadinit.cc
+++ b/src/loadinit.cc
@@ -311,7 +311,7 @@ void LoadInit::consParseStmt( StmtList *stmtList )
ObjectField *objField = ObjectField::cons( internal, 0, String("P") );
/* Parse the above list. */
- LangExpr *parseExpr = parseCmd( internal, false, objField, typeRef, 0, list );
+ LangExpr *parseExpr = parseCmd( internal, false, false, objField, typeRef, 0, list );
LangStmt *parseStmt = LangStmt::cons( internal, LangStmt::ExprType, parseExpr );
stmtList->append( parseStmt );
}
diff --git a/src/parser.cc b/src/parser.cc
index 037d94cd..4990a1a6 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -547,7 +547,7 @@ LangExpr *BaseParser::sendTree( const InputLoc &loc, LangVarRef *varRef, ConsIte
parserText, eof ) );
}
-LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *objField,
+LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool tree, bool stop, ObjectField *objField,
TypeRef *typeRef, FieldInitVect *fieldInitVect, ConsItemList *list )
{
LangExpr *expr = 0;
@@ -575,7 +575,7 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj
pd->parserTextList.append( parserText );
expr = LangExpr::cons( LangTerm::cons( loc,
- stop ? LangTerm::ParseStopType : LangTerm::ParseType,
+ stop ? LangTerm::ParseStopType : ( tree ? LangTerm::ParseTreeType : LangTerm::ParseType ),
varRef, objField, parserTypeRef, fieldInitVect, constructor, parserText ) );
/* Check for redeclaration. */
diff --git a/src/parser.h b/src/parser.h
index 64eb457b..c92abaf4 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -95,7 +95,7 @@ struct BaseParser
LexJoin *lexOptJoin( LexJoin *join, LexJoin *context );
LangExpr *send( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list, bool eof );
LangExpr *sendTree( const InputLoc &loc, LangVarRef *varRef, ConsItemList *list, bool eof );
- LangExpr *parseCmd( const InputLoc &loc, bool stop, ObjectField *objField,
+ LangExpr *parseCmd( const InputLoc &loc, bool tree, bool stop, ObjectField *objField,
TypeRef *typeRef, FieldInitVect *fieldInitVect, ConsItemList *list );
PatternItemList *consPatternEl( LangVarRef *varRef, PatternItemList *list );
PatternItemList *patternElNamed( const InputLoc &loc, LangVarRef *varRef,
diff --git a/src/parsetree.h b/src/parsetree.h
index cd90c641..46816cbf 100644
--- a/src/parsetree.h
+++ b/src/parsetree.h
@@ -2594,6 +2594,7 @@ struct LangTerm
TrueType,
FalseType,
ParseType,
+ ParseTreeType,
ParseStopType,
SendType,
SendTreeType,
@@ -2783,7 +2784,7 @@ struct LangTerm
UniqueType *evaluateNew( Compiler *pd, CodeVect &code ) const;
UniqueType *evaluateConstruct( Compiler *pd, CodeVect &code ) const;
void parseFrag( Compiler *pd, CodeVect &code, int stopId ) const;
- UniqueType *evaluateParse( Compiler *pd, CodeVect &code, bool stop ) const;
+ UniqueType *evaluateParse( Compiler *pd, CodeVect &code, bool tree, bool stop ) const;
void evaluateSendStream( Compiler *pd, CodeVect &code ) const;
void evaluateSendParser( Compiler *pd, CodeVect &code, bool strings ) const;
UniqueType *evaluateSend( Compiler *pd, CodeVect &code ) const;
diff --git a/src/resolve.cc b/src/resolve.cc
index 0ff31c18..0e57ad07 100644
--- a/src/resolve.cc
+++ b/src/resolve.cc
@@ -429,8 +429,9 @@ void LangTerm::resolve( Compiler *pd )
case FalseType:
break;
- case ParseStopType:
case ParseType:
+ case ParseTreeType:
+ case ParseStopType:
typeRef->resolveType( pd );
/* Evaluate the initialization expressions. */
if ( fieldInitArgs != 0 ) {
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 42a93a21..e898de6b 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -1127,7 +1127,7 @@ void LangTerm::parseFrag( Compiler *pd, CodeVect &code, int stopId ) const
}
}
-UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code, bool stop ) const
+UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code, bool tree, bool stop ) const
{
UniqueType *targetUT = typeRef->uniqueType->langEl->generic->utArg;
@@ -1241,7 +1241,7 @@ UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code, bool stop ) c
continue;
}
- if ( ut->typeId == TYPE_TREE &&
+ if ( !tree && ut->typeId == TYPE_TREE &&
ut->langEl != pd->strLangEl && ut->langEl != pd->streamLangEl )
{
/* Convert it to a string. */
@@ -1612,9 +1612,11 @@ UniqueType *LangTerm::evaluate( Compiler *pd, CodeVect &code ) const
case MatchType:
return evaluateMatch( pd, code );
case ParseType:
- return evaluateParse( pd, code, false );
+ return evaluateParse( pd, code, false, false );
+ case ParseTreeType:
+ return evaluateParse( pd, code, true, false );
case ParseStopType:
- return evaluateParse( pd, code, true );
+ return evaluateParse( pd, code, false, true );
case ConstructType:
return evaluateConstruct( pd, code );
case SendType:
@@ -2277,7 +2279,7 @@ void Compiler::findLocals( ObjectDef *localFrame, CodeBlock *block )
UniqueType *ut = el->typeRef->uniqueType;
if ( ut->typeId == TYPE_ITER ) {
int depth = el->scope->depth();
- LocalType type;
+ LocalType type = LT_Tree;
switch ( ut->iterDef->type ) {
case IterDef::Tree:
case IterDef::Child: