1 import sys
2 import itertools
3 import re
4 from PyQt4 import QtGui,QtCore
5
6 patterns = {
7 '+': r'(\+)' ,
8 '-': r'(-)' ,
9 '*': r'(\*)' ,
10 '/': r'(/)' ,
11 '(': r'(\()' ,
12 ')': r'(\))' ,
13 'int':r'((\+|-)?\d+(\.\d+)?)'
14 }
15 class Parse(object):
16 def __init__(self, buf):
17 self.buf = buf
18 self.value = self.expr2()
19 def expr2(self):
20 value = self.expr1()
21 while 1:
22 if self.test('+'):
23 self.match('+')
24 value += self.expr1()
25 elif self.test('-'):
26 self.match('-')
27 value -= self.expr1()
28 else:
29 break
30 return value
31 def expr1(self):
32 value = self.expr()
33 while 1:
34 if self.test('*'):
35 self.match('*')
36 value *= self.expr()
37 elif self.test('/'):
38 self.match('/')
39 value /= self.expr()
40 else:
41 break
42 return value
43 def expr(self):
44 if self.test('int'):
45 return self.match('int')
46 elif self.test('('):
47 self.match('(')
48 value = self.expr2()
49 self.match(')')
50 return value
51 else:
52 raise Exception("ERROR")
53 def test(self, name):
54 if re.match(patterns[name], self.buf):
55 return 1
56 else:
57 return 0
58 def match(self, name):
59 m = re.match(patterns[name], self.buf)
60 if m:
61 self.buf = self.buf[len(m.group(0)):]
62 if name == 'int':
63 return float(m.group(1))
64 Exception('cannot parse "'+name+'" out')
65 def calc(buf):
66 try:
67 p = Parse(str(buf))
68 if p.buf:
69 return "ERROR"
70 return p.value
71 except Exception:
72 return "ERROR"
73 def log(buf):
74 f = open("calc.log","a")
75 f.write(buf+"\n")
76 f.close()
77
78 class Example(QtGui.QWidget):
79 def __init__(self):
80 super(Example, self).__init__()
81 self.initUI()
82 self.initData()
83 def initUI(self):
84 self.setWindowTitle('grid layout')
85 names = ['(', ')', 'back', 'clear', '7', '8', '9', '/',
86 '4', '5', '6', '*', '1', '2', '3', '-','0', '.', '=', '+']
87 grid = QtGui.QGridLayout()
88 self.text = QtGui.QLineEdit()
89 self.text.setFocusPolicy(QtCore.Qt.No