git @ Cat's Eye Technologies Tamsin / 6ea4ae5
Better debugging, but still no progress on what's up. Cat's Eye Technologies 11 years ago
1 changed file(s) with 53 addition(s) and 9 deletion(s). Raw diff Collapse all Expand all
55
66 DEBUG = False
77
8 def enc(x):
9 if not isinstance(x, str):
10 x = unicode(x)
11 return x.encode('ascii', 'xmlcharrefreplace')
12
813 def debug(x):
914 if DEBUG:
10 print x.encode('ascii', 'xmlcharrefreplace')
15 print enc(x)
1116
1217
1318 class TamsinParseError(ValueError):
7378 debug("setting buffer to '%s'" % buffer)
7479 self.buffer = buffer
7580 self.position = 0
81 self.reset_position = None
7682 self.token = None
7783 self.scan()
7884
96102 def isalnum(self):
97103 return self.buffer[self.position].isalnum()
98104
105 def report_buffer(self, position, length):
106 """Display a printable snippet of the buffer, of maximum
107 length length, starting at position.
108
109 """
110 report = self.buffer[position:position+length]
111 if len(report) == length:
112 report += '...'
113 return enc(report)
114
99115 def error(self, expected):
100 report = self.buffer[self.position:self.position+20]
101 if len(report) == 20:
102 report += '...'
103 raise ValueError(u"Expected %s, found '%s' at '%s...'" %
104 (expected.encode('ascii', 'xmlcharrefreplace'),
105 self.token.encode('ascii', 'xmlcharrefreplace'),
106 report.encode('ascii', 'xmlcharrefreplace')))
116 raise ValueError(u"Expected %s, found '%s' at '%s...' (position %s)" %
117 (enc(expected),
118 enc(self.token),
119 self.report_buffer(self.position, 20),
120 self.position))
107121
108122 def clone(self, class_=None):
109123 if class_ is None:
119133 debug("scanned: '%s'" % self.token)
120134
121135 def switch(self, class_):
136 """Note that there is a different method for switching back to
137 a scanner you just switched from! (TODO: Python's with?)
138
139 """
122140 # 'putback' the token
123 debug("reset position %s, position %s, putbacking '%s'" %
141 debug("scanner.switch(). reset position %s, position %s, putbacking '%s'" %
124142 (self.reset_position, self.position,
125143 self.buffer[self.reset_position:self.position-self.reset_position+1])
126144 )
130148 new_scanner.scan()
131149 return new_scanner
132150
151 def switch_back(self, class_):
152 debug("scanner.switch_back(). reset position %s, position %s, putbacking '%s'" %
153 (self.reset_position, self.position,
154 self.buffer[self.reset_position:self.position-self.reset_position+1])
155 )
156 self.position = self.reset_position
157 self.token = None
158 new_scanner = self.clone(class_=class_)
159 #new_scanner.scan()
160 return new_scanner
161
133162 def consume(self, t):
134163 #print repr(self.token), repr(t)
135164 if self.token == t:
143172 if r is None:
144173 self.error("'%s'" % t)
145174 return r
175
176 def dump(self):
177 if DEBUG:
178 print "--%r" % self
179 print " buffer: %s" % enc(self.buffer)
180 print " position: %s" % self.position
181 print " buffer at position: %s" % self.report_buffer(self.position, 40)
182 print " reset_position: %s" % self.reset_position
183 print " buffer at reset_pos: %s" % self.report_buffer(self.reset_position, 40)
184 print " token: %s" % enc(self.token)
146185
147186
148187 class TamsinScanner(Scanner):
558597 self.production = prods[0]
559598 ProductionScanner.__init__(self, buffer)
560599 new_scanner_class = CustomScanner
600 debug("SWITCHING SCANNERS")
561601 old_scanner_class = self.scanner.__class__
562602 old_scanner = self.scanner
563603 self.scanner = self.scanner.switch(new_scanner_class)
564604 debug("SWITCHED SCANNER FROM %r TO %r" %
565605 (old_scanner, self.scanner))
606 old_scanner.dump()
607 self.scanner.dump()
566608 result = self.interpret(sub)
567609 old_scanner = self.scanner
568610 self.scanner = self.scanner.switch(old_scanner_class)
569611 debug("SWITCHED SCANNER BACK TO %r FROM %r" %
570612 (self.scanner, old_scanner))
613 old_scanner.dump()
614 self.scanner.dump()
571615 return result
572616 elif ast[0] == 'WHILE':
573617 result = Term('nil')