@@ -359,6 +359,23 @@ def test_leftrecursion(self):
359359 self .assertEqual (g .num ("32767" ), 32767 )
360360
361361
362+ def test_mutual_leftrecursion (self ):
363+ g = self .compile ("""
364+ num ::= (<num>:n <digit>:d => n * 10 + d
365+ | <digit>)
366+ digit ::= :x ?(x.isdigit()) => int(x)
367+ x ::= <expr>
368+ expr ::= <x>:e '-' <num>:n => e - n
369+ | <num>
370+ """ )
371+ self .assertEqual (g .expr ("3" ), 3 )
372+ self .assertEqual (g .expr ("3-2" ), 1 )
373+ self .assertEqual (g .expr ("3-2-1" ), 0 )
374+ self .assertEqual (g .x ("3" ), 3 )
375+ self .assertEqual (g .x ("3-2" ), 1 )
376+ self .assertEqual (g .x ("3-2-1" ), 0 )
377+
378+
362379 def test_characterVsSequence (self ):
363380 """
364381 Characters (in single-quotes) are not regarded as sequences.
@@ -806,6 +823,23 @@ def test_leftrecursion(self):
806823 self .assertEqual (g .num ("32767" ), 32767 )
807824
808825
826+ def test_mutual_leftrecursion (self ):
827+ g = self .compile ("""
828+ num = (num:n digit:d -> n * 10 + d
829+ | digit)
830+ digit = :x ?(x.isdigit()) -> int(x)
831+ x = expr
832+ expr = x:e '-' num:n -> e - n
833+ | num
834+ """ )
835+ self .assertEqual (g .expr ("3" ), 3 )
836+ self .assertEqual (g .expr ("3-2" ), 1 )
837+ self .assertEqual (g .expr ("3-2-1" ), 0 )
838+ self .assertEqual (g .x ("3" ), 3 )
839+ self .assertEqual (g .x ("3-2" ), 1 )
840+ self .assertEqual (g .x ("3-2-1" ), 0 )
841+
842+
809843 def test_characterVsSequence (self ):
810844 """
811845 Characters (in single-quotes) are not regarded as sequences.
@@ -1011,6 +1045,25 @@ def test_leftrecursion(self):
10111045 self .assertEqual (g .num ("3" ), 3 )
10121046 self .assertEqual (g .num ("32767" ), 32767 )
10131047
1048+ def test_mutual_leftrecursion (self ):
1049+ g = self .compile ("""
1050+ num = (num:n digit:d -> makeInt(n, d)
1051+ | digit)
1052+ digit = :x ?(isdigit(x)) -> int(x)
1053+ x = expr
1054+ expr = x:e '-' num:n -> subtract(e, n)
1055+ | num
1056+ """ , {"makeInt" : lambda x , y : x * 10 + y ,
1057+ "isdigit" : lambda x : x .isdigit (),
1058+ "subtract" : lambda x , y : x - y })
1059+ self .assertEqual (g .expr ("3" ), 3 )
1060+ self .assertEqual (g .expr ("3-2" ), 1 )
1061+ self .assertEqual (g .expr ("3-2-1" ), 0 )
1062+ self .assertEqual (g .x ("3" ), 3 )
1063+ self .assertEqual (g .x ("3-2" ), 1 )
1064+ self .assertEqual (g .x ("3-2-1" ), 0 )
1065+
1066+
10141067 def test_characterVsSequence (self ):
10151068 """
10161069 Characters (in single-quotes) are not regarded as sequences.
0 commit comments