summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2009-03-01 03:44:49 +0000
committerAdrian Thurston <thurston@complang.org>2009-03-01 03:44:49 +0000
commitd7884f1080497f0432dbe7b6226c5294c5a98f9b (patch)
tree67f4fb73b0d29cc5ebadc469db23ff23aad4ddc1
parentf067b4e5d7039c37e6cfb199d442862c0819b889 (diff)
downloadcolm-d7884f1080497f0432dbe7b6226c5294c5a98f9b.tar.gz
Added objFieldList so that object attributes have their offets ordered as they
appear. Otherwise the args to make_token need to be sorted according to the alphabetical sort of the attribute names. Also, debugging gets harder with an alphabetical sort and this has caused me problems on more than one occation.
-rw-r--r--colm/compile.cpp34
-rw-r--r--colm/lmparse.kl19
-rw-r--r--colm/parsedata.h1
-rw-r--r--colm/parsetree.h9
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;