diff options
author | Adrian Thurston <thurston@complang.org> | 2014-07-06 10:46:07 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2014-07-06 10:46:07 -0400 |
commit | d977f91ff7f0bb1ead98f4aae2992bdf80e3e1af (patch) | |
tree | e85bcb9c4c2dc98f2d4a0d01a7906a16f8bacfdd /src | |
parent | 007ebcd57612fe48a82a38c0cf0ff5e0a8c19666 (diff) | |
download | colm-d977f91ff7f0bb1ead98f4aae2992bdf80e3e1af.tar.gz |
added parse_tree for sending constructed trees (orig parse behaviour)
Diffstat (limited to 'src')
-rw-r--r-- | src/colm.lm | 2 | ||||
-rw-r--r-- | src/consinit.cc | 2 | ||||
-rw-r--r-- | src/loadcolm.cc | 16 | ||||
-rw-r--r-- | src/loadinit.cc | 2 | ||||
-rw-r--r-- | src/parser.cc | 4 | ||||
-rw-r--r-- | src/parser.h | 2 | ||||
-rw-r--r-- | src/parsetree.h | 3 | ||||
-rw-r--r-- | src/resolve.cc | 3 | ||||
-rw-r--r-- | src/synthesis.cc | 12 |
9 files changed, 32 insertions, 14 deletions
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: |