minishell/grammar.md

54 lines
1.4 KiB
Markdown

## Initial Grammar (Left recursivity)
This grammar is conceived to take into account both left associativity
and priority of operators to wit () is of highest priority followed by |
and then || and && which share the same priority (priorization therefore
occurs because of left associativity).
```
LINE -> CMDS eol
CMDS -> CMDS LIST_OP PIPELINE
CMDS -> PIPELINE
PIPELINE -> PIPELINE | GROUP_OR_SIMPLE
PIPELINE -> GROUP_OR_SIMPLE
GROUP_OR_SIMPLE -> (CMDS) REDIR
GROUP_OR_SIMPLE -> SIMPLE
SIMPLE -> REDIR word REDIR SIMPLE_LST
SIMPLE_LST -> word REDIR SIMPLE_LST
SIMPLE_LST -> ε
REDIR -> > word REDIR
REDIR -> >> word REDIR
REDIR -> < word REDIR
REDIR -> << word REDIR
REDIR -> ε
LIST_OP -> &&
LIST_OP -> ||
```
## Grammar after removal of left recursivity
The same priorities as the previous version except it is now LL(1) and
therefore compatible with descending syntax analysis (LL(1)).
```
LINE -> CMDS eol
CMDS -> PIPELINE OPT_CMDS
OPT_CMDS -> LIST_OP PIPELINE OPT_CMDS
OPT_CMDS -> ε
PIPELINE -> GROUP_OR_SIMPLE OPT_PIPELINE
OPT_PIPELINE -> | GROUP_OR_SIMPLE OPT_PIPELINE
OPT_PIPELINE -> ε
GROUP_OR_SIMPLE -> (CMDS) REDIR
GROUP_OR_SIMPLE -> SIMPLE
SIMPLE -> REDIR SIMPLE_TAIL
SIMPLE_TAIL -> word REDIR SIMPLE_TAIL
SIMPLE_TAIL -> ε
REDIR -> > word REDIR
REDIR -> >> word REDIR
REDIR -> < word REDIR
REDIR -> << word REDIR
REDIR -> ε
LIST_OP -> &&
LIST_OP -> ||
```