# Rewriting Marpa rules

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.