expr.h 9.9 KB

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