Better debugging, but still no progress on what's up.
Cat's Eye Technologies
11 years ago
5 | 5 | |
6 | 6 | DEBUG = False |
7 | 7 | |
8 | def enc(x): | |
9 | if not isinstance(x, str): | |
10 | x = unicode(x) | |
11 | return x.encode('ascii', 'xmlcharrefreplace') | |
12 | ||
8 | 13 | def debug(x): |
9 | 14 | if DEBUG: |
10 | print x.encode('ascii', 'xmlcharrefreplace') | |
15 | print enc(x) | |
11 | 16 | |
12 | 17 | |
13 | 18 | class TamsinParseError(ValueError): |
73 | 78 | debug("setting buffer to '%s'" % buffer) |
74 | 79 | self.buffer = buffer |
75 | 80 | self.position = 0 |
81 | self.reset_position = None | |
76 | 82 | self.token = None |
77 | 83 | self.scan() |
78 | 84 | |
96 | 102 | def isalnum(self): |
97 | 103 | return self.buffer[self.position].isalnum() |
98 | 104 | |
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 | ||
99 | 115 | 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)) | |
107 | 121 | |
108 | 122 | def clone(self, class_=None): |
109 | 123 | if class_ is None: |
119 | 133 | debug("scanned: '%s'" % self.token) |
120 | 134 | |
121 | 135 | 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 | """ | |
122 | 140 | # 'putback' the token |
123 | debug("reset position %s, position %s, putbacking '%s'" % | |
141 | debug("scanner.switch(). reset position %s, position %s, putbacking '%s'" % | |
124 | 142 | (self.reset_position, self.position, |
125 | 143 | self.buffer[self.reset_position:self.position-self.reset_position+1]) |
126 | 144 | ) |
130 | 148 | new_scanner.scan() |
131 | 149 | return new_scanner |
132 | 150 | |
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 | ||
133 | 162 | def consume(self, t): |
134 | 163 | #print repr(self.token), repr(t) |
135 | 164 | if self.token == t: |
143 | 172 | if r is None: |
144 | 173 | self.error("'%s'" % t) |
145 | 174 | 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) | |
146 | 185 | |
147 | 186 | |
148 | 187 | class TamsinScanner(Scanner): |
558 | 597 | self.production = prods[0] |
559 | 598 | ProductionScanner.__init__(self, buffer) |
560 | 599 | new_scanner_class = CustomScanner |
600 | debug("SWITCHING SCANNERS") | |
561 | 601 | old_scanner_class = self.scanner.__class__ |
562 | 602 | old_scanner = self.scanner |
563 | 603 | self.scanner = self.scanner.switch(new_scanner_class) |
564 | 604 | debug("SWITCHED SCANNER FROM %r TO %r" % |
565 | 605 | (old_scanner, self.scanner)) |
606 | old_scanner.dump() | |
607 | self.scanner.dump() | |
566 | 608 | result = self.interpret(sub) |
567 | 609 | old_scanner = self.scanner |
568 | 610 | self.scanner = self.scanner.switch(old_scanner_class) |
569 | 611 | debug("SWITCHED SCANNER BACK TO %r FROM %r" % |
570 | 612 | (self.scanner, old_scanner)) |
613 | old_scanner.dump() | |
614 | self.scanner.dump() | |
571 | 615 | return result |
572 | 616 | elif ast[0] == 'WHILE': |
573 | 617 | result = Term('nil') |