There is a grammar of this kind described in the documentation:
grammar
=
| ['()'] ['$'] {'#' &'#'} '#'
| ['()'] {'#' &'#'} '#%'
| ['()'] ['$'] {'0' &'0'} '0'
| ['()'] {'0' &'0%'} '0%'
| ['()'] ['$'] {'#' &'0'} {'0' &'0'} '0'
;
How to correctly describe the grammar so that when you try to parse a string, you get the following result:
For string '######'
we get the result (['#', '#', '#', '#', '#'], '#')
it's True (worked first rule)
For string '#####%'
we get the result (['#', '#', '#', '#'], '#')
it's False it should be (['#', '#', '#', '#'], '#%')
(worked first but should have been second rule)
For string '000000'
we get the result (['0', '0', '0', '0', '0'], '0')
it's True (worked third rule)
For string '###000'
we get the result (['#', '#'], '#')
it's False (worked first but should have been fifth rule)
Are the rules given in the documentation absurd or am I doing something wrong ?
Tatsu try rules in the order they are declared.
So in your example:
The first rule will successfully match
#####
before even reading the%
Reversing the two options will make Tatsu try to parse
#%
first, and only try#
if it fails.NB: the
~
symbol can also be used to avoid trying other options for a rule once a pattern has been successfully parsed.