Let’s try to write some rewrite rules for a next level Marpa to a lower level Marpa. The syntax is not important, this is about how we can rewrite the rules.
In the actual grammars none of the left side patterns work, but all of the right side rewritten version should work.
Alternations
An alternation is a rule that can match either way B
, C
or D
.
A ::= B | C => A ::= B
A ::= C
A ::= B | C | D => A ::= B
A ::= C
A ::= D
Plus, Star
Plus means match one or more times, star means match zero of more times.
Normally you can’t use +
or *
inside of a rule. Only whole rules can be
used like this. If you want to use these you need to create a new rule and use
it inside.
A ::= B+ C => A ::= SR0 C
SR0 ::= B+
Subrule
A subrule is a rule that is part of another rule. A subrule behaves as if it is a rule.
A ::= (B C) D => A ::= SR0 D
SR0 ::= B C
A ::= (B C)+ D => A ::= SR0 D
SR0 ::= SR1+
SR1 ::= B C
Count
Match exactly n
times.
A ::= B{n}
A ::= B{1} => A ::= B
A ::= B{2} => A ::= B B
A ::= B{10} => A ::= B B B B B B B B B B
Min
Match at least min
times.
A ::= B{min,}
A ::= B{2,} => A ::= B B
A ::= B B SR0
SR0 ::= B*
Max
Match no more than max
times.
A ::= B{,max}
A ::= B{,10} => A ::= Null
A ::= B
A ::= B B
A ::= B B B
A ::= B B B B
A ::= B B B B B
A ::= B B B B B B
A ::= B B B B B B B
A ::= B B B B B B B B
A ::= B B B B B B B B B
A ::= B B B B B B B B B B
Min, Max
Match at least min
times, but no more than max
times.
A ::= B{min, max}
A ::= B{2,5} => A ::= B B
A ::= B B B
A ::= B B B B
A ::= B B B B B
I will keep the namespaces, modules and includes in my brain for another time.