Registry{ (@ private Hashtable typeMap; private Hashtable entityMap; private Hashtable categoryTypeMap; private Hashtable categoryMap; @) init (@ typeMap = new Hashtable(); set_types(new TypeList()); entityMap = new Hashtable(); set_entities(new EntityList()); categoryTypeMap = new Hashtable(); categoryMap = new Hashtable(); set_categories(new CategoryList()); @) (@ private Entity get_entity(EntityName name) throws ParseError { Entity entity = (Entity)(entityMap.get(name.get_value())); if( entity == null) throw new ParseError("Undefined Entity: "+name); return entity; } private void put_entity(Entity entity) throws ParseError { String key = entity.get_name().get_value(); if( entityMap.contains(key)) throw new ParseError("Duplicate Entity: "+key); entityMap.put(key,entity); } private CodeCategoryType get_categoryType(String name) throws ParseError { CodeCategoryType ctype = (CodeCategoryType)(categoryTypeMap.get(name)); if( ctype == null) throw new ParseError("Undefined Code Category Type: "+name); return ctype; } private void put_categoryType(CodeCategoryType ctype) throws ParseError { String key = ctype.get_name(); if( categoryTypeMap.contains(key)) throw new ParseError("Duplicate Code Category Type "+key); categoryTypeMap.put(key,ctype); } private CodeCategory get_category(String name) throws ParseError { CodeCategory category = (CodeCategory)(categoryMap.get(name)); if( category == null) throw new ParseError("Undefined Code Category: "+name); return category; } private void put_category(CodeCategory category) throws ParseError { String key = category.get_tag(); if( categoryMap.contains(key)) throw new ParseError("Duplicate Code Category:"+key); categoryMap.put(key,category); } void add(DefinedType type) throws ParseError { get_types().add(type); // Add type to typeMap, verify uniqueness. } void createEntity(EntityName name) throws ParseError { Entity entity = new Entity(); entity.set_name(name); put_entity(entity); get_entities().add(entity); } void setEntityKeys(EntityName name, AccessKeyList keys) throws ParseError { Entity entity = get_entity(name); entity.set_keys(keys); } void addEntityParent(EntityName name, EntityName parentName) throws ParseError { Entity entity = get_entity(name); Entity parent = get_entity(parentName); if( parent == entity) throw new ParseError("Self Inheritence: "+name); entity.add(new ParentEntity(parent)); } void addEntityMethod(EntityName name, Method method) throws ParseError { Entity entity = get_entity(name); entity.add(method); } void createCategoryType (String name, String header, String impl, String make) throws ParseError { CodeCategoryType ctype = new CodeCategoryType( name, new HeaderTemplate(header), new ImplTemplate(impl), new MakeTemplate(make)); put_categoryType(ctype); } void createNonGeneratedCategory( String name, String macroBaseName, String classNamePattern, String headerFilePattern) throws ParseError { NonGeneratedCodeCategory category = new NonGeneratedCodeCategory( name,macroBaseName,classNamePattern,headerFilePattern); put_category(category); get_categories().add(category); } void createGeneratedCategory( String name, String macroBaseName, String classNamePattern, String headerFilePattern, String type_name, AccessKeyList keys) throws ParseError { CodeCategoryType ctype = get_categoryType(type_name); if( ctype == null) throw new ParseError("Undefined Code Category: "+type_name); GeneratedCodeCategory category = new GeneratedCodeCategory( name,macroBaseName,classNamePattern,headerFilePattern, ctype,keys); put_category(category); get_categories().add(category); } @) } TypeList { init (@ set_value(new DefinedType_List(null)); @) void add(DefinedType type) (@ get_value().addElement(type); @) } EntityList { init (@ set_value(new Entity_List(null)); @) void add(Entity entity) (@ get_value().addElement(entity); @) } DefinedType { init (@ name = null; header = null; @) } AccessKeyList { init (@ set_accesskey_list(new AccessKey_List(null)); @) void add(AccessKey key) (@ get_accesskey_list().addElement(key); @) } Entity { init (@ set_name(null); set_parents(new ParentEntity_List(null)); set_methods(new Method_List(null)); set_keys(new AccessKeyList()); @) void add(Method method) (@ get_methods().addElement(method); @) void add(ParentEntity parent) (@ get_parents().addElement(parent); @) } Method { init (@ set_name(null); set_bodyVersion(null); set_isStatic(false); set_isConst(false); set_isVirtual(false); set_keys(new AccessKeyList()); set_returnDecl(null); set_args(new ArgumentDecl_List(null)); @) void add(ArgumentDecl decl) (@ get_args().addElement(decl); @) } TypeDecl { init (@ set_prefix(""); set_suffix(""); set_isRef(false); set_type(null); set_auxType(new TypeUse_List(null)); @) void append_prefix(String text) (@ set_prefix(get_prefix()+text); @) void append_suffix(String text) (@ set_suffix(get_suffix()+text); @) void add_auxType(TypeUse use) (@ get_auxType().addElement(use); @) } ArgumentDecl { init (@ set_name(null); set_initializer(null); @) } EntityName { public String toString() (@ return get_value(); @) } CategoryList{ init (@ set_value(new CodeCategory_List()); @) void add(CodeCategory category) (@ get_value().addElement(category); @) }