The following Cocol grammar may be familiar. It describes a set of EBNF productions that can incorporate Wirth's metabrackets { } [ and ].
COMPILER EBNF $CN /* Parse a set of EBNF productions P.D. Terry, Rhodes University, 2005 */ CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" . lowline = "_" . digit = "0123456789" . noquote1 = ANY - "'" . noquote2 = ANY - '"' . TOKENS nonterminal = letter { letter | lowline | digit } . terminal = "'" noquote1 { noquote1 } "'" | '"' noquote2 { noquote2 } '"' . COMMENTS FROM "<" TO ">" IGNORE CHR(9) .. CHR(13) PRODUCTIONS EBNF = { Production } EOF . Production = nonterminal "=" Expression "." . Expression = Term { "|" Term } . Term = Factor { Factor } . Factor = nonterminal | terminal | "[" Expression "]" | "(" Expression ")" | "{" Expression "}" . END EBNF.
Show how the productions would be attributed so as to parse a set of productions given in the Wirth notation and reproduce them one to a line in the alternative EBNF notation that uses Kleene closure symbol * and e. For example, a production like
Program = [ Header ] { Statement } .
should be transformed to
Program = ( Header | e ) ( Statement )* .