diff options
author | Adrian Thurston <thurston@complang.org> | 2014-01-05 18:23:00 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2014-01-05 18:23:00 -0500 |
commit | f77092c630833e09cf34fe9552c6b3d39ec0482c (patch) | |
tree | 2d3859b0814440c8260949c70c88ff27e7edbf6b | |
parent | 382c1b3c45587fcb3d3b7dfc82d58dc7c0c096e8 (diff) | |
download | colm-f77092c630833e09cf34fe9552c6b3d39ec0482c.tar.gz |
removed curScope from ObjectDef, track it in BaseParser
-rw-r--r-- | src/declare.cc | 61 | ||||
-rw-r--r-- | src/loadcolm.cc | 8 | ||||
-rw-r--r-- | src/parser.cc | 57 | ||||
-rw-r--r-- | src/parser.h | 1 | ||||
-rw-r--r-- | src/parsetree.h | 9 |
5 files changed, 69 insertions, 67 deletions
diff --git a/src/declare.cc b/src/declare.cc index aa42beb4..5ee113fc 100644 --- a/src/declare.cc +++ b/src/declare.cc @@ -49,30 +49,30 @@ void Compiler::initUniqueTypes( ) ObjectField *ObjNameScope::checkRedecl( const String &name ) { - return owner->checkRedecl( name ); + return owner->checkRedecl( this, name ); } void ObjNameScope::insertField( const String &name, ObjectField *value ) { - return owner->insertField( name, value ); + return owner->insertField( this, name, value ); } -ObjectField *ObjectDef::checkRedecl( const String &name ) +ObjectField *ObjectDef::checkRedecl( ObjNameScope *inScope, const String &name ) { - ObjFieldMapEl *objDefMapEl = curScope->objFieldMap->find( name ); + ObjFieldMapEl *objDefMapEl = inScope->objFieldMap->find( name ); if ( objDefMapEl != 0 ) return objDefMapEl->value; return 0; } -void ObjectDef::insertField( const String &name, ObjectField *value ) +void ObjectDef::insertField( ObjNameScope *inScope, const String &name, ObjectField *value ) { - curScope->objFieldMap->insert( name, value ); + inScope->objFieldMap->insert( name, value ); objFieldList->append( value ); - value->scope = curScope; + value->scope = inScope; } -void ObjectDef::pushScope() +ObjNameScope *ObjectDef::pushScope( ObjNameScope *curScope ) { ObjNameScope *newScope = new ObjNameScope; newScope->objFieldMap = new ObjFieldMap; @@ -81,7 +81,7 @@ void ObjectDef::pushScope() newScope->parentScope = curScope; curScope->children.append( newScope ); - curScope = newScope; + return newScope; } void LexJoin::varDecl( Compiler *pd, TokenDef *tokenDef ) @@ -124,13 +124,13 @@ void LexTerm::varDecl( Compiler *pd, TokenDef *tokenDef ) void LexFactorAug::varDecl( Compiler *pd, TokenDef *tokenDef ) { for ( ReCaptureVect::Iter re = reCaptureVect; re.lte(); re++ ) { - if ( tokenDef->objectDef->checkRedecl( re->objField->name ) != 0 ) { + if ( tokenDef->objectDef->rootScope->checkRedecl( re->objField->name ) != 0 ) { error(re->objField->loc) << "label name \"" << re->objField->name << "\" already in use" << endp; } /* Insert it into the map. */ - tokenDef->objectDef->insertField( re->objField->name, re->objField ); + tokenDef->objectDef->rootScope->insertField( re->objField->name, re->objField ); /* Store it in the TokenDef. */ tokenDef->reCaptureVect.append( *re ); @@ -254,7 +254,7 @@ void Compiler::addProdRedObjectVar( ObjectDef *localFrame, LangEl *nonTerm ) initLocalInstructions( el ); - localFrame->insertField( el->name, el ); + localFrame->rootScope->insertField( el->name, el ); } void Compiler::addProdLHSLoad( Production *prod, CodeVect &code, long &insertPos ) @@ -309,7 +309,7 @@ void Compiler::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList ) /* Only ever fetch for reading since they are constant. */ el->inGetR = IN_GET_LOCAL_R; - localFrame->insertField( el->name, el ); + localFrame->rootScope->insertField( el->name, el ); } } } @@ -721,7 +721,7 @@ void Compiler::addMatchLength( ObjectDef *frame, LangEl *lel ) el->isConst = true; el->useOffset = false; el->inGetR = IN_GET_MATCH_LENGTH_R; - frame->insertField( el->name, el ); + frame->rootScope->insertField( el->name, el ); } void Compiler::addMatchText( ObjectDef *frame, LangEl *lel ) @@ -736,7 +736,7 @@ void Compiler::addMatchText( ObjectDef *frame, LangEl *lel ) el->isConst = true; el->useOffset = false; el->inGetR = IN_GET_MATCH_TEXT_R; - frame->insertField( el->name, el ); + frame->rootScope->insertField( el->name, el ); } void Compiler::addInput( ObjectDef *frame ) @@ -754,7 +754,7 @@ void Compiler::addInput( ObjectDef *frame ) el->inGetR = IN_LOAD_INPUT_R; el->inGetWV = IN_LOAD_INPUT_WV; el->inGetWC = IN_LOAD_INPUT_WC; - frame->insertField( el->name, el ); + frame->rootScope->insertField( el->name, el ); } void Compiler::addCtx( ObjectDef *frame ) @@ -772,7 +772,7 @@ void Compiler::addCtx( ObjectDef *frame ) el->inGetR = IN_LOAD_CTX_R; el->inGetWV = IN_LOAD_CTX_WV; el->inGetWC = IN_LOAD_CTX_WC; - frame->insertField( el->name, el ); + frame->rootScope->insertField( el->name, el ); } void Compiler::initIntObject( ) @@ -903,10 +903,9 @@ void Compiler::addLengthField( ObjectDef *objDef, Code getLength ) el->useOffset = false; el->inGetR = getLength; - objDef->insertField( el->name, el ); + objDef->rootScope->insertField( el->name, el ); } - void Compiler::initTokenObjects( ) { /* Give all user terminals the token object type. */ @@ -915,15 +914,15 @@ void Compiler::initTokenObjects( ) if ( lel->objectDef != 0 ) { /* Create the "data" field. */ ObjectField *dataEl = makeDataEl(); - lel->objectDef->insertField( dataEl->name, dataEl ); + lel->objectDef->rootScope->insertField( dataEl->name, dataEl ); /* Create the "pos" field. */ ObjectField *posEl = makePosEl(); - lel->objectDef->insertField( posEl->name, posEl ); + lel->objectDef->rootScope->insertField( posEl->name, posEl ); /* Create the "line" field. */ ObjectField *lineEl = makeLineEl(); - lel->objectDef->insertField( lineEl->name, lineEl ); + lel->objectDef->rootScope->insertField( lineEl->name, lineEl ); } } } @@ -969,7 +968,7 @@ void Compiler::addStdin() el->inGetR = IN_GET_STDIN; el->inGetWC = IN_GET_STDIN; el->inGetWV = IN_GET_STDIN; - globalObjectDef->insertField( el->name, el ); + globalObjectDef->rootScope->insertField( el->name, el ); } void Compiler::addStdout() @@ -986,7 +985,7 @@ void Compiler::addStdout() el->inGetR = IN_GET_STDOUT; el->inGetWC = IN_GET_STDOUT; el->inGetWV = IN_GET_STDOUT; - globalObjectDef->insertField( el->name, el ); + globalObjectDef->rootScope->insertField( el->name, el ); } void Compiler::addStderr() @@ -1003,7 +1002,7 @@ void Compiler::addStderr() el->inGetR = IN_GET_STDERR; el->inGetWC = IN_GET_STDERR; el->inGetWV = IN_GET_STDERR; - globalObjectDef->insertField( el->name, el ); + globalObjectDef->rootScope->insertField( el->name, el ); } void Compiler::addArgv() @@ -1012,7 +1011,7 @@ void Compiler::addArgv() ObjectField *el = ObjectField::cons( internal, argvTypeRef, "argv" ); el->isArgv = true; el->isConst = true; - globalObjectDef->insertField( el->name, el ); + globalObjectDef->rootScope->insertField( el->name, el ); } void Compiler::addError() @@ -1029,7 +1028,7 @@ void Compiler::addError() el->inGetR = IN_GET_ERROR; el->inGetWC = IN_GET_ERROR; el->inGetWV = IN_GET_ERROR; - globalObjectDef->insertField( el->name, el ); + globalObjectDef->rootScope->insertField( el->name, el ); } int Compiler::argvOffset() @@ -1085,7 +1084,7 @@ void Compiler::initListField( GenericType *gen, const char *name, int offset ) el->inSetWC = IN_SET_LIST_MEM_WC; el->inSetWV = IN_SET_LIST_MEM_WV; - gen->objDef->insertField( el->name, el ); + gen->objDef->rootScope->insertField( el->name, el ); el->useOffset = true; el->beenReferenced = true; @@ -1131,7 +1130,7 @@ void Compiler::initParserField( GenericType *gen, const char *name, int offset, el->inSetWC = IN_SET_PARSER_MEM_WC; el->inSetWV = IN_SET_PARSER_MEM_WV; - gen->objDef->insertField( el->name, el ); + gen->objDef->rootScope->insertField( el->name, el ); el->useOffset = true; el->beenReferenced = true; @@ -1157,7 +1156,7 @@ void Compiler::initCtxField( GenericType *gen ) el->inSetWC = IN_SET_PARSER_CTX_WC; el->inSetWV = IN_SET_PARSER_CTX_WV; - gen->objDef->insertField( el->name, el ); + gen->objDef->rootScope->insertField( el->name, el ); el->useOffset = false; el->beenReferenced = true; @@ -1189,7 +1188,7 @@ void Compiler::makeFuncVisible( Function *func, bool isUserIter ) if ( func->localFrame->rootScope->findField( param->name ) != 0 ) error(param->loc) << "parameter " << param->name << " redeclared" << endp; - func->localFrame->insertField( param->name, param ); + func->localFrame->rootScope->insertField( param->name, param ); param->beenInitialized = true; param->pos = paramPos; diff --git a/src/loadcolm.cc b/src/loadcolm.cc index f06b2597..c6be2c49 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -228,7 +228,7 @@ struct LoadColm IterCall *iterCall = walkIterCall( Statement.iter_call() ); stmt = forScope( Statement.id().loc(), forDecl, - curLocalFrame->curScope, typeRef, iterCall, stmtList ); + curScope, typeRef, iterCall, stmtList ); popScope(); break; @@ -429,7 +429,7 @@ struct LoadColm if ( optLabel.prodName() == opt_label::_Id ) { String id = optLabel.id().data(); varRef = LangVarRef::cons( optLabel.id().loc(), - context, curLocalFrame->curScope, id ); + context, curScope, id ); } return varRef; } @@ -1157,7 +1157,7 @@ struct LoadColm QualItemVect *qualItemVect = walkQual( Qual ); String id = varRef.id().data(); LangVarRef *langVarRef = LangVarRef::cons( varRef.id().loc(), - context, curLocalFrame->curScope, qualItemVect, id ); + context, curScope, qualItemVect, id ); return langVarRef; } @@ -1814,7 +1814,7 @@ struct LoadColm case iter_call::_Id: { String tree = Tree.id().data(); LangVarRef *varRef = LangVarRef::cons( Tree.id().loc(), - context, curLocalFrame->curScope, tree ); + context, curScope, tree ); LangTerm *langTerm = LangTerm::cons( Tree.id().loc(), LangTerm::VarRefType, varRef ); LangExpr *langExpr = LangExpr::cons( langTerm ); diff --git a/src/parser.cc b/src/parser.cc index 8820475c..586aefe2 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -52,6 +52,7 @@ void BaseParser::init() pd->rootLocalFrame = ObjectDef::cons( ObjectDef::FrameType, "local", pd->nextObjectId++ ); curLocalFrame = pd->rootLocalFrame; + curScope = pd->rootLocalFrame->rootScope; /* Declarations of internal types. They must be declared now because we use * them directly, rather than via type lookup. */ @@ -345,12 +346,14 @@ ObjectDef *BaseParser::blockOpen() "local", pd->nextObjectId++ ); curLocalFrame = frame; + curScope = frame->rootScope; return frame; } void BaseParser::blockClose() { curLocalFrame = pd->rootLocalFrame; + curScope = pd->rootLocalFrame->rootScope; } void BaseParser::functionDef( StmtList *stmtList, ObjectDef *localFrame, @@ -387,14 +390,14 @@ LangStmt *BaseParser::globalDef( ObjectField *objField, LangExpr *expr, object = context->contextObjDef; } - if ( object->checkRedecl( objField->name ) != 0 ) + if ( object->rootScope->checkRedecl( objField->name ) != 0 ) error(objField->loc) << "object field renamed" << endp; - object->insertField( objField->name, objField ); + object->rootScope->insertField( objField->name, objField ); if ( expr != 0 ) { LangVarRef *varRef = LangVarRef::cons( objField->loc, - context, curLocalFrame->curScope, objField->name ); + context, curScope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); @@ -418,14 +421,14 @@ void BaseParser::cflDef( NtDef *ntDef, ObjectDef *objectDef, LelDefList *defList /* If there is a capture, create the field. */ if ( pel->captureField != 0 ) { /* Might already exist. */ - ObjectField *newOf = objectDef->checkRedecl( pel->captureField->name ); + ObjectField *newOf = objectDef->rootScope->checkRedecl( pel->captureField->name ); if ( newOf != 0 ) { /* FIXME: check the types are the same. */ } else { newOf = pel->captureField; newOf->typeRef = pel->typeRef; - objectDef->insertField( newOf->name, newOf ); + objectDef->rootScope->insertField( newOf->name, newOf ); } newOf->isRhsGet = true; @@ -572,7 +575,7 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj LangVarRef *varRef = 0; if ( objField != 0 ) { varRef = LangVarRef::cons( objField->loc, - context, curLocalFrame->curScope, objField->name ); + context, curScope, objField->name ); } /* The typeref for the parser. */ @@ -588,14 +591,14 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj /* Check for redeclaration. */ if ( objField != 0 ) { - if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) { + if ( curScope->checkRedecl( objField->name ) != 0 ) { error( objField->loc ) << "variable " << objField->name << " redeclared" << endp; } /* Insert it into the field map. */ objField->typeRef = typeRef; - curLocalFrame->insertField( objField->name, objField ); + curScope->insertField( objField->name, objField ); } return expr; @@ -607,7 +610,7 @@ PatternItemList *BaseParser::consPatternEl( LangVarRef *varRef, PatternItemList list->head->varRef = varRef; if ( varRef != 0 ) { - if ( curLocalFrame->checkRedecl( varRef->name ) != 0 ) { + if ( curScope->checkRedecl( varRef->name ) != 0 ) { error( varRef->loc ) << "variable " << varRef->name << " redeclared" << endp; } @@ -616,7 +619,7 @@ PatternItemList *BaseParser::consPatternEl( LangVarRef *varRef, PatternItemList ObjectField *objField = ObjectField::cons( InputLoc(), typeRef, varRef->name ); /* Insert it into the field map. */ - curLocalFrame->insertField( varRef->name, objField ); + curScope->insertField( varRef->name, objField ); } return list; @@ -673,14 +676,14 @@ LangStmt *BaseParser::forScope( const InputLoc &loc, const String &data, Context *context = contextStack.length() == 0 ? 0 : contextStack.top(); /* Check for redeclaration. */ - if ( curLocalFrame->checkRedecl( data ) != 0 ) + if ( curScope->checkRedecl( data ) != 0 ) error( loc ) << "variable " << data << " redeclared" << endp; /* Note that we pass in a null type reference. This type is dependent on * the result of the iter_call lookup since it must contain a reference to * the iterator that is called. This lookup is done at compile time. */ ObjectField *iterField = ObjectField::cons( loc, (TypeRef*)0, data ); - curLocalFrame->insertField( data, iterField ); + curScope->insertField( data, iterField ); LangStmt *stmt = LangStmt::cons( loc, LangStmt::ForIterType, iterField, typeRef, iterCall, stmtList, context, scope ); @@ -749,10 +752,10 @@ Production *BaseParser::production( const InputLoc &loc, ProdElList *prodElList, void BaseParser::objVarDef( ObjectDef *objectDef, ObjectField *objField ) { - if ( objectDef->checkRedecl( objField->name ) != 0 ) + if ( objectDef->rootScope->checkRedecl( objField->name ) != 0 ) error() << "object field renamed" << endp; - objectDef->insertField( objField->name, objField ); + objectDef->rootScope->insertField( objField->name, objField ); } LelDefList *BaseParser::prodAppend( LelDefList *defList, Production *definition ) @@ -775,7 +778,7 @@ LangExpr *BaseParser::construct( const InputLoc &loc, ObjectField *objField, LangVarRef *varRef = 0; if ( objField != 0 ) { varRef = LangVarRef::cons( objField->loc, - context, curLocalFrame->curScope, objField->name ); + context, curScope, objField->name ); } LangExpr *expr = LangExpr::cons( LangTerm::cons( loc, LangTerm::ConstructType, @@ -783,14 +786,14 @@ LangExpr *BaseParser::construct( const InputLoc &loc, ObjectField *objField, /* Check for redeclaration. */ if ( objField != 0 ) { - if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) { + if ( curScope->checkRedecl( objField->name ) != 0 ) { error( objField->loc ) << "variable " << objField->name << " redeclared" << endp; } /* Insert it into the field map. */ objField->typeRef = typeRef; - curLocalFrame->insertField( objField->name, objField ); + curScope->insertField( objField->name, objField ); } return expr; @@ -818,19 +821,19 @@ LangStmt *BaseParser::varDef( ObjectField *objField, Context *context = contextStack.length() == 0 ? 0 : contextStack.top(); /* Check for redeclaration. */ - if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) { + if ( curScope->checkRedecl( objField->name ) != 0 ) { error( objField->loc ) << "variable " << objField->name << " redeclared" << endp; } /* Insert it into the field map. */ - curLocalFrame->insertField( objField->name, objField ); + curScope->insertField( objField->name, objField ); //cout << "var def " << $1->objField->name << endl; if ( expr != 0 ) { LangVarRef *varRef = LangVarRef::cons( objField->loc, - context, curLocalFrame->curScope, objField->name ); + context, curScope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); } @@ -847,15 +850,15 @@ LangStmt *BaseParser::exportStmt( ObjectField *objField, LangStmt::Type assignTy ObjectDef *object = pd->globalObjectDef; - if ( object->checkRedecl( objField->name ) != 0 ) + if ( object->rootScope->checkRedecl( objField->name ) != 0 ) error(objField->loc) << "object field renamed" << endp; - object->insertField( objField->name, objField ); + object->rootScope->insertField( objField->name, objField ); objField->isExport = true; if ( expr != 0 ) { LangVarRef *varRef = LangVarRef::cons( objField->loc, - 0, curLocalFrame->curScope, objField->name ); + 0, curScope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); } @@ -887,10 +890,10 @@ void BaseParser::contextVarDef( const InputLoc &loc, ObjectField *objField ) objField->context = context; object = context->contextObjDef; - if ( object->checkRedecl( objField->name ) != 0 ) + if ( object->rootScope->checkRedecl( objField->name ) != 0 ) error(objField->loc) << "object field renamed" << endp; - object->insertField( objField->name, objField ); + object->rootScope->insertField( objField->name, objField ); } void BaseParser::contextHead( const InputLoc &loc, const String &data ) @@ -965,10 +968,10 @@ void BaseParser::precedenceStmt( PredType predType, PredDeclList *predDeclList ) void BaseParser::pushScope() { - curLocalFrame->pushScope(); + curScope = curLocalFrame->pushScope( curScope ); } void BaseParser::popScope() { - curLocalFrame->curScope = curLocalFrame->curScope->parentScope; + curScope = curScope->parentScope; } diff --git a/src/parser.h b/src/parser.h index 156a0791..3eec64ce 100644 --- a/src/parser.h +++ b/src/parser.h @@ -43,6 +43,7 @@ struct BaseParser NamespaceVect namespaceStack; ContextStack contextStack; ObjectDef *curLocalFrame; + ObjNameScope *curScope; bool enterRl; diff --git a/src/parsetree.h b/src/parsetree.h index fbe3395b..56e3fa90 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -2421,7 +2421,7 @@ struct ObjectDef o->name = name; o->id = id; - o->rootScope = o->curScope = new ObjNameScope; + o->rootScope = new ObjNameScope; o->rootScope->owner = o; o->rootScope->objFieldMap = new ObjFieldMap; @@ -2437,9 +2437,8 @@ struct ObjectDef ObjMethodMap *objMethodMap; ObjNameScope *rootScope; - ObjNameScope *curScope; - void pushScope(); + ObjNameScope *pushScope( ObjNameScope *curScope ); long id; long nextOffset; @@ -2449,10 +2448,10 @@ struct ObjectDef void referenceField( Compiler *pd, ObjectField *field ); void initField( Compiler *pd, ObjectField *field ); void createCode( Compiler *pd, CodeVect &code ); - ObjectField *checkRedecl( const String &name ); ObjMethod *findMethod( const String &name ) const; ObjectField *findFieldInScope( const ObjNameScope *scope, const String &name ) const; - void insertField( const String &name, ObjectField *value ); + ObjectField *checkRedecl( ObjNameScope *inScope, const String &name ); + void insertField( ObjNameScope *inScope, const String &name, ObjectField *value ); void resolve( Compiler *pd ); ObjectField *findFieldNum( long offset ); |