From 4c96750dbed12204ad2533685081ede4db96873c Mon Sep 17 00:00:00 2001 From: Adnan Ioricce Date: Wed, 16 Oct 2024 13:36:05 -0300 Subject: [PATCH] [Chapter17&CompilingExpr] - Chapter 17 follow up --- clox/clox | Bin 0 -> 52256 bytes clox/common.h | 2 +- clox/compiler.c | 250 +++++++++++++++++++++++++++++++++++++++++++++--- clox/compiler.h | 4 +- clox/scanner.c | 9 +- clox/scanner.o | Bin 12528 -> 23936 bytes clox/vm.c | 16 +++- clox/vm.o | Bin 5912 -> 13080 bytes 8 files changed, 261 insertions(+), 20 deletions(-) create mode 100755 clox/clox diff --git a/clox/clox b/clox/clox new file mode 100755 index 0000000000000000000000000000000000000000..2c5a0e7fb758bd1264a8be59af431bb39bea1108 GIT binary patch literal 52256 zcmeIbd3aUT)jxj5J0|yLCd@a?S`!k83>x%?F+pa6;?xi_k&?*_OjbbyVgxDGTt2mt{&{%||r( z#wflqichC$ichE7p45?NtFmXS9Yv0LnaXRtpOX3ZD!#pnUZ)Yr;1Lnmxa}9e*-`U9 zsc(Vedv3fG_}uuY0Ai`C=Q))M+XG$*KHBBqJ#;rNQuUpzA9|EMb!w^##x^&s8Qb2` z(pEdRx~Op7ij~V-Cw#4G?TW%R)n~4(DH=DvzG~9iwc}cgSFFshZ){jzoj*ZuJ4oRpo7^S?S+KTXGW z(3iBn0AmMrO2L_`Fd0axA6=gO`ULoI9}_`IImt&U5GTT~ISHQaJ`p`_LLHNjT|k_O zzW+(^wC9QFZ#@Z~wm1>}4JW~W4-65MB_EdoaUwbQodiGsB>2-$g0DRZzWgNkl9S-? zISKxPli;rd{zUy^)YaE^v>R=;s~ehYjP{P2hGwI+6PU`%_KvFRm6g>iR#w(kH8cXz z+SbtAQAdnX*H&9=)UIjhAaV7Isy3sprM0#ha;h2|TdF}^mq3ji3TgyrlP2JxXB}-F zl}%Ns6?NCPK~6_)W24bj+f?1uYSdLXwzSt8b*tMNI*_#2)~+a@yn z1ruY?_=4gX9EZlo!Eps=8VR9k`KtPf#cS&)7oIt}XnEbZudS@FpHx({vT)7BqRXn6 zkDHi}D3;&80va(aot41(-w$eu-0iEY8w=MqH#bzBS$*cjh6$I|)l|1#RyA?l*CtMy zII*cdzrMOUzi52HxPn3iLd3&{@xwwa;?+WYk}2Yyf?UKciF1*f zh%`S2kB;m88X6E*JjSC6*U`TLA;>kJQu!=V?ieqs`~x@Kf-qDm`U^Qx-U7 zf&ber@L_n!XJuXQ_{z4pub*oeWt$FkSjP^Rbsh2@6iqvJ<^Z6NjU0q)cxV(5^D9`^ zd*m37kr~W$O6xr=@&V>KmGvGFd5d{Ysl9te{Ob@c9H)p^PJjx zH;DY7ndg+&+bZ&}GS8{3cbUk)$ULX8-UTB63+6d>^+rYhN#;3a^%jc!Bg}Kk?v052 zkC{(pK27Am$2_O3UPI*XWS&!1@B3c@G4eL%IYspz5&0XL=hW1D82Qrkiw=}7DXmyi z*8TC~?$3J$LG!N9&G5$kpy>MC3U3O-R&%yA`O3DPdCd@j-GA%Z47p|92Vwm1#-pHn zgyt*yds+9>J!gob*Lob8mUkcOc^1{o-PSR}oYVb}o-dFo>;Ac5{T8^&yI+~p{rV&9 zk2&2!!T@m2nS7*e=~L5T<+ASAdR7RYzxBKiE0=Zut@~ilC}5yv$LY|pV_?yNo=qsa zxah#8rI(amTKd(4z_df;+iyNT6M}pG0`kX83H=e!obKMTZP~93hOjN}-FR;C7}YP^ zG6`HPe|$D6e-fkoE?WKeOOk6dxZZvSe2w6HgcJ5-RK0B5l)HpHU(Xgwh*H93fVR_L zi{35oe&MTS-G46YI{N;CiWx-*ik>Zd`soGfaL?=@1btLj5FWY_JcdE~gYoS4eQ67# zM%ffzJ2Ll?f-diWoQPvb>b4)Oixbn|9~1Ofy(g0H_sgDm@7%H{KC#Qpr^;UVvLihv z!K)-B^Rxa9Qy%1PP-iBb;?16Q=#Qt|yMQq-J$PJwq<{OmxDKTibGD7Vc#vT%SzLD2 zJ82jU)rKgD5EmBxb*;l0W&XlsN4zb#c;R^?Qrhq1{TzIHa z_Ow`S)`kCepsefZ+;IA=_j}7Q+O_=`mvw($R=wIOda-QFdSB1GRIR$*Dcf>+8cQhvdu844^{f}QEf%$vZ7aSXS=2DiSN6o8t)AsFlU7!3mu*?>n||#X zR#|ms*_LT()4NA(@3Kt>LAJW|QaIR)MSm|kcCc>yHfKUv_2IW~)%ppgwyn?YX@`}! zOdE7@SC2_TT`m;f^kT=*vhJ6AT0R#B?-)VRN~G$qp1VFfb_`t@FL;~-q37#hi5t9b zJN%*gEzoT{^OgZ{is={x-TxFlym(Ic8$E+TK4a6-E0>mSnVVL+ZTg5~Wjm&B$-3k0 ztgFHs3n3AV4Pewh@h)mD+tTTq8h$8i)bwrD=7!Ha;mtz@Vd{v1ps#jrC^Mfqc0~Kt zmKkXfxaaMM(8TGKH>Di%dK?Iv-hD)P3C9iaQ;2`()4uq*)khI5-o|4Sr2=YB83nD5 z0#)AqT+hWqqZyG8riRm;BT&ie*(cPQ@*F67b|%R~J-x(lJRbiv@r}phuOYtTczh@E zCCA~<91py<*UwPg`%45OXnc7B{+nsOwM~!hg&~qlWZ*3>^FI z2NN_v`%r23=W=+nhMoXra~PLm7;i_zTXU8D*pEi63;bzdiBZ|8XIVaSqW?O^Ez zbGA*n08dOy&o5mvXIuVL1S?7(h3>}?ak}0alMra9kH{@LP~QDk&n*z}_C)%5_p5Wd zztrBb`yZGMx4@!X=8Q-yI?(;sIoH6pBj>6LJKVaJCdMc2QaRKG<#=PP?r8lk)Ig z&$Q+C{+2qhe&*YUq0hiM6`Y0J=8<#NU%K8ajBfbSzv`$O52wAdpUZ*r?w<>Ns!DRg zn~#Y~v!_FSsoK?L=3$1Ws8QN=$eiB2Jgsb7J0!P3@-(C$_Kt%dEZ=asIkqFCcZ$eD zkCH%mV-7N9T?avT5!ud~;@r1ost>Ie zLN=Fo{nOK#an-rC9i46Ajh~@dm}C3&?w;Oyq2oqWh9zZBUdbil&7Ew@w$y9jL5ZCP zDQ@R;S6yzdXlSh6Hxl&W>Ce3VQ=sk62kU^ZYTGwLVebLfymB`cE?E)Y_%&2n($;xB zuuf+;XsyoLeZwVf?v8l; z+deD^saWq&S!9PdWdovq4UPK-t3vh+>IB~>h?7Ong0n7s^Ap?VJe%437BEyl{Ea^V z5>03cZ~OAb79!2pS1DKGTawLOoY~h%x$!+5g$D*F9ZN zWcJ#jPtu|2%06X1sRR_%U7H6y&K4%yy%T-5w1t#UpPMbAS2#;W#q zDw(p4&fI$r@Ss2givlWVB4xDHy@7&_* zUjnq~?qQuHdhbF}Nubjgiv{tqRx&KSkpl)}{EvFb{u8a;$7g}PIgnEHtgJi$ct1m? z%zlmq6~}G(p;=~EPhp8aytzWCG7H0)0c^FoZ61eucypBauBR=zF6zddv(AUSDS{kH zR{gbikmB9XdMV(vS9*7#3h8D;QOc3l(7taN$~h!bfZDL$Y2F_pV$(lB+xv-RfET?7 zh$F#j7Ebmn;bgy$6+aIMg>Cz=5);xM147;tiMWqgb`T|}j#CymWr0%`IAwuT7C2>r zQx-U7fm0SZWr0%`IAwuT7C2>r|FM@EUt+dkx1n05o095`3owi&7Zfp zqI6z`F*3hsLVJYh(ZrWdpU!0QlBpGoN~cv2p1WjDMfrj`7ZRRcet!A%8HDD|m{nRK zphYt(mMofQENNcZ+_JhE+E%yJ)J8_u1dJ(DA|u-)Q>H+LdSm1`R57yP^!CvK(AKVL zt*!2;t%-26XBD8f0$`CeH8fWd-`;_zl=THhBlc_Zp=-13_j#~KZF5U!{fY?obhfmu zjdZj`gcX!+Kz7EP$Bum+=gm0p!+8kj7e|jB%R<`Pd+gW>oQHel$-IXDx9R^z*0s=M z)!WC8J%F@Ar6Z93`mYj4{Eri0=6QY-xOF%$QDr-UI|p!Bb}R*tF*p7Z{)hDFpN<_n3VhaU$Buo1^d+Rlz;_&h{gB>_^Z?SAkp6-A z*N+{`#lz&AkrpF8inN0HH;x^93F%8nKSKHuQXigKcfjAzKzcJ$zW;v!=_N>CLdxHy z97Vbjse>`G1L+8)_aQAtdWiV9FkbM0cm&chNcA2~bKN4tT$5%FO!4}*LoYt)#%>7X z6SRx3UX1D9G~xp*Qq`L!s&3#qivT-s+2 z?PF~UXv541E=Yi_vV=@x!M_8yXqlp~Q{ZR&;FocmtP;9YUE1*sl)r*GRh()9Fj_U%Svua;BMyTfe2SQ`b`#IAwuT7WjY60^2jAqD9M8 zs^j~QRXe#Wfyak35x;X3U|LipeCf{PBfLB2fz4my(7*rHv6yo^55A%05t$nmDd%M# zy4;aju0XoN9~E>O?^Ai*j%A`W{(Dhfzn&{K9bQz6_G!C+sq**w zr2Jz^Cz54DjlWL2`Zhb(q#SqtNg5K)6R;F!7qzXi^$*a8GSM13kr=A2$B9Eduxvx zBR47G+=$IXtc?ZK_i_fZmT^5?Q1VB!qJp5G?(DwghNK^gEiaOOS+=AX>(wM$W+naY zSo%o%y^6l)U&^n-5LNBzC*{9<0@-o-r(uXn`VF~~e#5_{AA_Zzq&NCYda=Gc0gu$* z7_R9LEBax2P$%(hfhAqT6vBsphC&gXI06?YQHC3VuwU*s0g3DLwxAbX$J>EqgfETe zbWPs{L|WeK5dmD&bD_w&%TYGcaj}mJeD3owWVjIo&W`?kP7;0_RL*}4B<#Hvm$YrT zfO{G6qlg$?jLR!-kuMb(`vGLed+TvE>>mIz!B2XheFWEu0#37k0P&LqoNM0#n#lr= z*xv@tSpptoj|0uw0xq9NKdVqK;10V0rL%*b;96t90b9(?SOj>3{d>^Q3ttHM zYI`ea=KBh9?Xq71&BAaL@U`|hTrW($3N+j8dq972zuCa-urCIDN&gDKd+a~rda2Oi zUi)28e$~&u*=zI0pfYee;C*%-=$8q74%qhqzud>JI%I^oy7zed--Tq%L}$-WIcEu^b1st8yv`Iz@r6UbMlSab&>6WH+J-4U(O?sNhdg;Om#pzJG${RKpl@Ggxwdg?x%}I=>VX_{d5X{5dk~^b|>&688+CoELGq1=(-l zj1V9A6EKehpyGjEWPT6eH#jptMn=o9cwb+b@oO(+c(5swQTPL#5#j?Gz>ID5E_Z&7%pm|z zGV>%dzX9+9GY=v2CV^u47j;MlUvCDtljE37MVU1%0r<|6Cs0GC?r zs4{g1W|?UjQC4r58h|iyjCOZYp-RvMAj^ld|6*i}OtLj;wjyBi+*dW}Fpxzwsjpg5 zy$TG}FvqD%*DAcF0rm@zTsNKeW~B@;le8qm)2-UY!7~9gY}*wS>bJdxQNe6@?p8z` zcuN&gyQsO4?H^}&?o$*Tv8^!*!}GAhb8KImfIp=03{z^pSPZXYUWM7=#r|m+| zr;5JWP|ahg_Hz8ZrKnc{A5eG>_%9RilNFv)a^RCf(oDmr`zR*86w*b1Y|<7b<{Wn; zn1mG=odhpgXimfPtQyru4%@7OiiJZwD_>>K zg?sycs4_97qKIS+0%ve;F~_Ew99I78U@3EK9t%QzwpJ)+YVmZgD3ig%$mdgLGh0M1 zlcFV0_He=TA}DhF43D8~&*W6hnn!oA1-fTeyP zVf%)|t5Z*d8IGtGucHA@U_65EKB(eM1kF0sum-2^Z;F@^8TK>Bag6b~YUyS06)eV7>bgE0G`0j}187pR-V2`#R%A zB8_au$3vW9*cBjeHxBi`5m~``XjnZ!$$4m!=6p(WdLgKS<%~*xzOS$^oeDWrxBdi%l%4`m~v$vmg{X(uD6kJO=Zdjx+xdvrd+(6a-Hs(ipuO! z{Vt^pORU+`d?;Hcsu623Q?A84(?RLvX08RL=N&vda6M@SfCFi+?`@>^9F)6$Zy8|2 zzL=SS$T;?4W`Y4y`3&z5k$AQcm12t-a*QWsCe#!>o>V1((mWw0;1OoRg34#V#Y~#- zJg}tMbJ> zR+N34SOU(O`eOKhhw{)vG5UPHaVId#T6bbu0Zb`1QWWCgCZ}N;HNl0Bx(s! zBdA3VdOZVYaIRv$1fs>b$hFKW_b&UMbXeHSnLni!T$y{+SlJP)gund~m1K%acz1I; zeW{A%qwfOU1<3LS#br>+ETXQR$Ts23>_8@qizGAK&jP+>yAh}FbyX2<^Bq*d@Usev zewly=&RJ!Q8v(wQZ$n1vGF8aC2_ELo*^ni)OYKJ!JcKOo(R}R*Vq73NAru$5;%U1Gj*vF z!QO@l7b1p}V-4~gj~pGY7>_@L{v40V4-)Q&7%>oWi;OU*2cq}CI}p|2^PPC``MJWi zu)@6yRam9C7=a&Q3|il}LL87>ZCV5@4oM@()t&W2E0uGaz#A#_ZPWFVD7g*hPWxF1 z%VpU=(VmZS+D`y8hSDNn%*AQ*r#h2}nT8zi3Q~Q@m_a}JmLvaFoT1B(;u z2ZBn(;xt6TH<9(IC|Cp7@Te%rjN?&JkW@Y+R^3KK8_Lg!T?EL_E*ZTsl9wTjxCw(ngL}i`~udG>w&rFeVJR*E%rI5Bb-*6g2z0MCtAl?|_jvcP>FMrZObtN&gS(f1to`=&9SGO3{^yeG-i+FvBse??OLzJ5{qBBl-nXi2As z9)N&&{l7x)mpDcJn%LHW=2G<^0pXu;+F43!Y&2|4sGpu3(e-OUuRVsi9=bl`)ZZZK zT}m6Ti2KHqi((>$Zj%&|r2!qGioHUb1+knN?ek73?U9%?Bc%)DH1k5#oXs%HU=^r9 z&dffYfjhtmY-Sg;%*b4cf>eSBVq~dj2r|ZQGj%e9w`2*8AYEiAMTJGUHuAPGUAy%oR_&Fsgb!qz$)?5kwf?V^y)a8)tx^HT5xo1eDoi%g{yxM8 z)D2)45a~viyUWH_(UIfOfH6367wy^QjBF3!W)qBD#jv^*v4YG(5a$YVk5c(%h~UA9 zn0QBrg=8tv>W)s`uBBpKC|=7jd|bK&1A@fx?nbG&e{)jo?*sOa#>Fj8A)5#7 zvj|wMGGO?*>hz>}=OZ_YWdy7<^~G?xxEQc3Hwp~yhr|_4-}xiZ+PqO3(2v#K026J) znQ%o%mgr;qqoMC#vX&##9k+ zpBMyl@(A7!HSWQgb-toxlmCI!5%(~`N`?M9Xw}jez3?Z9b9o;cJfM2NBUS+^ZB`H* z#tME5;lIKunjaj?=6{0h`#7_oK_*Asuci8FuDj)RqJVs>uEPD zg;YL^>uERJ7eyw`;(FT63B3t9xrTEC5~qgpxt@0W+5ZVRkn8jK{o7dsqp2qlAZ!F1 zS`AN7$$SXj;7Rd+lQL88WF}Rpi|^4mGk{E`()R!e@pkN(5k7w|9+ub(Nw4lB!l4(C za~a?aH;jwv@*Nt!p38S-o=kf$lJr$gh|~@x;SueEC1C;gC_vg8-Ev=YoyllZ?MGzls z{W;T{>7Ko+WC*LkVeY&gwG3cHFw@h?YgQQp`3lGkdG;t`5E~{z+Ze(Xis?-?4L&KL`+pBZA>}iOAI#xF_fLK!Uyp~lw!9g&<;|!q zBepGXMr|3fZFvKlDqY@|H=rov4QQwiV#7WT!!&w7O8NZGmX4n;d)Br?*RkEhU}D33 znS;)}4p+;37E0UZYQT=U8Y;S`1K4AJ2UoAjFFN_m0l@ps`*01Ici7vO>3rGV2MKK2?U;4H&G z3Y|2VZj(8hJjE%b`3QLr0S~#oM%D!oYe&4Sf=_t8M)nj4w1;|fkrPBl4hMK>4+x4{%Kx46?!lfF8ivpK_x8qo6=V z@9~oA<bQV{2f55DG)Oc_> z1+F}iK)wfCDBkofa&OqX{$>Yn_?#Q=VyxHLn>I0GxLOsFH9&ZcA!!I8 zJdHaLzc{WNu-fl0#&s#E(eFm`&Y5bA{7@qb@TC1LBtALDeR7QZcLADX{>aOwy{~*$?4$>Ux%1f& zB4D*)KIEf+tcAc!aoRyMqHMrI^;42Mg;~e3W9~iaZ#bex_k<4#UKts z9v5Z6B(H#Ee5_^-NdoLb@CwyRVg!>>&qFC`ufY^k0X{sS4s8;Otcq!>A+5+w1wxT4 zV+0xss%mb^a6g9{-LYCUq&2;1@DQ#l0tg5rG1Q0SH0-}ZhaEAN3!u%-fkJl3$0%qU z92LSX@hh0iayF5FBq}KcFMj%Hm;;bG8^B~{!pO`9P{xdd%n|^LaY|`BVm7=A)m)YH z8!c@)NWMxQN?Qw{lNn0e1>iPjDD5Wzeuz^_`%|pT_zRq^IeECh61qJFl0)R7v=;#! zW`@#U2k;s*l=cpQzv7hAK91>jE2M47Y0=XD0g{i&Luoc_ZSthF3;=1&P}*Ps193`e zd4r+=QDoc+X`2WAOiLRBl2PQLv|<3`n4z?307{vmG@X&s&Qj7W<9|u(^5==M^FCG|-PG4|OXBFpe2Yn+0G7GnBRnzyh2j!)j1< zVH~FOL5`KqJN5LUC=@4Zp*h|#T#mm;Z2W1cP|z4gdrmrII9qcmgkH>ASU`DaZtH8acG#?_$!@AZ^W{4BBkKD2njxX@#YY3?U(dte_a( ziga%*xM)ZRQS;`2xgHe#P(e0M&vnQk5Rhvi*dOeF4Wj25l4LTk%0*~i8k4FaEp?xl z9}5(rIS)dIQv0-*p#3O_*f-#G__Ubvmc=9#q2SgGn-RYzhAbg6;4oY<%I8DOX%r=< zmev@VhG185+&a*v`q#$@Wy4LJugN^oWpuNoxg)iKJpXmAXYB5#X`7HhN< zBfzK;$8EXa*J_qS^sJbg6O|;>(2!Phrz>o5t|G7v?#SAeC2XLP9^+CXQ@9sM*x-B! zUKA6)G$vd_TAy8m4VOmP9vc`M0#Y20HLh$WYe5Rox&G)mM+caMX zc-mro_BTQDgBV{E6n`Q3XVTt{g7u)g0;gD8Xev8Kuax35WFhDGF}=C3>zBdPIT|Qu z3uJU_Ihx8bG?XmI84?vJ%h(1vzYex(Ik!T_H?1T@A2SfV{Ct;XPID@ESBKg?Ci7;thPt z`5>xGzmizqfz{=S8?e*Q0NR|LYMuwqubhEfl{o?4szB;@QBo@EqV6fzF*}m{{rFg8 zDpfO5hXFfD5OI79$&-drvLKo)i8g|$D0MFgc&038HdoZ*Gpz@Z^FM;i8L341R{|U( z!CwL#F2REUhYAs?^8of2Am@YJYNNjpm3lVt*#e)5=>Yg_fzRhd9y9FG4*&+D5+3Hx zD98%LBc1RNwhQ}=ym<4|Tw{2>yIg)JS>*ALa71?^2Q)u#EC7DV7|&C8S+W>^E5}To zF_yQD7EV`?@w2~zzX1sdno*Byl;hE*Rc=_hSLR|>k!skXv+~@tgOh{hnUfF`9oHzz zwE8_f6%Sn85qN}jPSA#1ddkcz%=MWjn7v^mnCGJypG3lPF2w|;6f6pg<1&H;=DGcK z;pqP5nI-)xBn6clse{d;%thwDsljwJ!@D%kyfAn{kfotwp_ZuyhI9JJPn#%Ok*-AN z`AOFtic8OkRq9R-#?hIv`j+%ds4c6^VB64zTA&4ic_tYnd3Lc-I42V-l=O#pnP$1L zL+%)02Ek&JUc)3igupzKVlG$w9)ta2RloL~@2#LG`lXb5b* z*;GyWN(>Ks(3I@sXzn`E&NB*7iK8gAm&qj#&tZ# z2(*eYG1{c2Bkr7_#i4kB3+s50ru)h;b!)7I@QDB4k#WO``ALFC_YHNcK=TCc01DOG|RibjIWiVH*USL^+va z7z$)wiVTY;ojFU6w(R4(I49nx{bXRtl|j4z@eyP|-=31)H?S{K&l`i1(b_es&S2@# zLlUN+p}H?4iG7Z+*;h`Ylwm=WSqdDUXt*F}Cq&M^oQza*h8P)-IgD)odaNW`H$GI9 zXldxAkdQoRVm&WHK=vMQ1Yf-Me%X3PaW_8a1yQX}X6330k3!-qa+`6gUL}O|Du8R47!RI0 z96t`yVVfAmx&1khCB<*qk1#Lokd(VMIXYhT)6p!KE*q~?3xLV{%GL!O z6I|xR)_T-&pb(-^ni8v?L=hS-M(JQIm*T5FqwWk<1X*& zwt1v+y!3SuSykix!ZGs5l4sL=SfrvINr5id*Pr7n(i07pxR->am*Dvp*GA}EwLm?- zk27N4C&mu~>xov!eY#eMzN9%>`a(`$0f~0**QcZ8yq?QZ$WG`VYbd4!(FLM!NVW zoP6|P#Z8J|_>k_>NFMG5@q9Awt&EMqSYb z!Qnw+Da@e>GxSJ3a!2V|V|2_EqT^M7z#e|~`f1AA3X8iB-M{jV;VVJ(`WcCpi(8At zQAVlyMx-Foi5bnt#@$%W;^lZ?;$mM{Bi-6GKM$ocK`nUgL})1AXB#xfWjJ5Kc^V2V zbEw5v9{Ok@@fsHJrJUJ~i_M1>Hs6CeyKyn@#>M`Zl6uMkX_v)3D7KV*DP|`c1T%Q- z)%Url(*j#~`IhV2?Yl&EqaamSaF?hIl#9)8iIOvP$s^LX<7iB3e!SPSZ5`dptVR0`%$$oyq1Kxi@gmhT91z@;yaw5EuH7N&m6F$uF^c6l!J zjlBUDo8sC-m%8|+5S%b8iaN03Al*br8sZ!4rj)p&N?cC~40~Rt+YkFhEyvpBW+QQy z0y)La^q8~j+^mb-blUrU;O4kl=&TH8x4T*Mpi7B6SoA6U0qKwupt_(ed~nLrk^;9M zN$pklxtUYk)8YNkP=nK@rnBLFd4kf-8wz^MhDEQ3nzU~T(v#cwDcFoQ7WQ@cLp(!V zIQZlsbxUcV>?lg`ev7r1qTQbJpx1z(S{6QG@Kx|uM}QAU>V2l#nz1E^)(I!BA((1L_g=nlydb9RK( zt2;nl|6fxtC2@-;&O+6)$xj<49S|HuKG{hN~8NxbskA%?Hk(;lV> z=OXC&3fOj7@vAb5MIc8NNPHz{ge=Aad;SNy`+g(7u2=4J*r@9eRz`pR1eWxf z?of^c6Jw(e&eP?FJm%FB=gAi%WVUN&M=TQ~V+;l#$H{po8z&+(GAzc1u9v@nFvKN3 zzlvcZMhL%4VBp3N5lro7XH-Q0qJ^HWOa!QO*IWhv_xLhdFoB`1%T1Z>W}iFT9Tol; z(QPc_)$IG+oE$fNo}0<0RJqx+-Eb*HpY0A6Ra~eenTlg;pK-INxMMuNg{%#~vUKe{ zcMRsODRr1Rb;y;WIX4R3WylrXH96KROJS?$QAAtKLHcjR6d!lk8{%@Ja3WS8+_-7D zVHivAU$*_IGt*5C@hW1nZv@g;TrZ$k+bkvk6lknm%FA7aS>fVky+8}?l81L@1o6B z;oy0LfohojqxBuG_ZRN4nmVZTAr=sD{I3ZEKOGzBVyT4jun!*W=7_?06!0;yViY|_ z_x2zLz}4YGjQyO=u-L-12LgB$iXr_HAs`-TdHVvmMXh*_|^_ z)^?jqOfD~DOG^)Tmm12BIbZh9M3JqL!TuJ$ey zra&*-JJ2HJ{{lO>_RjSMh}=gFM1K2|EAMmD?62I1d1VRXyFE;_Gu6I?Vnu815diJC z4BvJ&y3T>XzhcEkClTY^{wCLSVuARs#A6nvwDY(E1z68w5%DZ0=0msle+T))SzF~uUpk1&;L&+Aj2-!9@Z7wbZ||I9~7Jf2EbkO<3b z*}~IJH;>RqZXpueb2TW+`-l<6Hdc>XKGwIA$1W;?QZ>F3c*YKxBVhMjDdGFjJ$B8m zM?Cw$^+#zsHcyz_7mqmthS^Yh#*W1o75C zg2K`8!;r`RZW8Mh$@;QkV(sU#N0}I85V6R&3ohyr(}CR0^L{p(D@1|xShIjMwhxl?k;o+3NB*-XYb^KRuNv#G-8I`7AyDec2nMTy%+c*tUtg) zv?sBCVgKbU=;&J@+Bg zQSkTU3$7LgpB!JXNfdm1e8FZ>@L^H`%-M~CSR6iK_uMR+|ITsEzezOz-NfeSdhlyA zc28F<#<;nnFTcQ`=e@spya12sPpoIQJ5r>a4H;3t5cVwLgWzB05v=>qM!P5uYYlY}waB z#$ZAojGa__Q=*_wDMAQ4ffNYTGI+Q1$(6HX`8rD6#khq>1F5#`Y+-?bJ%IjSC)^+X zM7NUqB}Pq-zonRz>}Sx947;-LkS%b%jDRWUVZ`4@s&o>uWeEWXYgrHPx-!JzOenyz zqq45Cs=j@k(N^2u+1O!}&#RcRXaWA%2LF>YcR~4_8I>~@EtJ=-E z%JTV@Gf|d6y=ck2it@QJY7n$nt*Wi8#cr1N6)kNY5pGv$Z&+7b*}Y7NtP|a2bT+p))Hm1Gh<`bvvegOt z#R`R@=vvuXMx}5S_D#IMMVD4~Hg~qy){Kkyrf`Ew+AG%i?BL~VJ8Ih(!K;kgH4QL= z?(fEicI2q}gkpGL9sVT>o`Tj^)ts52d~0V%HU5=JxX@zCmi+=xYv@3Sz#>i3*`zN@ zmx8-Bx4_a>HPTff0iG*b&`?ubSyRX6Q;%OUJhha>v0W*gTa3!ODr_smSM54b zWfNMsx&bDJNnu_#fgZ-zRCb~tCjqLiYOShn=vZs4s%pf3wd$5mI3l|QU^B!vceESA za?@6HHm@|QYHFq_ymWbTmA182t(8>g$Mft*$;7UZ5N%>q3rSFkAq9V*C97_iJr?KZ zxM?@wywkLb38Noh68~?F{&lr&E&0``F`rJE-&R}SK1D$Ft!@9S;Lu(;skN?XdHc9Y z{~|c3wi?Z~tA&fAQ6g<^K`&r)V4wdgi~ZS|=wV^d{U5Z%|4ifGs5MtL)gst8wVqg3qWp%0x)M}S4kCO(_+tfr z-;Kas+p(CT7a@<=*3R}7(6FhM5x-*oc{Ao!E-If@R#7<>|KK)5Vdl(Oyts14!X>41 z6k^_zxl?B>QW-hBN#1F5N*6CycuaW`xfsYY1>+CkFw4y>k8zjIo34sxmd;tMYdpVn zkJG^@W4=aDEuA+@QQ+U}v~sf+&A?yL zEmF98jB}+O(qS78s%j9=Qb@xOZ2O|7Eu*dos4&GlG_ ztgMw?*}k%&^@0^xg|s8i)fx@$(;MnB%OJ`(cQn*BfTf|mw6S$X6)h%r`r~%WC(Nx>czc4f~Tem@Af>@y}ruddNsYm71 zmX<~#ZeHyg5Vn_g%s^zWs##Ul486E=DyTNbu4rkh9a~k?T-A(PR*uD5prw5*{vL5G z|0B^D+uX2bY&%vjwPTkzp1Hhu?drDXqQ>?Kb*rljt5>zJTHVw(dBxi1w(<2V^XnTM zmRIMGD;PgH|IBguHMOh8HZ)f^cGiHk0l^?a)P(vo>sG8;Rk*ySY2vu?6B^dktiG(M zVcoi_)yu0V*0(j~*H>5P%l~s23!!6?9g8(q<%Ht=PWd;A`H0n>Yx3)xJI5+IRaas) z|4WU>a;Wst`+qJF-CWbqGOhq~cSlW4Z5;q1T_6}n#Zp-oH?$yK)ub~tWp$&>!59Ea zge&GZG@m19wpcgP=CT8mJ8#XTw))~#E9z^;6*f#-wQlXorlO+B6Y3^kRTfVNov2n#^MMY3}!e#Ys6Wf|5H8jqFXvjG8jqSihV-+JI%q#;^xc zL%_-Z;#^_8f!7FpI-7iW^s8|PAF){CWR{qVosySL2cP`h?YwNhW+MNZ`Jg2c4_dET z=Hfmw`Ut3SGFO}DJFA6&3MJrt2>31q0P$T4I6o%9qrdv@7`K_`rOt!qZ@m$n zPLH|8GB4#0h4_cR9eg$8d}rc$F(Do|BP!(K=SAiM#|cB>)6apDcpoE}O9@ z1qcPTXRF#M;9!gV0;gXiggtD&OC!8%erlS06Qz8WY}1s%0s(tuVU&6rWRHDAJtbgAiZmX-VUK+*K41r8^uX(H zpGN|*@0jm~EZD5d=zJiGvE%k{|@tRW#+rh{Y30HA61A)&2EGa zryD&c+p*QUgNQq@g+wCmw)PXT-+ELb9<^Q|;sxs^g?P#8C8F1QMA$L>C8a{ee}C z5(~9#v;wj3nu126M1+Lje#l@1z9Z(FX290pLKUJu0jForO#G4uQO$z#J3*npAG#Z% zL!dl+mTHQ-%?CiCzwjw2h)ST?YVCwF`Wu{rf~W+FyR8R6p}&$TWdM~x@u>A2DD-zM z1qD$F6fapvL9sCwO`s`JF$%+Z$Lg{JvCro)n!u*F1Es(IsQud6Yag`Xe+TWq*y!fJ z*gbtb0mYBm@PxS`dmW=^`+VO@yA`nlGEjg`Pd;{fs^Ln~%`-9x)$d?lJRmITS?AqV~vm;KyGM zn#(t;VY1P@IUb&%VB|tna$&P|!wRQ)qpryjR8=AdIcLp>;sSxdW5QEpSjmtBg1`6c zqj&2X)VXGZQsv|1Vq-FjCm&M92yzxTFv!C>tHkyn+wGJr#IRb}4z=5NF*fcpA7ncp zL<8*`9$4=@ZXQZ(1DTzYR^RzIIX9&(zR7{I51R4ZgXTkKK$L+Or4J!w1g|tmED?`F zZpsaNP^K}gASQr=qhw*?pn^LsTp6%mjrkWSy2aqo-(%Ws?8OI3678azcwFMF-i}G$ z*^aWg&W!mlgo{#AR zzTb-UHD9lv`49aY0!;S@USf(a#oE+ws9ib?l(DW z!+-De9`IT-#lRux*%KX4nYv_Ltb~gXcCqt}{i<#IBD@XIbP%&vajZnD1>8@;FhXcc*t2JWZU?iL zY=;144KFx<1;cP5hp=bQ1-b@i6~kYhYhBxyC&Uu=?D?t|%PjSPr35I<1KhV=Yren| z^z5nE^rA%43sBO3+kL{d<_UU&9{KeN3Kb=i=n3~vt~FN>5yT=$3l$}@Z32|^e{w%_ ztvQ08pl8n&nqHKE2zK1#dER4{$3X1=EQ+${#UfFbj*pcpb3E_))MJ$i!2}a|ps^?g zj|QbOpL*`}TC)U}pl8oFv@)VZT10@7{^8(D@Ty^gfv{)Kt(t*ZrAbe4bBcAIAR_45 zvr7|+5-Cc6unyjA9kJiAP5d#sjS<+z(2c-uV;G9j_Jp zI!*j1o8xu<7Wi8L1ID>NczsX|96!b?1`aLcbDsA;@1HG;J*!E3z9HpXK(PwL2LSMgTHClG0RQ7^+M>~Vi^gjD{-Gh%v`mWcZ?h-a)#mR zH9rE3RebRK^$J*GKoQQTqPB_EK9^ecaZa9}L!*sY2 z{&CQJ!NhInA5F1b;Vin>b{@u5D*i!4>+Xyl@0@j!Q?t^!7PFl(AW^R6ccQIM`yO~Q z!G*>V%t0~6NW>X-np3>Y`NVt%)e)ZQ%+%T9bDe3(&cw~aR+RG20jsnf02^03+sto6 z=C`@Xf5v{_M!Y%Tbsi4hnS#hCkw=n{zcii0xZ6Z1z0d3X6mB77q=&lnH@eOph#MUKdtK*IgapHR!u_S|{2l|} zaQ@`>xX#BI(;UB#dz@c*4tvl5?{!}1Ti!cS@x#FDFg7^v)T>dX!=N<3gz0T*}ZhWG(+jpbSxz%@v&-u0w-*Utx_A{UJr0+SO z^8y?nw(-BEmnXsh<|KIj$mB%zzHt)#yC=c_9e5MHRyZjNsPAzi z`3?+d8reqj{|@7`wm8y_=f+3-2#E;#9Anb_zW52iXTZ+O)VAD7iffj_M{_0pP=!BV z;8i9esXqz+@{{0qDEWFjF#VOscd-bIFia{xky!juk)~HafY_l5_&Wj3t7)0?+idBH z2nGKZ_%z5*OOpQwC13w&BUjPCbrSiXDtf)KQ-4r|-|xz>!m;UIsp*XcCh*fls&k8NLP4 zM6~e%@u=A-lz2@2;xKUsEc{>jd5*%T0H2O{6;*O_)kEj7pjSi*$uK1+s(t{17K)<) z_%z5_voxwOG8s>LD`Xr|aTPyQ76(5%M1A%u{3wOze&Q3^^U{;xFH`j<`}q}uK6KoF zrCxm!Ik%q#|0CdOAARqq#|!@&Q|Pbk$$5pxV<(ZrKiedI@~6jNRrozh4u+dJUO$PP z4^D!2(b4pWWILn-ea@yn1>*|N#2y2&C8!UsvJx-9 zs<~07tpj_P8k%FJW2vc;CQ zJ{Y(WHb6;R9lx!I8_kl)>zi7dm1)tzl{M`xl`F7;PHh4dCadIb8zW&$3;u9GZYt~} zD{+63*ojzK(^%P7D>n+UijIcr%GL(#e&aT}KCG(EeQ?+((B7^Z!cK>B@qJS<%JBuo zC=i>Z*dH0*WK7O{Ir>}C`$Ialmp>q8;8*7ZSER#wcNrUyf%+QrwW zUZD?rlHP_r1bx_zg7&pd*d~UwqfMqOG$i#g3YxLWu>f!53$Wc0A0NZ+E{Q6gTAt6S zBg$4(VJA*O&Dv(jlPR_liV|#tZ0AOz#7rg1&<|B)P*5xOo)!o-3p%)`p@4w~Wi4Vn z6x6Ozp=Cu4cy&&4$QUCzGz`I2O%2tkwFR=I4D_B+055Oi=86LGVi@FA&GiU}D%;Rp z*P`L7<;&Y@SLvMCc&Vshp+q!XBA#!l=2pX)z_w;=onZcde{h}0xd_v=ICAZ%N@aer zOk!6(Z)wDE0Q?1!=5JN}t(d=fM8!3JNq*No0Y!=Y`o3?k;*Z2x1%zp<&ryaP*BZM1 z!>WGH!#wVliJ_K{v3KoS&UBRj{n)V<&A-Np3XV03V9-hU7222wfOoo@e~04Vq4@bv z_B_}|+D^A$uP@FAj;d<@1D+^y_-h5F@ctx&CuNPVg7#Q~{_A{EvK#AEMFk>dlVRs72oU$XuRZL9;prfPXUe^eCt@U1`|%fvNae{%abqMZCw72OKO zze4fvRSl;8T+1f&e*-v@==R0dIanI=(DyMiC+pHM({7xJ{1LTIiYWfVB!eq7SKi{d zIf-9CZ(E=iS9jvpCh^dG8h0Cj#QHx{U(@_Z-Js$dntcx1D)HEZ4EeSF_5FZRD5;)P z<3Q%(_S5-$0VMM4`|Rh&D}GI=(&YLdO5)#992Jy1iY3F&|Dyf_Aft&inSKtE%O7jv z(ETlQ@w~=AhXQ;sGsYiL&ru@(CjTqorSIta_49`@il1Mc=0X4Gq3hNC_&RX3pXS%k zBPN|oYJ9F$Cb6sL*Xdg*N#u{+M@A)!u15>dd^-OQ0OEB0kp)pvq?h|klNchRG=BL{ zfUIA+ORPZikBDI;Kw2I;{VV|%1?r;Qz}T({6+S78|M!W@O5{IODs%TJKh$N({Mjer zZ|Ia9#dMB@Bbk5rN%+6DQ8K-nk-!WvnSZR}PqyFcTP5FbR2Ry^J%(^PQriJk0r(LV}V8HllhrXA`yfe9+dQZ)xa5! r>;RnF9rgT2^CUG #define DEBUG_TRACE_EXECUTION - +#define DEBUG_PRINT_CODE #endif diff --git a/clox/compiler.c b/clox/compiler.c index 5c6ab1e..7915530 100644 --- a/clox/compiler.c +++ b/clox/compiler.c @@ -1,22 +1,246 @@ #include +#include #include "common.h" #include "compiler.h" #include "scanner.h" -void compile(const char* source) { - initScanner(source); - int line = -1; - for (;;) { - Token token = scanToken(); - if (token.line != line) { - printf("%4d ", token.line); - line = token.line; - } else { - printf(" | "); - } - printf("%2d '%.*s'\n", token.type, token.length, token.start); +#ifdef DEBUG_PRINT_CODE +#include "debug.h" +#endif - if (token.type == TOKEN_EOF) break; +typedef struct { + Token current; + Token previous; + bool hadError; + bool panicMode; +} Parser; + +typedef enum { + PREC_NONE, + PREC_ASSIGNMENT, // = + PREC_OR, // or + PREC_AND, // and + PREC_EQUALITY, // == != + PREC_COMPARISON, // < > <= >= + PREC_TERM, // + - + PREC_FACTOR, // * / + PREC_UNARY, // ! - + PREC_CALL, // . () + PREC_PRIMARY +} Precedence; + +typedef void (*ParseFn)(); + +typedef struct { + ParseFn prefix; + ParseFn infix; + Precedence precedence; +} ParseRule; + +Parser parser; +Chunk* compilingChunk; + +static Chunk* currentChunk() { + return compilingChunk; +} + +static void errorAt(Token* token, const char* message) { + if (parser.panicMode) return; + parser.panicMode = true; + fprintf(stderr, "[line %d] Error", token->line); + + if (token->type == TOKEN_EOF) { + fprintf(stderr, " at end"); + } else if (token->type == TOKEN_ERROR) { + // Nothing. + } else { + fprintf(stderr, " at '%.*s'", token->length, token->start); + } + + fprintf(stderr, ": %s\n", message); + parser.hadError = true; +} + +static void error(const char* message) { + errorAt(&parser.previous, message); +} + +static void errorAtCurrent(const char* message) { + errorAt(&parser.current, message); +} + +static void advance() { + parser.previous = parser.current; + + for (;;) { + parser.current = scanToken(); + if (parser.current.type != TOKEN_ERROR) break; + + errorAtCurrent(parser.current.start); } } + +static void consume(TokenType type, const char* message) { + if (parser.current.type == type) { + advance(); + return; + } + + errorAtCurrent(message); +} + +static void emitByte(uint8_t byte) { + writeChunk(currentChunk(), byte, parser.previous.line); +} + +static void emitBytes(uint8_t byte1, uint8_t byte2) { + emitByte(byte1); + emitByte(byte2); +} + +static void endCompiler() { + emitReturn(); + #ifdef DEBUG_PRINT_CODE + if (!parser.hadError) { + disassembleChunk(currentChunk(), "code"); + } +#endif +} +static void expression(); +static ParseRule* getRule(TokenType type); +static void parsePrecedence(Precedence precedence); + +static void binary() { + TokenType operatorType = parser.previous.type; + ParseRule* rule = getRule(operatorType); + parsePrecedence((Precedence)(rule->precedence + 1)); + + switch (operatorType) { + case TOKEN_PLUS: emitByte(OP_ADD); break; + case TOKEN_MINUS: emitByte(OP_SUBTRACT); break; + case TOKEN_STAR: emitByte(OP_MULTIPLY); break; + case TOKEN_SLASH: emitByte(OP_DIVIDE); break; + default: return; // Unreachable. + } +} + +static void emitReturn() { + emitByte(OP_RETURN); +} + +static uint8_t makeConstant(Value value) { + int constant = addConstant(currentChunk(), value); + if (constant > UINT8_MAX) { + error("Too many constants in one chunk."); + return 0; + } + + return (uint8_t)constant; +} + +static void emitConstant(Value value) { + emitBytes(OP_CONSTANT, makeConstant(value)); +} + +static void parsePrecedence(Precedence precedence) { + advance(); + ParseFn prefixRule = getRule(parser.previous.type)->prefix; + if (prefixRule == NULL) { + error("Expect expression."); + return; + } + + prefixRule(); + + while (precedence <= getRule(parser.current.type)->precedence) { + advance(); + ParseFn infixRule = getRule(parser.previous.type)->infix; + infixRule(); + } +} + +ParseRule rules[] = { + [TOKEN_LEFT_PAREN] = {grouping, NULL, PREC_NONE}, + [TOKEN_RIGHT_PAREN] = {NULL, NULL, PREC_NONE}, + [TOKEN_LEFT_BRACE] = {NULL, NULL, PREC_NONE}, + [TOKEN_RIGHT_BRACE] = {NULL, NULL, PREC_NONE}, + [TOKEN_COMMA] = {NULL, NULL, PREC_NONE}, + [TOKEN_DOT] = {NULL, NULL, PREC_NONE}, + [TOKEN_MINUS] = {unary, binary, PREC_TERM}, + [TOKEN_PLUS] = {NULL, binary, PREC_TERM}, + [TOKEN_SEMICOLON] = {NULL, NULL, PREC_NONE}, + [TOKEN_SLASH] = {NULL, binary, PREC_FACTOR}, + [TOKEN_STAR] = {NULL, binary, PREC_FACTOR}, + [TOKEN_BANG] = {NULL, NULL, PREC_NONE}, + [TOKEN_BANG_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_EQUAL_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_GREATER] = {NULL, NULL, PREC_NONE}, + [TOKEN_GREATER_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_LESS] = {NULL, NULL, PREC_NONE}, + [TOKEN_LESS_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_IDENTIFIER] = {NULL, NULL, PREC_NONE}, + [TOKEN_STRING] = {NULL, NULL, PREC_NONE}, + [TOKEN_NUMBER] = {number, NULL, PREC_NONE}, + [TOKEN_AND] = {NULL, NULL, PREC_NONE}, + [TOKEN_CLASS] = {NULL, NULL, PREC_NONE}, + [TOKEN_ELSE] = {NULL, NULL, PREC_NONE}, + [TOKEN_FALSE] = {NULL, NULL, PREC_NONE}, + [TOKEN_FOR] = {NULL, NULL, PREC_NONE}, + [TOKEN_FUN] = {NULL, NULL, PREC_NONE}, + [TOKEN_IF] = {NULL, NULL, PREC_NONE}, + [TOKEN_NIL] = {NULL, NULL, PREC_NONE}, + [TOKEN_OR] = {NULL, NULL, PREC_NONE}, + [TOKEN_PRINT] = {NULL, NULL, PREC_NONE}, + [TOKEN_RETURN] = {NULL, NULL, PREC_NONE}, + [TOKEN_SUPER] = {NULL, NULL, PREC_NONE}, + [TOKEN_THIS] = {NULL, NULL, PREC_NONE}, + [TOKEN_TRUE] = {NULL, NULL, PREC_NONE}, + [TOKEN_VAR] = {NULL, NULL, PREC_NONE}, + [TOKEN_WHILE] = {NULL, NULL, PREC_NONE}, + [TOKEN_ERROR] = {NULL, NULL, PREC_NONE}, + [TOKEN_EOF] = {NULL, NULL, PREC_NONE}, +}; + +static ParseRule* getRule(TokenType type) { + return &rules[type]; +} + +static void expression() { + // What goes here? + parsePrecedence(PREC_ASSIGNMENT); +} +static void grouping() { + expression(); + consume(TOKEN_RIGHT_PAREN, "Expect ')' after expression."); +} + +static void number() { + double value = strtod(parser.previous.start, NULL); + emitConstant(value); +} + +static void unary() { + TokenType operatorType = parser.previous.type; + + // Compile the operand. + parsePrecedence(PREC_UNARY); + // Emit the operator instruction. + switch (operatorType) { + case TOKEN_MINUS: emitByte(OP_NEGATE); break; + default: return; // Unreachable. + } +} + +bool compile(const char* source, Chunk* chunk) { + initScanner(source); + compilingChunk = chunk; + parser.hadError = false; + parser.panicMode = false; + advance(); + expression(); + consume(TOKEN_EOF, "Expect end of expression."); + endCompiler(); + return !parser.hadError; +} diff --git a/clox/compiler.h b/clox/compiler.h index 53bbae0..6e976ad 100644 --- a/clox/compiler.h +++ b/clox/compiler.h @@ -1,7 +1,9 @@ #ifndef clox_compiler_h #define clox_compiler_h -void compile(const char* source); +#include "vm.h" + +bool compile(const char* source, Chunk* chunk); #endif diff --git a/clox/scanner.c b/clox/scanner.c index 3d1c3be..5faddeb 100644 --- a/clox/scanner.c +++ b/clox/scanner.c @@ -18,9 +18,8 @@ void initScanner(const char* source) { scanner.line = 1; } -static Token identifier() { - while (isAlpha(peek()) || isDigit(peek())) advance(); - return makeToken(identifierType()); +static bool isDigit(char c) { + return c >= '0' && c <= '9'; } static bool isAlpha(char c) { @@ -144,6 +143,10 @@ static TokenType identifierType() { return TOKEN_IDENTIFIER; } +static Token identifier() { + while (isAlpha(peek()) || isDigit(peek())) advance(); + return makeToken(identifierType()); +} static Token number() { while (isDigit(peek())) advance(); diff --git a/clox/scanner.o b/clox/scanner.o index d61a7afb4a96f636bc5128bc199e5c23176d95f3..f4b971fadcdd0e5a5af21a7ebac1a31180d21a52 100644 GIT binary patch literal 23936 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 diff --git a/clox/vm.c b/clox/vm.c index 26de285..9c6c687 100644 --- a/clox/vm.c +++ b/clox/vm.c @@ -70,7 +70,19 @@ static InterpretResult run() { #undef READ_BYTE } InterpretResult interpret(const char* source) { - compile(source); - return INTERPRET_OK; + Chunk chunk; + initChunk(&chunk); + if (!compile(source, &chunk)) { + freeChunk(&chunk); + return INTERPRET_COMPILE_ERROR; + } + + vm.chunk = &chunk; + vm.ip = vm.chunk->code; + + InterpretResult result = run(); + + freeChunk(&chunk); + return result; } diff --git a/clox/vm.o b/clox/vm.o index 8dbfc5c30aa25c450d8b140b8fe80bea5429d2fb..10f26d50333de48de314a60761be95e74afb5399 100644 GIT binary patch literal 13080 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