I'm testing a parser which parses ambiguous grammars (it'll eventually wind up in CPAN under the name Parse::Marpa). In searching for good test cases (criteria: small enough to debug, tricky enough to find bugs and if possible, fun), I've bumped into what I'll call the (Larry) Wall Series.
Consider the following grammar, which is both a restriction and an extension of Perl: The restriction is that only numbers and minus signs are allowed. The extensions are that precedence is ignored; that lvalues are automatically created as needed; and that ambiguity is allowed. Ambigious expressions are evaluated as a list of all the possible results. (Apparently something like this will be an option with Perl 6 regexes, which encourages me to hope my thinking is not too warped, or at least that I have company.)
So, for example, the expression "6----1" produces the list (7, 8, 6, 7) as follows:
Putting a number at each end and the minus signs in the middle produces the greatest ambiguity, and is therefore the most interesting case. Given such an expression with
minus signs, what's the number of parses? Parse::Marpa produces this series: 1 1 3 4 8 12 21 33 55 88 144 232.
You'll note this is similar to, but not quite, the Fibonacci series. It's
, but does not seem to have a name, so I'm taking the liberty of calling it the Wall Series. I've checked the first 5 by hand.
For the curious here are the other parse results for the first 12 numbers in the Wall series.
Length 1, Parse 0, value==(6-1)==5
Length 2, Parse 0, value==(6-(-1))==7
Length 3, Parse 0, value==((6--)-1)==5
Length 3, Parse 1, value==(6-(--1))==6
Length 3, Parse 2, value==(6-(-(-1)))==5
Length 4, Parse 0, value==((6--)-(-1))==7
Length 4, Parse 1, value==(6-(--(-1)))==8
Length 4, Parse 2, value==(6-(-(--1)))==6
Length 4, Parse 3, value==(6-(-(-(-1))))==7
Length 5, Parse 0, value==(((6--)--)-1)==5
Length 5, Parse 1, value==((6--)-(--1))==6
Length 5, Parse 2, value==(6-(--(--1)))==7
Length 5, Parse 3, value==(6-(--(-(-1))))==6
Length 5, Parse 4, value==((6--)-(-(-1)))==5
Length 5, Parse 5, value==(6-(-(-(--1))))==6
Length 5, Parse 6, value==(6-(-(-(-(-1)))))==5
Length 5, Parse 7, value==(6-(-(--(-1))))==4
Length 6, Parse 0, value==(((6--)--)-(-1))==7
Length 6, Parse 1, value==((6--)-(--(-1)))==8
Length 6, Parse 2, value==((6--)-(-(--1)))==6
Length 6, Parse 3, value==((6--)-(-(-(-1))))==7
Length 6, Parse 4, value==(6-(--(--(-1))))==9
Length 6, Parse 5, value==(6-(--(-(--1))))==7
Length 6, Parse 6, value==(6-(--(-(-(-1)))))==8
Length 6, Parse 7, value==(6-(-(--(--1))))==5
Length 6, Parse 8, value==(6-(-(--(-(-1)))))==6
Length 6, Parse 9, value==(6-(-(-(--(-1)))))==8
Length 6, Parse 10, value==(6-(-(-(-(--1)))))==6
Length 6, Parse 11, value==(6-(-(-(-(-(-1))))))==7
Length 7, Parse 0, value==((((6--)--)--)-1)==5
Length 7, Parse 1, value==(((6--)--)-(--1))==6
Length 7, Parse 2, value==((6--)-(--(--1)))==7
Length 7, Parse 3, value==((6--)-(--(-(-1))))==6
Length 7, Parse 4, value==(((6--)--)-(-(-1)))==5
Length 7, Parse 5, value==(6-(--(--(--1))))==8
Length 7, Parse 6, value==(6-(--(--(-(-1)))))==7
Length 7, Parse 7, value==(6-(--(-(-(--1)))))==7
Length 7, Parse 8, value==(6-(--(-(-(-(-1))))))==6
Length 7, Parse 9, value==(6-(--(-(--(-1)))))==5
Length 7, Parse 10, value==((6--)-(-(-(--1))))==6
Length 7, Parse 11, value==((6--)-(-(-(-(-1)))))==5
Length 7, Parse 12, value==((6--)-(-(--(-1))))==4
Length 7, Parse 13, value==(6-(-(-(--(--1)))))==7
Length 7, Parse 14, value==(6-(-(-(--(-(-1))))))==6
Length 7, Parse 15, value==(6-(-(-(-(-(--1))))))==6
Length 7, Parse 16, value==(6-(-(-(-(-(-(-1)))))))==5
Length 7, Parse 17, value==(6-(-(-(-(--(-1))))))==4
Length 7, Parse 18, value==(6-(-(--(-(--1)))))==5
Length 7, Parse 19, value==(6-(-(--(-(-(-1))))))==4
Length 7, Parse 20, value==(6-(-(--(--(-1)))))==3
Length 8, Parse 0, value==((((6--)--)--)-(-1))==7
Length 8, Parse 1, value==(((6--)--)-(--(-1)))==8
Length 8, Parse 2, value==(((6--)--)-(-(--1)))==6
Length 8, Parse 3, value==(((6--)--)-(-(-(-1))))==7
Length 8, Parse 4, value==((6--)-(--(--(-1))))==9
Length 8, Parse 5, value==((6--)-(--(-(--1))))==7
Length 8, Parse 6, value==((6--)-(--(-(-(-1)))))==8
Length 8, Parse 7, value==((6--)-(-(--(--1))))==5
Length 8, Parse 8, value==((6--)-(-(--(-(-1)))))==6
Length 8, Parse 9, value==((6--)-(-(-(--(-1)))))==8
Length 8, Parse 10, value==((6--)-(-(-(-(--1)))))==6
Length 8, Parse 11, value==((6--)-(-(-(-(-(-1))))))==7
Length 8, Parse 12, value==(6-(--(--(--(-1)))))==10
Length 8, Parse 13, value==(6-(--(--(-(--1)))))==8
Length 8, Parse 14, value==(6-(--(--(-(-(-1))))))==9
Length 8, Parse 15, value==(6-(--(-(--(--1)))))==6
Length 8, Parse 16, value==(6-(--(-(--(-(-1))))))==7
Length 8, Parse 17, value==(6-(--(-(-(--(-1))))))==9
Length 8, Parse 18, value==(6-(--(-(-(-(--1))))))==7
Length 8, Parse 19, value==(6-(--(-(-(-(-(-1)))))))==8
Length 8, Parse 20, value==(6-(-(--(--(--1)))))==4
Length 9, Parse 0, value==(((((6--)--)--)--)-1)==5
Length 9, Parse 1, value==((((6--)--)--)-(--1))==6
Length 9, Parse 2, value==(((6--)--)-(--(--1)))==7
Length 9, Parse 3, value==(((6--)--)-(--(-(-1))))==6
Length 9, Parse 4, value==((((6--)--)--)-(-(-1)))==5
Length 9, Parse 5, value==((6--)-(--(--(--1))))==8
Length 9, Parse 6, value==((6--)-(--(--(-(-1)))))==7
Length 9, Parse 7, value==((6--)-(--(-(-(--1)))))==7
Length 9, Parse 8, value==((6--)-(--(-(-(-(-1))))))==6
Length 9, Parse 9, value==((6--)-(--(-(--(-1)))))==5
Length 9, Parse 10, value==(((6--)--)-(-(-(--1))))==6
Length 9, Parse 11, value==(((6--)--)-(-(-(-(-1)))))==5
Length 9, Parse 12, value==(((6--)--)-(-(--(-1))))==4
Length 9, Parse 13, value==(6-(--(--(--(--1)))))==9
Length 9, Parse 14, value==(6-(--(--(--(-(-1))))))==8
Length 9, Parse 15, value==(6-(--(--(-(-(--1))))))==8
Length 9, Parse 16, value==(6-(--(--(-(-(-(-1)))))))==7
Length 9, Parse 17, value==(6-(--(--(-(--(-1))))))==6
Length 9, Parse 18, value==(6-(--(-(-(--(--1))))))==8
Length 9, Parse 19, value==(6-(--(-(-(--(-(-1)))))))==7
Length 9, Parse 20, value==(6-(--(-(-(-(-(--1)))))))==7
Length 10, Parse 0, value==(((((6--)--)--)--)-(-1))==7
Length 10, Parse 1, value==((((6--)--)--)-(--(-1)))==8
Length 10, Parse 2, value==((((6--)--)--)-(-(--1)))==6
Length 10, Parse 3, value==((((6--)--)--)-(-(-(-1))))==7
Length 10, Parse 4, value==(((6--)--)-(--(--(-1))))==9
Length 10, Parse 5, value==(((6--)--)-(--(-(--1))))==7
Length 10, Parse 6, value==(((6--)--)-(--(-(-(-1)))))==8
Length 10, Parse 7, value==(((6--)--)-(-(--(--1))))==5
Length 10, Parse 8, value==(((6--)--)-(-(--(-(-1)))))==6
Length 10, Parse 9, value==(((6--)--)-(-(-(--(-1)))))==8
Length 10, Parse 10, value==(((6--)--)-(-(-(-(--1)))))==6
Length 10, Parse 11, value==(((6--)--)-(-(-(-(-(-1))))))==7
Length 10, Parse 12, value==((6--)-(--(--(--(-1)))))==10
Length 10, Parse 13, value==((6--)-(--(--(-(--1)))))==8
Length 10, Parse 14, value==((6--)-(--(--(-(-(-1))))))==9
Length 10, Parse 15, value==((6--)-(--(-(--(--1)))))==6
Length 10, Parse 16, value==((6--)-(--(-(--(-(-1))))))==7
Length 10, Parse 17, value==((6--)-(--(-(-(--(-1))))))==9
Length 10, Parse 18, value==((6--)-(--(-(-(-(--1))))))==7
Length 10, Parse 19, value==((6--)-(--(-(-(-(-(-1)))))))==8
Length 10, Parse 20, value==((6--)-(-(--(--(--1)))))==4
Length 11, Parse 0, value==((((((6--)--)--)--)--)-1)==5
Length 11, Parse 1, value==(((((6--)--)--)--)-(--1))==6
Length 11, Parse 2, value==((((6--)--)--)-(--(--1)))==7
Length 11, Parse 3, value==((((6--)--)--)-(--(-(-1))))==6
Length 11, Parse 4, value==(((((6--)--)--)--)-(-(-1)))==5
Length 11, Parse 5, value==(((6--)--)-(--(--(--1))))==8
Length 11, Parse 6, value==(((6--)--)-(--(--(-(-1)))))==7
Length 11, Parse 7, value==(((6--)--)-(--(-(-(--1)))))==7
Length 11, Parse 8, value==(((6--)--)-(--(-(-(-(-1))))))==6
Length 11, Parse 9, value==(((6--)--)-(--(-(--(-1)))))==5
Length 11, Parse 10, value==((((6--)--)--)-(-(-(--1))))==6
Length 11, Parse 11, value==((((6--)--)--)-(-(-(-(-1)))))==5
Length 11, Parse 12, value==((((6--)--)--)-(-(--(-1))))==4
Length 11, Parse 13, value==((6--)-(--(--(--(--1)))))==9
Length 11, Parse 14, value==((6--)-(--(--(--(-(-1))))))==8
Length 11, Parse 15, value==((6--)-(--(--(-(-(--1))))))==8
Length 11, Parse 16, value==((6--)-(--(--(-(-(-(-1)))))))==7
Length 11, Parse 17, value==((6--)-(--(--(-(--(-1))))))==6
Length 11, Parse 18, value==((6--)-(--(-(-(--(--1))))))==8
Length 11, Parse 19, value==((6--)-(--(-(-(--(-(-1)))))))==7
Length 11, Parse 20, value==((6--)-(--(-(-(-(-(--1)))))))==7
Length 12, Parse 0, value==((((((6--)--)--)--)--)-(-1))==7
Length 12, Parse 1, value==(((((6--)--)--)--)-(--(-1)))==8
Length 12, Parse 2, value==(((((6--)--)--)--)-(-(--1)))==6
Length 12, Parse 3, value==(((((6--)--)--)--)-(-(-(-1))))==7
Length 12, Parse 4, value==((((6--)--)--)-(--(--(-1))))==9
Length 12, Parse 5, value==((((6--)--)--)-(--(-(--1))))==7
Length 12, Parse 6, value==((((6--)--)--)-(--(-(-(-1)))))==8
Length 12, Parse 7, value==((((6--)--)--)-(-(--(--1))))==5
Length 12, Parse 8, value==((((6--)--)--)-(-(--(-(-1)))))==6
Length 12, Parse 9, value==((((6--)--)--)-(-(-(--(-1)))))==8
Length 12, Parse 10, value==((((6--)--)--)-(-(-(-(--1)))))==6
Length 12, Parse 11, value==((((6--)--)--)-(-(-(-(-(-1))))))==7
Length 12, Parse 12, value==(((6--)--)-(--(--(--(-1)))))==10
Length 12, Parse 13, value==(((6--)--)-(--(--(-(--1)))))==8
Length 12, Parse 14, value==(((6--)--)-(--(--(-(-(-1))))))==9
Length 12, Parse 15, value==(((6--)--)-(--(-(--(--1)))))==6
Length 12, Parse 16, value==(((6--)--)-(--(-(--(-(-1))))))==7
Length 12, Parse 17, value==(((6--)--)-(--(-(-(--(-1))))))==9
Length 12, Parse 18, value==(((6--)--)-(--(-(-(-(--1))))))==7
Length 12, Parse 19, value==(((6--)--)-(--(-(-(-(-(-1)))))))==8
Length 12, Parse 20, value==(((6--)--)-(-(--(--(--1)))))==4