PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/RunTimeModule.cs

https://bitbucket.org/cvillamor/compiler
C# | 316 lines | 288 code | 23 blank | 5 comment | 10 complexity | 7904de77ebb71c1860544ac8b8347840 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Compiler_
  6. {
  7. class RunTimeModule
  8. {
  9. static public int TOTAL_SIZE = 1000;
  10. private String[] Code;
  11. private String[] Data;
  12. public Stack<object> Stack;
  13. private Byte[] Heap;
  14. private int m_ip; // Instruction Pointer
  15. private int m_dp; // Data Pointer
  16. private int m_sp; // Stack Pointer
  17. private int m_bp; // Base Pointer
  18. private int m_sip;
  19. public RunTimeModule()
  20. {
  21. Code = new String[TOTAL_SIZE];
  22. Data = new String[TOTAL_SIZE];
  23. Stack = new Stack<object>();
  24. Heap = new Byte[TOTAL_SIZE];
  25. startIP = false;
  26. }
  27. public bool startIP;
  28. public void CodeStackPush(string value)
  29. {
  30. Code[IP] = value;
  31. IP++;
  32. }
  33. public void DataStackPush(string value)
  34. {
  35. Data[DP]=value;
  36. DP++;
  37. }
  38. public int StartIP
  39. {
  40. set {
  41. m_sip = value;
  42. startIP = true;
  43. }
  44. get { return m_sip; }
  45. }
  46. public void StackPush(object value)
  47. {
  48. Stack.Push(value);
  49. }
  50. /*public void DataStackPush(char value)
  51. {
  52. Data[DP] = (byte)value;
  53. }*/
  54. public int IP
  55. {
  56. set { m_ip=value; }
  57. get { return m_ip; }
  58. }
  59. public int DP
  60. {
  61. set { m_dp = value; }
  62. get { return m_dp; }
  63. }
  64. public int SP
  65. {
  66. set { m_sp = value; }
  67. get { return m_sp; }
  68. }
  69. public int BP
  70. {
  71. set { m_bp = value; }
  72. get { return m_bp; }
  73. }
  74. public void Run()
  75. {
  76. IP = (startIP) ? StartIP : 0;
  77. while (Code[IP]!="OP_HALT")
  78. {
  79. //OP
  80. if(Code[IP].StartsWith("OP"))
  81. {
  82. switch (Code[IP])
  83. {
  84. case "OP_ABS" :
  85. Stack.Push(Math.Abs(Convert.ToInt32(Stack.Pop())));
  86. break;
  87. case "OP_ADD" :
  88. String s = Convert.ToString(Stack.Pop());
  89. String s2 = Convert.ToString(Stack.Pop());
  90. int one;
  91. int two;
  92. one = s.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(s.Remove(0,1))]) : Convert.ToInt32(s);
  93. two = s2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(s2.Remove(0,1))]) : Convert.ToInt32(s2);
  94. Stack.Push(one + two);
  95. break;
  96. case "OP_ADDI":
  97. break;
  98. case "OP_AND" :
  99. String ans = Convert.ToString(Stack.Pop());
  100. String ans2 = Convert.ToString(Stack.Pop());
  101. int onean;
  102. int twoan;
  103. onean = ans.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ans.Remove(0,1))]) : Convert.ToInt32(ans);
  104. twoan = ans2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ans2.Remove(0,1))]) : Convert.ToInt32(ans2);
  105. Stack.Push(Convert.ToInt32(Convert.ToBoolean(onean) && Convert.ToBoolean(twoan)));
  106. break;
  107. case "OP_ARRAYASSIGN":
  108. string arans = Convert.ToString(Stack.Pop());
  109. string arans2 = Convert.ToString(Stack.Pop());
  110. object onearan;
  111. object twoaran;
  112. onearan = arans.StartsWith("@") ? Data[Convert.ToInt32(arans.Remove(0, 1))] : arans;
  113. twoaran = arans2.StartsWith("@") ? Data[Convert.ToInt32(arans2.Remove(0, 1))] : arans2;
  114. Data[Convert.ToInt32(twoaran)] = onearan.ToString();
  115. break;
  116. case "OP_ASSIGN":
  117. int index = Convert.ToInt32(((String)Stack.Pop()).Remove(0,1));
  118. string lhss = Stack.Pop().ToString();
  119. object lhs = lhss.StartsWith("@") ? Data[Convert.ToInt32(lhss.Remove(0,1))] : lhss;
  120. Data[index] = lhs.ToString();
  121. break;
  122. case "OP_CALL":
  123. break;
  124. case "OP_CVRINTTOREAL":
  125. break;
  126. case "OP_CVRREALTOINT":
  127. break;
  128. case "OP_DIV":
  129. String d = Convert.ToString(Stack.Pop());
  130. String d2 = Convert.ToString(Stack.Pop());
  131. int oned;
  132. int twod;
  133. oned = d.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(d.Remove(0,1))]) : Convert.ToInt32(d);
  134. twod = d2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(d2.Remove(0,1))]) : Convert.ToInt32(d2);
  135. Stack.Push(twod / oned);
  136. break;
  137. case "OP_EQ":
  138. String eq = Convert.ToString(Stack.Pop());
  139. String eq2 = Convert.ToString(Stack.Pop());
  140. int oneeq;
  141. int twoeq;
  142. oneeq = eq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(eq.Remove(0,1))]) : Convert.ToInt32(eq);
  143. twoeq = eq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(eq2.Remove(0,1))]) : Convert.ToInt32(eq2);
  144. Stack.Push(Convert.ToInt32(twoeq == oneeq));
  145. break;
  146. case "OP_FNEG":
  147. String fneg = Convert.ToString(Stack.Pop());
  148. int onefn;
  149. onefn = fneg.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(fneg.Remove(0, 1))]) : Convert.ToInt32(fneg);
  150. Stack.Push(Convert.ToInt32(-onefn));
  151. break;
  152. case "OP_GET":
  153. Stack.Push(Data[Convert.ToInt32(Stack.Pop())]);
  154. break;
  155. case "OP_GT":
  156. String gt = Convert.ToString(Stack.Pop());
  157. String gt2 = Convert.ToString(Stack.Pop());
  158. int onegt;
  159. int twogt;
  160. onegt = gt.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gt.Remove(0,1))]) : Convert.ToInt32(gt);
  161. twogt = gt2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gt2.Remove(0,1))]) : Convert.ToInt32(gt2);
  162. Stack.Push(Convert.ToInt32(twogt > onegt));
  163. break;
  164. case "OP_GTEQ":
  165. String gteq = Convert.ToString(Stack.Pop());
  166. String gteq2 = Convert.ToString(Stack.Pop());
  167. int onegteq;
  168. int twogteq;
  169. onegteq = gteq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gteq.Remove(0,1))]) : Convert.ToInt32(gteq);
  170. twogteq = gteq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(gteq2.Remove(0,1))]) : Convert.ToInt32(gteq2);
  171. Stack.Push(Convert.ToInt32(twogteq >= onegteq));
  172. break;
  173. case "OP_HALT":
  174. break;
  175. case "OP_JFALSE":
  176. int ijf = Convert.ToInt32(Stack.Pop());
  177. string ijfs = Stack.Pop().ToString();
  178. int ijfi = ijfs.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ijfs.Remove(0,1))]) : Convert.ToInt32(ijfs);
  179. IP = ijfi==1 ? IP : --ijf;
  180. break;
  181. case "OP_JMP":
  182. IP = Convert.ToInt32(Stack.Pop());
  183. IP--;
  184. break;
  185. case "OP_JTRUE":
  186. int ijt = Convert.ToInt32(Stack.Pop());
  187. string ijts = Stack.Pop().ToString();
  188. int ijti = ijts.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ijts.Remove(0, 1))]) : Convert.ToInt32(ijts);
  189. IP = ijti == 1 ? --ijt : IP;
  190. break;
  191. case "OP_LT":
  192. String lt = Convert.ToString(Stack.Pop());
  193. String lt2 = Convert.ToString(Stack.Pop());
  194. int onelt;
  195. int twolt;
  196. onelt = lt.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lt.Remove(0,1))]) : Convert.ToInt32(lt);
  197. twolt = lt2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lt2.Remove(0,1))]) : Convert.ToInt32(lt2);
  198. Stack.Push(Convert.ToInt32(twolt < onelt));
  199. break;
  200. case "OP_LTEQ":
  201. String lteq = Convert.ToString(Stack.Pop());
  202. String lteq2 = Convert.ToString(Stack.Pop());
  203. int onelteq;
  204. int twolteq;
  205. onelteq = lteq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lteq.Remove(0,1))]) : Convert.ToInt32(lteq);
  206. twolteq = lteq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(lteq2.Remove(0,1))]) : Convert.ToInt32(lteq2);
  207. Stack.Push(Convert.ToInt32(twolteq <= onelteq));
  208. break;
  209. case "OP_MOD":
  210. String mod1 = Convert.ToString(Stack.Pop());
  211. String mod2 = Convert.ToString(Stack.Pop());
  212. int onemod;
  213. int twomod;
  214. onemod = mod1.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(mod1.Remove(0, 1))]) : Convert.ToInt32(mod1);
  215. twomod = mod2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(mod2.Remove(0, 1))]) : Convert.ToInt32(mod2);
  216. Stack.Push(twomod % onemod);
  217. break;
  218. case "OP_MULT":
  219. String m = Convert.ToString(Stack.Pop());
  220. String m2 = Convert.ToString(Stack.Pop());
  221. int onem;
  222. int twom;
  223. onem = m.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(m.Remove(0,1))]) : Convert.ToInt32(m);
  224. twom = m2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(m2.Remove(0,1))]) : Convert.ToInt32(m2);
  225. Stack.Push(onem * twom);
  226. break;
  227. case "OP_NOT":
  228. String not = Convert.ToString(Stack.Pop());
  229. int onenot = not.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(not.Remove(0, 1))]) : Convert.ToInt32(not);
  230. Stack.Push(Convert.ToInt32(!Convert.ToBoolean(onenot)));
  231. break;
  232. case "OP_NOTEQ":
  233. String neq = Convert.ToString(Stack.Pop());
  234. String neq2 = Convert.ToString(Stack.Pop());
  235. int oneneq;
  236. int twoneq;
  237. oneneq = neq.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(neq.Remove(0, 1))]) : Convert.ToInt32(neq);
  238. twoneq = neq2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(neq2.Remove(0, 1))]) : Convert.ToInt32(neq2);
  239. Stack.Push(Convert.ToInt32(neq != neq2));
  240. break;
  241. case "OP_OR" :
  242. String ors = Convert.ToString(Stack.Pop());
  243. String ors2 = Convert.ToString(Stack.Pop());
  244. int oneors;
  245. int twoors2;
  246. oneors = ors.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ors.Remove(0,1))]) : Convert.ToInt32(ors);
  247. twoors2 = ors2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ors2.Remove(0,1))]) : Convert.ToInt32(ors2);
  248. Stack.Push(Convert.ToInt32(Convert.ToBoolean(oneors) || Convert.ToBoolean(twoors2)));
  249. break;
  250. case "OP_POP":
  251. break;
  252. case "OP_PUSH":
  253. break;
  254. case"OP_RETURN":
  255. String ret = Convert.ToString(Stack.Pop());
  256. int retadd = oneors = ret.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(ret.Remove(0, 1))]) : Convert.ToInt32(ret);
  257. IP = retadd;
  258. IP--;
  259. break;
  260. case "OP_SUBI":
  261. break;
  262. case "OP_SUBTRACT":
  263. String f = Convert.ToString(Stack.Pop());
  264. String f2 = Convert.ToString(Stack.Pop());
  265. int one1;
  266. int two1;
  267. one1 = f.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(f.Remove(0,1))]) : Convert.ToInt32(f);
  268. two1 = f2.StartsWith("@") ? Convert.ToInt32(Data[Convert.ToInt32(f2.Remove(0,1))]) : Convert.ToInt32(f2);
  269. Stack.Push(two1-one1);
  270. break;
  271. case "OP_WRITE":
  272. string iwr = (String)Stack.Pop();
  273. object objw = iwr.StartsWith("@") ? Data[Convert.ToInt32(iwr.Remove(0, 1))] : iwr;
  274. Console.WriteLine(objw);
  275. break;
  276. case "OP_WRITELN":
  277. string iwrln = (String)Stack.Pop();
  278. object obj = iwrln.StartsWith("@") ? Data[Convert.ToInt32(iwrln.Remove(0, 1))] : iwrln;
  279. Console.WriteLine(obj);
  280. break;
  281. }
  282. }
  283. else if(Code[IP].StartsWith("@"))
  284. {
  285. Stack.Push(Code[IP]);
  286. }
  287. else
  288. Stack.Push(Code[IP]);
  289. IP++;
  290. }
  291. }
  292. }
  293. }