compiler.cpp 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177
  1. #include "pocketpy/compiler.h"
  2. namespace pkpy{
  3. NameScope Compiler::name_scope() const {
  4. auto s = contexts.size()>1 ? NAME_LOCAL : NAME_GLOBAL;
  5. if(unknown_global_scope && s == NAME_GLOBAL) s = NAME_GLOBAL_UNKNOWN;
  6. return s;
  7. }
  8. CodeObject_ Compiler::push_global_context(){
  9. CodeObject_ co = std::make_shared<CodeObject>(lexer->src, lexer->src->filename);
  10. contexts.push(CodeEmitContext(vm, co, contexts.size()));
  11. return co;
  12. }
  13. FuncDecl_ Compiler::push_f_context(Str name){
  14. FuncDecl_ decl = std::make_shared<FuncDecl>();
  15. decl->code = std::make_shared<CodeObject>(lexer->src, name);
  16. decl->nested = name_scope() == NAME_LOCAL;
  17. contexts.push(CodeEmitContext(vm, decl->code, contexts.size()));
  18. contexts.top().func = decl;
  19. return decl;
  20. }
  21. void Compiler::pop_context(){
  22. if(!ctx()->s_expr.empty()){
  23. throw std::runtime_error("!ctx()->s_expr.empty()\n" + ctx()->_log_s_expr());
  24. }
  25. // add a `return None` in the end as a guard
  26. // previously, we only do this if the last opcode is not a return
  27. // however, this is buggy...since there may be a jump to the end (out of bound) even if the last opcode is a return
  28. ctx()->emit_(OP_LOAD_NONE, BC_NOARG, BC_KEEPLINE);
  29. ctx()->emit_(OP_RETURN_VALUE, BC_NOARG, BC_KEEPLINE);
  30. // some check here
  31. std::vector<Bytecode>& codes = ctx()->co->codes;
  32. if(ctx()->co->varnames.size() > PK_MAX_CO_VARNAMES){
  33. SyntaxError("maximum number of local variables exceeded");
  34. }
  35. if(ctx()->co->consts.size() > 65535){
  36. std::map<std::string, int> counts;
  37. for(PyObject* c: ctx()->co->consts){
  38. std::string key = obj_type_name(vm, vm->_tp(c)).str();
  39. counts[key] += 1;
  40. }
  41. for(auto pair: counts){
  42. std::cout << pair.first << ": " << pair.second << std::endl;
  43. }
  44. SyntaxError("maximum number of constants exceeded");
  45. }
  46. if(codes.size() > 65535 && ctx()->co->src->mode != JSON_MODE){
  47. // json mode does not contain jump instructions, so it is safe to ignore this check
  48. SyntaxError("maximum number of opcodes exceeded");
  49. }
  50. // pre-compute LOOP_BREAK and LOOP_CONTINUE and FOR_ITER
  51. for(int i=0; i<codes.size(); i++){
  52. Bytecode& bc = codes[i];
  53. if(bc.op == OP_LOOP_CONTINUE){
  54. bc.arg = ctx()->co->blocks[bc.arg].start;
  55. }else if(bc.op == OP_LOOP_BREAK){
  56. bc.arg = ctx()->co->blocks[bc.arg].get_break_end();
  57. }else if(bc.op == OP_FOR_ITER){
  58. bc.arg = ctx()->co->_get_block_codei(i).end;
  59. }
  60. }
  61. FuncDecl_ func = contexts.top().func;
  62. if(func){
  63. func->is_simple = true;
  64. if(func->code->is_generator) func->is_simple = false;
  65. if(func->kwargs.size() > 0) func->is_simple = false;
  66. if(func->starred_arg >= 0) func->is_simple = false;
  67. if(func->starred_kwarg >= 0) func->is_simple = false;
  68. }
  69. contexts.pop();
  70. }
  71. void Compiler::init_pratt_rules(){
  72. PK_LOCAL_STATIC unsigned int count = 0;
  73. if(count > 0) return;
  74. count += 1;
  75. // http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
  76. #define PK_METHOD(name) &Compiler::name
  77. #define PK_NO_INFIX nullptr, PREC_NONE
  78. for(TokenIndex i=0; i<kTokenCount; i++) rules[i] = { nullptr, PK_NO_INFIX };
  79. rules[TK(".")] = { nullptr, PK_METHOD(exprAttrib), PREC_ATTRIB };
  80. rules[TK("(")] = { PK_METHOD(exprGroup), PK_METHOD(exprCall), PREC_CALL };
  81. rules[TK("[")] = { PK_METHOD(exprList), PK_METHOD(exprSubscr), PREC_SUBSCRIPT };
  82. rules[TK("{")] = { PK_METHOD(exprMap), PK_NO_INFIX };
  83. rules[TK("%")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_FACTOR };
  84. rules[TK("+")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_TERM };
  85. rules[TK("-")] = { PK_METHOD(exprUnaryOp), PK_METHOD(exprBinaryOp), PREC_TERM };
  86. rules[TK("*")] = { PK_METHOD(exprUnaryOp), PK_METHOD(exprBinaryOp), PREC_FACTOR };
  87. rules[TK("~")] = { PK_METHOD(exprUnaryOp), nullptr, PREC_UNARY };
  88. rules[TK("/")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_FACTOR };
  89. rules[TK("//")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_FACTOR };
  90. rules[TK("**")] = { PK_METHOD(exprUnaryOp), PK_METHOD(exprBinaryOp), PREC_EXPONENT };
  91. rules[TK(">")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  92. rules[TK("<")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  93. rules[TK("==")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  94. rules[TK("!=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  95. rules[TK(">=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  96. rules[TK("<=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  97. rules[TK("in")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  98. rules[TK("is")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  99. rules[TK("<<")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  100. rules[TK(">>")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
  101. rules[TK("&")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_AND };
  102. rules[TK("|")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_OR };
  103. rules[TK("^")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_XOR };
  104. rules[TK("@")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_FACTOR };
  105. rules[TK("if")] = { nullptr, PK_METHOD(exprTernary), PREC_TERNARY };
  106. rules[TK(",")] = { nullptr, PK_METHOD(exprTuple), PREC_TUPLE };
  107. rules[TK("not in")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  108. rules[TK("is not")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION };
  109. rules[TK("and") ] = { nullptr, PK_METHOD(exprAnd), PREC_LOGICAL_AND };
  110. rules[TK("or")] = { nullptr, PK_METHOD(exprOr), PREC_LOGICAL_OR };
  111. rules[TK("not")] = { PK_METHOD(exprNot), nullptr, PREC_LOGICAL_NOT };
  112. rules[TK("True")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX };
  113. rules[TK("False")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX };
  114. rules[TK("None")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX };
  115. rules[TK("...")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX };
  116. rules[TK("lambda")] = { PK_METHOD(exprLambda), PK_NO_INFIX };
  117. rules[TK("@id")] = { PK_METHOD(exprName), PK_NO_INFIX };
  118. rules[TK("@num")] = { PK_METHOD(exprLiteral), PK_NO_INFIX };
  119. rules[TK("@str")] = { PK_METHOD(exprLiteral), PK_NO_INFIX };
  120. rules[TK("@fstr")] = { PK_METHOD(exprFString), PK_NO_INFIX };
  121. rules[TK("@long")] = { PK_METHOD(exprLong), PK_NO_INFIX };
  122. rules[TK("@bytes")] = { PK_METHOD(exprBytes), PK_NO_INFIX };
  123. #undef PK_METHOD
  124. #undef PK_NO_INFIX
  125. }
  126. bool Compiler::match(TokenIndex expected) {
  127. if (curr().type != expected) return false;
  128. advance();
  129. return true;
  130. }
  131. void Compiler::consume(TokenIndex expected) {
  132. if (!match(expected)){
  133. SyntaxError(
  134. fmt("expected '", TK_STR(expected), "', got '", TK_STR(curr().type), "'")
  135. );
  136. }
  137. }
  138. bool Compiler::match_newlines_repl(){
  139. return match_newlines(mode()==REPL_MODE);
  140. }
  141. bool Compiler::match_newlines(bool repl_throw) {
  142. bool consumed = false;
  143. if (curr().type == TK("@eol")) {
  144. while (curr().type == TK("@eol")) advance();
  145. consumed = true;
  146. }
  147. if (repl_throw && curr().type == TK("@eof")){
  148. throw NeedMoreLines(ctx()->is_compiling_class);
  149. }
  150. return consumed;
  151. }
  152. bool Compiler::match_end_stmt() {
  153. if (match(TK(";"))) { match_newlines(); return true; }
  154. if (match_newlines() || curr().type == TK("@eof")) return true;
  155. if (curr().type == TK("@dedent")) return true;
  156. return false;
  157. }
  158. void Compiler::consume_end_stmt() {
  159. if (!match_end_stmt()) SyntaxError("expected statement end");
  160. }
  161. void Compiler::EXPR(bool push_stack) {
  162. parse_expression(PREC_TUPLE+1, push_stack);
  163. }
  164. void Compiler::EXPR_TUPLE(bool push_stack) {
  165. parse_expression(PREC_TUPLE, push_stack);
  166. }
  167. // special case for `for loop` and `comp`
  168. Expr_ Compiler::EXPR_VARS(){
  169. std::vector<Expr_> items;
  170. do {
  171. consume(TK("@id"));
  172. items.push_back(make_expr<NameExpr>(prev().str(), name_scope()));
  173. } while(match(TK(",")));
  174. if(items.size()==1) return std::move(items[0]);
  175. return make_expr<TupleExpr>(std::move(items));
  176. }
  177. void Compiler::exprLiteral(){
  178. ctx()->s_expr.push(make_expr<LiteralExpr>(prev().value));
  179. }
  180. void Compiler::exprLong(){
  181. ctx()->s_expr.push(make_expr<LongExpr>(prev().str()));
  182. }
  183. void Compiler::exprBytes(){
  184. ctx()->s_expr.push(make_expr<BytesExpr>(std::get<Str>(prev().value)));
  185. }
  186. void Compiler::exprFString(){
  187. ctx()->s_expr.push(make_expr<FStringExpr>(std::get<Str>(prev().value)));
  188. }
  189. void Compiler::exprLambda(){
  190. FuncDecl_ decl = push_f_context("<lambda>");
  191. auto e = make_expr<LambdaExpr>(decl);
  192. if(!match(TK(":"))){
  193. _compile_f_args(e->decl, false);
  194. consume(TK(":"));
  195. }
  196. // https://github.com/blueloveTH/pocketpy/issues/37
  197. parse_expression(PREC_LAMBDA + 1, false);
  198. ctx()->emit_(OP_RETURN_VALUE, BC_NOARG, BC_KEEPLINE);
  199. pop_context();
  200. ctx()->s_expr.push(std::move(e));
  201. }
  202. void Compiler::exprTuple(){
  203. std::vector<Expr_> items;
  204. items.push_back(ctx()->s_expr.popx());
  205. do {
  206. if(curr().brackets_level) match_newlines_repl();
  207. if(!is_expression()) break;
  208. EXPR();
  209. items.push_back(ctx()->s_expr.popx());
  210. if(curr().brackets_level) match_newlines_repl();
  211. } while(match(TK(",")));
  212. ctx()->s_expr.push(make_expr<TupleExpr>(
  213. std::move(items)
  214. ));
  215. }
  216. void Compiler::exprOr(){
  217. auto e = make_expr<OrExpr>();
  218. e->lhs = ctx()->s_expr.popx();
  219. parse_expression(PREC_LOGICAL_OR + 1);
  220. e->rhs = ctx()->s_expr.popx();
  221. ctx()->s_expr.push(std::move(e));
  222. }
  223. void Compiler::exprAnd(){
  224. auto e = make_expr<AndExpr>();
  225. e->lhs = ctx()->s_expr.popx();
  226. parse_expression(PREC_LOGICAL_AND + 1);
  227. e->rhs = ctx()->s_expr.popx();
  228. ctx()->s_expr.push(std::move(e));
  229. }
  230. void Compiler::exprTernary(){
  231. auto e = make_expr<TernaryExpr>();
  232. e->true_expr = ctx()->s_expr.popx();
  233. // cond
  234. parse_expression(PREC_TERNARY + 1);
  235. e->cond = ctx()->s_expr.popx();
  236. consume(TK("else"));
  237. // if false
  238. parse_expression(PREC_TERNARY + 1);
  239. e->false_expr = ctx()->s_expr.popx();
  240. ctx()->s_expr.push(std::move(e));
  241. }
  242. void Compiler::exprBinaryOp(){
  243. auto e = make_expr<BinaryExpr>();
  244. e->op = prev().type;
  245. e->lhs = ctx()->s_expr.popx();
  246. parse_expression(rules[e->op].precedence + 1);
  247. e->rhs = ctx()->s_expr.popx();
  248. ctx()->s_expr.push(std::move(e));
  249. }
  250. void Compiler::exprNot() {
  251. parse_expression(PREC_LOGICAL_NOT + 1);
  252. ctx()->s_expr.push(make_expr<NotExpr>(ctx()->s_expr.popx()));
  253. }
  254. void Compiler::exprUnaryOp(){
  255. TokenIndex op = prev().type;
  256. parse_expression(PREC_UNARY + 1);
  257. switch(op){
  258. case TK("-"):
  259. ctx()->s_expr.push(make_expr<NegatedExpr>(ctx()->s_expr.popx()));
  260. break;
  261. case TK("~"):
  262. ctx()->s_expr.push(make_expr<InvertExpr>(ctx()->s_expr.popx()));
  263. break;
  264. case TK("*"):
  265. ctx()->s_expr.push(make_expr<StarredExpr>(1, ctx()->s_expr.popx()));
  266. break;
  267. case TK("**"):
  268. ctx()->s_expr.push(make_expr<StarredExpr>(2, ctx()->s_expr.popx()));
  269. break;
  270. default: FATAL_ERROR();
  271. }
  272. }
  273. void Compiler::exprGroup(){
  274. match_newlines_repl();
  275. EXPR_TUPLE(); // () is just for change precedence
  276. match_newlines_repl();
  277. consume(TK(")"));
  278. if(ctx()->s_expr.top()->is_tuple()) return;
  279. Expr_ g = make_expr<GroupedExpr>(ctx()->s_expr.popx());
  280. ctx()->s_expr.push(std::move(g));
  281. }
  282. void Compiler::exprList() {
  283. int line = prev().line;
  284. std::vector<Expr_> items;
  285. do {
  286. match_newlines_repl();
  287. if (curr().type == TK("]")) break;
  288. EXPR();
  289. items.push_back(ctx()->s_expr.popx());
  290. match_newlines_repl();
  291. if(items.size()==1 && match(TK("for"))){
  292. _consume_comp<ListCompExpr>(std::move(items[0]));
  293. consume(TK("]"));
  294. return;
  295. }
  296. match_newlines_repl();
  297. } while (match(TK(",")));
  298. consume(TK("]"));
  299. auto e = make_expr<ListExpr>(std::move(items));
  300. e->line = line; // override line
  301. ctx()->s_expr.push(std::move(e));
  302. }
  303. void Compiler::exprMap() {
  304. bool parsing_dict = false; // {...} may be dict or set
  305. std::vector<Expr_> items;
  306. do {
  307. match_newlines_repl();
  308. if (curr().type == TK("}")) break;
  309. EXPR();
  310. int star_level = ctx()->s_expr.top()->star_level();
  311. if(star_level==2 || curr().type == TK(":")){
  312. parsing_dict = true;
  313. }
  314. if(parsing_dict){
  315. auto dict_item = make_expr<DictItemExpr>();
  316. if(star_level == 2){
  317. dict_item->key = nullptr;
  318. dict_item->value = ctx()->s_expr.popx();
  319. }else{
  320. consume(TK(":"));
  321. EXPR();
  322. dict_item->key = ctx()->s_expr.popx();
  323. dict_item->value = ctx()->s_expr.popx();
  324. }
  325. items.push_back(std::move(dict_item));
  326. }else{
  327. items.push_back(ctx()->s_expr.popx());
  328. }
  329. match_newlines_repl();
  330. if(items.size()==1 && match(TK("for"))){
  331. if(parsing_dict) _consume_comp<DictCompExpr>(std::move(items[0]));
  332. else _consume_comp<SetCompExpr>(std::move(items[0]));
  333. consume(TK("}"));
  334. return;
  335. }
  336. match_newlines_repl();
  337. } while (match(TK(",")));
  338. consume(TK("}"));
  339. if(items.size()==0 || parsing_dict){
  340. auto e = make_expr<DictExpr>(std::move(items));
  341. ctx()->s_expr.push(std::move(e));
  342. }else{
  343. auto e = make_expr<SetExpr>(std::move(items));
  344. ctx()->s_expr.push(std::move(e));
  345. }
  346. }
  347. void Compiler::exprCall() {
  348. auto e = make_expr<CallExpr>();
  349. e->callable = ctx()->s_expr.popx();
  350. do {
  351. match_newlines_repl();
  352. if (curr().type==TK(")")) break;
  353. if(curr().type==TK("@id") && next().type==TK("=")) {
  354. consume(TK("@id"));
  355. Str key = prev().str();
  356. consume(TK("="));
  357. EXPR();
  358. e->kwargs.push_back({key, ctx()->s_expr.popx()});
  359. } else{
  360. EXPR();
  361. if(ctx()->s_expr.top()->star_level() == 2){
  362. // **kwargs
  363. e->kwargs.push_back({"**", ctx()->s_expr.popx()});
  364. }else{
  365. // positional argument
  366. if(!e->kwargs.empty()) SyntaxError("positional argument follows keyword argument");
  367. e->args.push_back(ctx()->s_expr.popx());
  368. }
  369. }
  370. match_newlines_repl();
  371. } while (match(TK(",")));
  372. consume(TK(")"));
  373. if(e->args.size() > 32767) SyntaxError("too many positional arguments");
  374. if(e->kwargs.size() > 32767) SyntaxError("too many keyword arguments");
  375. ctx()->s_expr.push(std::move(e));
  376. }
  377. void Compiler::exprName(){
  378. Str name = prev().str();
  379. NameScope scope = name_scope();
  380. if(ctx()->global_names.count(name)){
  381. scope = NAME_GLOBAL;
  382. }
  383. ctx()->s_expr.push(make_expr<NameExpr>(name, scope));
  384. }
  385. void Compiler::exprAttrib() {
  386. consume(TK("@id"));
  387. ctx()->s_expr.push(
  388. make_expr<AttribExpr>(ctx()->s_expr.popx(), prev().str())
  389. );
  390. }
  391. void Compiler::exprSubscr() {
  392. auto e = make_expr<SubscrExpr>();
  393. e->a = ctx()->s_expr.popx();
  394. auto slice = make_expr<SliceExpr>();
  395. bool is_slice = false;
  396. // a[<0> <state:1> : state<3> : state<5>]
  397. int state = 0;
  398. do{
  399. match_newlines_repl();
  400. switch(state){
  401. case 0:
  402. if(match(TK(":"))){
  403. is_slice=true;
  404. state=2;
  405. break;
  406. }
  407. if(match(TK("]"))) SyntaxError();
  408. EXPR_TUPLE();
  409. slice->start = ctx()->s_expr.popx();
  410. state=1;
  411. break;
  412. case 1:
  413. if(match(TK(":"))){
  414. is_slice=true;
  415. state=2;
  416. break;
  417. }
  418. if(match(TK("]"))) goto __SUBSCR_END;
  419. SyntaxError("expected ':' or ']'");
  420. break;
  421. case 2:
  422. if(match(TK(":"))){
  423. state=4;
  424. break;
  425. }
  426. if(match(TK("]"))) goto __SUBSCR_END;
  427. EXPR_TUPLE();
  428. slice->stop = ctx()->s_expr.popx();
  429. state=3;
  430. break;
  431. case 3:
  432. if(match(TK(":"))){
  433. state=4;
  434. break;
  435. }
  436. if(match(TK("]"))) goto __SUBSCR_END;
  437. SyntaxError("expected ':' or ']'");
  438. break;
  439. case 4:
  440. if(match(TK("]"))) goto __SUBSCR_END;
  441. EXPR_TUPLE();
  442. slice->step = ctx()->s_expr.popx();
  443. state=5;
  444. break;
  445. case 5: consume(TK("]")); goto __SUBSCR_END;
  446. }
  447. match_newlines_repl();
  448. }while(true);
  449. __SUBSCR_END:
  450. if(is_slice){
  451. e->b = std::move(slice);
  452. }else{
  453. if(state != 1) FATAL_ERROR();
  454. e->b = std::move(slice->start);
  455. }
  456. ctx()->s_expr.push(std::move(e));
  457. }
  458. void Compiler::exprLiteral0() {
  459. ctx()->s_expr.push(make_expr<Literal0Expr>(prev().type));
  460. }
  461. void Compiler::compile_block_body() {
  462. consume(TK(":"));
  463. if(curr().type!=TK("@eol") && curr().type!=TK("@eof")){
  464. compile_stmt(); // inline block
  465. return;
  466. }
  467. if(!match_newlines(mode()==REPL_MODE)){
  468. SyntaxError("expected a new line after ':'");
  469. }
  470. consume(TK("@indent"));
  471. while (curr().type != TK("@dedent")) {
  472. match_newlines();
  473. compile_stmt();
  474. match_newlines();
  475. }
  476. consume(TK("@dedent"));
  477. }
  478. // import a [as b]
  479. // import a [as b], c [as d]
  480. void Compiler::compile_normal_import() {
  481. do {
  482. consume(TK("@id"));
  483. Str name = prev().str();
  484. ctx()->emit_(OP_IMPORT_PATH, ctx()->add_const(VAR(name)), prev().line);
  485. if (match(TK("as"))) {
  486. consume(TK("@id"));
  487. name = prev().str();
  488. }
  489. ctx()->emit_store_name(name_scope(), StrName(name), prev().line);
  490. } while (match(TK(",")));
  491. consume_end_stmt();
  492. }
  493. // from a import b [as c], d [as e]
  494. // from a.b import c [as d]
  495. // from . import a [as b]
  496. // from .a import b [as c]
  497. // from ..a import b [as c]
  498. // from .a.b import c [as d]
  499. // from xxx import *
  500. void Compiler::compile_from_import() {
  501. int dots = 0;
  502. while(true){
  503. switch(curr().type){
  504. case TK("."): dots+=1; break;
  505. case TK(".."): dots+=2; break;
  506. case TK("..."): dots+=3; break;
  507. default: goto __EAT_DOTS_END;
  508. }
  509. advance();
  510. }
  511. __EAT_DOTS_END:
  512. SStream ss;
  513. for(int i=0; i<dots; i++) ss << '.';
  514. if(dots > 0){
  515. // @id is optional if dots > 0
  516. if(match(TK("@id"))){
  517. ss << prev().sv();
  518. while (match(TK("."))) {
  519. consume(TK("@id"));
  520. ss << "." << prev().sv();
  521. }
  522. }
  523. }else{
  524. // @id is required if dots == 0
  525. consume(TK("@id"));
  526. ss << prev().sv();
  527. while (match(TK("."))) {
  528. consume(TK("@id"));
  529. ss << "." << prev().sv();
  530. }
  531. }
  532. ctx()->emit_(OP_IMPORT_PATH, ctx()->add_const(VAR(ss.str())), prev().line);
  533. consume(TK("import"));
  534. if (match(TK("*"))) {
  535. if(name_scope() != NAME_GLOBAL) SyntaxError("from <module> import * can only be used in global scope");
  536. // pop the module and import __all__
  537. ctx()->emit_(OP_POP_IMPORT_STAR, BC_NOARG, prev().line);
  538. consume_end_stmt();
  539. return;
  540. }
  541. do {
  542. ctx()->emit_(OP_DUP_TOP, BC_NOARG, BC_KEEPLINE);
  543. consume(TK("@id"));
  544. Str name = prev().str();
  545. ctx()->emit_(OP_LOAD_ATTR, StrName(name).index, prev().line);
  546. if (match(TK("as"))) {
  547. consume(TK("@id"));
  548. name = prev().str();
  549. }
  550. ctx()->emit_store_name(name_scope(), StrName(name), prev().line);
  551. } while (match(TK(",")));
  552. ctx()->emit_(OP_POP_TOP, BC_NOARG, BC_KEEPLINE);
  553. consume_end_stmt();
  554. }
  555. bool Compiler::is_expression(){
  556. PrattCallback prefix = rules[curr().type].prefix;
  557. return prefix != nullptr;
  558. }
  559. void Compiler::parse_expression(int precedence, bool push_stack) {
  560. PrattCallback prefix = rules[curr().type].prefix;
  561. if (prefix == nullptr) SyntaxError(Str("expected an expression, got ") + TK_STR(curr().type));
  562. advance();
  563. (this->*prefix)();
  564. while (rules[curr().type].precedence >= precedence) {
  565. TokenIndex op = curr().type;
  566. advance();
  567. PrattCallback infix = rules[op].infix;
  568. PK_ASSERT(infix != nullptr);
  569. (this->*infix)();
  570. }
  571. if(!push_stack) ctx()->emit_expr();
  572. }
  573. void Compiler::compile_if_stmt() {
  574. EXPR(false); // condition
  575. int patch = ctx()->emit_(OP_POP_JUMP_IF_FALSE, BC_NOARG, prev().line);
  576. compile_block_body();
  577. if (match(TK("elif"))) {
  578. int exit_patch = ctx()->emit_(OP_JUMP_ABSOLUTE, BC_NOARG, prev().line);
  579. ctx()->patch_jump(patch);
  580. compile_if_stmt();
  581. ctx()->patch_jump(exit_patch);
  582. } else if (match(TK("else"))) {
  583. int exit_patch = ctx()->emit_(OP_JUMP_ABSOLUTE, BC_NOARG, prev().line);
  584. ctx()->patch_jump(patch);
  585. compile_block_body();
  586. ctx()->patch_jump(exit_patch);
  587. } else {
  588. ctx()->patch_jump(patch);
  589. }
  590. }
  591. void Compiler::compile_while_loop() {
  592. CodeBlock* block = ctx()->enter_block(WHILE_LOOP);
  593. EXPR(false); // condition
  594. int patch = ctx()->emit_(OP_POP_JUMP_IF_FALSE, BC_NOARG, prev().line);
  595. compile_block_body();
  596. ctx()->emit_(OP_LOOP_CONTINUE, ctx()->get_loop(), BC_KEEPLINE);
  597. ctx()->patch_jump(patch);
  598. ctx()->exit_block();
  599. // optional else clause
  600. if (match(TK("else"))) {
  601. compile_block_body();
  602. block->end2 = ctx()->co->codes.size();
  603. }
  604. }
  605. void Compiler::compile_for_loop() {
  606. Expr_ vars = EXPR_VARS();
  607. consume(TK("in"));
  608. EXPR_TUPLE(false);
  609. ctx()->emit_(OP_GET_ITER, BC_NOARG, BC_KEEPLINE);
  610. CodeBlock* block = ctx()->enter_block(FOR_LOOP);
  611. ctx()->emit_(OP_FOR_ITER, BC_NOARG, BC_KEEPLINE);
  612. bool ok = vars->emit_store(ctx());
  613. if(!ok) SyntaxError(); // this error occurs in `vars` instead of this line, but...nevermind
  614. compile_block_body();
  615. ctx()->emit_(OP_LOOP_CONTINUE, ctx()->get_loop(), BC_KEEPLINE);
  616. ctx()->exit_block();
  617. // optional else clause
  618. if (match(TK("else"))) {
  619. compile_block_body();
  620. block->end2 = ctx()->co->codes.size();
  621. }
  622. }
  623. void Compiler::compile_try_except() {
  624. ctx()->enter_block(TRY_EXCEPT);
  625. compile_block_body();
  626. std::vector<int> patches = {
  627. ctx()->emit_(OP_JUMP_ABSOLUTE, BC_NOARG, BC_KEEPLINE)
  628. };
  629. ctx()->exit_block();
  630. do {
  631. StrName as_name;
  632. consume(TK("except"));
  633. if(match(TK("@id"))){
  634. ctx()->emit_(OP_EXCEPTION_MATCH, StrName(prev().sv()).index, prev().line);
  635. if(match(TK("as"))){
  636. consume(TK("@id"));
  637. as_name = StrName(prev().sv());
  638. }
  639. }else{
  640. ctx()->emit_(OP_LOAD_TRUE, BC_NOARG, BC_KEEPLINE);
  641. }
  642. int patch = ctx()->emit_(OP_POP_JUMP_IF_FALSE, BC_NOARG, BC_KEEPLINE);
  643. // on match
  644. if(!as_name.empty()){
  645. ctx()->emit_(OP_DUP_TOP, BC_NOARG, BC_KEEPLINE);
  646. ctx()->emit_store_name(name_scope(), as_name, BC_KEEPLINE);
  647. }
  648. // pop the exception
  649. ctx()->emit_(OP_POP_EXCEPTION, BC_NOARG, BC_KEEPLINE);
  650. compile_block_body();
  651. patches.push_back(ctx()->emit_(OP_JUMP_ABSOLUTE, BC_NOARG, BC_KEEPLINE));
  652. ctx()->patch_jump(patch);
  653. }while(curr().type == TK("except"));
  654. // no match, re-raise
  655. ctx()->emit_(OP_RE_RAISE, BC_NOARG, BC_KEEPLINE);
  656. for (int patch : patches) ctx()->patch_jump(patch);
  657. }
  658. void Compiler::compile_decorated(){
  659. std::vector<Expr_> decorators;
  660. do{
  661. EXPR();
  662. decorators.push_back(ctx()->s_expr.popx());
  663. if(!match_newlines_repl()) SyntaxError();
  664. }while(match(TK("@")));
  665. consume(TK("def"));
  666. compile_function(decorators);
  667. }
  668. bool Compiler::try_compile_assignment(){
  669. switch (curr().type) {
  670. case TK("+="): case TK("-="): case TK("*="): case TK("/="): case TK("//="): case TK("%="):
  671. case TK("<<="): case TK(">>="): case TK("&="): case TK("|="): case TK("^="): {
  672. Expr* lhs_p = ctx()->s_expr.top().get();
  673. if(lhs_p->is_starred()) SyntaxError();
  674. if(ctx()->is_compiling_class) SyntaxError("can't use inplace operator in class definition");
  675. advance();
  676. auto e = make_expr<BinaryExpr>();
  677. e->op = prev().type - 1; // -1 to remove =
  678. e->lhs = ctx()->s_expr.popx();
  679. EXPR_TUPLE();
  680. e->rhs = ctx()->s_expr.popx();
  681. if(e->is_starred()) SyntaxError();
  682. e->emit_(ctx());
  683. bool ok = lhs_p->emit_store(ctx());
  684. if(!ok) SyntaxError();
  685. } return true;
  686. case TK("="): {
  687. int n = 0;
  688. while(match(TK("="))){
  689. EXPR_TUPLE();
  690. n += 1;
  691. }
  692. // stack size is n+1
  693. Expr_ val = ctx()->s_expr.popx();
  694. val->emit_(ctx());
  695. for(int j=1; j<n; j++) ctx()->emit_(OP_DUP_TOP, BC_NOARG, BC_KEEPLINE);
  696. for(int j=0; j<n; j++){
  697. auto e = ctx()->s_expr.popx();
  698. if(e->is_starred()) SyntaxError();
  699. bool ok = e->emit_store(ctx());
  700. if(!ok) SyntaxError();
  701. }
  702. } return true;
  703. default: return false;
  704. }
  705. }
  706. void Compiler::compile_stmt() {
  707. if(match(TK("class"))){
  708. compile_class();
  709. return;
  710. }
  711. advance();
  712. int kw_line = prev().line; // backup line number
  713. int curr_loop_block = ctx()->get_loop();
  714. switch(prev().type){
  715. case TK("break"):
  716. if (curr_loop_block < 0) SyntaxError("'break' outside loop");
  717. ctx()->emit_(OP_LOOP_BREAK, curr_loop_block, kw_line);
  718. consume_end_stmt();
  719. break;
  720. case TK("continue"):
  721. if (curr_loop_block < 0) SyntaxError("'continue' not properly in loop");
  722. ctx()->emit_(OP_LOOP_CONTINUE, curr_loop_block, kw_line);
  723. consume_end_stmt();
  724. break;
  725. case TK("yield"):
  726. if (contexts.size() <= 1) SyntaxError("'yield' outside function");
  727. EXPR_TUPLE(false);
  728. // if yield present, mark the function as generator
  729. ctx()->co->is_generator = true;
  730. ctx()->emit_(OP_YIELD_VALUE, BC_NOARG, kw_line);
  731. consume_end_stmt();
  732. break;
  733. case TK("yield from"):
  734. if (contexts.size() <= 1) SyntaxError("'yield from' outside function");
  735. EXPR_TUPLE(false);
  736. // if yield from present, mark the function as generator
  737. ctx()->co->is_generator = true;
  738. ctx()->emit_(OP_GET_ITER, BC_NOARG, kw_line);
  739. ctx()->enter_block(FOR_LOOP);
  740. ctx()->emit_(OP_FOR_ITER, BC_NOARG, BC_KEEPLINE);
  741. ctx()->emit_(OP_YIELD_VALUE, BC_NOARG, BC_KEEPLINE);
  742. ctx()->emit_(OP_LOOP_CONTINUE, ctx()->get_loop(), BC_KEEPLINE);
  743. ctx()->exit_block();
  744. consume_end_stmt();
  745. break;
  746. case TK("return"):
  747. if (contexts.size() <= 1) SyntaxError("'return' outside function");
  748. if(match_end_stmt()){
  749. ctx()->emit_(OP_LOAD_NONE, BC_NOARG, kw_line);
  750. }else{
  751. EXPR_TUPLE(false);
  752. consume_end_stmt();
  753. }
  754. ctx()->emit_(OP_RETURN_VALUE, BC_NOARG, kw_line);
  755. break;
  756. /*************************************************/
  757. case TK("if"): compile_if_stmt(); break;
  758. case TK("while"): compile_while_loop(); break;
  759. case TK("for"): compile_for_loop(); break;
  760. case TK("import"): compile_normal_import(); break;
  761. case TK("from"): compile_from_import(); break;
  762. case TK("def"): compile_function(); break;
  763. case TK("@"): compile_decorated(); break;
  764. case TK("try"): compile_try_except(); break;
  765. case TK("pass"): consume_end_stmt(); break;
  766. /*************************************************/
  767. case TK("++"):{
  768. consume(TK("@id"));
  769. StrName name(prev().sv());
  770. NameScope scope = name_scope();
  771. bool is_global = ctx()->global_names.count(name.sv());
  772. if(is_global) scope = NAME_GLOBAL;
  773. switch(scope){
  774. case NAME_LOCAL:
  775. ctx()->emit_(OP_INC_FAST, ctx()->add_varname(name), prev().line);
  776. break;
  777. case NAME_GLOBAL:
  778. ctx()->emit_(OP_INC_GLOBAL, name.index, prev().line);
  779. break;
  780. default: SyntaxError(); break;
  781. }
  782. consume_end_stmt();
  783. break;
  784. }
  785. case TK("--"):{
  786. consume(TK("@id"));
  787. StrName name(prev().sv());
  788. switch(name_scope()){
  789. case NAME_LOCAL:
  790. ctx()->emit_(OP_DEC_FAST, ctx()->add_varname(name), prev().line);
  791. break;
  792. case NAME_GLOBAL:
  793. ctx()->emit_(OP_DEC_GLOBAL, name.index, prev().line);
  794. break;
  795. default: SyntaxError(); break;
  796. }
  797. consume_end_stmt();
  798. break;
  799. }
  800. case TK("assert"):{
  801. EXPR(false); // condition
  802. int index = ctx()->emit_(OP_POP_JUMP_IF_TRUE, BC_NOARG, kw_line);
  803. int has_msg = 0;
  804. if(match(TK(","))){
  805. EXPR(false); // message
  806. has_msg = 1;
  807. }
  808. ctx()->emit_(OP_RAISE_ASSERT, has_msg, kw_line);
  809. ctx()->patch_jump(index);
  810. consume_end_stmt();
  811. break;
  812. }
  813. case TK("global"):
  814. do {
  815. consume(TK("@id"));
  816. ctx()->global_names.insert(prev().str());
  817. } while (match(TK(",")));
  818. consume_end_stmt();
  819. break;
  820. case TK("raise"): {
  821. consume(TK("@id"));
  822. int dummy_t = StrName(prev().sv()).index;
  823. if(match(TK("(")) && !match(TK(")"))){
  824. EXPR(false); consume(TK(")"));
  825. }else{
  826. ctx()->emit_(OP_LOAD_NONE, BC_NOARG, kw_line);
  827. }
  828. ctx()->emit_(OP_RAISE, dummy_t, kw_line);
  829. consume_end_stmt();
  830. } break;
  831. case TK("del"): {
  832. EXPR_TUPLE();
  833. Expr_ e = ctx()->s_expr.popx();
  834. bool ok = e->emit_del(ctx());
  835. if(!ok) SyntaxError();
  836. consume_end_stmt();
  837. } break;
  838. case TK("with"): {
  839. EXPR(false);
  840. consume(TK("as"));
  841. consume(TK("@id"));
  842. Expr_ e = make_expr<NameExpr>(prev().str(), name_scope());
  843. bool ok = e->emit_store(ctx());
  844. if(!ok) SyntaxError();
  845. e->emit_(ctx());
  846. ctx()->emit_(OP_WITH_ENTER, BC_NOARG, prev().line);
  847. compile_block_body();
  848. e->emit_(ctx());
  849. ctx()->emit_(OP_WITH_EXIT, BC_NOARG, prev().line);
  850. } break;
  851. /*************************************************/
  852. case TK("=="): {
  853. consume(TK("@id"));
  854. if(mode()!=EXEC_MODE) SyntaxError("'label' is only available in EXEC_MODE");
  855. bool ok = ctx()->add_label(prev().str());
  856. consume(TK("=="));
  857. if(!ok) SyntaxError("label " + prev().str().escape() + " already exists");
  858. consume_end_stmt();
  859. } break;
  860. case TK("->"):
  861. consume(TK("@id"));
  862. if(mode()!=EXEC_MODE) SyntaxError("'goto' is only available in EXEC_MODE");
  863. ctx()->emit_(OP_GOTO, StrName(prev().sv()).index, prev().line);
  864. consume_end_stmt();
  865. break;
  866. /*************************************************/
  867. // handle dangling expression or assignment
  868. default: {
  869. advance(-1); // do revert since we have pre-called advance() at the beginning
  870. EXPR_TUPLE();
  871. bool is_typed_name = false; // e.g. x: int
  872. // eat variable's type hint if it is a single name
  873. if(ctx()->s_expr.top()->is_name()){
  874. if(match(TK(":"))){
  875. consume_type_hints();
  876. is_typed_name = true;
  877. }
  878. }
  879. if(!try_compile_assignment()){
  880. if(!ctx()->s_expr.empty() && ctx()->s_expr.top()->is_starred()){
  881. SyntaxError();
  882. }
  883. if(!is_typed_name){
  884. ctx()->emit_expr();
  885. if((mode()==CELL_MODE || mode()==REPL_MODE) && name_scope()==NAME_GLOBAL){
  886. ctx()->emit_(OP_PRINT_EXPR, BC_NOARG, BC_KEEPLINE);
  887. }else{
  888. ctx()->emit_(OP_POP_TOP, BC_NOARG, BC_KEEPLINE);
  889. }
  890. }else{
  891. PK_ASSERT(ctx()->s_expr.size() == 1)
  892. ctx()->s_expr.pop();
  893. }
  894. }
  895. consume_end_stmt();
  896. }
  897. }
  898. }
  899. void Compiler::consume_type_hints(){
  900. EXPR();
  901. ctx()->s_expr.pop();
  902. }
  903. void Compiler::compile_class(){
  904. consume(TK("@id"));
  905. int namei = StrName(prev().sv()).index;
  906. Expr_ base = nullptr;
  907. if(match(TK("("))){
  908. if(is_expression()){
  909. EXPR();
  910. base = ctx()->s_expr.popx();
  911. }
  912. consume(TK(")"));
  913. }
  914. if(base == nullptr){
  915. ctx()->emit_(OP_LOAD_NONE, BC_NOARG, prev().line);
  916. }else {
  917. base->emit_(ctx());
  918. }
  919. ctx()->emit_(OP_BEGIN_CLASS, namei, BC_KEEPLINE);
  920. for(auto& c: this->contexts.data()){
  921. if(c.is_compiling_class){
  922. SyntaxError("nested class is not allowed");
  923. }
  924. }
  925. ctx()->is_compiling_class = true;
  926. compile_block_body();
  927. ctx()->is_compiling_class = false;
  928. ctx()->emit_(OP_END_CLASS, BC_NOARG, BC_KEEPLINE);
  929. }
  930. void Compiler::_compile_f_args(FuncDecl_ decl, bool enable_type_hints){
  931. int state = 0; // 0 for args, 1 for *args, 2 for k=v, 3 for **kwargs
  932. do {
  933. if(state > 3) SyntaxError();
  934. if(state == 3) SyntaxError("**kwargs should be the last argument");
  935. match_newlines();
  936. if(match(TK("*"))){
  937. if(state < 1) state = 1;
  938. else SyntaxError("*args should be placed before **kwargs");
  939. }
  940. else if(match(TK("**"))){
  941. state = 3;
  942. }
  943. consume(TK("@id"));
  944. StrName name = prev().str();
  945. // check duplicate argument name
  946. for(int j: decl->args){
  947. if(decl->code->varnames[j] == name) {
  948. SyntaxError("duplicate argument name");
  949. }
  950. }
  951. for(auto& kv: decl->kwargs){
  952. if(decl->code->varnames[kv.key] == name){
  953. SyntaxError("duplicate argument name");
  954. }
  955. }
  956. if(decl->starred_arg!=-1 && decl->code->varnames[decl->starred_arg] == name){
  957. SyntaxError("duplicate argument name");
  958. }
  959. if(decl->starred_kwarg!=-1 && decl->code->varnames[decl->starred_kwarg] == name){
  960. SyntaxError("duplicate argument name");
  961. }
  962. // eat type hints
  963. if(enable_type_hints && match(TK(":"))) consume_type_hints();
  964. if(state == 0 && curr().type == TK("=")) state = 2;
  965. int index = ctx()->add_varname(name);
  966. switch (state)
  967. {
  968. case 0:
  969. decl->args.push_back(index);
  970. break;
  971. case 1:
  972. decl->starred_arg = index;
  973. state+=1;
  974. break;
  975. case 2: {
  976. consume(TK("="));
  977. PyObject* value = read_literal();
  978. if(value == nullptr){
  979. SyntaxError(Str("default argument must be a literal"));
  980. }
  981. decl->kwargs.push_back(FuncDecl::KwArg{index, value});
  982. } break;
  983. case 3:
  984. decl->starred_kwarg = index;
  985. state+=1;
  986. break;
  987. }
  988. } while (match(TK(",")));
  989. }
  990. void Compiler::compile_function(const std::vector<Expr_>& decorators){
  991. const char* _start = curr().start;
  992. consume(TK("@id"));
  993. Str decl_name = prev().str();
  994. FuncDecl_ decl = push_f_context(decl_name);
  995. consume(TK("("));
  996. if (!match(TK(")"))) {
  997. _compile_f_args(decl, true);
  998. consume(TK(")"));
  999. }
  1000. if(match(TK("->"))) consume_type_hints();
  1001. const char* _end = curr().start;
  1002. decl->signature = Str(_start, _end-_start);
  1003. compile_block_body();
  1004. pop_context();
  1005. PyObject* docstring = nullptr;
  1006. if(decl->code->codes.size()>=2 && decl->code->codes[0].op == OP_LOAD_CONST && decl->code->codes[1].op == OP_POP_TOP){
  1007. PyObject* c = decl->code->consts[decl->code->codes[0].arg];
  1008. if(is_type(c, vm->tp_str)){
  1009. decl->code->codes[0].op = OP_NO_OP;
  1010. decl->code->codes[1].op = OP_NO_OP;
  1011. docstring = c;
  1012. }
  1013. }
  1014. if(docstring != nullptr){
  1015. decl->docstring = PK_OBJ_GET(Str, docstring);
  1016. }
  1017. ctx()->emit_(OP_LOAD_FUNCTION, ctx()->add_func_decl(decl), prev().line);
  1018. // add decorators
  1019. for(auto it=decorators.rbegin(); it!=decorators.rend(); ++it){
  1020. (*it)->emit_(ctx());
  1021. ctx()->emit_(OP_ROT_TWO, BC_NOARG, (*it)->line);
  1022. ctx()->emit_(OP_LOAD_NULL, BC_NOARG, BC_KEEPLINE);
  1023. ctx()->emit_(OP_ROT_TWO, BC_NOARG, BC_KEEPLINE);
  1024. ctx()->emit_(OP_CALL, 1, (*it)->line);
  1025. }
  1026. if(!ctx()->is_compiling_class){
  1027. auto e = make_expr<NameExpr>(decl_name, name_scope());
  1028. e->emit_store(ctx());
  1029. }else{
  1030. int index = StrName(decl_name).index;
  1031. ctx()->emit_(OP_STORE_CLASS_ATTR, index, prev().line);
  1032. }
  1033. }
  1034. PyObject* Compiler::to_object(const TokenValue& value){
  1035. PyObject* obj = nullptr;
  1036. if(std::holds_alternative<i64>(value)){
  1037. obj = VAR(std::get<i64>(value));
  1038. }
  1039. if(std::holds_alternative<f64>(value)){
  1040. obj = VAR(std::get<f64>(value));
  1041. }
  1042. if(std::holds_alternative<Str>(value)){
  1043. obj = VAR(std::get<Str>(value));
  1044. }
  1045. if(obj == nullptr) FATAL_ERROR();
  1046. return obj;
  1047. }
  1048. PyObject* Compiler::read_literal(){
  1049. advance();
  1050. switch(prev().type){
  1051. case TK("-"): {
  1052. consume(TK("@num"));
  1053. PyObject* val = to_object(prev().value);
  1054. return vm->py_negate(val);
  1055. }
  1056. case TK("@num"): return to_object(prev().value);
  1057. case TK("@str"): return to_object(prev().value);
  1058. case TK("True"): return VAR(true);
  1059. case TK("False"): return VAR(false);
  1060. case TK("None"): return vm->None;
  1061. case TK("..."): return vm->Ellipsis;
  1062. default: break;
  1063. }
  1064. return nullptr;
  1065. }
  1066. Compiler::Compiler(VM* vm, const Str& source, const Str& filename, CompileMode mode, bool unknown_global_scope){
  1067. this->vm = vm;
  1068. this->used = false;
  1069. this->unknown_global_scope = unknown_global_scope;
  1070. this->lexer = std::make_unique<Lexer>(
  1071. std::make_shared<SourceData>(source, filename, mode)
  1072. );
  1073. init_pratt_rules();
  1074. }
  1075. CodeObject_ Compiler::compile(){
  1076. if(used) FATAL_ERROR();
  1077. used = true;
  1078. tokens = lexer->run();
  1079. CodeObject_ code = push_global_context();
  1080. advance(); // skip @sof, so prev() is always valid
  1081. match_newlines(); // skip possible leading '\n'
  1082. if(mode()==EVAL_MODE) {
  1083. EXPR_TUPLE(false);
  1084. consume(TK("@eof"));
  1085. ctx()->emit_(OP_RETURN_VALUE, BC_NOARG, BC_KEEPLINE);
  1086. pop_context();
  1087. return code;
  1088. }else if(mode()==JSON_MODE){
  1089. EXPR();
  1090. Expr_ e = ctx()->s_expr.popx();
  1091. if(!e->is_json_object()) SyntaxError("expect a JSON object, literal or array");
  1092. consume(TK("@eof"));
  1093. e->emit_(ctx());
  1094. ctx()->emit_(OP_RETURN_VALUE, BC_NOARG, BC_KEEPLINE);
  1095. pop_context();
  1096. return code;
  1097. }
  1098. while (!match(TK("@eof"))) {
  1099. compile_stmt();
  1100. match_newlines();
  1101. }
  1102. pop_context();
  1103. return code;
  1104. }
  1105. } // namespace pkpy