Ejemplo n.º 1
0
def expandMacro(ppt, name, arglist):
    global macros
    if name not in macros:
        Err.log("Undefined macro '%s'" % name)
        return IR.NullNode
    argexprs = [
        IR.Node(ppt, "Label", "_*%d" % i, arg)
        for (i, arg) in zip(xrange(1, sys.maxint), arglist)
    ]
    bindexprs = [
        IR.Node(ppt, "Label", "_%d" % i, IR.LabelExpr("_*%d" % i))
        for i in range(1,
                       len(arglist) + 1)
    ]
    body = [
        IR.Node("%s->%s" % (ppt, node.ppt), node.nodetype, *node.data)
        for node in macros[name]
    ]
    invocation = [IR.Node(ppt, "ScopeBegin")] + argexprs + [
        IR.Node(ppt, "ScopeBegin")
    ] + bindexprs + body + [
        IR.Node(ppt, "ScopeEnd"),
        IR.Node(ppt, "ScopeEnd")
    ]
    return IR.SequenceNode(ppt, invocation)
Ejemplo n.º 2
0
 def atom():
     "Parses lowest-priority expression components."
     global templabelcount
     next = line.lookahead(0).type
     if next == "NUM":
         return IR.ConstantExpr(line.expect("NUM").value)
     elif next in ["LABEL", "X", "Y", "Z", "SP", "OPCODE"]:
         return IR.LabelExpr(line.expect("LABEL").value)
     elif next == "^":
         line.expect("^")
         return IR.PCExpr()
     elif next == "[":
         line.expect("[")
         result = parse_expr(line)
         line.expect("]")
         return result
     elif next == "+":
         offset = 0
         while next == "+":
             offset += 1
             line.expect("+")
             next = line.lookahead(0).type
         return IR.LabelExpr("*" + str(templabelcount + offset))
     elif next == "-":
         offset = 1
         while next == "-":
             offset -= 1
             line.expect("-")
             next = line.lookahead(0).type
         return IR.LabelExpr("*" + str(templabelcount + offset))
     elif next == ">":
         line.expect(">")
         return IR.HighByteExpr(atom())
     elif next == "<":
         line.expect("<")
         return IR.LowByteExpr(atom())
     else:
         Err.log('Expected: expression')