Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/eqnparser.py
diff options
context:
space:
mode:
authorReinier Heeres <reinier@heeres.eu>2007-09-10 09:57:56 (GMT)
committer Reinier Heeres <reinier@heeres.eu>2007-09-10 09:57:56 (GMT)
commitadc9ebd4ac938f16f804943139768b269bf4b497 (patch)
tree4269b988337ebf0ea06a8a0e740d5ef46bb1b132 /eqnparser.py
parentb0cca9f16f0a57ea07c8a27f4421311e96b41680 (diff)
Bugfixes, plot axes labels, MANIFEST update
Diffstat (limited to 'eqnparser.py')
-rw-r--r--eqnparser.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/eqnparser.py b/eqnparser.py
index 5e9a05c..bcc3f4f 100644
--- a/eqnparser.py
+++ b/eqnparser.py
@@ -58,6 +58,14 @@ class ParserState:
self.char = None
return self.char
+ def prev(self):
+ self.ofs -= 1
+ if self.ofs < self.strlen and self.ofs >= 0:
+ self.char = self.str[self.ofs]
+ else:
+ self.char = None
+ return self.char
+
def set_ofs(self, o):
self.ofs = o
self.char = self.str[o]
@@ -163,6 +171,7 @@ class EqnParser:
self.register_operator('/', self.OP_DIADIC, 1, lambda x: self.ml.div(x[0], x[1]))
self.register_operator('^', self.OP_DIADIC, 2, lambda x: self.ml.pow(x[0], x[1]))
+ self.register_operator('**', self.OP_DIADIC, 2, lambda x: self.ml.pow(x[0], x[1]))
self.register_operator('!', self.OP_POST, 0, lambda x: self.ml.factorial(x[0]))
@@ -330,21 +339,28 @@ class EqnParser:
def parse_operator(self, ps, left_val):
startofs = ps.ofs
+ op = None
while ps.more() and ps.char in self.OP_CHARS:
ps.next()
- op = self.valid_operator(ps.str[startofs:ps.ofs], left_val)
- if op is not None:
- _logger.debug('parse_operator(): %d - %d: %s', startofs, ps.ofs, ps.str[startofs:ps.ofs])
- return op
-
- return self.INVALID_OP
+ op2 = self.valid_operator(ps.str[startofs:ps.ofs], left_val)
+ if op2 is not None:
+ op = op2
+ elif op2 is None and op is not None:
+ ps.prev()
+ break
+
+ if op is not None:
+ _logger.debug('parse_operator(): %d - %d: %s', startofs, ps.ofs, ps.str[startofs:ps.ofs])
+ return op
+ else:
+ return self.INVALID_OP
def parse_func_args(self, ps):
startofs = ps.ofs
args = []
pcount = 1
while ps.more() and pcount > 0:
- if ps.char == ',':
+ if ps.char == ',' and pcount == 1:
args.append(ps.str[startofs:ps.ofs])
startofs = ps.ofs + 1
elif ps.char == '(':