def index(parser, unary=False): if not unary: unary = ExprParser.isUnary(parser, parser.lookBehind()) if not unary and len(parser.currentNode.nodes) == 0: Error.parseError(parser, "unexpected .") field = parser.nextToken() if not field.type in ["identifier", "i32"]: Error.parseError(parser, "field name must be an identifier") acess = Tree.Field(0, Types.Null(), parser) acess.unary = unary acess.number = field.type == "i32" field = field.token acess.owner = parser.currentNode acess.field = field if not unary: acess.addNode(parser.currentNode.nodes[-1]) parser.currentNode.nodes[-1] = acess else: parser.currentNode.addNode(acess)
def initStruct(parser, package= ""): if ExprParser.isUnary(parser, parser.lookBehind()): Error.parseError(parser, "unexpected {") if package == "": package = parser.package if len(parser.currentNode.nodes) == 0: Error.parseError(parser, "unexpected {") if not type(parser.currentNode.nodes[-1]) in [Tree.ReadVar, Tree.Field]: Error.parseError(parser, "unexpected {") readVar = type(parser.currentNode.nodes[-1]) is Tree.ReadVar name = parser.currentNode.nodes[-1].name if readVar else parser.currentNode.nodes[-1].field init = Tree.InitStruct(parser) if not readVar: package = parser.currentNode.nodes[-1].nodes[0].name t = (parser.currentNode.nodes[-1].nodes[0]) if not package in parser.imports: t.error("no package called " + package) elif not type(t) is Tree.ReadVar: init.error("unexpected {") init.package = package del parser.currentNode.nodes[-1] s = parser.structs[package][name] init.paramNames = offsetsToList(parser.structs[package][name].offsets) init.s = s init.mutable = False parser.currentNode.addNode(init) parser.currentNode = init parser.nextToken() while parser.thisToken().token != "}": if parser.thisToken().token == ",": ExprParser.endExpr(parser) else: Parser.callToken(parser) parser.nextToken() t = parser.thisToken().token continue ExprParser.endExpr(parser) parser.currentNode = init.owner
def initStruct(parser, package= "", shouldRead=True): numB = parser.curly unary = not shouldRead if shouldRead and ExprParser.isUnary(parser, parser.lookBehind()): unary = True parser.curly += 1 readVar = True if not unary: if package == "": package = parser.package if len(parser.currentNode.nodes) == 0: Error.parseError(parser, "unexpected {") if not type(parser.currentNode.nodes[-1]) in [Tree.ReadVar, Tree.Field]: Error.parseError(parser, "unexpected {") readVar = type(parser.currentNode.nodes[-1]) is Tree.ReadVar name = parser.currentNode.nodes[-1].name if readVar else parser.currentNode.nodes[-1].field init = Tree.InitStruct(parser) if not readVar: if type(parser.currentNode.nodes[-1].nodes[0]) is Tree.ReadVar: package = parser.currentNode.nodes[-1].nodes[0].name t = (parser.currentNode.nodes[-1].nodes[0]) if not package in parser.imports: t.error("no package called " + package) init.package = package if not unary: init.constructor = parser.currentNode.nodes[-1] init.addNode(parser.currentNode.nodes[-1]) del parser.currentNode.nodes[-1] init.mutable = False init.unary = unary parser.currentNode.addNode(init) parser.currentNode = init parser.nextToken() while parser.thisToken().token != "}": if parser.thisToken().token in [",", "\n"]: ExprParser.endExpr(parser) if parser.thisToken().token != ",": Parser.callToken(parser) t = parser.thisToken().token if t == "}" and parser.curly <= numB: break parser.nextToken() else: closeCurly(parser) ExprParser.endExpr(parser) parser.currentNode = init.owner