var ebnf = new EbnfGrammar(EbnfStyle.BracketComments | EbnfStyle.CommaSeparator | EbnfStyle.SemicolonTerminator | EbnfStyle.SquareBracketAsOptional);
var grammar = ebnf.Build(@"
(* := is an extension to define a literal with no whitespace between repeats and sequences *)
grammar := [ sub_unit_number, ""/"" ], street_number, ws, street_name, ws, street_type;
sub_unit_number := number;
street_number := number, [ letter ];
street_name := word, { ws, -street_type, word };
street_type := ""street"" | ""road"" | ""terrace"";
word := letter, {letter};
ws := ? Terminals.WhiteSpace ?, { ? Terminals.WhiteSpace ? };
number := digit, {digit};
letter := ? Terminals.Letter ?;
digit := ? Terminals.Digit ?;
", "grammar"); var ebnf = new EbnfGrammar(EbnfStyle.BracketComments | EbnfStyle.CommaSeparator | EbnfStyle.SemicolonTerminator | EbnfStyle.SquareBracketAsOptional | EbnfStyle.NumericCardinality);
var grammar = ebnf.Build(@"
(* := is an extension to define a literal with no whitespace between repeats and sequences *)
grammar := [ sub_unit_number, ""/"" ], street_number, ws, street_name, ws, street_type;
sub_unit_number := number;
street_number := number, [ letter ];
street_name := word, { ws, 0 * (street_type), word };, "grammar");