Exemple #1
0
        object ParseValue(IEnumerator <object> e)
        {
            var obj = e.Current;

            if (e.Current is float)
            {
                e.MustMoveNext();
            }
            else if (e.Current is char)
            {
                e.AssertChar('{');
                obj = ParseTable(e);
            }
            else if (e.Current is string)
            {
                List <object> objs = new List <object> ();
                objs.Add(Env[(string)obj]);
                e.MustMoveNext();
                while (e.Current.Equals('+'))
                {
                    e.MustMoveNext();
                    objs.Add(Env[(string)e.Current]);
                    e.MustMoveNext();
                }
                if (objs.Count > 0)
                {
                    object result = objs [0];
                    for (int i = 1; i < objs.Count; i++)
                    {
                        result = DynamicOr(result, objs [i]);
                    }
                    obj = result;
                }
                else
                {
                    obj = objs [0];
                }
            }
            else if (e.Current is StringBuilder)
            {
                obj = obj.ToString();
                e.MustMoveNext();
            }
            else
            {
                throw new Exception();
            }
            return(obj);
        }
Exemple #2
0
        LuaTable ParseTable(IEnumerator <object> e)
        {
            var  objs    = new List <object> ();
            bool isArray = true;

            while (!e.Current.Equals('}'))
            {
                if (e.Current is float)
                {
                    objs.Add(e.Current);
                    e.MustMoveNext();
                }
                else if (e.Current is char)
                {
                    e.AssertChar('{');
                    objs.Add(ParseTable(e));
                }
                else if (e.Current is string)
                {
                    var ident = (string)e.Current;
                    e.MustMoveNext();
                    if (e.Current.Equals('='))
                    {
                        e.MustMoveNext();
                        objs.Add(new LKeyValue(ident, ParseValue(e)));
                        isArray = false;
                    }
                    else
                    {
                        objs.Add(Env[ident]);
                    }
                }
                else if (e.Current is StringBuilder)
                {
                    objs.Add(e.Current.ToString());
                    e.MustMoveNext();
                }
                if (!e.Current.Equals('}'))
                {
                    e.AssertChar(',');
                }
            }
            e.MoveNext();
            var table = new LuaTable(objs.Count);

            if (isArray)
            {
                table.SetArray(0, objs.ToArray());
            }
            else
            {
                var stuff = new Dictionary <string, object> ();
                foreach (var o in objs)
                {
                    var kv = (LKeyValue)o;
                    stuff.Add(kv.Key, kv.Value);
                }
                table.SetMap(stuff);
            }
            return(table);
        }