[Wisp-cvs] wisp/users/dig tran.py,1.24,1.25
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2003-04-17 11:16:13
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv21595 Modified Files: tran.py Log Message: wrote the Constant_Sum class Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- tran.py 16 Apr 2003 20:57:07 -0000 1.24 +++ tran.py 17 Apr 2003 11:16:09 -0000 1.25 @@ -49,6 +49,51 @@ Semicolon = Unique_Token(';') Dollar = Unique_Stackable('$') +class Constant_Sum (Stackable): + def __init__ (this, plus = (), minus = (), scalar = 0L): + this.scalar = long(scalar) + this.plus = []; this.minus = [] + for item in plus: + if isinstance(item, Symbol_Literal) or item == Dollar: + this.plus.append(item) + else: raise 'bad addee', item + for item in minus: + if isinstance(item, Symbol_Literal) or item == Dollar: + try: + i = this.plus.index(item) + this.plus.pop(i) + except ValueError: + this.minus.append(item) + else: raise 'bad subtractee', item + this.plus = tuple(this.plus); this.minus = tuple(this.minus) + def __add__ (this, that): + if isinstance(that, Symbol_Literal) or that == Dollar: + that = Constant_Sum(plus = [that]) + return Constant_Sum(plus = this.plus + that.plus, + minus = this.minus + that.minus, + scalar = this.scalar + that.scalar) + def __sub__ (this, that): + if isinstance(that, Symbol_Literal) or that == Dollar: + that = Constant_Sum(plus = [that]) + return Constant_Sum(plus = this.plus + that.minus, + minus = this.minus + that.plus, + scalar = this.scalar - that.scalar) + def __repr__ (this): + arg = [] + if this.plus: arg.append('plus = ' + `this.plus`) + if this.minus: arg.append('minus = ' + `this.minus`) + if this.scalar: arg.append('scalar = ' + `this.scalar`) + return 'Constant_Sum(%s)' % ', '.join(arg) + def __str__ (this): + res = '' + for item in this.plus: res += ' + ' + str(item) + for item in this.minus: res += ' - ' + str(item) + if this.scalar > 0: res += ' + ' + str(this.scalar) + else: res += ' - ' + str(-this.scalar) + if res[0] == ' ': res = res[1:] + if res[:2] == '+ ': res = res[2:] + return '(' + res + ')' + class Lexer (shlex): def __init__ (this, filename): shlex.__init__(this, instream = open(filename, 'r'), infile = filename) |