Converting EBNF to BNF

bnf, computer-science, ebnf, language-agnostic, recursive-descent

Solution

See this page. It contains instructions for each production that needs to be converted:

From EBNF to BNF

For building parsers (especially bottom-up) a BNF grammar is often better, than EBNF. But it's easy to convert an EBNF Grammar to BNF:

Convert every repetition `{ E }` to a fresh non-terminal `X` and add

X = ε | X E.

Convert every option `[ E ]` to a fresh non-terminal `X` and add

X = ε | E.

(We can convert `X = A [ E ] B.` to `X = A E B | A B.`)

Convert every group `( E )` to a fresh non-terminal `X` and add

X = E.

We can even do away with alternatives by having several productions with the same non-terminal.

`X = E | E'.` becomes `X = E. X = E'.`

Problem

It's been a few years since my computer-language class and so I've forgotten the finer points of BNF's and EBNF's and I don't have a textbook next to me. Specifically, I've forgotten how to convert an EBNF into BNF. From what little I remember, I know that one of the main points is to convert ``` { term } ``` into ``` <term> | <many-terms> ``` But I don't remember the other rules. I've tried to look this up online but I can only find links to either homework questions, or a small comment about converting terms with curly braces. I can't find an exhaustive list of rules that define the translation.

Original source