diff options
-rw-r--r-- | colm/compile.cpp | 34 | ||||
-rw-r--r-- | colm/lmparse.kl | 19 | ||||
-rw-r--r-- | colm/parsedata.h | 1 | ||||
-rw-r--r-- | colm/parsetree.h | 9 |
4 files changed, 48 insertions, 15 deletions
diff --git a/colm/compile.cpp b/colm/compile.cpp index 2a9b810e..5fce43ce 100644 --- a/colm/compile.cpp +++ b/colm/compile.cpp @@ -1861,6 +1861,7 @@ void ParseData::addProdRedObjectVar( ObjectDef *localFrame, KlangEl *nonTerm ) initLocalInstructions( el ); localFrame->objFieldMap->insert( el->name, el ); + localFrame->objFieldList->append( el ); } void ParseData::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList ) @@ -1884,6 +1885,7 @@ void ParseData::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList ) el->inGetR = IN_GET_LOCAL_R; localFrame->objFieldMap->insert( el->name, el ); + localFrame->objFieldList->append( el ); } } } @@ -1901,6 +1903,7 @@ void ParseData::addMatchLength( ObjectDef *frame, KlangEl *lel ) el->useOffset = false; el->inGetR = IN_GET_MATCH_LENGTH_R; frame->objFieldMap->insert( el->name, el ); + frame->objFieldList->append( el ); } void ParseData::addMatchText( ObjectDef *frame, KlangEl *lel ) @@ -1916,6 +1919,7 @@ void ParseData::addMatchText( ObjectDef *frame, KlangEl *lel ) el->useOffset = false; el->inGetR = IN_GET_MATCH_TEXT_R; frame->objFieldMap->insert( el->name, el ); + frame->objFieldList->append( el ); } void ParseData::initFieldInstructions( ObjField *el ) @@ -1944,9 +1948,10 @@ void ParseData::initLocalRefInstructions( ObjField *el ) void ParseData::initIntObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; intObj = new ObjectDef( ObjectDef::BuiltinType, "int", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); intKlangEl->objectDef = intObj; initFunction( uniqueTypeStr, intObj, "to_string", IN_INT_TO_STR, IN_INT_TO_STR, true ); @@ -1966,14 +1971,16 @@ void ParseData::addLengthField( ObjectDef *objDef, Code getLength ) el->inGetR = getLength; objDef->objFieldMap->insert( el->name, el ); + objDef->objFieldList->append( el ); } void ParseData::initStrObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; strObj = new ObjectDef( ObjectDef::BuiltinType, "str", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); strKlangEl->objectDef = strObj; initFunction( uniqueTypeInt, strObj, "atoi", IN_STR_ATOI, IN_STR_ATOI, true ); @@ -1989,9 +1996,10 @@ void ParseData::initStrObject( ) void ParseData::initStreamObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; streamObj = new ObjectDef( ObjectDef::BuiltinType, "stream", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); streamKlangEl->objectDef = streamObj; // initFunction( uniqueTypeInt, strObj, "atoi", IN_STR_ATOI, IN_STR_ATOI, true ); @@ -2043,15 +2051,18 @@ void ParseData::initTokenObjects( ) { /* Make a default object Definition. */ ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; - tokenObj = new ObjectDef( ObjectDef::BuiltinType, "token", fieldMap, + tokenObj = new ObjectDef( ObjectDef::BuiltinType, "token", fieldMap, fieldList, methodMap, nextObjectId++ ); ObjField *dataEl = makeDataEl(); tokenObj->objFieldMap->insert( dataEl->name, dataEl ); + tokenObj->objFieldList->append( dataEl ); ObjField *posEl = makePosEl(); tokenObj->objFieldMap->insert( posEl->name, posEl ); + tokenObj->objFieldList->append( posEl ); /* Give all user terminals the token object type. */ @@ -2063,10 +2074,12 @@ void ParseData::initTokenObjects( ) /* Create the "data" field. */ ObjField *dataEl = makeDataEl(); lel->objectDef->objFieldMap->insert( dataEl->name, dataEl ); + lel->objectDef->objFieldList->append( dataEl ); /* Create the "pos" field. */ ObjField *posEl = makePosEl(); lel->objectDef->objFieldMap->insert( posEl->name, posEl ); + lel->objectDef->objFieldList->append( posEl ); } } } @@ -2305,13 +2318,13 @@ void ParseData::initAllLanguageObjects() ObjectDef *obj = lel->objectDef; if ( obj != 0 ) { /* Init all fields of the object. */ - for ( ObjFieldMap::Iter f = *obj->objFieldMap; f.lte(); f++ ) + for ( ObjFieldList::Iter f = *obj->objFieldList; f.lte(); f++ ) obj->initField( this, f->value ); } } /* Init all fields of the global object. */ - for ( ObjFieldMap::Iter f = *globalObjectDef->objFieldMap; f.lte(); f++ ) + for ( ObjFieldList::Iter f = *globalObjectDef->objFieldList; f.lte(); f++ ) globalObjectDef->initField( this, f->value ); } @@ -2356,6 +2369,7 @@ void ParseData::initListField( GenericType *gen, const char *name, int offset ) el->inSetWV = IN_SET_LIST_MEM_WV; gen->objDef->objFieldMap->insert( el->name, el ); + gen->objDef->objFieldList->append( el ); el->useOffset = true; el->beenReferenced = true; @@ -2391,9 +2405,10 @@ void ParseData::resolveGenericTypes() gen->keyUT = gen->keyTypeArg->lookupType( this ); ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; gen->objDef = new ObjectDef( ObjectDef::BuiltinType, - gen->name, fieldMap, methodMap, nextObjectId++ ); + gen->name, fieldMap, fieldList, methodMap, nextObjectId++ ); switch ( gen->typeId ) { case GEN_MAP: @@ -2429,6 +2444,7 @@ void ParseData::makeFuncVisible( Function *func, bool isUserIter ) error(param->loc) << "parameter " << param->name << " redeclared" << endp; func->localFrame->objFieldMap->insert( param->name, param ); + func->localFrame->objFieldList->append( param ); param->beenInitialized = true; param->pos = paramPos; @@ -2447,7 +2463,6 @@ void ParseData::makeFuncVisible( Function *func, bool isUserIter ) * words containing the args. */ long paramOffset = 0; for ( ParameterList::Iter param = *func->paramList; param.lte(); param++ ) { - /* Moving downward, and need the offset to point to the lower half of * the argument. */ paramOffset -= sizeOfField( paramUTs[param->pos] ); @@ -2649,6 +2664,7 @@ void ParseData::addStdin() el->useOffset = false; el->inGetR = IN_GET_STDIN; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::addStdout() @@ -2664,6 +2680,7 @@ void ParseData::addStdout() el->useOffset = false; el->inGetR = IN_GET_STDOUT; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::addStderr() @@ -2679,6 +2696,7 @@ void ParseData::addStderr() el->useOffset = false; el->inGetR = IN_GET_STDERR; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::initGlobalFunctions() diff --git a/colm/lmparse.kl b/colm/lmparse.kl index 04e64d65..6f974c21 100644 --- a/colm/lmparse.kl +++ b/colm/lmparse.kl @@ -88,7 +88,8 @@ block_open: '{' final { /* Init the object representing the local frame. */ $$->localFrame = new ObjectDef( ObjectDef::FrameType, - "local", new ObjFieldMap(), new ObjMethodMap(), pd->nextObjectId++ ); + "local", new ObjFieldMap(), new ObjFieldList, + new ObjMethodMap(), pd->nextObjectId++ ); pd->curLocalFrame = $$->localFrame; }; @@ -239,6 +240,7 @@ global_def: KW_Global var_def opt_def_init error($2->objField->loc) << "object field renamed" << endp; globalObj->objFieldMap->insert( $2->objField->name, $2->objField ); + globalObj->objFieldList->append( $2->objField ); if ( $3->expr != 0 ) { LangVarRef *varRef = new LangVarRef( $2->objField->loc, @@ -296,7 +298,7 @@ cfl_def: cfl_def_head obj_var_list properties_list cfl_prod_list /* Make a new object definition. */ ObjectDef *objectDef = new ObjectDef( ObjectDef::UserType, curDefineId, - pd->objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + pd->objFieldMap, pd->objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); langEl->objectDef = objectDef; }; @@ -360,11 +362,13 @@ obj_var_list: obj_var_list var_def error() << "object field renamed" << endp; pd->objFieldMap->insert( $2->objField->name, $2->objField ); + pd->objFieldList->append( $2->objField ); }; obj_var_list: final { pd->objFieldMap = new ObjFieldMap; + pd->objFieldList = new ObjFieldList; }; @@ -487,6 +491,7 @@ pattern_el: opt_label pattern_el_type_or_lit /* Insert it into the field map. */ pd->curLocalFrame->objFieldMap->insert( $1->varRef->name, objField ); + pd->curLocalFrame->objFieldList->append( objField ); } }; @@ -739,7 +744,7 @@ token_def: /* Create the object def for the token. */ ObjectDef *objectDef = new ObjectDef( ObjectDef::UserType, name, - pd->objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + pd->objFieldMap, pd->objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); tokEl->objectDef = objectDef; @@ -973,6 +978,7 @@ statement: var_def opt_def_init /* Insert it into the field map. */ pd->curLocalFrame->objFieldMap->insert( $1->objField->name, $1->objField ); + pd->curLocalFrame->objFieldList->append( $1->objField ); if ( $2->expr != 0 ) { LangVarRef *varRef = new LangVarRef( $1->objField->loc, @@ -1025,6 +1031,7 @@ statement: KW_For TK_Word ':' type_ref KW_In iter_call block_or_single * to the iterator that is called. This lookup is done at compile time. */ ObjField *iterField = new ObjField( $2->loc, (TypeRef*)0, $2->data ); pd->curLocalFrame->objFieldMap->insert( $2->data, iterField ); + pd->curLocalFrame->objFieldList->append( iterField ); $$->stmt = new LangStmt( $1->loc, LangStmt::ForIterType, iterField, $4->typeRef, $6->langTerm, $7->stmtList ); @@ -1639,6 +1646,7 @@ factor_with_label: /* Insert it into the map. */ pd->objFieldMap->insert( $1->data, objField ); + pd->objFieldList->append( objField ); /* Create the enter and leaving actions that will mark the substring. */ Action *enter = new Action( MarkMark, pd->nextMatchEndNum++ ); @@ -2001,8 +2009,9 @@ void Parser::init() /* Set up the global object. */ String global = "global"; ObjFieldMap *objFieldMap = new ObjFieldMap; + ObjFieldList *objFieldList = new ObjFieldList; pd->globalObjectDef = new ObjectDef( ObjectDef::UserType, global, - objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + objFieldMap, objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); /* The eofTokenRegion defaults to the root region. */ pd->eofTokenRegion = rootRegion; @@ -2014,7 +2023,7 @@ void Parser::init() pd->initGraphDict(); pd->rootLocalFrame = new ObjectDef( ObjectDef::FrameType, - "local", new ObjFieldMap(), new ObjMethodMap(), + "local", new ObjFieldMap(), new ObjFieldList(), new ObjMethodMap(), pd->nextObjectId++ ); pd->curLocalFrame = pd->rootLocalFrame; diff --git a/colm/parsedata.h b/colm/parsedata.h index 93fe2de0..8d4dcb23 100644 --- a/colm/parsedata.h +++ b/colm/parsedata.h @@ -916,6 +916,7 @@ struct ParseData long nextLabelId; ObjFieldMap *objFieldMap; + ObjFieldList *objFieldList; bool revertOn; diff --git a/colm/parsetree.h b/colm/parsetree.h index 86f81e7f..87880364 100644 --- a/colm/parsetree.h +++ b/colm/parsetree.h @@ -30,6 +30,7 @@ #include "bstset.h" #include "vector.h" #include "dlist.h" +#include "dlistval.h" #include "astring.h" #include "bytecode.h" #include "avlbasic.h" @@ -1247,6 +1248,8 @@ struct ObjField typedef AvlMap<String, ObjField*, CmpStr> ObjFieldMap; typedef AvlMapEl<String, ObjField*> ObjFieldMapEl; +typedef DListVal<ObjField*> ObjFieldList; + typedef DList<ObjField> ParameterList; struct TemplateType; @@ -1261,14 +1264,16 @@ struct ObjectDef }; ObjectDef( Type type, String name, - ObjFieldMap *objFieldMap, ObjMethodMap *objMethodMap, int id ) + ObjFieldMap *objFieldMap, ObjFieldList *objFieldList, + ObjMethodMap *objMethodMap, int id ) : - type(type), name(name), objFieldMap(objFieldMap), + type(type), name(name), objFieldMap(objFieldMap), objFieldList(objFieldList), objMethodMap(objMethodMap), id(id), nextOffset(0) {} Type type; String name; ObjFieldMap *objFieldMap; + ObjFieldList *objFieldList; ObjMethodMap *objMethodMap; long id; |