expr.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. #pragma once
  2. #include "codeobject.h"
  3. #include "common.h"
  4. #include "lexer.h"
  5. #include "error.h"
  6. #include "vm.h"
  7. namespace pkpy{
  8. struct CodeEmitContext;
  9. struct Expr;
  10. typedef std::unique_ptr<Expr> Expr_;
  11. struct Expr{
  12. int line = 0;
  13. virtual ~Expr() = default;
  14. virtual void emit_(CodeEmitContext* ctx) = 0;
  15. virtual bool is_literal() const { return false; }
  16. virtual bool is_json_object() const { return false; }
  17. virtual bool is_attrib() const { return false; }
  18. virtual bool is_compare() const { return false; }
  19. virtual int star_level() const { return 0; }
  20. virtual bool is_tuple() const { return false; }
  21. virtual bool is_name() const { return false; }
  22. bool is_starred() const { return star_level() > 0; }
  23. std::string str() const { PK_ASSERT(false); }
  24. // for OP_DELETE_XXX
  25. [[nodiscard]] virtual bool emit_del(CodeEmitContext* ctx) {
  26. PK_UNUSED(ctx);
  27. return false;
  28. }
  29. // for OP_STORE_XXX
  30. [[nodiscard]] virtual bool emit_store(CodeEmitContext* ctx) {
  31. PK_UNUSED(ctx);
  32. return false;
  33. }
  34. };
  35. struct CodeEmitContext{
  36. VM* vm;
  37. FuncDecl_ func; // optional
  38. CodeObject_ co;
  39. // some bugs on MSVC (error C2280) when using std::vector<Expr_>
  40. // so we use stack_no_copy instead
  41. stack_no_copy<Expr_> s_expr;
  42. int level;
  43. std::set<Str> global_names;
  44. CodeEmitContext(VM* vm, CodeObject_ co, int level): vm(vm), co(co), level(level) {}
  45. int curr_block_i = 0;
  46. bool is_compiling_class = false;
  47. int for_loop_depth = 0;
  48. int get_loop() const;
  49. CodeBlock* enter_block(CodeBlockType type);
  50. void exit_block();
  51. void emit_expr(); // clear the expression stack and generate bytecode
  52. std::string _log_s_expr();
  53. int emit_(Opcode opcode, uint16_t arg, int line);
  54. void patch_jump(int index);
  55. bool add_label(StrName name);
  56. int add_varname(StrName name);
  57. int add_const(PyObject* v);
  58. int add_func_decl(FuncDecl_ decl);
  59. void emit_store_name(NameScope scope, StrName name, int line);
  60. };
  61. struct NameExpr: Expr{
  62. StrName name;
  63. NameScope scope;
  64. NameExpr(StrName name, NameScope scope): name(name), scope(scope) {}
  65. void emit_(CodeEmitContext* ctx) override;
  66. bool emit_del(CodeEmitContext* ctx) override;
  67. bool emit_store(CodeEmitContext* ctx) override;
  68. bool is_name() const override { return true; }
  69. };
  70. struct InvertExpr: Expr{
  71. Expr_ child;
  72. InvertExpr(Expr_&& child): child(std::move(child)) {}
  73. void emit_(CodeEmitContext* ctx) override;
  74. };
  75. struct StarredExpr: Expr{
  76. int level;
  77. Expr_ child;
  78. StarredExpr(int level, Expr_&& child): level(level), child(std::move(child)) {}
  79. int star_level() const override { return level; }
  80. void emit_(CodeEmitContext* ctx) override;
  81. bool emit_store(CodeEmitContext* ctx) override;
  82. };
  83. struct NotExpr: Expr{
  84. Expr_ child;
  85. NotExpr(Expr_&& child): child(std::move(child)) {}
  86. void emit_(CodeEmitContext* ctx) override;
  87. };
  88. struct AndExpr: Expr{
  89. Expr_ lhs;
  90. Expr_ rhs;
  91. void emit_(CodeEmitContext* ctx) override;
  92. };
  93. struct OrExpr: Expr{
  94. Expr_ lhs;
  95. Expr_ rhs;
  96. void emit_(CodeEmitContext* ctx) override;
  97. };
  98. // [None, True, False, ...]
  99. struct Literal0Expr: Expr{
  100. TokenIndex token;
  101. Literal0Expr(TokenIndex token): token(token) {}
  102. bool is_json_object() const override { return true; }
  103. void emit_(CodeEmitContext* ctx) override;
  104. };
  105. struct LongExpr: Expr{
  106. Str s;
  107. LongExpr(const Str& s): s(s) {}
  108. void emit_(CodeEmitContext* ctx) override;
  109. };
  110. struct BytesExpr: Expr{
  111. Str s;
  112. BytesExpr(const Str& s): s(s) {}
  113. void emit_(CodeEmitContext* ctx) override;
  114. };
  115. struct ImagExpr: Expr{
  116. f64 value;
  117. ImagExpr(f64 value): value(value) {}
  118. void emit_(CodeEmitContext* ctx) override;
  119. };
  120. // @num, @str which needs to invoke OP_LOAD_CONST
  121. struct LiteralExpr: Expr{
  122. TokenValue value;
  123. LiteralExpr(TokenValue value): value(value) {}
  124. void emit_(CodeEmitContext* ctx) override;
  125. bool is_literal() const override { return true; }
  126. bool is_json_object() const override { return true; }
  127. };
  128. struct NegatedExpr: Expr{
  129. Expr_ child;
  130. NegatedExpr(Expr_&& child): child(std::move(child)) {}
  131. void emit_(CodeEmitContext* ctx) override;
  132. bool is_json_object() const override { return child->is_literal(); }
  133. };
  134. struct SliceExpr: Expr{
  135. Expr_ start;
  136. Expr_ stop;
  137. Expr_ step;
  138. void emit_(CodeEmitContext* ctx) override;
  139. };
  140. struct DictItemExpr: Expr{
  141. Expr_ key; // maybe nullptr if it is **kwargs
  142. Expr_ value;
  143. int star_level() const override { return value->star_level(); }
  144. void emit_(CodeEmitContext* ctx) override;
  145. };
  146. struct SequenceExpr: Expr{
  147. std::vector<Expr_> items;
  148. SequenceExpr(std::vector<Expr_>&& items): items(std::move(items)) {}
  149. virtual Opcode opcode() const = 0;
  150. void emit_(CodeEmitContext* ctx) override {
  151. for(auto& item: items) item->emit_(ctx);
  152. ctx->emit_(opcode(), items.size(), line);
  153. }
  154. };
  155. struct ListExpr: SequenceExpr{
  156. using SequenceExpr::SequenceExpr;
  157. Opcode opcode() const override {
  158. for(auto& e: items) if(e->is_starred()) return OP_BUILD_LIST_UNPACK;
  159. return OP_BUILD_LIST;
  160. }
  161. bool is_json_object() const override { return true; }
  162. };
  163. struct DictExpr: SequenceExpr{
  164. using SequenceExpr::SequenceExpr;
  165. Opcode opcode() const override {
  166. for(auto& e: items) if(e->is_starred()) return OP_BUILD_DICT_UNPACK;
  167. return OP_BUILD_DICT;
  168. }
  169. bool is_json_object() const override { return true; }
  170. };
  171. struct SetExpr: SequenceExpr{
  172. using SequenceExpr::SequenceExpr;
  173. Opcode opcode() const override {
  174. for(auto& e: items) if(e->is_starred()) return OP_BUILD_SET_UNPACK;
  175. return OP_BUILD_SET;
  176. }
  177. };
  178. struct TupleExpr: SequenceExpr{
  179. using SequenceExpr::SequenceExpr;
  180. bool is_tuple() const override { return true; }
  181. Opcode opcode() const override {
  182. for(auto& e: items) if(e->is_starred()) return OP_BUILD_TUPLE_UNPACK;
  183. return OP_BUILD_TUPLE;
  184. }
  185. bool emit_store(CodeEmitContext* ctx) override;
  186. bool emit_del(CodeEmitContext* ctx) override;
  187. };
  188. struct CompExpr: Expr{
  189. Expr_ expr; // loop expr
  190. Expr_ vars; // loop vars
  191. Expr_ iter; // loop iter
  192. Expr_ cond; // optional if condition
  193. virtual Opcode op0() = 0;
  194. virtual Opcode op1() = 0;
  195. void emit_(CodeEmitContext* ctx) override;
  196. };
  197. struct ListCompExpr: CompExpr{
  198. Opcode op0() override { return OP_BUILD_LIST; }
  199. Opcode op1() override { return OP_LIST_APPEND; }
  200. };
  201. struct DictCompExpr: CompExpr{
  202. Opcode op0() override { return OP_BUILD_DICT; }
  203. Opcode op1() override { return OP_DICT_ADD; }
  204. };
  205. struct SetCompExpr: CompExpr{
  206. Opcode op0() override { return OP_BUILD_SET; }
  207. Opcode op1() override { return OP_SET_ADD; }
  208. };
  209. struct LambdaExpr: Expr{
  210. FuncDecl_ decl;
  211. LambdaExpr(FuncDecl_ decl): decl(decl) {}
  212. void emit_(CodeEmitContext* ctx) override {
  213. int index = ctx->add_func_decl(decl);
  214. ctx->emit_(OP_LOAD_FUNCTION, index, line);
  215. }
  216. };
  217. struct FStringExpr: Expr{
  218. Str src;
  219. FStringExpr(const Str& src): src(src) {}
  220. void _load_simple_expr(CodeEmitContext* ctx, Str expr);
  221. void emit_(CodeEmitContext* ctx) override;
  222. };
  223. struct SubscrExpr: Expr{
  224. Expr_ a;
  225. Expr_ b;
  226. void emit_(CodeEmitContext* ctx) override;
  227. bool emit_del(CodeEmitContext* ctx) override;
  228. bool emit_store(CodeEmitContext* ctx) override;
  229. };
  230. struct AttribExpr: Expr{
  231. Expr_ a;
  232. Str b;
  233. AttribExpr(Expr_ a, const Str& b): a(std::move(a)), b(b) {}
  234. AttribExpr(Expr_ a, Str&& b): a(std::move(a)), b(std::move(b)) {}
  235. void emit_(CodeEmitContext* ctx) override;
  236. bool emit_del(CodeEmitContext* ctx) override;
  237. bool emit_store(CodeEmitContext* ctx) override;
  238. void emit_method(CodeEmitContext* ctx);
  239. bool is_attrib() const override { return true; }
  240. };
  241. struct CallExpr: Expr{
  242. Expr_ callable;
  243. std::vector<Expr_> args;
  244. // **a will be interpreted as a special keyword argument: {"**": a}
  245. std::vector<std::pair<Str, Expr_>> kwargs;
  246. void emit_(CodeEmitContext* ctx) override;
  247. };
  248. struct GroupedExpr: Expr{
  249. Expr_ a;
  250. GroupedExpr(Expr_&& a): a(std::move(a)) {}
  251. void emit_(CodeEmitContext* ctx) override{
  252. a->emit_(ctx);
  253. }
  254. bool emit_del(CodeEmitContext* ctx) override {
  255. return a->emit_del(ctx);
  256. }
  257. bool emit_store(CodeEmitContext* ctx) override {
  258. return a->emit_store(ctx);
  259. }
  260. };
  261. struct BinaryExpr: Expr{
  262. TokenIndex op;
  263. Expr_ lhs;
  264. Expr_ rhs;
  265. bool is_compare() const override;
  266. void _emit_compare(CodeEmitContext* ctx, std::vector<int>& jmps);
  267. void emit_(CodeEmitContext* ctx) override;
  268. };
  269. struct TernaryExpr: Expr{
  270. Expr_ cond;
  271. Expr_ true_expr;
  272. Expr_ false_expr;
  273. void emit_(CodeEmitContext* ctx) override;
  274. };
  275. } // namespace pkpy