def parserMethodGen(parser, gen, struct): sgen = struct.generic if len(gen) > len(sgen): Error.parseError( parser, str(len(gen) - len(sgen)) + " generic arguments too many") elif len(gen) < len(sgen): Error.parseError( parser, str(len(gen) - len(sgen)) + " generic arguments too few") newGen = coll.OrderedDict() for a, b in zip(gen, sgen): typ = sgen[b] aStripped = a[a.rfind(".") + 1:] if not a in sgen: Error.parseError( parser, "Unknown type parameter " + aStripped + " in " + str(struct)) if gen[a].type != Types.All: typ = gen[ b] #@cleanup check if interface is compatible with structs regular generics Error.parseError(parser, "unexpected :") newGen[a] = typ Scope.changeType(parser, aStripped, typ) return newGen
def parserMethodGen(parser, gen, struct): sgen = struct.generic if len(gen) > len(sgen): Error.parseError(parser, str(len(gen)-len(sgen))+" generic arguments too many") elif len(gen) < len(sgen): Error.parseError(parser, str(len(gen) - len(sgen)) + " generic arguments too few") newGen = coll.OrderedDict() for a, b in zip(gen, sgen): if gen[a].type != Types.All: Error.parseError(parser, "unexpected :") newGen[a] = sgen[b] Scope.changeType(parser, a, sgen[b]) return newGen
def parserMethodGen(parser, gen, struct): sgen = struct.generic if len(gen) > len(sgen): Error.parseError( parser, str(len(gen) - len(sgen)) + " generic arguments too many") elif len(gen) < len(sgen): Error.parseError( parser, str(len(gen) - len(sgen)) + " generic arguments too few") newGen = coll.OrderedDict() for a, b in zip(gen, sgen): if gen[a].type != Types.All: Error.parseError(parser, "unexpected :") newGen[a] = sgen[b] Scope.changeType(parser, a, sgen[b]) return newGen
def typeParser(parser, decl= False): name = parser.nextToken() Scope.incrScope(parser) if name.type != "identifier": Error.parseError(parser, "type name must be an identifier") name = name.token if name[0].lower() == name[0]: Error.parseError(parser, "struct name must be upper case") import collections as coll gen = coll.OrderedDict() if parser.nextToken().token == "[": gen = FuncParser.generics(parser, name) if parser.thisToken().token != "=": if parser.thisToken().token in ["with", "either", "is"]: tmp = parser.currentNode if parser.thisToken().token == "either": Enum.enumParser(parser, name, decl, gen) elif parser.thisToken().token == "is": Alias.aliasParser(parser, name, decl, gen) else: parser.currentNode = Tree.PlaceHolder(parser) Interface.traitParser(parser, name, decl, gen) parser.currentNode = tmp return Error.parseError(parser, "expecting =") tmp = parser.currentNode typ = Tree.Type(parser.package, name, parser) typ.package = parser.package typ.normalName = name tmp.addNode(typ) parser.currentNode = typ while not Parser.isEnd(parser): parser.nextToken() Parser.declareOnly(parser, noVar=True) args = [i.varType for i in parser.currentNode] fields = parser.currentNode.nodes typ.fields = [i.name for i in typ] typ.nodes = [] parser.currentNode = tmp if decl: meth = parser.structs[parser.package][name].methods _types = parser.structs[parser.package][name]._types parser.structs[parser.package][name] = Struct(name, args, fields, gen, typ, parser.package) tmp = parser.structs[parser.package][name]._types parser.structs[parser.package][name].methods = meth parser.structs[parser.package][name].package = parser.package parser.structs[parser.package][name]._types = _types _types.update(tmp) Scope.changeType(parser, name, parser.structs[parser.package][name] ) typ.struct = parser.structs[parser.package][name] Scope.decrScope(parser)
def typeParser(parser, decl=False): name = parser.nextToken() Scope.incrScope(parser) if name.type != "identifier" and name.token != "ext": Error.parseError(parser, "type name must be an identifier") externalStruct = False if name.token == "ext": externalStruct = True name = parser.nextToken() if name.type != "identifier" and name.token != "ext": Error.parseError(parser, "type name must be an identifier") name = name.token if name[0].lower() == name[0] and not externalStruct: Error.parseError(parser, "struct name must be upper case") import collections as coll gen = coll.OrderedDict() if parser.nextToken().token == "[": if externalStruct: Error.parseError(parser, "External structs cannot be generic") gen = FuncParser.generics(parser, name) if parser.thisToken().token != "=": if parser.thisToken().token in ["with", "either", "is"]: if externalStruct: Error.parseError( parser, "Can only define external structs not interfaces, enums or aliases" ) tmp = parser.currentNode if parser.thisToken().token == "either": Enum.enumParser(parser, name, decl, gen) elif parser.thisToken().token == "is": Alias.aliasParser(parser, name, decl, gen) else: parser.currentNode = Tree.PlaceHolder(parser) Interface.traitParser(parser, name, decl, gen) parser.currentNode = tmp return Error.parseError(parser, "expecting =") tmp = parser.currentNode typ = Tree.Type(parser.package, name, parser) typ.package = parser.package typ.normalName = name typ.externalStruct = externalStruct tmp.addNode(typ) parser.currentNode = typ while not Parser.isEnd(parser): parser.nextToken() Parser.declareOnly(parser, noVar=True) args = [i.varType for i in parser.currentNode] fields = parser.currentNode.nodes if not decl: using = parser.structs[parser.package][name].using for i in parser.currentNode: if type(i) is Tree.Using: using.append(i.name) typ.fields = [i.name for i in typ] typ.args = args typ.generics = gen typ.nodes = [] parser.currentNode = tmp if decl: meth = parser.structs[parser.package][name].methods _types = parser.structs[parser.package][name]._types #if name == "Channel": # print("Channel make") # print(id(_types)) parser.structs[parser.package][name] = Struct(name, args, fields, gen, typ, parser.package) tmp = parser.structs[parser.package][name]._types parser.structs[parser.package][name].methods = meth parser.structs[parser.package][name].package = parser.package parser.structs[parser.package][name]._types = _types parser.structs[parser.package][name].externalStruct = externalStruct _types.update(tmp) Scope.changeType(parser, name, parser.structs[parser.package][name]) typ.struct = parser.structs[parser.package][name] Scope.decrScope(parser)