예제 #1
0
        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));
        }
예제 #2
0
        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);
        }