internal static XbnfDocument Parse(ParseContext pc) { var result = new XbnfDocument(); while (-1 != pc.Current) { result.Productions.Add(XbnfProduction.Parse(pc)); // have to do this so trailing whitespace // doesn't get read as a production pc.TryReadCCommentsAndWhitespace(); } return(result); }
static IList <IList <string> > _GetDysConcat(XbnfDocument d, ICollection <string> syms, IDictionary <XbnfExpression, string> tmap, IDictionary <string, XbnfAttributeList> attrs, IList <KeyValuePair <string, IList <string> > > rules, XbnfProduction p, XbnfConcatExpression ce) { var l = new List <IList <string> >(); if (null == ce.Right) { if (null == ce.Left) { return(l); } foreach (var ll in _GetDysjunctions(d, syms, tmap, attrs, rules, p, ce.Left)) { l.Add(new List <string>(ll)); } return(l); } else if (null == ce.Left) { foreach (var ll in _GetDysjunctions(d, syms, tmap, attrs, rules, p, ce.Right)) { l.Add(new List <string>(ll)); } return(l); } foreach (var ll in _GetDysjunctions(d, syms, tmap, attrs, rules, p, ce.Left)) { foreach (var ll2 in _GetDysjunctions(d, syms, tmap, attrs, rules, p, ce.Right)) { var ll3 = new List <string>(); ll3.AddRange(ll); ll3.AddRange(ll2); if (!l.Contains(ll3, OrderedCollectionEqualityComparer <string> .Default)) { l.Add(ll3); } } } return(l); }
static IList <IList <string> > _GetDysOr(XbnfDocument d, ICollection <string> syms, IDictionary <XbnfExpression, string> tmap, IDictionary <string, XbnfAttributeList> attrs, IList <KeyValuePair <string, IList <string> > > rules, XbnfProduction p, XbnfOrExpression oe) { var l = new List <IList <string> >(); if (null == oe.Left) { l.Add(new List <string>()); } else { foreach (var ll in _GetDysjunctions(d, syms, tmap, attrs, rules, p, oe.Left)) { if (!l.Contains(ll, OrderedCollectionEqualityComparer <string> .Default)) { l.Add(ll); } } } if (null == oe.Right) { var ll = new List <string>(); if (!l.Contains(ll, OrderedCollectionEqualityComparer <string> .Default)) { l.Add(ll); } } else { foreach (var ll in _GetDysjunctions(d, syms, tmap, attrs, rules, p, oe.Right)) { if (!l.Contains(ll, OrderedCollectionEqualityComparer <string> .Default)) { l.Add(ll); } } } return(l); }
static IList <IList <string> > _GetDysRepeat(XbnfDocument d, ICollection <string> syms, IDictionary <XbnfExpression, string> tmap, IDictionary <string, XbnfAttributeList> attrs, IList <KeyValuePair <string, IList <string> > > rules, XbnfProduction p, XbnfRepeatExpression re) { string sid = null; var sr = re.Expression as XbnfRefExpression; if (null != d && null != sr) { sid = string.Concat(sr.Symbol, "list"); } if (string.IsNullOrEmpty(sid)) { var cc = re.Expression as XbnfConcatExpression; if (null != cc) { sr = cc.Right as XbnfRefExpression; if (null != sr) { sid = string.Concat(sr.Symbol, "listtail"); } } } if (string.IsNullOrEmpty(sid)) { sid = "implicitlist"; } var listId = sid; var i = 2; var ss = listId; while (syms.Contains(ss)) { ss = string.Concat(listId, i.ToString()); ++i; } syms.Add(ss); var attr = new XbnfAttribute("collapsed", true); var attrlist = new XbnfAttributeList(); attrlist.Add(attr); attrs.Add(listId, attrlist); var expr = new XbnfOrExpression( new XbnfConcatExpression( new XbnfRefExpression(listId), re.Expression), re.Expression); foreach (var nt in _GetDysjunctions(d, syms, tmap, attrs, rules, p, expr)) { var l = new List <string>(); var r = new KeyValuePair <string, IList <string> >(listId, l); foreach (var s in nt) { if (1 < r.Value.Count && null == s) { continue; } r.Value.Add(s); } rules.Add(r); } if (!re.IsOptional) { return(new List <IList <string> >(new IList <string>[] { new List <string>(new string[] { listId }) })); } else { var res = new List <IList <string> >(); res.Add(new List <string>(new string[] { listId })); res.Add(new List <string>()); return(res); } }
static IList <IList <string> > _GetDysOptional(XbnfDocument d, ICollection <string> syms, IDictionary <XbnfExpression, string> tmap, IDictionary <string, XbnfAttributeList> attrs, IList <KeyValuePair <string, IList <string> > > rules, XbnfProduction p, XbnfOptionalExpression ope) { var l = new List <IList <string> >(); if (null != ope.Expression) { l.AddRange(_GetDysjunctions(d, syms, tmap, attrs, rules, p, ope.Expression)); var ll = new List <string>(); if (!l.Contains(ll, OrderedCollectionEqualityComparer <string> .Default)) { l.Add(ll); } } return(l); }
static IList <IList <string> > _GetDysjunctions( XbnfDocument d, ICollection <string> syms, IDictionary <XbnfExpression, string> tmap, IDictionary <string, XbnfAttributeList> attrs, IList <KeyValuePair <string, IList <string> > > rules, XbnfProduction p, XbnfExpression e ) { var le = e as XbnfLiteralExpression; if (null != le) { var res = new List <IList <string> >(); var l = new List <string>(); l.Add(tmap[le]); res.Add(l); return(res); } var rxe = e as XbnfRegexExpression; if (null != rxe) { var res = new List <IList <string> >(); var l = new List <string>(); l.Add(tmap[rxe]); res.Add(l); return(res); } var rfe = e as XbnfRefExpression; if (null != rfe) { var res = new List <IList <string> >(); var l = new List <string>(); l.Add(rfe.Symbol); res.Add(l); return(res); } var ce = e as XbnfConcatExpression; if (null != ce) { return(_GetDysConcat(d, syms, tmap, attrs, rules, p, ce)); } var oe = e as XbnfOrExpression; if (null != oe) { return(_GetDysOr(d, syms, tmap, attrs, rules, p, oe)); } var ope = e as XbnfOptionalExpression; if (null != ope) { return(_GetDysOptional(d, syms, tmap, attrs, rules, p, ope)); } var re = e as XbnfRepeatExpression; if (null != re) { return(_GetDysRepeat(d, syms, tmap, attrs, rules, p, re)); } throw new NotSupportedException("The specified expression type is not supported."); }