Statement.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using Island.StandardLib;
  2. using System.Collections.Generic;
  3. namespace EXTS
  4. {
  5. public abstract class Statement
  6. {
  7. internal EXTSEngine engine;
  8. public Statement() => engine = EXTSEngine.CompilingEngine;
  9. public abstract EValue Eval();
  10. }
  11. public class StatementList : Statement
  12. {
  13. internal static StatementList runningStatement;
  14. internal List<Statement> statements;
  15. Dictionary<string, EValue> val;
  16. internal StatementList parentVarlst;
  17. internal bool stop;
  18. public StatementList() => val = new Dictionary<string, EValue>();
  19. public EValue this[string name]
  20. {
  21. get
  22. {
  23. if (val.ContainsKey(name))
  24. return val[name];
  25. StatementList lst = this;
  26. while (lst.parentVarlst != null)
  27. {
  28. lst = lst.parentVarlst;
  29. if (lst.val.ContainsKey(name))
  30. return lst.val[name];
  31. }
  32. return new EValue();
  33. }
  34. set
  35. {
  36. if (val.ContainsKey(name))
  37. {
  38. val[name] = value;
  39. return;
  40. }
  41. StatementList lst = this;
  42. while (lst.parentVarlst != null)
  43. {
  44. lst = lst.parentVarlst;
  45. if (lst.val.ContainsKey(name))
  46. {
  47. lst.val[name] = value;
  48. return;
  49. }
  50. }
  51. val.Add(name, value);
  52. }
  53. }
  54. public StatementList(params Statement[] sms)
  55. {
  56. statements = new List<Statement>(sms);
  57. }
  58. public void AddStatement(Statement statement)
  59. {
  60. statements.Add(statement);
  61. }
  62. public virtual bool BeforeEval() { return true; }
  63. public override EValue Eval()
  64. {
  65. stop = false;
  66. runningStatement = this;
  67. val = new Dictionary<string, EValue>();
  68. val.Set("return", new EValue());
  69. if (!BeforeEval())
  70. return new EValue(new EString(engine.funcptrs.PushRandom((FuncStatement)this)));
  71. for (int i = 0; i < statements.Count; i++)
  72. {
  73. statements[i].Eval();
  74. if (stop) break;
  75. }
  76. EValue ret = val.Get("return", new EValue());
  77. val.Clear();
  78. return ret;
  79. }
  80. }
  81. public class SetValStatement : Statement
  82. {
  83. StatementList env;
  84. string name;
  85. Statement value;
  86. public SetValStatement(StatementList elist, string valname, Statement val)
  87. {
  88. env = elist;
  89. name = valname;
  90. value = val;
  91. }
  92. public override EValue Eval()
  93. {
  94. EValue val = value.Eval();
  95. env[name] = val;
  96. return val;
  97. }
  98. }
  99. public class GetValStatement : Statement
  100. {
  101. StatementList env;
  102. string name;
  103. public GetValStatement(StatementList elist, string valname)
  104. {
  105. env = elist;
  106. name = valname;
  107. }
  108. public override EValue Eval() => env[name];
  109. }
  110. public class ImmediateStatement : Statement
  111. {
  112. EValue val;
  113. public ImmediateStatement(string immval)
  114. {
  115. if (float.TryParse(immval, out float f))
  116. val = new EValue(new ENumber(f));
  117. else val = new EValue(new EString(immval));
  118. }
  119. public override EValue Eval() => val;
  120. }
  121. public class ReturnStatement : Statement
  122. {
  123. public override EValue Eval()
  124. {
  125. StatementList.runningStatement.stop = true;
  126. return new EValue();
  127. }
  128. }
  129. public class FuncStatement : StatementList
  130. {
  131. internal string name;
  132. internal EValue[] parameters;
  133. public bool runfunc = true;
  134. public FuncStatement(params Statement[] statements) : base(statements) { }
  135. public override bool BeforeEval()
  136. {
  137. if (parameters != null)
  138. {
  139. for (int i = 0; i < parameters.Length; i++)
  140. this["pmt" + i] = parameters[i];
  141. }
  142. parameters = null;
  143. return runfunc;
  144. }
  145. public EValue Eval(EValue[] pmts)
  146. {
  147. parameters = pmts;
  148. return base.Eval();
  149. }
  150. }
  151. public class BodyFuncStatement : StatementList
  152. {
  153. internal KeyValuePair<string, EValue>[] parameters;
  154. public BodyFuncStatement(params Statement[] statements) : base(statements) { }
  155. public override bool BeforeEval()
  156. {
  157. if (parameters != null)
  158. {
  159. for (int i = 0; i < parameters.Length; i++)
  160. this[parameters[i].Key] = parameters[i].Value;
  161. }
  162. parameters = null;
  163. return true;
  164. }
  165. public EValue Eval(params KeyValuePair<string, EValue>[] pmts)
  166. {
  167. parameters = pmts;
  168. return base.Eval();
  169. }
  170. }
  171. public class CallFuncStatement : Statement
  172. {
  173. string func;
  174. Statement[] pmts;
  175. public CallFuncStatement(string funcName, params Statement[] parameters)
  176. {
  177. for (int i = 0; i < parameters.Length; i++)
  178. parameters[i].engine = engine;
  179. func = funcName;
  180. pmts = parameters;
  181. }
  182. public override EValue Eval() => engine.RunFuncBase(func, pmts.Do((p) => p.Eval()));
  183. }
  184. }