ast.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. #include "pch.h"
  2. #include "ast.h"
  3. //////////////////////////////////////////////////////////////////////////////
  4. //
  5. // Closure
  6. //
  7. //////////////////////////////////////////////////////////////////////////////
  8. class Closure : public Value {
  9. public:
  10. virtual TRef<Delay> Evaluate(Delay* pdelay) = 0;
  11. static TRef<Type> StaticGetType()
  12. {
  13. return
  14. new FunctionType(
  15. new PolymorphicType(),
  16. new PolymorphicType()
  17. );
  18. }
  19. };
  20. //////////////////////////////////////////////////////////////////////////////
  21. //
  22. // Closure
  23. //
  24. //////////////////////////////////////////////////////////////////////////////
  25. class ExpressionClosure : public Closure {
  26. private:
  27. ZString m_str;
  28. TRef<Environment> m_penv;
  29. TRef<Expression> m_pexpr;
  30. public:
  31. ExpressionClosure(Environment* penv, const ZString& str, Expression* pexpr) :
  32. m_str(str),
  33. m_penv(penv),
  34. m_pexpr(pexpr)
  35. {
  36. }
  37. TRef<Delay> Evaluate(Delay* pdelay)
  38. {
  39. return
  40. CreateDelay(
  41. new Environment(m_penv, m_str, pdelay),
  42. m_pexpr
  43. );
  44. }
  45. ZString GetString()
  46. {
  47. return "(function arg -> expr)";
  48. }
  49. };
  50. //////////////////////////////////////////////////////////////////////////////
  51. //
  52. // Expression
  53. //
  54. //////////////////////////////////////////////////////////////////////////////
  55. bool Expression::IsValue()
  56. {
  57. return false;
  58. }
  59. Value* Expression::GetValue()
  60. {
  61. return NULL;
  62. }
  63. //////////////////////////////////////////////////////////////////////////////
  64. //
  65. // ValueExpression
  66. //
  67. //////////////////////////////////////////////////////////////////////////////
  68. class ValueExpression : public Expression {
  69. private:
  70. TRef<Value> m_pvalue;
  71. public:
  72. ValueExpression(Value* pvalue) :
  73. m_pvalue(pvalue)
  74. {
  75. }
  76. bool IsValue()
  77. {
  78. return true;
  79. }
  80. Value* GetValue()
  81. {
  82. return m_pvalue;
  83. }
  84. TRef<Type> GetType(Environment* penv)
  85. {
  86. return m_pvalue->GetType();
  87. }
  88. TRef<Delay> Evaluate(Environment* penv)
  89. {
  90. return CreateDelay(NULL, this);
  91. }
  92. };
  93. TRef<Expression> CreateValueExpression(Value* pvalue)
  94. {
  95. return new ValueExpression(pvalue);
  96. }
  97. //////////////////////////////////////////////////////////////////////////////
  98. //
  99. // SymbolExpression
  100. //
  101. //////////////////////////////////////////////////////////////////////////////
  102. class SymbolExpression : public Expression {
  103. private:
  104. ZString m_str;
  105. public:
  106. SymbolExpression(const ZString& str) :
  107. m_str(str)
  108. {
  109. }
  110. TRef<Type> GetType(Environment* penv)
  111. {
  112. TRef<Delay> pdelay = penv->Find(m_str);
  113. if (pdelay == NULL) {
  114. ZError("Undefined symbol: " + m_str);
  115. }
  116. return pdelay->GetType();
  117. }
  118. TRef<Delay> Evaluate(Environment* penv)
  119. {
  120. return penv->Find(m_str);
  121. }
  122. };
  123. TRef<Expression> CreateSymbolExpression(const ZString& str)
  124. {
  125. return new SymbolExpression(str);
  126. }
  127. //////////////////////////////////////////////////////////////////////////////
  128. //
  129. // ApplyExpression
  130. //
  131. //////////////////////////////////////////////////////////////////////////////
  132. class ApplyExpression : public Expression {
  133. private:
  134. TRef<Expression> m_pexprFunc;
  135. TRef<Expression> m_pexprArg;
  136. public:
  137. ApplyExpression(Expression* pexprFunc, Expression* pexprArg) :
  138. m_pexprFunc(pexprFunc),
  139. m_pexprArg(pexprArg)
  140. {
  141. }
  142. TRef<Type> GetType(Environment* penv)
  143. {
  144. TRef<Type> ptypeFunc = m_pexprFunc->GetType(penv);
  145. ZVerify(ptypeFunc->IsMatch(Closure::StaticGetType()));
  146. TRef<FunctionType> pfuncType = ptypeFunc->GetFunctionType();
  147. TRef<Type> ptypeFuncArg = pfuncType->GetArgType();
  148. TRef<Type> ptypeArg = m_pexprArg->GetType(penv);
  149. if (ptypeFuncArg->IsMatch(ptypeArg)) {
  150. return pfuncType->GetResultType();
  151. } else {
  152. int id = 'a';
  153. ZError(
  154. "Type mismatch: "
  155. + ptypeFuncArg->GetString(id)
  156. + " != "
  157. + ptypeArg->GetString(id)
  158. );
  159. return NULL;
  160. }
  161. }
  162. TRef<Delay> Evaluate(Environment* penv)
  163. {
  164. TRef<Delay> pdelayFunc = m_pexprFunc->Evaluate(penv);
  165. TRef<Value> pvalue = pdelayFunc->Evaluate();
  166. TRef<Closure> pclosure; CastTo(pclosure, pvalue);
  167. TRef<Delay> pdelayArg = m_pexprArg->Evaluate(penv);
  168. return pclosure->Evaluate(pdelayArg);
  169. }
  170. };
  171. TRef<Expression> CreateApplyExpression(Expression* pexprFunc, Expression* pexprArg)
  172. {
  173. return new ApplyExpression(pexprFunc, pexprArg);
  174. }
  175. //////////////////////////////////////////////////////////////////////////////
  176. //
  177. // FunctionExpression
  178. //
  179. //////////////////////////////////////////////////////////////////////////////
  180. class FunctionExpression : public Expression {
  181. private:
  182. ZString m_str;
  183. TRef<Expression> m_pexpr;
  184. public:
  185. FunctionExpression(const ZString& str, Expression* pexpr) :
  186. m_str(str),
  187. m_pexpr(pexpr)
  188. {
  189. }
  190. TRef<Type> GetType(Environment* penv)
  191. {
  192. TRef<Type> ptypeArg = new PolymorphicType();
  193. penv =
  194. new Environment(
  195. penv,
  196. m_str,
  197. CreateTypeDelay(ptypeArg)
  198. );
  199. TRef<Type> ptypeResult = m_pexpr->GetType(penv);
  200. return new FunctionType(ptypeArg, ptypeResult);
  201. }
  202. TRef<Delay> Evaluate(Environment* penv)
  203. {
  204. TRef<Value> pvalue = new ExpressionClosure(penv, m_str, m_pexpr);
  205. TRef<Expression> pexpr = new ValueExpression(pvalue);
  206. return CreateDelay(NULL, pexpr);
  207. }
  208. };
  209. TRef<Expression> CreateFunctionExpression(const ZString& str, Expression* pexpr)
  210. {
  211. return new FunctionExpression(str, pexpr);
  212. }
  213. //////////////////////////////////////////////////////////////////////////////
  214. //
  215. // LetExpression
  216. //
  217. //////////////////////////////////////////////////////////////////////////////
  218. class LetExpression : public Expression {
  219. private:
  220. TRef<Environment> m_penv;
  221. TRef<Expression> m_pexprIn;
  222. public:
  223. LetExpression(Environment* penv, Expression* pexprIn) :
  224. m_penv(penv),
  225. m_pexprIn(pexprIn)
  226. {
  227. }
  228. TRef<Type> GetType(Environment* penv)
  229. {
  230. ZUnimplemented();
  231. return NULL;
  232. }
  233. TRef<Delay> Evaluate(Environment* penv)
  234. {
  235. Environment* penvLet = m_penv;
  236. TRef<Environment> penvTop = new Environment(NULL, "let", NULL);
  237. while (penvLet != NULL) {
  238. TRef<Delay> pdelay = penvLet->GetDelay();
  239. TRef<Expression> pexpr;
  240. if (pdelay != NULL) {
  241. pexpr = pdelay->GetExpression();
  242. }
  243. penv =
  244. new Environment(
  245. penv,
  246. penvLet->GetString(),
  247. CreateDelay(
  248. penvTop,
  249. pexpr
  250. )
  251. );
  252. penvLet = penvLet->GetNext();
  253. }
  254. penvTop->SetNext(penv);
  255. return CreateDelay(penvTop, m_pexprIn);
  256. }
  257. };
  258. TRef<Expression> CreateLetExpression(Environment* penv, Expression* pexprIn)
  259. {
  260. return new LetExpression(penv, pexprIn);
  261. }
  262. //////////////////////////////////////////////////////////////////////////////
  263. //
  264. // TypeDelay
  265. //
  266. //////////////////////////////////////////////////////////////////////////////
  267. class TypeDelay : public Delay {
  268. private:
  269. TRef<Type> m_ptype;
  270. public:
  271. TypeDelay(Type* ptype) :
  272. m_ptype(ptype)
  273. {
  274. }
  275. Expression* GetExpression()
  276. {
  277. return NULL;
  278. }
  279. TRef<Value> Evaluate()
  280. {
  281. return NULL;
  282. }
  283. TRef<Type> GetType()
  284. {
  285. return m_ptype;
  286. }
  287. };
  288. TRef<Delay> CreateTypeDelay(Type* ptype)
  289. {
  290. return new TypeDelay(ptype);
  291. }
  292. //////////////////////////////////////////////////////////////////////////////
  293. //
  294. // Delay
  295. //
  296. //////////////////////////////////////////////////////////////////////////////
  297. class DelayImpl : public Delay {
  298. private:
  299. TRef<Environment> m_penv;
  300. TRef<Expression> m_pexpr;
  301. TRef<Type> m_ptype;
  302. TRef<Value> m_pvalue;
  303. public:
  304. DelayImpl(Environment* penv, Expression* pexpr) :
  305. m_penv(penv),
  306. m_pexpr(pexpr)
  307. {
  308. }
  309. Expression* GetExpression()
  310. {
  311. return m_pexpr;
  312. }
  313. TRef<Value> Evaluate()
  314. {
  315. if (m_pvalue == NULL) {
  316. if (m_pexpr->IsValue()) {
  317. m_pvalue = m_pexpr->GetValue();
  318. } else {
  319. m_pvalue = m_pexpr->Evaluate(m_penv)->Evaluate();
  320. }
  321. }
  322. return m_pvalue;
  323. }
  324. TRef<Type> GetType()
  325. {
  326. if (m_ptype) {
  327. return m_ptype;
  328. } else {
  329. m_ptype = new PolymorphicType();
  330. TRef<Type> ptype = m_pexpr->GetType(m_penv);
  331. ZVerify(m_ptype->IsMatch(ptype));
  332. m_ptype = NULL;
  333. return ptype;
  334. }
  335. }
  336. };
  337. TRef<Delay> CreateDelay(Environment* penv, Expression* pexpr)
  338. {
  339. return new DelayImpl(penv, pexpr);
  340. }
  341. //////////////////////////////////////////////////////////////////////////////
  342. //
  343. // Environment
  344. //
  345. //////////////////////////////////////////////////////////////////////////////
  346. Environment::Environment(Environment* penv, const ZString& str, Delay* pdelay) :
  347. m_penv(penv),
  348. m_str(str),
  349. m_pdelay(pdelay)
  350. {
  351. }
  352. Delay* Environment::Find(const ZString& str)
  353. {
  354. if (m_str == str) {
  355. return m_pdelay;
  356. } else if (m_penv != NULL) {
  357. return m_penv->Find(str);
  358. }
  359. return NULL;
  360. }
  361. Delay* Environment::GetArgument(int index)
  362. {
  363. if (index == 1) {
  364. return m_pdelay;
  365. } else {
  366. return m_penv->GetArgument(index - 1);
  367. }
  368. }