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); }
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); }