Beispiel #1
0
def test():
    def testExpr( expr ):
        t = tok.Tokenizer( expr )
        e = Expression( t )
        print expr, " ==> ", e.eval()

    testExpr( "42" )
    testExpr( "3 + 4" )
    testExpr( "9 - 5" )
    testExpr( "8 / 4" )
    testExpr( "10 % 3" )
    testExpr( "15 & 3" )
    testExpr( "1 | 6" )
    testExpr( "1 << 8" )
    testExpr( "1024 >> 2" )
    testExpr( "(1 + 2) * 3" )
    testExpr( "4 * (1 + 2)" )
    testExpr( "4 * (1 + 2) * 100" )
    testExpr( "-100" )
    testExpr( "! 1" )
    testExpr( "! 0" )

    symbols.set( "foo", 42 )
    testExpr( "foo" )
    testExpr( "foo + foo * 100 * foo" )

    symbols.set( "bar", 0x10000 )
    testExpr( "bar - 1" )

    testExpr( "notYetDefined" )
Beispiel #2
0
def assembleLine( line, phaseNumber=0 ):
    global gLoc
    for k,v in gDefines.items():
        line = line.replace(k,v)
    
    clearLineBytes()
    tokenizer = tok.Tokenizer( line )

    #
    #   Set '*' psuedo-symbol at the start of each line
    #
    symbols.set( '*', gLoc )

    #
    #   SYMBOL = VALUE
    #
    if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == '=':
        sym = tokenizer.curValue()
        tokenizer.advance( 2 )
        expr = eval.Expression( tokenizer )
        if not tokenizer.atEnd():
            raise Exception( "Bad expression (extra gunk)" )

        value = expr.eval()

        if phaseNumber > 0 and value == None:
            raise Exception( str.format( "Undefined expression" ) )
        
        symbols.set( sym, expr.eval() )

        if gListingFile != None and phaseNumber > 0:
            generateListingLine( line )

        return
        
    #
    #   handle SYMBOL: at start of line
    #   NOTE: could enforce leadingWhitespace, but we have a ':'
    #   instead of that.
    #
    if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == ':':
        sym = tokenizer.curValue()
        tokenizer.advance( 2 )

        if phaseNumber == 0:
            symbols.set( sym, gLoc )
            
        else:
            #
            #   check that the symbol has the same value in
            #   subsequent phases
            #
            symbols.setScope( sym )
            if symbols.get( sym ) != gLoc:
                raise Exception( str.format( "Symbol phase error (expected {0}, have {1})", symbols.get(sym), gLoc ) )

    #
    #   handle ops
    #
    if tokenizer.curTok() == tok.SYMBOL:

        op = tokenizer.curValue().lower()
        tokenizer.advance()
        
        if op in gPsuedoOps:
            gPsuedoOps[op]( tokenizer, phaseNumber )
        elif op in preOps:
            if preOps[op](line):
                raise Exception("define syntax error")
        elif op in gOps:
            assembleInstruction( op, tokenizer, phaseNumber )
        else:
            raise Exception( str.format( 'Unknown op: {0}', op ) )

    if gListingFile != None and phaseNumber > 0:
        generateListingLine( line )
Beispiel #3
0
def assembleLine(line, phaseNumber=0):
    global gLoc
    for k, v in gDefines.items():
        line = line.replace(k, v)

    clearLineBytes()
    tokenizer = tok.Tokenizer(line)

    #
    #   Set '*' psuedo-symbol at the start of each line
    #
    symbols.set('*', gLoc)

    #
    #   SYMBOL = VALUE
    #
    if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == '=':
        sym = tokenizer.curValue()
        tokenizer.advance(2)
        expr = eval.Expression(tokenizer)
        if not tokenizer.atEnd():
            raise Exception("Bad expression (extra gunk)")

        value = expr.eval()

        if phaseNumber > 0 and value == None:
            raise Exception(str.format("Undefined expression"))

        symbols.set(sym, expr.eval())

        if gListingFile != None and phaseNumber > 0:
            generateListingLine(line)

        return

    #
    #   handle SYMBOL: at start of line
    #   NOTE: could enforce leadingWhitespace, but we have a ':'
    #   instead of that.
    #
    if tokenizer.curTok() == tok.SYMBOL and tokenizer.peek(1) == ':':
        sym = tokenizer.curValue()
        tokenizer.advance(2)

        if phaseNumber == 0:
            symbols.set(sym, gLoc)

        else:
            #
            #   check that the symbol has the same value in
            #   subsequent phases
            #
            symbols.setScope(sym)
            if symbols.get(sym) != gLoc:
                raise Exception(
                    str.format("Symbol phase error (expected {0}, have {1})",
                               symbols.get(sym), gLoc))

    #
    #   handle ops
    #
    if tokenizer.curTok() == tok.SYMBOL:

        op = tokenizer.curValue().lower()
        tokenizer.advance()

        if op in gPsuedoOps:
            gPsuedoOps[op](tokenizer, phaseNumber)
        elif op in preOps:
            if preOps[op](line):
                raise Exception("define syntax error")
        elif op in gOps:
            assembleInstruction(op, tokenizer, phaseNumber)
        else:
            raise Exception(str.format('Unknown op: {0}', op))

    if gListingFile != None and phaseNumber > 0:
        generateListingLine(line)