public BnfGrammar(bool enhanced = true) : base("bnf") { if (enhanced) { #if CORECLR foreach (var property in typeof(Terminals).GetTypeInfo().DeclaredProperties) #else foreach (var property in typeof(Terminals).GetProperties()) #endif { #if CORECLR if (typeof(Parser).GetTypeInfo().IsAssignableFrom(property.PropertyType.GetTypeInfo())) #else if (typeof(Parser).IsAssignableFrom(property.PropertyType)) #endif { var parser = property.GetValue(null, null) as Parser; baseLookup[property.Name] = parser.Named(property.Name); } } } var lineEnd = sws & +(sws & Terminals.Eol); literal = ( (sq & (+!sq).WithName("value").Optional() & sq) | (dq & (+!dq).WithName("value").Optional() & dq) ).WithName("parser"); RuleNameParser = "<" & Terminals.Set('>').Inverse().Repeat().WithName("name") & ">"; RuleParser = new AlternativeParser(); // defined later TermParser = literal | (ruleName = RuleNameParser.Named("parser")); TermParser.Name = "term"; if (enhanced) { TermParser.Items.Add('(' & sws & RuleParser & sws & ')'); TermParser.Items.Add(repeatRule = ('{' & sws & RuleParser & sws & '}').WithName("parser")); TermParser.Items.Add(optionalRule = ('[' & sws & RuleParser & sws & ']').WithName("parser")); } list = (TermParser & -(~((+Terminals.SingleLineWhiteSpace).WithName("ws")) & TermParser)).WithName("parser"); listRepeat = (list.Named("list") & ws & '|' & sws & ~(RuleParser.Named("expression"))).WithName("parser"); RuleParser.Items.Add(listRepeat); RuleParser.Items.Add(list); rule = (~lineEnd & sws & RuleNameParser.Named("ruleName") & ws & ruleSeparator & sws & RuleParser & lineEnd).WithName("parser"); Expresssions = new AlternativeParser(); Expresssions.Items.Add(rule); this.Inner = ws & +Expresssions & ws; AttachEvents(); }
public BnfGrammar(bool enhanced = true) : base("bnf") { if (enhanced) { foreach (var terminal in Terminals.GetTerminals()) { baseLookup[terminal.Item1] = terminal.Item2.Named(terminal.Item1); } } literal = ( (sq & (+!sq).WithName("value").Optional() & sq) | (dq & (+!dq).WithName("value").Optional() & dq) | ((+(Terminals.WhiteSpace.Inverse().Except(Terminals.Set("<[{(|)}]>"))))).WithName("value") ).WithName("parser"); RuleNameParser = "<" & Terminals.Set("<>").Inverse().Repeat().WithName("name") & ">"; RuleParser = new AlternativeParser(); // defined later TermParser = ((ruleName = RuleNameParser.Named("parser")).NotFollowedBy(ows & ruleSeparator)) | literal; TermParser.Name = "term"; if (enhanced) { TermParser.Items.Add('(' & ows & RuleParser & ows & ')'); TermParser.Items.Add(repeatRule = ('{' & ows & RuleParser & ows & '}').WithName("parser")); TermParser.Items.Add(optionalRule = ('[' & ows & RuleParser & ows & ']').WithName("parser")); } TermParser.Items.Add((ows & RuleNameParser & ows & ruleSeparator).Not() & Terminals.Set("<[{(}]>").WithName("value").Named("parser")); list = (TermParser & -(~(rws.Named("ws")) & TermParser)).WithName("parser"); listRepeat = (list.Named("list") & ows & '|' & ~(ows & RuleParser.Named("expression"))).WithName("parser"); RuleParser.Items.Add(listRepeat); RuleParser.Items.Add(list); rule = (RuleNameParser.Named("ruleName") & ows & ruleSeparator & ows & RuleParser).WithName("parser"); Expresssions = new AlternativeParser(); Expresssions.Items.Add(rule); this.Inner = ows & (+Expresssions).SeparatedBy(rws) & ows; AttachEvents(); }
public BnfGrammar(BnfStyle style = BnfStyle.All) : base("bnf") { Parser ows = Terminals.WhiteSpace.Repeat(0); Parser rws = Terminals.WhiteSpace.Repeat(1); if (style.HasFlag(BnfStyle.CommonTerminals)) { foreach (var terminal in Terminals.GetTerminals()) { baseLookup[terminal.Item1] = terminal.Item2; } } if (style.HasFlag(BnfStyle.Comments)) { // allow ebnf comments var comment = new GroupParser("(*", "*)"); ows = (Terminals.WhiteSpace | comment).Repeat(0); rws = (Terminals.WhiteSpace | comment).Repeat(1); } literal = ( (sq & (+!sq).WithName("value").Optional() & sq) | (dq & (+!dq).WithName("value").Optional() & dq) | (+Terminals.Set(" \n\r<[{(|)}]>").Inverse()).WithName("value") ).WithName("parser"); RuleNameParser = "<" & Terminals.Set("<>\n\r").Inverse().Repeat().WithName("name") & ">"; RuleParser = new AlternativeParser(); // defined later TermParser = new AlternativeParser(); TermParser.Name = "term"; TermParser.Add((ruleName = RuleNameParser.Named("parser")).NotFollowedBy(ows & ruleSeparator)); if (style.HasFlag(BnfStyle.Cardinality)) { TermParser.Items.Add('(' & ows & RuleParser & ows & ')'); TermParser.Items.Add(repeatRule = ('{' & ows & RuleParser & ows & '}').WithName("parser")); TermParser.Items.Add(optionalRule = ('[' & ows & RuleParser & ows & ']').WithName("parser")); } TermParser.Items.Add(literal); var rep = -(~((+Terminals.WhiteSpace).WithName("ws")) & TermParser); rep.Name = "rep"; rep.AddMatch = false; list = (TermParser & rep).WithName("parser"); listRepeat = (list.Named("list") & ows & '|' & ~(ows & RuleParser.Named("expression"))).WithName("parser"); RuleParser.Items.Add(listRepeat); RuleParser.Items.Add(list); RuleParser.Items.Add((ows & RuleNameParser & ows & ruleSeparator).Not() & Terminals.WhiteSpace.Inverse().Repeat().WithName("value").Named("parser")); rule = (RuleNameParser.Named("ruleName") & ows & ruleSeparator & ows & RuleParser).WithName("parser"); Expresssions = new AlternativeParser(); Expresssions.Items.Add(rule); this.Inner = ows & (+Expresssions).SeparatedBy(rws) & ows; AttachEvents(); }