Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
0
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