/RunTimeModule.cs
C# | 316 lines | 288 code | 23 blank | 5 comment | 10 complexity | 7904de77ebb71c1860544ac8b8347840 MD5 | raw file
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Compiler_
- {
-
- class RunTimeModule
- {
- static public int TOTAL_SIZE = 1000;
- private String[] Code;
- private String[] Data;
- public Stack<object> Stack;
- private Byte[] Heap;
- private int m_ip; // Instruction Pointer
- private int m_dp; // Data Pointer
- private int m_sp; // Stack Pointer
- private int m_bp; // Base Pointer
- private int m_sip;
- public RunTimeModule()
- {
- Code = new String[TOTAL_SIZE];
- Data = new String[TOTAL_SIZE];
- Stack = new Stack<object>();
- Heap = new Byte[TOTAL_SIZE];
- startIP = false;
- }
- public bool startIP;
- public void CodeStackPush(string value)
- {
- Code[IP] = value;
- IP++;
- }
- public void DataStackPush(string value)
- {
- Data[DP]=value;
- DP++;
- }
- public int StartIP
- {
- set {
- m_sip = value;
- startIP = true;
- }
- get { return m_sip; }
- }
- public void StackPush(object value)
- {
- Stack.Push(value);
- }
- /*public void DataStackPush(char value)
- {
- Data[DP] = (byte)value;
- }*/
- public int IP
- {
- set { m_ip=value; }
- get { return m_ip; }
- }
- public int DP
- {
- set { m_dp = value; }
- get { return m_dp; }
- }
- public int SP
- {
- set { m_sp = value; }
- get { return m_sp; }
- }
- public int BP
- {
- set { m_bp = value; }
- get { return m_bp; }
- }
- public void Run()
- {
- IP = (startIP) ? StartIP : 0;
- while (Code[IP]!="OP_HALT")
- {
- //OP
- if(Code[IP].StartsWith("OP"))
- {
- switch (Code[IP])
- {
- case "OP_ABS" :
- Stack.Push(Math.Abs(Convert.ToInt32(Stack.Pop())));
- break;
- case "OP_ADD" :
- String s = Convert.ToString(Stack.Pop());
- String s2 = Convert.ToString(Stack.Pop());
- int one;
- int two;
- one = s.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(s.Remove(0,1))]) : Convert.ToInt32(s);
- two = s2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(s2.Remove(0,1))]) : Convert.ToInt32(s2);
- Stack.Push(one + two);
- break;
- case "OP_ADDI":
- break;
- case "OP_AND" :
- String ans = Convert.ToString(Stack.Pop());
- String ans2 = Convert.ToString(Stack.Pop());
- int onean;
- int twoan;
- onean = ans.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ans.Remove(0,1))]) : Convert.ToInt32(ans);
- twoan = ans2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ans2.Remove(0,1))]) : Convert.ToInt32(ans2);
- Stack.Push(Convert.ToInt32(Convert.ToBoolean(onean) && Convert.ToBoolean(twoan)));
- break;
- case "OP_ARRAYASSIGN":
- string arans = Convert.ToString(Stack.Pop());
- string arans2 = Convert.ToString(Stack.Pop());
- object onearan;
- object twoaran;
- onearan = arans.StartsWith("@") ? Data[Convert.ToInt32(arans.Remove(0, 1))] : arans;
- twoaran = arans2.StartsWith("@") ? Data[Convert.ToInt32(arans2.Remove(0, 1))] : arans2;
- Data[Convert.ToInt32(twoaran)] = onearan.ToString();
- break;
- case "OP_ASSIGN":
- int index = Convert.ToInt32(((String)Stack.Pop()).Remove(0,1));
- string lhss = Stack.Pop().ToString();
- object lhs = lhss.StartsWith("@") ? Data[Convert.ToInt32(lhss.Remove(0,1))] : lhss;
- Data[index] = lhs.ToString();
- break;
- case "OP_CALL":
- break;
- case "OP_CVRINTTOREAL":
- break;
- case "OP_CVRREALTOINT":
- break;
- case "OP_DIV":
- String d = Convert.ToString(Stack.Pop());
- String d2 = Convert.ToString(Stack.Pop());
- int oned;
- int twod;
- oned = d.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(d.Remove(0,1))]) : Convert.ToInt32(d);
- twod = d2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(d2.Remove(0,1))]) : Convert.ToInt32(d2);
- Stack.Push(twod / oned);
- break;
- case "OP_EQ":
- String eq = Convert.ToString(Stack.Pop());
- String eq2 = Convert.ToString(Stack.Pop());
- int oneeq;
- int twoeq;
- oneeq = eq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(eq.Remove(0,1))]) : Convert.ToInt32(eq);
- twoeq = eq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(eq2.Remove(0,1))]) : Convert.ToInt32(eq2);
- Stack.Push(Convert.ToInt32(twoeq == oneeq));
- break;
- case "OP_FNEG":
- String fneg = Convert.ToString(Stack.Pop());
- int onefn;
- onefn = fneg.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(fneg.Remove(0, 1))]) : Convert.ToInt32(fneg);
- Stack.Push(Convert.ToInt32(-onefn));
- break;
- case "OP_GET":
- Stack.Push(Data[Convert.ToInt32(Stack.Pop())]);
- break;
- case "OP_GT":
- String gt = Convert.ToString(Stack.Pop());
- String gt2 = Convert.ToString(Stack.Pop());
- int onegt;
- int twogt;
- onegt = gt.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gt.Remove(0,1))]) : Convert.ToInt32(gt);
- twogt = gt2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gt2.Remove(0,1))]) : Convert.ToInt32(gt2);
- Stack.Push(Convert.ToInt32(twogt > onegt));
- break;
- case "OP_GTEQ":
- String gteq = Convert.ToString(Stack.Pop());
- String gteq2 = Convert.ToString(Stack.Pop());
- int onegteq;
- int twogteq;
- onegteq = gteq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gteq.Remove(0,1))]) : Convert.ToInt32(gteq);
- twogteq = gteq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gteq2.Remove(0,1))]) : Convert.ToInt32(gteq2);
- Stack.Push(Convert.ToInt32(twogteq >= onegteq));
- break;
- case "OP_HALT":
- break;
- case "OP_JFALSE":
- int ijf = Convert.ToInt32(Stack.Pop());
- string ijfs = Stack.Pop().ToString();
- int ijfi = ijfs.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ijfs.Remove(0,1))]) : Convert.ToInt32(ijfs);
- IP = ijfi==1 ? IP : --ijf;
- break;
- case "OP_JMP":
- IP = Convert.ToInt32(Stack.Pop());
- IP--;
- break;
- case "OP_JTRUE":
- int ijt = Convert.ToInt32(Stack.Pop());
- string ijts = Stack.Pop().ToString();
- int ijti = ijts.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ijts.Remove(0, 1))]) : Convert.ToInt32(ijts);
- IP = ijti == 1 ? --ijt : IP;
- break;
- case "OP_LT":
- String lt = Convert.ToString(Stack.Pop());
- String lt2 = Convert.ToString(Stack.Pop());
- int onelt;
- int twolt;
- onelt = lt.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lt.Remove(0,1))]) : Convert.ToInt32(lt);
- twolt = lt2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lt2.Remove(0,1))]) : Convert.ToInt32(lt2);
- Stack.Push(Convert.ToInt32(twolt < onelt));
- break;
- case "OP_LTEQ":
- String lteq = Convert.ToString(Stack.Pop());
- String lteq2 = Convert.ToString(Stack.Pop());
- int onelteq;
- int twolteq;
- onelteq = lteq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lteq.Remove(0,1))]) : Convert.ToInt32(lteq);
- twolteq = lteq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lteq2.Remove(0,1))]) : Convert.ToInt32(lteq2);
- Stack.Push(Convert.ToInt32(twolteq <= onelteq));
- break;
- case "OP_MOD":
- String mod1 = Convert.ToString(Stack.Pop());
- String mod2 = Convert.ToString(Stack.Pop());
- int onemod;
- int twomod;
- onemod = mod1.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(mod1.Remove(0, 1))]) : Convert.ToInt32(mod1);
- twomod = mod2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(mod2.Remove(0, 1))]) : Convert.ToInt32(mod2);
- Stack.Push(twomod % onemod);
- break;
- case "OP_MULT":
- String m = Convert.ToString(Stack.Pop());
- String m2 = Convert.ToString(Stack.Pop());
- int onem;
- int twom;
- onem = m.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(m.Remove(0,1))]) : Convert.ToInt32(m);
- twom = m2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(m2.Remove(0,1))]) : Convert.ToInt32(m2);
- Stack.Push(onem * twom);
- break;
- case "OP_NOT":
- String not = Convert.ToString(Stack.Pop());
- int onenot = not.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(not.Remove(0, 1))]) : Convert.ToInt32(not);
- Stack.Push(Convert.ToInt32(!Convert.ToBoolean(onenot)));
- break;
- case "OP_NOTEQ":
- String neq = Convert.ToString(Stack.Pop());
- String neq2 = Convert.ToString(Stack.Pop());
- int oneneq;
- int twoneq;
- oneneq = neq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(neq.Remove(0, 1))]) : Convert.ToInt32(neq);
- twoneq = neq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(neq2.Remove(0, 1))]) : Convert.ToInt32(neq2);
- Stack.Push(Convert.ToInt32(neq != neq2));
- break;
- case "OP_OR" :
- String ors = Convert.ToString(Stack.Pop());
- String ors2 = Convert.ToString(Stack.Pop());
- int oneors;
- int twoors2;
- oneors = ors.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ors.Remove(0,1))]) : Convert.ToInt32(ors);
- twoors2 = ors2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ors2.Remove(0,1))]) : Convert.ToInt32(ors2);
- Stack.Push(Convert.ToInt32(Convert.ToBoolean(oneors) || Convert.ToBoolean(twoors2)));
- break;
- case "OP_POP":
- break;
- case "OP_PUSH":
- break;
- case"OP_RETURN":
- String ret = Convert.ToString(Stack.Pop());
- int retadd = oneors = ret.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ret.Remove(0, 1))]) : Convert.ToInt32(ret);
- IP = retadd;
- IP--;
- break;
- case "OP_SUBI":
- break;
- case "OP_SUBTRACT":
- String f = Convert.ToString(Stack.Pop());
- String f2 = Convert.ToString(Stack.Pop());
- int one1;
- int two1;
- one1 = f.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(f.Remove(0,1))]) : Convert.ToInt32(f);
- two1 = f2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(f2.Remove(0,1))]) : Convert.ToInt32(f2);
- Stack.Push(two1-one1);
- break;
- case "OP_WRITE":
- string iwr = (String)Stack.Pop();
- object objw = iwr.StartsWith("@") ? Data[Convert.ToInt32(iwr.Remove(0, 1))] : iwr;
- Console.WriteLine(objw);
- break;
- case "OP_WRITELN":
- string iwrln = (String)Stack.Pop();
- object obj = iwrln.StartsWith("@") ? Data[Convert.ToInt32(iwrln.Remove(0, 1))] : iwrln;
- Console.WriteLine(obj);
- break;
- }
- }
- else if(Code[IP].StartsWith("@"))
- {
- Stack.Push(Code[IP]);
- }
- else
- Stack.Push(Code[IP]);
- IP++;
- }
- }
- }
- }