diff --git a/.travis.yml b/.travis.yml index ab462ab..6d0996a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ language: python python: - "2.6" - "2.7" - - "3.2" - "3.3" + - "3.4" install: - "bash .travis.install" diff --git a/ometa/test/test_pymeta.py b/ometa/test/test_pymeta.py index ed7e57f..9a83ba7 100644 --- a/ometa/test/test_pymeta.py +++ b/ometa/test/test_pymeta.py @@ -359,6 +359,23 @@ def test_leftrecursion(self): self.assertEqual(g.num("32767"), 32767) + def test_mutual_leftrecursion(self): + g = self.compile(""" + num ::= (:n :d => n * 10 + d + | ) + digit ::= :x ?(x.isdigit()) => int(x) + x ::= + expr ::= :e '-' :n => e - n + | + """) + self.assertEqual(g.expr("3"), 3) + self.assertEqual(g.expr("3-2"), 1) + self.assertEqual(g.expr("3-2-1"), 0) + self.assertEqual(g.x("3"), 3) + self.assertEqual(g.x("3-2"), 1) + self.assertEqual(g.x("3-2-1"), 0) + + def test_characterVsSequence(self): """ Characters (in single-quotes) are not regarded as sequences. @@ -806,6 +823,23 @@ def test_leftrecursion(self): self.assertEqual(g.num("32767"), 32767) + def test_mutual_leftrecursion(self): + g = self.compile(""" + num = (num:n digit:d -> n * 10 + d + | digit) + digit = :x ?(x.isdigit()) -> int(x) + x = expr + expr = x:e '-' num:n -> e - n + | num + """) + self.assertEqual(g.expr("3"), 3) + self.assertEqual(g.expr("3-2"), 1) + self.assertEqual(g.expr("3-2-1"), 0) + self.assertEqual(g.x("3"), 3) + self.assertEqual(g.x("3-2"), 1) + self.assertEqual(g.x("3-2-1"), 0) + + def test_characterVsSequence(self): """ Characters (in single-quotes) are not regarded as sequences. @@ -1011,6 +1045,25 @@ def test_leftrecursion(self): self.assertEqual(g.num("3"), 3) self.assertEqual(g.num("32767"), 32767) + def test_mutual_leftrecursion(self): + g = self.compile(""" + num = (num:n digit:d -> makeInt(n, d) + | digit) + digit = :x ?(isdigit(x)) -> int(x) + x = expr + expr = x:e '-' num:n -> subtract(e, n) + | num + """, {"makeInt": lambda x, y: x * 10 + y, + "isdigit": lambda x: x.isdigit(), + "subtract": lambda x, y: x-y}) + self.assertEqual(g.expr("3"), 3) + self.assertEqual(g.expr("3-2"), 1) + self.assertEqual(g.expr("3-2-1"), 0) + self.assertEqual(g.x("3"), 3) + self.assertEqual(g.x("3-2"), 1) + self.assertEqual(g.x("3-2-1"), 0) + + def test_characterVsSequence(self): """ Characters (in single-quotes) are not regarded as sequences.