summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/colm.lm18
-rw-r--r--src/loadcolm.cc73
-rw-r--r--src/parsetree.h22
-rw-r--r--src/resolve.cc200
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;