From ce12e8d615dcd0f1a4b91a2101ce6411039b6bef Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 24 Aug 2017 13:17:56 -0400 Subject: [PATCH] debugging stuff --- parseManager/bin/Debug/parsetest2.txt | 72 ++++--- parseManager/parseManager.cs | 267 +++++++++++++++++++++----- 2 files changed, 265 insertions(+), 74 deletions(-) diff --git a/parseManager/bin/Debug/parsetest2.txt b/parseManager/bin/Debug/parsetest2.txt index 419e131..c1b90e0 100644 --- a/parseManager/bin/Debug/parsetest2.txt +++ b/parseManager/bin/Debug/parsetest2.txt @@ -5,33 +5,49 @@ ENABLE leaking } [START]{ "Test 1:" - t=15 - test=2*100 - test2=[1,2,3,4,"HI"] - "test2 = $test2$" - "test = $test$" - c=5 - ::HERE:: - a,b="sdf",true - "a,b,c = $a$ $b$ $c$" - food="yum" - test=true - stop=21 - "food = $food$" - "test = $test$" - "stop = $stop$" - "Test 2:" - testM(2+2,"Test") - count=0 - ::loop:: - if count>10 then GOTO("end")|GOTO("continue") - ::continue:: - "Count = $count$" - count=count+1 - if count>10 then GOTO("end")|GOTO("loop") - ::end:: - "Done!" - QUIT() + -- t=15 + -- test=2*100 + -- test2=[1,2,3,4,"HI"] + -- test2[5]="HELLO" + -- "test2 = $test2$" + -- "test = $test$" + -- c=5 + -- ::HERE:: + -- a,b="sdf",true + -- "a,b,c = $a$ $b$ $c$" + -- food="yum" + -- test=true + -- stop=21 + -- "food = $food$" + -- "test = $test$" + -- "stop = $stop$" + -- "Test 2:" + -- "test2[1] = $test2[1]$" + -- testM(2+2,"Test") + -- testM(2+2,test2[5]) + -- count=0 + -- ::loop:: + -- "Count = $count$" + -- count=count+1 + -- if count>10 then GOTO("end")|GOTO("loop") + -- ::end:: + -- "Done!" + --JUMP("CallMe") + env=CreateENV() + food="Hi" + SetENV(env) + food="Hello" + "$food$" + env=GetDefualtENV() + SetENV(env) + "$food$" + --test=CallMe("This","is a test!") + "$test$" + "Did it work!" + --QUIT() +} +[CallMe:function(args1,args2)]{ + "function was called!" + "CALL_TEST: $args1$ $args2$" } - -- (count==stop and name=="bob") ? GOTO(end) : GOTO(loop) \ No newline at end of file diff --git a/parseManager/parseManager.cs b/parseManager/parseManager.cs index fbcde5c..e4eb091 100644 --- a/parseManager/parseManager.cs +++ b/parseManager/parseManager.cs @@ -1,12 +1,10 @@ /* - * Created by SharpDevelop.GetType * User: Ryan * Date: 8/17/2017 * Time: 11:54 AM - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; +using System.Collections; using System.IO; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -14,9 +12,9 @@ using System.Reflection; using parseManager; namespace parseManager { - /// - /// Description of ParseManager. - /// + /// The parseManager is an Advance Config Script + /// It allows the user to run code while also definine variables + /// This also has very flexible flow control meaning you can use it for chat logic and such public class parseManager { standardDefine _invoke = new standardDefine(); @@ -25,12 +23,14 @@ namespace parseManager string _define; string _entry = "START"; Type _defineType; + standardDefine def = new standardDefine(); MethodInfo _defineMethod; object _defineClassObject; chunk _currentChunk; chunk _lastChunk = null; readonly ENV _mainENV = new ENV(); public ENV _defualtENV; + Stack _fStack = new Stack(); Dictionary _flags = new Dictionary(); Dictionary _chunks = new Dictionary(); Dictionary _methods = new Dictionary(); @@ -62,6 +62,10 @@ namespace parseManager _flags.Add("debugging", false); _flags.Add("topdown", true); } + public ENV Pop() + { + return _fStack.Pop(); + } public bool GetFlag(string flag) { bool f; @@ -145,24 +149,64 @@ namespace parseManager { _active = false; } + public bool isRegisteredFunction(string method, out chunk o) + { + if (_chunks.TryGetValue(method, out o)) { + return true; + } + return false; + } + public object InvokeI(string method, object[] argsV, chunk c) + { + var ccP = _currentChunk.GetPos(); + var ccN = _currentChunk.GetName(); + var argsN = c.GetArgs(); + var fEnv = new ENV(); + fEnv.SetParent(_defualtENV); + for (int i = 0; i < argsN.Length; i++) { + fEnv[argsN[i]] = argsV[i]; + } + var tempEnv = new ENV(); + tempEnv[0] = ccN; + tempEnv[1] = ccP; + tempEnv[2] = _defualtENV; + _fStack.Push(tempEnv); + if (_fStack.Count > 1024) { + PushError("Stack Overflow!"); + } + _defualtENV = fEnv; + Console.WriteLine(fEnv); + def.JUMP(method); + return fEnv; // TODO Handle returns + } public object InvokeR(string method, object[] args) { - //try{ - _defineMethod = _defineType.GetMethod(method); - return _defineMethod.Invoke(_defineClassObject, args); -// } catch { -// PushError("Invalid method: "+method); -// return null; -// } + chunk c; + if (isRegisteredFunction(method, out c)) { + return InvokeI(method, args, c); + } + try { + _defineMethod = _defineType.GetMethod(method); + return _defineMethod.Invoke(_defineClassObject, args); + } catch { + PushError("Invalid method: " + method); + return null; + } } public int InvokeNR(string method, object[] args) { - try { - _defineMethod = _defineType.GetMethod(method); - _defineMethod.Invoke(_defineClassObject, args); + chunk c; + if (isRegisteredFunction(method, out c)) { + InvokeI(method, args, c); return 0; - } catch { - PushError("Invalid method: " + method); + } else { + try { + _defineMethod = _defineType.GetMethod(method); + _defineMethod.Invoke(_defineClassObject, args); + return 0; + } catch { + PushError("Invalid method: " + method); + } } return -1; } @@ -180,6 +224,10 @@ namespace parseManager { return _defualtENV; } + public ENV GetDENV() + { + return _mainENV; + } public void SetENV() { _defualtENV = _mainENV; @@ -319,20 +367,23 @@ namespace parseManager tempReturn.SetText("INVOKED METHOD: " + func); } else if (type == "LINE") { tempReturn.SetCMDType("line"); - var test=parseHeader((string)stuff[0]); - tempReturn.SetText(test.Substring(1,test.Length-2)); + var test = parseHeader((string)stuff[0]); + tempReturn.SetText(test.Substring(1, test.Length - 2)); } else if (type == "FUNC_R") { var retargs = (string[])stuff[0]; var func = (string)stuff[1]; var args = (string[])stuff[2]; object data; + var env = GetENV(); + Console.WriteLine("CALLING: " + func); if (args.Length == 1 && args[0] == "") { // assume no args inserted! data = InvokeR(func, new object[]{ }); } else { data = InvokeR(func, ResolveVar(args)); } - var env = GetENV(); + Console.WriteLine("RETURN: "+retargs[0]+"|"+data); env[retargs[0]] = data; + Console.WriteLine(env); GLOBALS.Add_Var(retargs[0]); tempReturn.SetCMDType("method"); tempReturn.SetText("INVOKED METHOD: " + func); @@ -341,15 +392,41 @@ namespace parseManager var vals = (string[])stuff[1]; var env = GetENV(); var types = ResolveVar(vals); - for (int i = 0; i < types.Length; i++) { - env[vars[i]] = types[i]; - GLOBALS.Add_Var(vars[i]); - } + AssignmentHandler(vars, types); tempReturn.SetCMDType("assignment"); tempReturn.SetText(_currentChunk.GetLine()); } return tempReturn; } + public void AssignmentHandler(string[] vars, object[] types) + { + var env = GetENV(); + for (int i = 0; i < types.Length; i++) { + var test = vars[i]; + if (test.EndsWith("]")) { + var dict = Regex.Match(test, @"(.*)\[(.+)\]"); + var _var = dict.Groups[1].Value; + var _val = dict.Groups[2].Value; + var val = ResolveVar(new []{ _val }); + var _e = env[_var]; + if (!_e.GetType().ToString().Contains("ENV")) { + PushError("Attempted to index a object that isn't a table!"); + } else { + var e = (ENV)_e; + if (val[0].GetType().ToString().Contains("Double")) { + e[int.Parse(val[0].ToString())] = types[i]; + } else if (val[0].GetType().ToString().Contains("String")) { + e[(string)val[0]] = types[i]; + } else { + PushError("Invalid index type: " + val[0]); + } + } + } else { + env[vars[i]] = types[i]; + GLOBALS.Add_Var(vars[i]); + } + } + } public string parseHeader(string header) { var results = Regex.Matches(header, @"(\$.*?\$)"); @@ -388,6 +465,26 @@ namespace parseManager env[g] = res[g]; } args[i] = env; + debug("TABLE: " + env); + } else if (v[i].EndsWith("]")) { + var dict = Regex.Match(v[i], @"(.*)\[(.+)\]"); + var _var = dict.Groups[1].Value; + var _val = dict.Groups[2].Value; + var val2 = ResolveVar(new []{ _val }); + var env = GetENV(); + var _e = env[_var]; + if (!_e.GetType().ToString().Contains("ENV")) { + PushError("Attempted to index a object that isn't a table!"); + } else { + var e = (ENV)_e; + if (val2[0].GetType().ToString().Contains("Double")) { + args[i] = e[int.Parse(val2[0].ToString())]; + } else if (val2[0].GetType().ToString().Contains("String")) { + args[i] = e[(string)val2[0]]; + } else { + PushError("Invalid index type: " + val2[0]); + } + } } else if (isVar(v[i], out val)) { args[i] = val; debug("RETREVING SAVED VAL"); @@ -395,7 +492,7 @@ namespace parseManager args[i] = num; debug("NUMBER: " + num); } else if (v[i][0] == '"' && v[i][v[i].Length - 1] == '"') { - args[i] = parseHeader(v[i].Substring(1, v[i].Length - 2)); + args[i] = parseHeader(v[i].Replace("\"", "")); debug("STRING: " + args[i]); } else if (bool.TryParse(v[i], out boo)) { args[i] = boo; @@ -410,10 +507,34 @@ namespace parseManager } public bool isVar(string val, out object v) { - if (_defualtENV[val] != null) { - v = _defualtENV[val]; + object va; + Console.WriteLine(val); + if (_defualtENV.TryGetValue(val, out va)) { + v = va; return true; } + if (val.EndsWith("]")) { + var dict = Regex.Match(val, @"(.*)\[(.+)\]"); + var _var = dict.Groups[1].Value; + var _val = dict.Groups[2].Value; + var val2 = ResolveVar(new []{ _val }); + var env = GetENV(); + var _e = env[_var]; + if (!_e.GetType().ToString().Contains("ENV")) { + PushError("Attempted to index a object that isn't a table!"); + } else { + var e = (ENV)_e; + if (val2[0].GetType().ToString().Contains("Double")) { + v = e[int.Parse(val2[0].ToString())]; + return true; + } else if (val2[0].GetType().ToString().Contains("String")) { + v = e[(string)val2[0]]; + return true; + } else { + PushError("Invalid index type: " + val2[0]); + } + } + } v = null; return false; } @@ -427,10 +548,41 @@ namespace parseManager string _type; string _pureType; string[] _lines; + string[] args; + bool isFunc; Dictionary _labels = new Dictionary(); List _compiledlines = new List(); int _pos = 0; chunk _next = null; + public string[] GetArgs() + { + return args; + } + public chunk(string name, string cont, string type) + { + _BLOCK = name; + _type = type; + if (type.Contains("function")) { + isFunc = true; + var func = Regex.Match(type, @"\((.+)\)"); + args = GLOBALS.Split(func.Groups[1].Value); + _compiledlines.Add(new CMD("FUNC", new object[] { + "TRACEBACK", + new string[]{ } + })); // Append the traceback method to the chunk + } + _clean(cont); + } + public bool isFunction() + { + return isFunc; + } + public chunk(string name, string cont) + { + _BLOCK = name; + _type = "CODEBLOCK"; + _clean(cont); + } void _clean(string cont) { var m = Regex.Match(_type, @"([a-zA-Z0-9_]+)"); @@ -537,18 +689,6 @@ namespace parseManager } } } - public chunk(string name, string cont, string type) - { - _BLOCK = name; - _type = type; - _clean(cont); - } - public chunk(string name, string cont) - { - _BLOCK = name; - _type = "CODEBLOCK"; - _clean(cont); - } public string GetName() { return _BLOCK; @@ -706,7 +846,14 @@ namespace parseManager if (!loop) { object t; if (env.TryGetValue(cmd, out t)) { - return (double)t; + double te; + if (t.GetType().ToString().Contains("Double")) + return (double)t; + if(t.GetType().ToString().Contains("String")) + if (double.TryParse((string)t, out te)) { + return te; + } + return double.NaN; } else { t = double.NaN; // It couldn't be done :'( } @@ -719,20 +866,20 @@ namespace parseManager ENV _Parent; Dictionary _vars = new Dictionary(); Dictionary _varsI = new Dictionary(); - void SetParent(ENV other) + public void SetParent(ENV other) { _Parent = other; } public override string ToString() { - string str = ""; + string str = "("; foreach (KeyValuePair entry in _vars) { - str+=entry.Key+" = "+entry.Value+","; + str += "[\"" + entry.Key + "\"] = " + entry.Value + ", "; } foreach (KeyValuePair entry in _varsI) { - str+="["+entry.Key+"] = "+entry.Value+", "; + str += "[" + entry.Key + "] = " + entry.Value + ", "; } - return str; + return str + ")"; } public bool TryGetValue(string ind, out object obj) { @@ -934,6 +1081,15 @@ namespace parseManager } public class standardDefine { + public void TRACEBACK() + { + var test = GLOBALS.GetPM(); + ENV env = test.Pop(); + test.SetBlock((string)env[0]); + var c = test.GetCurrentChunk(); + c.SetPos((int)env[1]); + SetENV((ENV)env[3]); + } public void EXIT() { GLOBALS.GetPM().Deactivate(); @@ -942,6 +1098,25 @@ public class standardDefine { Environment.Exit(0); } + public void SetENV(ENV env) + { + var test = GLOBALS.GetPM(); + test.SetENV(env); + } + public ENV GetENV() + { + var test = GLOBALS.GetPM(); + return test.GetENV(); + } + public ENV GetDefualtENV() + { + var test = GLOBALS.GetPM(); + return test.GetDENV(); + } + public ENV CreateENV() + { + return new ENV(); + } public int GOTO(string label) { var test = GLOBALS.GetPM();