diff options
-rw-r--r-- | src/colm.lm | 18 | ||||
-rw-r--r-- | src/loadcolm.cc | 73 | ||||
-rw-r--r-- | src/parsetree.h | 22 | ||||
-rw-r--r-- | src/resolve.cc | 200 |
4 files changed, 57 insertions, 256 deletions
diff --git a/src/colm.lm b/src/colm.lm index 461e61c3..8527cf25 100644 --- a/src/colm.lm +++ b/src/colm.lm @@ -28,12 +28,8 @@ lex token IN / 'in' / token PARSER / 'parser' | 'accum' / token LIST / 'list' / - token LIST2 / 'list2' / - token LIST2EL / 'list2el' / token LIST_EL / 'list_el' / token MAP / 'map' / - token MAP2 / 'map2' / - token MAP2EL / 'map2el' / token MAP_EL / 'map_el' / token PTR / 'ptr' / token ITER / 'iter' / @@ -249,12 +245,6 @@ def pre_eof_def def alias_def [ALIAS id type_ref] -def list_el_def - [LIST_EL id] - -def map_el_def - [MAP_EL id] - def context_item [context_var_def] :ContextVar commit | [literal_def] :Literal commit @@ -270,8 +260,6 @@ def context_item | [export_def] :Export commit | [pre_eof_def] :PreEof commit | [precedence_def] :Precedence commit -| [list_el_def] :ListEl commit -| [map_el_def] :MapEl commit def export_def [EXPORT var_def opt_def_init] @@ -568,12 +556,10 @@ def type_ref [region_qual id opt_repeat] :Id | [PTR LT region_qual id opt_repeat GT] :Ptr | [LIST LT type_ref GT] :List +| [LIST_EL LT type_ref GT] :ListEl | [MAP LT MapKeyType: type_ref MapValueType: type_ref GT] :Map +| [MAP_EL LT type_ref GT] :MapEl | [PARSER LT type_ref GT] :Parser -| [LIST2EL LT type_ref GT] :List2El -| [LIST2 LT type_ref GT] :List2 -| [MAP2EL LT type_ref GT] :Map2El -| [MAP2 LT type_ref GT] :Map2 def region_qual [region_qual id DOUBLE_COLON] :Qual diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 115c4c1e..fd02ff01 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -819,40 +819,30 @@ struct LoadColm tr = TypeRef::cons( typeRef.id().loc(), TypeRef::Ptr, inner ); break; } - case type_ref::Map: { - TypeRef *key = walkTypeRef( typeRef.MapKeyType() ); - TypeRef *value = walkTypeRef( typeRef.MapValueType() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::Map, 0, key, value ); - break; - } case type_ref::List: { TypeRef *type = walkTypeRef( typeRef._type_ref() ); tr = TypeRef::cons( typeRef.loc(), TypeRef::List, 0, type, 0 ); break; } - case type_ref::Parser: { + case type_ref::ListEl: { TypeRef *type = walkTypeRef( typeRef._type_ref() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::Parser, 0, type, 0 ); + tr = TypeRef::cons( typeRef.loc(), TypeRef::ListEl, 0, type, 0 ); break; } - case type_ref::List2El: { - TypeRef *type = walkTypeRef( typeRef._type_ref() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::List2El, 0, type, 0 ); - break; - } - case type_ref::List2: { - TypeRef *type = walkTypeRef( typeRef._type_ref() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::List2, 0, type, 0 ); + case type_ref::Map: { + TypeRef *key = walkTypeRef( typeRef.MapKeyType() ); + TypeRef *value = walkTypeRef( typeRef.MapValueType() ); + tr = TypeRef::cons( typeRef.loc(), TypeRef::Map, 0, key, value ); break; } - case type_ref::Map2El: { + case type_ref::MapEl: { TypeRef *type = walkTypeRef( typeRef._type_ref() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::Map2El, 0, type, 0 ); + tr = TypeRef::cons( typeRef.loc(), TypeRef::MapEl, 0, type, 0 ); break; } - case type_ref::Map2: { + case type_ref::Parser: { TypeRef *type = walkTypeRef( typeRef._type_ref() ); - tr = TypeRef::cons( typeRef.loc(), TypeRef::Map2, 0, type, 0 ); + tr = TypeRef::cons( typeRef.loc(), TypeRef::Parser, 0, type, 0 ); break; } } @@ -2154,43 +2144,6 @@ struct LoadColm blockClose(); } - void walkListElDef( list_el_def Def ) - { - /* - * The unique type. This is a def with a single empty form. - */ - String name = Def.id().data(); - ObjectDef *objectDef = ObjectDef::cons( ObjectDef::UserType, - name, pd->nextObjectId++ ); - - LelDefList *defList = new LelDefList; - - Production *prod = BaseParser::production( InputLoc(), - new ProdElList, String(), false, 0, 0 ); - prodAppend( defList, prod ); - - NtDef *ntDef = NtDef::cons( name, curNspace(), curContext(), false ); - BaseParser::cflDef( ntDef, objectDef, defList ); - - /* - * List element with the same name as containing context. - */ - NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() ); - String id = curContext()->objectDef->name; - RepeatType repeatType = RepeatNone; - TypeRef *objTr = TypeRef::cons( InputLoc(), nspaceQual, id, repeatType ); - TypeRef *elTr = TypeRef::cons( InputLoc(), TypeRef::List2El, 0, objTr, 0 ); - - ObjectField *of = ObjectField::cons( InputLoc(), - ObjectField::UserFieldType, elTr, name ); - contextVarDef( InputLoc(), of ); - } - - void walkMapElDef( map_el_def Def ) - { - - } - void walkContextItem( context_item contextItem ) { switch ( contextItem.prodName() ) { @@ -2236,12 +2189,6 @@ struct LoadColm case context_item::Precedence: walkPrecedenceDef( contextItem.precedence_def() ); break; - case context_item::ListEl: - walkListElDef( contextItem.list_el_def() ); - break; - case context_item::MapEl: - walkMapElDef( contextItem.map_el_def() ); - break; } } diff --git a/src/parsetree.h b/src/parsetree.h index 084e596c..ec6400e0 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -2100,14 +2100,12 @@ struct TypeRef Literal, Iterator, List, + ListEl, Map, + MapEl, Parser, Ref, Ptr, - List2El, - List2, - Map2El, - Map2, }; TypeRef() @@ -2273,24 +2271,20 @@ struct TypeRef UniqueType *resolveIterator( Compiler *pd ); UniqueType *resolveTypeName( Compiler *pd ); UniqueType *resolveTypeLiteral( Compiler *pd ); - UniqueType *resolveTypeMapObj( Compiler *pd ); - UniqueType *resolveTypeMap( Compiler *pd ); UniqueType *resolveTypeListObj( Compiler *pd ); UniqueType *resolveTypeList( Compiler *pd ); + UniqueType *resolveTypeListElObj( Compiler *pd ); + UniqueType *resolveTypeListEl( Compiler *pd ); + UniqueType *resolveTypeMapObj( Compiler *pd ); + UniqueType *resolveTypeMap( Compiler *pd ); + UniqueType *resolveTypeMapElObj( Compiler *pd ); + UniqueType *resolveTypeMapEl( Compiler *pd ); UniqueType *resolveTypeParserObj( Compiler *pd ); UniqueType *resolveTypeParser( Compiler *pd ); UniqueType *resolveType( Compiler *pd ); UniqueType *resolveTypePtr( Compiler *pd ); UniqueType *resolveTypeRef( Compiler *pd ); - UniqueType *resolveTypeList2ElObj( Compiler *pd ); - UniqueType *resolveTypeList2El( Compiler *pd ); - UniqueType *resolveTypeList2Obj( Compiler *pd ); - UniqueType *resolveTypeList2( Compiler *pd ); - UniqueType *resolveTypeMap2ElObj( Compiler *pd ); - UniqueType *resolveTypeMap2El( Compiler *pd ); - UniqueType *resolveTypeMap2Obj( Compiler *pd ); - UniqueType *resolveTypeMap2( Compiler *pd ); Type type; InputLoc loc; diff --git a/src/resolve.cc b/src/resolve.cc index c0ee07f9..92364ae7 100644 --- a/src/resolve.cc +++ b/src/resolve.cc @@ -104,45 +104,7 @@ UniqueType *TypeRef::resolveTypeLiteral( Compiler *pd ) return 0; } -UniqueType *TypeRef::resolveTypeMapObj( Compiler *pd ) -{ - nspace = pd->rootNamespace; - - UniqueType *utKey = typeRef1->resolveType( pd ); - UniqueType *utValue = typeRef2->resolveType( pd ); - - UniqueMap searchKey( utKey, utValue ); - UniqueMap *inMap = pd->uniqueMapMap.find( &searchKey ); - if ( inMap == 0 ) { - inMap = new UniqueMap( utKey, utValue ); - pd->uniqueMapMap.insert( inMap ); - - /* FIXME: Need uniqe name allocator for types. */ - static int mapId = 0; - String name( 36, "__map%d", mapId++ ); - - GenericType *generic = new GenericType( name, GEN_MAP, - pd->nextGenericId++, 0/*langEl*/, typeRef2 ); - generic->keyTypeArg = typeRef1; - - nspace->genericList.append( generic ); - - generic->declare( pd, nspace ); - - inMap->generic = generic; - } - - generic = inMap->generic; - return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); -} - -UniqueType *TypeRef::resolveTypeMap( Compiler *pd ) -{ - UniqueType *mapUt = resolveTypeMapObj( pd ); - return pd->findUniqueType( TYPE_PTR, mapUt->langEl ); -} - -UniqueType *TypeRef::resolveTypeListObj( Compiler *pd ) +UniqueType *TypeRef::resolveTypeList( Compiler *pd ) { nspace = pd->rootNamespace; @@ -169,55 +131,10 @@ UniqueType *TypeRef::resolveTypeListObj( Compiler *pd ) } generic = inMap->generic; - return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); + return pd->findUniqueType( TYPE_PTR, pd->findUniqueType( TYPE_TREE, inMap->generic->langEl )->langEl ); } -UniqueType *TypeRef::resolveTypeList( Compiler *pd ) -{ - UniqueType *listUt = resolveTypeListObj( pd ); - return pd->findUniqueType( TYPE_PTR, listUt->langEl ); -} - -UniqueType *TypeRef::resolveTypeParserObj( Compiler *pd ) -{ - nspace = pd->rootNamespace; - - UniqueType *utParse = typeRef1->resolveType( pd ); - - UniqueParser searchKey( utParse ); - UniqueParser *inMap = pd->uniqueParserMap.find( &searchKey ); - if ( inMap == 0 ) { - inMap = new UniqueParser( utParse ); - pd->uniqueParserMap.insert( inMap ); - - /* FIXME: Need uniqe name allocator for types. */ - static int accumId = 0; - String name( 36, "__accum%d", accumId++ ); - - GenericType *generic = new GenericType( name, GEN_PARSER, - pd->nextGenericId++, 0/*langEl*/, typeRef1 ); - - nspace->genericList.append( generic ); - - generic->declare( pd, nspace ); - - inMap->generic = generic; - } - - generic = inMap->generic; - return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); -} - -UniqueType *TypeRef::resolveTypeParser( Compiler *pd ) -{ - UniqueType *parserUt = resolveTypeParserObj( pd ); - return pd->findUniqueType( TYPE_PTR, parserUt->langEl ); -} - -/* - * Object-based list/map - */ -UniqueType *TypeRef::resolveTypeList2ElObj( Compiler *pd ) +UniqueType *TypeRef::resolveTypeListEl( Compiler *pd ) { nspace = pd->rootNamespace; @@ -247,65 +164,39 @@ UniqueType *TypeRef::resolveTypeList2ElObj( Compiler *pd ) return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); } -UniqueType *TypeRef::resolveTypeList2El( Compiler *pd ) -{ - UniqueType *listUt = resolveTypeList2ElObj( pd ); - return pd->findUniqueType( TYPE_PTR, listUt->langEl ); -} - -UniqueType *TypeRef::resolveTypeList2Obj( Compiler *pd ) +UniqueType *TypeRef::resolveTypeMap( Compiler *pd ) { nspace = pd->rootNamespace; - UniqueType *utValue = typeRef1->resolveType( pd ); - - /* Find the offset of the list element. */ - int off = 0; - bool found = false; - FieldList *fieldList = utValue->langEl->objectDef->fieldList; - for ( FieldList::Iter f = *fieldList; f.lte(); f++, off++ ) { - UniqueType *fUT = f->value->typeRef->resolveType( pd ); - if ( fUT->langEl->generic != 0 && - fUT->langEl->generic->typeId == GEN_LIST2EL ) - { - found = true; - break; - } - } - - if ( !found ) - error( loc ) << "cound not find list element in type ref" << endp; + UniqueType *utKey = typeRef1->resolveType( pd ); + UniqueType *utValue = typeRef2->resolveType( pd ); - UniqueList2 searchKey( utValue, off ); - UniqueList2 *inMap = pd->uniqueList2Map.find( &searchKey ); + UniqueMap searchKey( utKey, utValue ); + UniqueMap *inMap = pd->uniqueMapMap.find( &searchKey ); if ( inMap == 0 ) { - inMap = new UniqueList2( utValue, off ); - pd->uniqueList2Map.insert( inMap ); + inMap = new UniqueMap( utKey, utValue ); + pd->uniqueMapMap.insert( inMap ); /* FIXME: Need uniqe name allocator for types. */ - static int listId = 0; - String name( 36, "__list2%d", listId++ ); + static int mapId = 0; + String name( 36, "__map%d", mapId++ ); - GenericType *generic = new GenericType( name, GEN_LIST2, - pd->nextGenericId++, 0/*langEl*/, typeRef1 ); + GenericType *generic = new GenericType( name, GEN_MAP, + pd->nextGenericId++, 0/*langEl*/, typeRef2 ); + generic->keyTypeArg = typeRef1; - generic->elOffset = off; nspace->genericList.append( generic ); + generic->declare( pd, nspace ); + inMap->generic = generic; } generic = inMap->generic; - return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); + return pd->findUniqueType( TYPE_PTR, pd->findUniqueType( TYPE_TREE, inMap->generic->langEl )->langEl ); } -UniqueType *TypeRef::resolveTypeList2( Compiler *pd ) -{ - UniqueType *listUt = resolveTypeList2Obj( pd ); - return pd->findUniqueType( TYPE_PTR, listUt->langEl ); -} - -UniqueType *TypeRef::resolveTypeMap2ElObj( Compiler *pd ) +UniqueType *TypeRef::resolveTypeMapEl( Compiler *pd ) { nspace = pd->rootNamespace; @@ -335,29 +226,23 @@ UniqueType *TypeRef::resolveTypeMap2ElObj( Compiler *pd ) return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); } -UniqueType *TypeRef::resolveTypeMap2El( Compiler *pd ) -{ - UniqueType *listUt = resolveTypeMap2ElObj( pd ); - return pd->findUniqueType( TYPE_PTR, listUt->langEl ); -} - -UniqueType *TypeRef::resolveTypeMap2Obj( Compiler *pd ) +UniqueType *TypeRef::resolveTypeParser( Compiler *pd ) { nspace = pd->rootNamespace; - UniqueType *utValue = typeRef1->resolveType( pd ); + UniqueType *utParse = typeRef1->resolveType( pd ); - UniqueMap2 searchKey( utValue ); - UniqueMap2 *inMap = pd->uniqueMap2Map.find( &searchKey ); + UniqueParser searchKey( utParse ); + UniqueParser *inMap = pd->uniqueParserMap.find( &searchKey ); if ( inMap == 0 ) { - inMap = new UniqueMap2( utValue ); - pd->uniqueMap2Map.insert( inMap ); + inMap = new UniqueParser( utParse ); + pd->uniqueParserMap.insert( inMap ); /* FIXME: Need uniqe name allocator for types. */ - static int listId = 0; - String name( 36, "__map2%d", listId++ ); + static int accumId = 0; + String name( 36, "__accum%d", accumId++ ); - GenericType *generic = new GenericType( name, GEN_MAP2, + GenericType *generic = new GenericType( name, GEN_PARSER, pd->nextGenericId++, 0/*langEl*/, typeRef1 ); nspace->genericList.append( generic ); @@ -368,14 +253,9 @@ UniqueType *TypeRef::resolveTypeMap2Obj( Compiler *pd ) } generic = inMap->generic; - return pd->findUniqueType( TYPE_TREE, inMap->generic->langEl ); + return pd->findUniqueType( TYPE_PTR, pd->findUniqueType( TYPE_TREE, inMap->generic->langEl )->langEl ); } -UniqueType *TypeRef::resolveTypeMap2( Compiler *pd ) -{ - UniqueType *listUt = resolveTypeMap2Obj( pd ); - return pd->findUniqueType( TYPE_PTR, listUt->langEl ); -} /* * End object based list/map @@ -475,11 +355,17 @@ UniqueType *TypeRef::resolveType( Compiler *pd ) case Literal: uniqueType = resolveTypeLiteral( pd ); break; + case List: + uniqueType = resolveTypeList( pd ); + break; + case ListEl: + uniqueType = resolveTypeListEl( pd ); + break; case Map: uniqueType = resolveTypeMap( pd ); break; - case List: - uniqueType = resolveTypeList( pd ); + case MapEl: + uniqueType = resolveTypeMapEl( pd ); break; case Parser: uniqueType = resolveTypeParser( pd ); @@ -493,18 +379,6 @@ UniqueType *TypeRef::resolveType( Compiler *pd ) case Iterator: uniqueType = resolveIterator( pd ); break; - case List2El: - uniqueType = resolveTypeList2El( pd ); - break; - case List2: - uniqueType = resolveTypeList2( pd ); - break; - case Map2El: - uniqueType = resolveTypeMap2El( pd ); - break; - case Map2: - uniqueType = resolveTypeMap2( pd ); - break; case Unspecified: /* No lookup needed, unique type(s) set when constructed. */ break; |