rendered paste bodyimport 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