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)
|