Exemplo n.º 1
0
    def doPushSym( self ):
        symbol = self.m_postfix[ self.m_index]
        self.m_index = self.m_index + 1

        if symbols.isDefined( symbol ):
            self.m_stack.append( symbols.get( symbol ) )
        else:
            self.m_undefined = True
            self.m_stack.append( 1 )
Exemplo n.º 2
0
Arquivo: kasm.py Projeto: clker/kasm
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 )
Exemplo n.º 3
0
Arquivo: kasm.py Projeto: clker/kasm
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)