public override IList <IList <string> > ToDisjunctions(EbnfDocument parent, Cfg cfg) { var _listId = cfg.GetUniqueId("implicitlist"); IDictionary <string, object> attrs = new Dictionary <string, object>(); attrs.Add("collapse", true); cfg.AttributeSets.Add(_listId, attrs); var expr = new EbnfOrExpression(new EbnfOrExpression(new EbnfConcatExpression(Expression, new EbnfRefExpression(_listId)), Expression), null); foreach (var nt in expr.ToDisjunctions(parent, cfg)) { CfgRule r = new CfgRule(); r.Left = _listId; foreach (var s in nt) { if (1 < r.Right.Count && null == s) { continue; } r.Right.Add(s); } if (!cfg.Rules.Contains(r)) { cfg.Rules.Add(r); } } return(new List <IList <string> >(new IList <string>[] { new List <string>(new string[] { _listId }) })); }
static EbnfExpression _ParseExpression(EbnfDocument doc, ParseContext pc) { EbnfExpression current = null; EbnfExpression e; long position; int line; int column; pc.TrySkipCCommentsAndWhiteSpace(); position = pc.Position; line = pc.Line; column = pc.Column; while (-1 != pc.Current && ']' != pc.Current && ')' != pc.Current && '}' != pc.Current && ';' != pc.Current) { pc.TrySkipCCommentsAndWhiteSpace(); position = pc.Position; line = pc.Line; column = pc.Column; switch (pc.Current) { case '|': pc.Advance(); current = new EbnfOrExpression(current, _ParseExpression(doc, pc)); current.SetPositionInfo(line, column, position); break; case '(': pc.Advance(); e = _ParseExpression(doc, pc); current.SetPositionInfo(line, column, position); pc.Expecting(')'); pc.Advance(); e.SetPositionInfo(line, column, position); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } break; case '[': pc.Advance(); e = new EbnfOptionalExpression(_ParseExpression(doc, pc)); e.SetPositionInfo(line, column, position); pc.TrySkipCCommentsAndWhiteSpace(); pc.Expecting(']'); pc.Advance(); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } break; case '{': pc.Advance(); e = new EbnfRepeatExpression(_ParseExpression(doc, pc)); e.SetPositionInfo(line, column, position); pc.TrySkipCCommentsAndWhiteSpace(); pc.Expecting('}'); pc.Advance(); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } break; case '\"': e = new EbnfLiteralExpression(pc.ParseJsonString()); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } e.SetPositionInfo(line, column, position); break; case '\'': pc.Advance(); pc.ClearCapture(); pc.TryReadUntil('\'', '\\', false); pc.Expecting('\''); pc.Advance(); e = new EbnfRegexExpression(pc.Capture); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } e.SetPositionInfo(line, column, position); break; case ';': case ']': case ')': case '}': return(current); default: e = new EbnfRefExpression(_ParseIdentifier(pc)); if (null == current) { current = e; } else { current = new EbnfConcatExpression(current, e); } e.SetPositionInfo(line, column, position); break; } } pc.TrySkipCCommentsAndWhiteSpace(); return(current); }