diff options
author | Reinier Heeres <reinier@heeres.eu> | 2007-09-16 14:36:55 (GMT) |
---|---|---|
committer | Reinier Heeres <reinier@heeres.eu> | 2007-09-16 14:36:55 (GMT) |
commit | d3a7798fbd50c43cc70787483be0cdde42876e13 (patch) | |
tree | f087fe61591f9cfb9f3e84d3893bbf38919e5ce8 /eqnparser.py | |
parent | fe7ae7de21b8cc29b40ff76387501b2ea3cf5faa (diff) |
Improved internal equation history logic
Diffstat (limited to 'eqnparser.py')
-rw-r--r-- | eqnparser.py | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/eqnparser.py b/eqnparser.py index da176fe..363269a 100644 --- a/eqnparser.py +++ b/eqnparser.py @@ -109,6 +109,12 @@ class ParserState: msg += ": %s" % (self.error_msg) return msg + def copy_error(self, ps): + """Copy error state from recursively created ParserState object""" + self.error_code = ps.error_code + self.error_msg = ps.error_msg + self.error_range = (ps.error_range[0] + ps.ofs, ps.error_range[1] + ps.ofs) + class EqnParser: OP_INVALID = -1 OP_PRE = 1 @@ -219,7 +225,7 @@ class EqnParser: self.register_operator('%', self.OP_DIADIC, 0, lambda x: self.ml.mod(x[0], x[1])) - self.set_var('help', 'Use help(test) to get help about \'test\'', parse=False) + self.set_var('help', 'Use help(test) to get help about \'test\', help(index) for available topics', parse=False) def register_function(self, name, f, opts): self.functions[name] = (f, opts) @@ -286,7 +292,7 @@ class EqnParser: # return None # self.variables[name].highest_level = level if type(self.variables[name]) is types.StringType and self.parse_var[name]: - return self.parse(self.variables[name]) + return self.parse(self.variables[name], reset=False) else: return self.variables[name] else: @@ -335,7 +341,7 @@ class EqnParser: else: pargs = [] for i in range(len(args)): - pargs.append(self.parse(args[i])) + pargs.append(self.parse(args[i], reset=False)) if pargs[i] is None: _logger.error('Unable to parse argument %d: \'%s\'', i, args[i]) self.ps.set_error(ParserState.PARSE_ERROR, msg='Unable to parse argument %d: \'%s\'' % (i, args[i])) @@ -567,12 +573,22 @@ class EqnParser: def get_error_range(self): return self.ps.error_range - def parse(self, eqn): + def parse(self, eqn, reset=True): """Construct ParserState object and call _parse""" _logger.debug('parse(): %s', eqn) self.reset_variable_level(0) + + if reset: + self.ps = None + + oldps = self.ps self.ps = ParserState(eqn) - return self._parse(self.ps) + ret = self._parse(self.ps) + if oldps is not None: + oldps.copy_error(self.ps) + self.ps = oldps + + return ret def functions_string(self): ret = "" |