All pastes #908608 Raw Edit

Miscellany

public python v1 · immutable
·published 2008-02-18 16:38 UTC
rendered paste body
import tokrulestokens = tokrules.VHDLParser.tokensfrom ply import yaccclass Expr: passclass BinOp(Expr):    def __init__(self, left, op, right):        self.type = "op"        self.left = left        self.right = right        self.op = op        self.name = ""    def getlabel(self):        text = self.op        if text == "*": text = "x"        if self.name != "":            return self.name + ': ' + text        return text        def __repr__(self):        if self.name == "":            return "(%s %s %s)" % (self.left, self.op, self.right)        else:            return self.nameclass Number(Expr):    def __init__(self, value):        self.type = "number"        self.display = value[0]        self.value = value[1]        self.name = ""        def getlabel(self):        def inttobin(i):            str = []            while i > 0:                if i & 1:                    str.insert(0, "1")                else:                    str.insert(0, "0")                i = i >> 1            return ''.join(str)        if self.display == 'BINARY':            text = '0b' + inttobin(self.value)        elif self.display == 'HEX':            text = "0x%0X" % self.value        else:            text = str(self.value)        if self.name != "":            return self.name + ": " + text        else:            return text    def __repr__(self):        return str(self.value)def getsym(p, id):    if not hasattr(p, "symbols"):        p.symbols = {}    try:        return p.symbols[id]    except KeyError:        p.symbols[id] = Register(id)        return p.symbols[id]class Register(Expr):    def __init__(self, id):        self.type = "reg"        self.id = id        self.name = ""        def getlabel(self):        return self.id    def __repr__(self):        return "Register %s" % self.idclass Assignment(Expr):    def __init__(self, target, value):        self.type = "assignment"        self.target = target        self.value = value        self.name = ""    def __repr__(self):        return "%s <= %s" % (self.target, self.value)def p_block_1(p):    '''block : statement'''    p[0] = [p[1]]def p_block_2(p):    '''block : block statement'''    p[0] = list(p[1])    p[0].append(p[2])def p_statement_variable(p):    'statement : SYMBOL VARIABLE expression SCOLON'    if not hasattr(p.parser, "symbols"):        p.parser.symbols = {}    id = p[1]    #Is the symbol already defined    if id in p.parser.symbols:        print "Error on line %d - symbol already assigned" % p.lineno()        while 1:            tok = yacc.token()            if not tok or tok.type == "SCOLON": break        yacc.restart()    else:        p[3].name = id        p[3].extent = (p.lexspan(1)[0], p.lexspan(4)[1])        p.parser.symbols[id] = p[3]        p[0] = p[3]def p_statement_signal(p):    '''statement : SYMBOL SIGNAL expression SCOLON'''    p[0] = Assignment(getsym(p.parser, p[1]), p[3])    p[0].extent = (p.lexspan(1)[0], p.lexspan(4)[1])def p_expression_binop(p):    '''expression : expression PLUS expression                  | expression MINUS expression'''    p[0] = BinOp(p[1], p[2], p[3])def p_expression_term(p):    'expression : term'    p[0] = p[1]def p_term_mult(p):    '''term : term TIMES factor            | term DIVIDE factor'''    p[0] = BinOp(p[1], p[2], p[3])def p_term_factor(p):    'term : factor'    p[0] = p[1]def p_factor_num(p):    'factor : NUMBER'    p[0] = Number(p[1])def p_factor_reg(p):    'factor : SYMBOL'    p[0] = getsym(p.parser, p[1])def p_factor_compount(p):    'factor : LPAREN expression RPAREN'    p[0] = p[2]def p_error(p):    print "Syntax error - %s" % p