summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-07-16 08:32:40 -0400
committerAdrian Thurston <thurston@complang.org>2012-07-16 08:32:40 -0400
commite4514d7b9dd8929f8976c3e746381ef9d4741005 (patch)
tree2f3e6c82535a071a3559e0453dd17f6ca06d96a5
parent516b11d71d8bc5e8d05379d2e98a18e3a23d6461 (diff)
downloadcolm-e4514d7b9dd8929f8976c3e746381ef9d4741005.tar.gz
moved the send (also old << syntax) to LangTerm
The send belongs in the lang terms with the rest of the parsing, consing, matching, etc. Was in LangStmt only because there are some grammar issues to fix. The repl/accum/string definitions are a bit sloppy.
-rw-r--r--src/lmparse.kl38
-rw-r--r--src/parsetree.h24
-rw-r--r--src/resolve.cc23
-rw-r--r--src/synthesis.cc154
4 files changed, 121 insertions, 118 deletions
diff --git a/src/lmparse.kl b/src/lmparse.kl
index 07988dd7..4789bad1 100644
--- a/src/lmparse.kl
+++ b/src/lmparse.kl
@@ -1441,24 +1441,6 @@ statement: KW_Yield var_ref
final {
$$->stmt = LangStmt::cons( LangStmt::YieldType, $2->varRef );
};
-statement: var_ref TK_LtLt accumulate
- final {
- Namespace *nspace = namespaceStack.top();
- TokenRegion *region = regionStack.top();
- ParserText *parserText = ParserText::cons( $2->loc, nspace, region, replItemList );
- pd->parserTextList.append( parserText );
-
- $$->stmt = LangStmt::cons( LangStmt::SendType, $1->varRef, parserText );
- };
-statement: KW_Send var_ref accumulate
- final {
- Namespace *nspace = namespaceStack.top();
- TokenRegion *region = regionStack.top();
- ParserText *parserText = ParserText::cons( $1->loc, nspace, region, replItemList );
- pd->parserTextList.append( parserText );
-
- $$->stmt = LangStmt::cons( LangStmt::SendType, $2->varRef, parserText );
- };
nonterm opt_require_stmt uses statement;
@@ -1974,6 +1956,26 @@ code_factor: KW_ParseStop opt_capture type_ref '(' opt_code_expr_list ')'
}
};
+code_factor:
+ var_ref TK_LtLt accumulate
+ final {
+ Namespace *nspace = namespaceStack.top();
+ TokenRegion *region = regionStack.top();
+ ParserText *parserText = ParserText::cons( $2->loc, nspace, region, replItemList );
+ pd->parserTextList.append( parserText );
+
+ $$->expr = LangExpr::cons( LangTerm::cons( LangTerm::SendType, $1->varRef, parserText ) );
+ };
+code_factor:
+ KW_Send var_ref accumulate
+ final {
+ Namespace *nspace = namespaceStack.top();
+ TokenRegion *region = regionStack.top();
+ ParserText *parserText = ParserText::cons( $1->loc, nspace, region, replItemList );
+ pd->parserTextList.append( parserText );
+
+ $$->expr = LangExpr::cons( LangTerm::cons( LangTerm::SendType, $2->varRef, parserText ) );
+ };
code_factor: KW_TypeId '<' type_ref '>'
final {
$$->expr = LangExpr::cons( LangTerm::cons( $1->loc,
diff --git a/src/parsetree.h b/src/parsetree.h
index 60028476..0701cf1d 100644
--- a/src/parsetree.h
+++ b/src/parsetree.h
@@ -2342,6 +2342,7 @@ struct LangTerm
OrigParseType,
OrigParseStopType,
Parse2Type,
+ SendType,
MakeTreeType,
MakeTokenType,
EmbedStringType,
@@ -2518,6 +2519,15 @@ struct LangTerm
t->replacement = (replacement);
return t;
}
+
+ static LangTerm *cons( Type type, LangVarRef *varRef, ParserText *parserText )
+ {
+ LangTerm *s = new LangTerm;
+ s->type = type;
+ s->varRef = varRef;
+ s->parserText = parserText;
+ return s;
+ }
void resolve( Compiler *pd );
@@ -2525,6 +2535,7 @@ struct LangTerm
UniqueType *evaluateNew( Compiler *pd, CodeVect &code ) const;
UniqueType *evaluateConstruct( Compiler *pd, CodeVect &code ) const;
UniqueType *evaluateParse2( Compiler *pd, CodeVect &code ) const;
+ UniqueType *evaluateSend( Compiler *pd, CodeVect &code ) const;
UniqueType *evaluateMatch( Compiler *pd, CodeVect &code ) const;
UniqueType *evaluate( Compiler *pd, CodeVect &code ) const;
void assignFieldArgs( Compiler *pd, CodeVect &code, UniqueType *replUT ) const;
@@ -2619,8 +2630,7 @@ struct LangStmt
ReturnType,
YieldType,
ForIterType,
- BreakType,
- SendType
+ BreakType
};
LangStmt()
@@ -2743,15 +2753,6 @@ struct LangStmt
return s;
}
- static LangStmt *cons( Type type, LangVarRef *varRef, ParserText *parserText )
- {
- LangStmt *s = new LangStmt;
- s->type = (type);
- s->varRef = (varRef);
- s->parserText = (parserText);
- return s;
- }
-
static LangStmt *cons( const InputLoc &loc, Type type, ObjField *objField,
TypeRef *typeRef, LangTerm *langTerm, StmtList *stmtList )
{
@@ -2775,7 +2776,6 @@ struct LangStmt
void resolve( Compiler *pd ) const;
void resolveParserItems( Compiler *pd ) const;
- void evaluateSend( Compiler *pd, CodeVect &code ) const;
LangTerm *chooseDefaultIter( Compiler *pd, LangTerm *fromVarRef ) const;
void compileWhile( Compiler *pd, CodeVect &code ) const;
void compileForIterBody( Compiler *pd, CodeVect &code, UniqueType *iterUT ) const;
diff --git a/src/resolve.cc b/src/resolve.cc
index bfb5b9d9..7ca06203 100644
--- a/src/resolve.cc
+++ b/src/resolve.cc
@@ -333,14 +333,6 @@ void LangTerm::resolve( Compiler *pd )
(*pi)->expr->resolve( pd );
}
break;
- case Parse2Type:
- typeRef->lookupType( pd );
- /* Evaluate the initialization expressions. */
- if ( fieldInitArgs != 0 ) {
- for ( FieldInitVect::Iter pi = *fieldInitArgs; pi.lte(); pi++ )
- (*pi)->expr->resolve( pd );
- }
- break;
case VarRefType:
break;
@@ -378,6 +370,18 @@ void LangTerm::resolve( Compiler *pd )
generic = parserTypeRef->generic;
break;
+ case Parse2Type:
+ typeRef->lookupType( pd );
+ /* Evaluate the initialization expressions. */
+ if ( fieldInitArgs != 0 ) {
+ for ( FieldInitVect::Iter pi = *fieldInitArgs; pi.lte(); pi++ )
+ (*pi)->expr->resolve( pd );
+ }
+ break;
+
+ case SendType:
+ break;
+
case EmbedStringType:
break;
}
@@ -500,9 +504,6 @@ void LangStmt::resolve( Compiler *pd ) const
varRef->resolve( pd );
break;
}
- case SendType: {
- break;
- }
}
}
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 8b014ffc..88bdf00c 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -1423,6 +1423,81 @@ UniqueType *LangTerm::evaluateParse2( Compiler *pd, CodeVect &code ) const
return replUT;
}
+UniqueType *LangTerm::evaluateSend( Compiler *pd, CodeVect &code ) const
+{
+ UniqueType *varUt = varRef->evaluate( pd, code );
+
+ /* Assign bind ids to the variables in the replacement. */
+ for ( ReplItemList::Iter item = *parserText->list; item.lte(); item++ ) {
+ switch ( item->type ) {
+ case ReplItem::FactorType: {
+ String result;
+ bool unusedCI;
+ prepareLitString( result, unusedCI,
+ item->factor->typeRef->pdaLiteral->token.data,
+ item->factor->typeRef->pdaLiteral->token.loc );
+
+ /* Make sure we have this string. */
+ StringMapEl *mapEl = 0;
+ if ( pd->literalStrings.insert( result, &mapEl ) )
+ mapEl->value = pd->literalStrings.length()-1;
+
+ code.append( IN_LOAD_STR );
+ code.appendWord( mapEl->value );
+ break;
+ }
+ case ReplItem::InputText: {
+ /* Make sure we have this string. */
+ StringMapEl *mapEl = 0;
+ if ( pd->literalStrings.insert( item->data, &mapEl ) )
+ mapEl->value = pd->literalStrings.length()-1;
+
+ code.append( IN_LOAD_STR );
+ code.appendWord( mapEl->value );
+ break;
+ }
+ case ReplItem::ExprType:
+ item->expr->evaluate( pd, code );
+ break;
+ }
+
+ code.append( IN_DUP_TOP_OFF );
+ code.appendHalf( 1 );
+
+ /* Not a stream. Get the input first. */
+ code.append( IN_GET_INPUT );
+ if ( pd->revertOn )
+ code.append( IN_INPUT_APPEND_WV );
+ else
+ code.append( IN_INPUT_APPEND_WC );
+ code.append( IN_POP );
+
+ code.append( IN_DUP_TOP );
+
+ /* Parse instruction, dependent on whether or not we are producing
+ * revert or commit code. */
+ if ( pd->revertOn ) {
+ code.append( IN_PARSE_SAVE_STEPS );
+ code.append( IN_PARSE_LOAD_START );
+ code.append( IN_PARSE_FRAG_WV );
+ code.appendHalf( 0 );
+ code.append( IN_PCR_CALL );
+ code.append( IN_PARSE_FRAG_WV3 );
+ }
+ else {
+ code.append( IN_PARSE_SAVE_STEPS );
+ code.append( IN_PARSE_LOAD_START );
+ code.append( IN_PARSE_FRAG_WC );
+ code.appendHalf( 0 );
+ code.append( IN_PCR_CALL );
+ code.append( IN_PARSE_FRAG_WC3 );
+ }
+ }
+
+ return varUt;
+}
+
+
UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code, bool stop ) const
{
UniqueType *ut = typeRef->uniqueType;
@@ -1658,6 +1733,8 @@ UniqueType *LangTerm::evaluate( Compiler *pd, CodeVect &code ) const
return evaluateConstruct( pd, code );
case Parse2Type:
return evaluateParse2( pd, code );
+ case SendType:
+ return evaluateSend( pd, code );
case NewType:
return evaluateNew( pd, code );
case TypeIdType: {
@@ -2181,79 +2258,6 @@ void LangStmt::compileWhile( Compiler *pd, CodeVect &code ) const
pd->curLocalFrame->iterPopScope();
}
-void LangStmt::evaluateSend( Compiler *pd, CodeVect &code ) const
-{
- varRef->evaluate( pd, code );
-
- /* Assign bind ids to the variables in the replacement. */
- for ( ReplItemList::Iter item = *parserText->list; item.lte(); item++ ) {
- switch ( item->type ) {
- case ReplItem::FactorType: {
- String result;
- bool unusedCI;
- prepareLitString( result, unusedCI,
- item->factor->typeRef->pdaLiteral->token.data,
- item->factor->typeRef->pdaLiteral->token.loc );
-
- /* Make sure we have this string. */
- StringMapEl *mapEl = 0;
- if ( pd->literalStrings.insert( result, &mapEl ) )
- mapEl->value = pd->literalStrings.length()-1;
-
- code.append( IN_LOAD_STR );
- code.appendWord( mapEl->value );
- break;
- }
- case ReplItem::InputText: {
- /* Make sure we have this string. */
- StringMapEl *mapEl = 0;
- if ( pd->literalStrings.insert( item->data, &mapEl ) )
- mapEl->value = pd->literalStrings.length()-1;
-
- code.append( IN_LOAD_STR );
- code.appendWord( mapEl->value );
- break;
- }
- case ReplItem::ExprType:
- item->expr->evaluate( pd, code );
- break;
- }
-
- code.append( IN_DUP_TOP_OFF );
- code.appendHalf( 1 );
-
- /* Not a stream. Get the input first. */
- code.append( IN_GET_INPUT );
- if ( pd->revertOn )
- code.append( IN_INPUT_APPEND_WV );
- else
- code.append( IN_INPUT_APPEND_WC );
- code.append( IN_POP );
-
- code.append( IN_DUP_TOP );
-
- /* Parse instruction, dependent on whether or not we are producing
- * revert or commit code. */
- if ( pd->revertOn ) {
- code.append( IN_PARSE_SAVE_STEPS );
- code.append( IN_PARSE_LOAD_START );
- code.append( IN_PARSE_FRAG_WV );
- code.appendHalf( 0 );
- code.append( IN_PCR_CALL );
- code.append( IN_PARSE_FRAG_WV3 );
- }
- else {
- code.append( IN_PARSE_SAVE_STEPS );
- code.append( IN_PARSE_LOAD_START );
- code.append( IN_PARSE_FRAG_WC );
- code.appendHalf( 0 );
- code.append( IN_PCR_CALL );
- code.append( IN_PARSE_FRAG_WC3 );
- }
- }
- code.append( IN_POP );
-}
-
void LangStmt::compile( Compiler *pd, CodeVect &code ) const
{
switch ( type ) {
@@ -2415,10 +2419,6 @@ void LangStmt::compile( Compiler *pd, CodeVect &code ) const
objField->refActive = false;
break;
}
- case SendType: {
- evaluateSend( pd, code );
- break;
- }
}
}