private ConfigParseResult Parse() { var root = new ConfigClass("", null); e = tokens.GetEnumerator(); while (e.MoveNext()) { t = e.Current; if (t.Type == BisTokenType.Term) { switch (t.Value.ToLower()) { case @class: var c = ParseClass(); if (c != null) { root.AddSubclass(c); } break; case @enum: ParseEnum(); break; } continue; } errors.Add(string.Format("Expected 'class' or 'enum' at {0}, Line={1}, Column={2}", t.File, t.BeginLine, t.BeginPos + 1)); } return(new ConfigParseResult(new ConfigFile(root, enums), errors)); }
private ConfigClass ParseClass() { if (!Expect(BisTokenType.Term, @class)) { return(null); } var name = ParseName(); if (name == null) { return(null); } string baseName = null; if (!Next()) { return(null); } if (t.Type == BisTokenType.Semicolon) //External { return(new ConfigClass(name)); } if (t.Type == BisTokenType.Colon) //inheritance { baseName = ParseName(); if (!Next()) { return(null); } } var c = new ConfigClass(name, baseName); if (!Expect(BisTokenType.LCurly, "{")) { return(null); } while (true) { if (!Next()) { return(null); } switch (t.Value.ToLower()) { case "}": break; case @class: var sc = ParseClass(); if (sc != null) { c.AddSubclass(sc); } break; case @delete: var del = ParseName(); if (del == null) { continue; } c.AddDelete(del); break; default: var propName = ReadIdentifier(); if (propName == null) { continue; } if (!Next()) { return(null); } if (t.Type == BisTokenType.LSquare) { if (!ExpectNext(BisTokenType.RSquare, "]")) { continue; } if (!Next()) { return(null); } propName += "[]"; } Expect(BisTokenType.Operator, "="); var propValue = ParseConfigPropertyValue(propName); if (propValue == null) { continue; } c.AddProperty(propValue); break; } if (t.Type == BisTokenType.RCurly) { break; } } if (!Expect(BisTokenType.RCurly, "}")) { return(null); } ExpectNext(BisTokenType.Semicolon, ";"); return(c); }