From ab6515bc125f9289e21f6995d201c5c9774e3eea Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sun, 15 Mar 2015 08:45:14 -0600
Subject: [PATCH] Fix parsing corner cases

---
 pymbolic/parser.py    | 10 +++++-----
 test/test_pymbolic.py |  5 +++++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/pymbolic/parser.py b/pymbolic/parser.py
index cea1e2a..7a48d13 100644
--- a/pymbolic/parser.py
+++ b/pymbolic/parser.py
@@ -105,17 +105,17 @@ class Parser:
             (_imaginary, (_float, pytools.lex.RE("j"))),
             (_float, ("|",
                 # has a letter tag
-                pytools.lex.RE(r"[+-]?[0-9]+([a-zA-Z]+)"),
+                pytools.lex.RE(r"[0-9]+([a-zA-Z]+)"),
                 # has digits before the dot (after optional)
                 pytools.lex.RE(
-                    r"[+-]?[0-9]+\.[0-9]*([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
+                    r"[0-9]+\.[0-9]*([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
                 pytools.lex.RE(
-                    r"[+-]?[0-9]+(\.[0-9]*)?[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
+                    r"[0-9]+(\.[0-9]*)?[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"),
                 # has digits after the dot (before optional)
                 pytools.lex.RE(
-                    r"[+-]?[0-9]*\.[0-9]+([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
+                    r"[0-9]*\.[0-9]+([eEdD][+-]?[0-9]+)?([a-zA-Z]*)"),
                 pytools.lex.RE(
-                    r"[+-]?[0-9]*\.[0-9]+[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"))),
+                    r"[0-9]*\.[0-9]+[eEdD][+-]?[0-9]+([a-zA-Z]*)\b"))),
             (_int, pytools.lex.RE(r"[0-9]+")),
             (_plus, pytools.lex.RE(r"\+")),
             (_minus, pytools.lex.RE(r"-")),
diff --git a/test/test_pymbolic.py b/test/test_pymbolic.py
index 7df9f14..00fb007 100644
--- a/test/test_pymbolic.py
+++ b/test/test_pymbolic.py
@@ -221,6 +221,11 @@ def test_parser():
     print(repr(parse("3::1")))
     print(repr(parse(":5:1")))
     print(repr(parse("3:5:1")))
+    print(repr(parse("g[i,k]+2.0*h[i,k]")))
+    print(repr(parse("g[i,k]+(+2.0)*h[i,k]")))
+    print(repr(parse("a - b - c")))
+    print(repr(parse("-a - -b - -c")))
+    print(repr(parse("- - - a - - - - b - - - - - c")))
 
     print(parse("3::1"))
 
-- 
GitLab