From 7d6ca9130c3b8804d509021ce8313ad5f0a02d48 Mon Sep 17 00:00:00 2001 From: Paze AI Date: Sun, 16 Aug 2026 18:06:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20C++=20=E9=98=B6=E6=AE=B5=202=20-=20?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - namespace NAME { } 块扁平化: 跳过关键字, 内容按顶层解析 - 表达式/函数体中 ns::name -> name (非类名 + :: 跳过) - 外部成员定义 ns::Class::method -> Class_method (跳命名空间限定) - 支持嵌套命名空间 outer::inner::Class::method - using namespace ns; / using ns::name; 跳过 - 修复: gather_decl 已消费首个 :: 的流位置不对称问题 --- bin/pcc-cpp.exe | Bin 74752 -> 76288 bytes tools/pcc-cpp.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/bin/pcc-cpp.exe b/bin/pcc-cpp.exe index 4a0ed9b17fc083fff4304a31ee9db0a87cf8ee55..2b3a3d50ac4aba28411b729910b991448dc32dc3 100644 GIT binary patch delta 28219 zcmchg33OCN)3EOix$MJ)Wgu)4Aglrs5oH@qFp&ucK?Maj(6G6Jnn7i8f-|Fx!w9?= zHv|Pl#aC329Z>>e0xpOMB8w~vc!#(EqAa5MpXz%j1m5pI|M|}MpO159s=B+ns=B(m zy1MV3P`D|%aC`FfDfNTV$@gi_zhhdbq#8*{owOq}UhPutfUarDns(&f8N07)HCNX< zSB0!d*DNZv&bn5!a-tt_tFATCXEbkQ3`^CuwlkX7t=x7#q*7I~suCiG_sads5r&P1K!Ijsk8^e!RvET`Sw_ ziyC)R-k039hfCL@TJW^)ufDn&9IP7;Xd2BeRDHO}9sV3{RMe)TL<84Wi(G5+9#fzc(o>wqGR9xVKkG3RM9?rHiyFBO^~2w3qFwb>WiXBpvQ09( zrhXe*M{*WHIRMJ+sFoM=yx^s4%=3%_#zY1BE%HV3($jJx>-$BviXB$(`ww-CsfrqT zcJExT`BCMD*HVQtb5Rlz5drj_N39jiSA!cwU5T3Q(&{CKo6cgh;G}b!{}Q^iuA!R^ zt27Bz7Y3S-AvB?Oh+WKD1*x`1rgODmWm~QNJC(qNy+l%qFY0<#u&8GmAZmp9&W&tB zg~u>0){YuaQxz`qSC8f#qB>0tVVqrOSYLn7h;k13CY#Hu)NO}Q+kw!ad&NSpiiI)N zbn{r16Z-e&k5&8f-KknzeXn_IwR`wpQ*DU8$E;WVib2 zQ@y4Bu(`f^sy^S`UA;-#T_R;m@T@yIhx%bo~NGdbuL@xM{*p&FB|C&GcQ0udR})iWn(E5!~4A6L&LV zd+%v;PL0$Ku+5GXWfh+8>7G^!9ax)yKkEAGP7&@|M0j2Nf8&&SSIsp2PBT!`Q}rQLbjITCMe+<{Pzg z({GbLpA&DUrDK(-=j!`qnhM5X!J9#Sv95Xdn|0isz4wXHaMIw$Or&Prl{HlC7Cc>6 zkczu@K(;mNTd{t1|IwfkB?{}**OU7G-WWdu9r_imt>fFx?^7-b*pxwNN*j%IHw)QAih7=)VYLK# zYn1Bm87-8@ts#_F|3-b8=gOzWk=)@eln~knf~=2!LkC~vYwL;aI7*~M245v;%=!Th zv!@iK<0V}?orOL&F}+vzl!@l}+V%Cb=8W2PZ=eIF_}&-0KG_#JYrRalq*8r&$DjF| zak-miV@o4LI9cbuQ6iT!1u~-WL?VZ+?JT+lJJ$HYJW;zvZJO7KLYY%0;2~YJ!e*;F zT>{jKh7ZC+8N^>4G^QPdt>TbX_AP3x4|bd=RgBAko`L@QF;6e2G2d>iq8eFy(y@)x*2iv> z?ZX}FZMW5R+Ag)*s;RctcAM_Bx$QQYI(MkL-FEbtt<3M+P&81qs)lM5H$dPvr*Wq= z7OkqO+Q6mlBd6^{yUnHAR@iOtIBl=lZM9U}EW7P_r!8o=xmDYfcH5}QPU9%MF@@@a zkq8^>)c05Q?oj(mN{3-ibvLKFnO%L8Q{CLDu4h;0IMvm+nZ4?@O{FpZ6z&r&Ygy1= z;&j`{nKI9br_71<`ZO4+YaWDuh>;kq_dUwR##3a?T*&{^s>DR_mAx}$9gVlt$Ig2r|6AmSWx)# zOT^!EGKw;`6=zpU)~wIAn#(+Q1R%jjV^8YV2VdFZKlSDR88p6OAJdDoyChe~7nK9X ztDj-TMO}UAVuc-IWWFtw5Cw~qrr@ZhbFzYEvKBi|R}E25Lpo$f&REsZBYVoD$;HG`JFphLHO zC|-slH*%V}T}qKioZGI*no6Yv<%u?=@r|FUX;%WJHD-%>szK+vP-m$Ght__=sn-^> zM{0}99Db1#4zJT++Po}*F;6{V6xrqQ+ViCuO--wDkFIqnV7D{AxW`WvnSNURhq^HR^X48GmP;sHiu91;?m8_`nTXl_HgI2H6M+QEDdS4`Nm7c^Oy&-Dr zyTgx^m9;7x8T5{)*w!5$uEJ;B+N5ai78-vons2|`Y~3hb?{8k;sCm`?*fQqn+utl` z)IRrfo9R__i1(4+G4DG=iQUbSUt&xI75Dz#_eSY5(RLd26_tA{&J>|s;B)h*MjZkp z;MQ(q&^v4xl5-DWgch*$awFg6MSfsUf9fcE z#!W@lE4OnIUW*;ml)5}EW@;>e1>+>rVmptHo}M})7;~48n4-c za9F;(y^>N}HMm13F_SNHR1|7TS0evG^zKV{Uuf^cQ}(8Uu;?WbjT}kI-UpnB6c@x=jL*b$-?n6 zII{oA-Z8ZaZQ1S>i&Ss1^gOs_75@FCJJh(5`F@l7fvJt9cR_kuZsbfJVivOrksclY z37-^;6u8=ax#7?CAnT<8-&J*4TYf+|Mw=_AUWY* z+@Y-vP$im|o>`oo-c2ugTA1tFKsbaqyTiq_=EYhyL2O>+Ouxv%HFIH(B99$mNMBA< z)z+sll*GTgN@J#`uVegq`svapYHuGovXebS=EpZQ4&+5UP9eYS7yiZHp!B-(%%orR zT~U?lf{eV#**un0maXRDeqsTmm&M475RNOBwbDha(*UarI`oSi!%Q@Mf>wB|_0Z2{ zW!cfLS0N}X_z&~9x322=`%g@{btA1oZzCFMSx5^y{c(q`6;4d=#@^b?t!afH7b1$n zWfXkDUkm$1eioG*#amJ#8C$>Tf^=KsL+;RTwV;ZeAZN9vmMG&M$cl#2#g;O=TkU2P z?Bx}^eO+2shRmms8UKnlWhU{4-drzza27@o2}^Ti=d}9HKwYq zP%#kOcXMq28!UX-zOg7-ZhFn!->iKgC*x3N=uh_KXvfaCW5Ve0^llkt;$E^I@}k~G zkLlXT>6z{oTe8Y_N(z_(x6HzShPp#-WGrR=n={I?+$##w_1xe_9cKP*?iIG4kqx0D zf7NiAJ6wY_1W}=F?r?2-1--jTy)kuQb~SX1xjrIewob>1Yd^5d%8?}hRB`AE(Sf1- zQZOeE$ItXdek-kGXNSJ%I@^!S3MS{t9&yIH@l$2y!?N7OO7;?z#^}WKOnlWE3I)rV z0}0cqh?skK_$C%(LRi*XX)LWxYOTBv;qK5|GUKvP;?^%4m5_r{j7_Z|$L?tTO?yIw zd&Nve5U)Z63zj|Up7yQWN930TOZ3bs%aR#g2QB^ybuuwB*{og!?UH$33@ZN;qd}lq z()`ZAyGJEvOiWK>4G=i+fp>p!0)SOJDr@wRJ6t3QQgmQ?H;8g0$1t!7k(FhMmsjUV zQJ=_H3Fr>V9S|Gl+qC;)iL_jQZdRyi7);z3HsyXL}%IOcB>Z&O*;M4@&+CaD<1Qm99sR|tuJXEvzm;bdX7r)qMy zM@AI*-5~}i6RvFP4&}<$NsN!VDnny^s`|LYmrFH{UnDHym1AbLObxWBG;;FV^o_ud zSGz-UCFjdGcIC)6;C4UPK-te5zNLI0z6F%=$v%vTeGJT6dBis4ekL!zkqKuT9Cxd( zO>&1;B*_3=c|tZFviSH@_5vUPcgqR}KGm)9PVf2B`x)gf*_t-_@k;(j9>RTVqjz3x zLHbFneXvuV^gj@I>dUDdApvXn7I8ghDagStGZGh{o)PbY%d${nSqY& z8B&Q+LP@vHA8!Rwg>_}#*s295&^^s_1BaAND=wo$r0i-RwS3P=$aNOZgZsr)XRY8N z2JbzWIGy5PC+R>;V_Pj>Fn2*D3+8DS1)EJXuIyy9DQJ}=oAClnM^P`h+Y0P(DDPC1 zU4)8MXhjakezjzB>?Jc?tR0-Bv1XniQVKfBzd?5CX{W1899_$3NiF+ACxUCiF7A~= z)cY(=OpZIWh_jq8@=s|!dsRsS5Rhf%4wMqF3v4XYxftY74xJmh%n^LvTz3l?W)bw6j{La-T10NwGi$T26iX`l}_^*_ExkF)Tc8V;&aTTb0L4D07XvR_*fcti2Lb3^5KC2r- zvZG)UtFEO>)R>%QFW70XQ&g+K7iCLXJwnz(`9in@DmXo?fLaLR`QZk5es2EBoQ$&4 z`sMjaE@3>E5$1M3RS-~49=D1xi3VX8-i3#_y#8`pml*TN zLEBSi9Tpeu60Zw6YgXbOh8IsLqy>XZvA(~NihZCxdiZM*6pBIFHLjL}Xui?V8Ow8* zsVL_CbU=9&d;!#1hH6`IhX%E8VkgR>f6+UB>NJ9#G*Ct7Vtj~jc0^cLQ0D|I#ZiYC z)IbE~8}qJljM&`l?5!6FQp8*@DWJ^7cwgAVaQz4D;m(oe`;>?bdat-q&R?N@s7I+a zC6?DB7*k56)YBdA@uw)^szS-SN4mD7g61=filf^JVzex`J~Ty*g8^#QnV^tFL0qnL z6$uT05*_3jM=vt+Hz83=?%fmy5bO8><%$c^Zk#TSvd)fMgFZ~G$6eOJA4SXrx(M@c zWCx0M9BT{p&&en=Tehzq_`w}|S61OR2@-AHGdE=E+vQk7OvwuFC9ZUktytp90e9$4 zf(LQ?1>#acO$PcVH?G#z`<+0)nWblKr6gkjFT8594l1A~E4~3I{13VXHr?t9bi2jwv6<-`#Z_aj zdZKk?pVBj6E%||YdVzULoVO(9n@#0;?`baf%{Q)xrEK2QY7@Q^a*15!%dfpH`kM2i z?Q~K6vk_xr72jY_dAJIP@r*x51_Rz5RJA3q`V8m}&tgcW^;lV$Fcl?i6Yl0DEGCR+ z6yZ&;OAq(VBE6Wx3l!SYSVkE`&ibNkgbJ` zUAI%9{K!k?LMm;6_t^pq8VK!-^6Hx%J+>)5n!s>ELJv2EN&eO7AzkjG3z24X(EEEo zrODT9f$@5DKQB)m%>r|Ht|MNugxvG|(anEQ4v}*9R9oerDi#!U6vA#y6%JZ3MqO0j zO*crayS}&G?g$Il&L_XQXj?qS;fgtMw#6sax}Bs2$fXuIcqeyg4(vuwo}^N?0qkCO zdY%-H=)ZTcV+S&dot$R@v?UdN@j$5Cuv{zzQ@R06LQzycLhH@I+i03ho za7PxCFCaUuR~7|3pllM^R947@x-ntS7V38x$^k->w(`3ID@u!`a*~2_ifG1KQYqaY zS($`ns@aWNk#dS}f9lk#Kpk+)E-4Fx(AF70k9zLwfsdZW&Cf`Vn*UigkCQkrjGs#sZb(w~71PDqbm$xFr83-T*OKeSmVrMx z343cwmaayA{+gjJl}=Ebv?3AIWJ9X@Ez5V?ZhOAZVoc^gz8_DQ9P)hsqtrP4z4XtD zY~<=@pVY)$pYn*png)w_;0qzMlV)<}i4NNZu$67DsRZG zJC;{ebgM{dFH-(EiQux412Nas?Q(`G*2Rtg-X*+tS*?&CcZq5- zmqELAh=%wUQglfPpZgI@`{ZQ97mUVmS?C-c8w z=zR!G^S>!#KK?!+QE4zW@hq+qxEbt_TfP_n?JM7l@ znG2uz5acE|LrFM% zy%&YY*iEBpn&1ux`f>o3wiVLmr9e#WM;ptbDz40=P|=Hu9`3Lq2ikfC~&pJ zc5*F1fYPkPJ8ex}wrn{PxWfZj+oYI@ON+BvT&9o*NFu2cv-L+R`_>< zdjIIdV}ocH0;Rupe1Kenln1l|w+xIiF8M&Ml*0jKxhutPq~$q6OoEXXohDfz&y4Ha z77Z;SGzr?%9r}s{IO}5~76acXmox(;CHMIv8+_{zFxnrg`1E3*zEiF{GC6N#X1bp* z5i#!Y?cAISmk#c*UoKI}ZvS8)R_t5bw98qnXfCGpZ^;am6>Jv%nHO32jMWP56V^G7 zL9BXI*oK+)6&UHg)!pHFw}h0~Gll3YMo}(4N&-H~>SE(^>Blh&BI2;z&DQs)NbsAt_5GD=a|Ck;A7wJo%c8pvL3ig@N`joU!bRbm(YS@`CY=9%f;js?h;198{-8s zxu)`uQVC1^T^SATn3>S95Y4w_1q-%wro+a@+G0@a#prv5Ue)GFC|qFzdSCPPQI}t!|}`U*qfX`I<2=X3TQZb^^Kz?iUQz&K)XcVo4^=+^d=g)=_0WxyT+$ zDKiYi%jEf1%(Fn6KHq9H`yC6)+AVO)Ddl~bg@l=ZEA&r8Z_S4=*puM!thi0g^`KP7 zsEp4ivOqu37Jg&-3D_6AKRFQJ&Ss6aGE38u5%ji$&VJt6((X}cGkilBdSMtfs?dNc z!z65kUdC^weSWW%Hhy3;93#qu^(aVdJ1#h1}iU+dv9Vnj_{9dyvF*e~8g;RVI`v-oLwdyKcXY22Oi;}x|V};fc zIE2K!#LdiL5uRAYmn8E24%~_npc6%Aew4)PeB+mn&XTUFS5|w?S5z?LhZL|+-fogg zE1z-4fBs#Bh17|pJWtrQO-Ynf3j4qg#n&@M_{zDWI{Ml1b%wB%XjvX)^KBvLFKi$B zIYR_^t6W_%dhOtdomlfx$-kpr<^4F7Sbp`Jnbk8jupAYg$CPv5R@2FI+lr4~XtY+) z5|0WcLy#?3o|F!gV@~9b^ugJYPt+1CO$mPD+)D0shw8{W;KV@2al*>6S?~8np-
{M@Ys!hB4-%j;Pr+REvN$g@qLqu`iBBMxSgSl3U7(sSqxmZ=%;SW{vVpHphv)CbT z>KIumjIUoT`6{_KQPe~dWLWFI5UcL8e!?9|XX3+HzU8}Z=tg#$_$r>q`C@^lBh)oW z!VPy>%jpvI-XJsQ4*x?kPnd5fG=$D(Dr}yy&b(zCVZUll+$8hF9RvBLf5MGbj+EGo zCfJUfda2{M+ZdkN#asK*v+b4Vx@lnNR-54yaF!+B*x^PPWz`Nc%)Px*y^j?$#9M3~ z!kvU`g=O?D?(WFPsoz!!gAqo8x)Yk9*2<-$Y>5*UP!fp}z&uz<1mQ@pB379YS zObe|0l%|%_ly9UYcy&PXe|5j~TRSzJRK_IjL9sz+fJlEId8Gfe3Hn&UsAw;+wVmKm7$ zhCSCK31$@nvHyTP`MptP$UF#DyII`og?6lpTR*WKSgNgIHiPgT#z1jrIoS8wNd1z{ z2(1qT`@sbZTCL9b!?G90I*vpSSp+1ZZoHFUGmc_=ayiL>W3Dlx=DAHYd`9ko zx$OJ#ur5hXYdMj|ys>Tsyg+l5EHUl^7wby0=29~3_c&x(9AQP`miE!%5_Ek6=`ubE zXIAG0yku4)lYTu#1~`Go@5*8SCU7U5tUOt}lU7(fq5#7UAn-%dGZ=(>%C_~2onM`} zsyx5?1T>-B61f?Oxz4Ufax;b}TYfn27pe3drc$2dy!N`9_Hb9K<8ApW4yEeB#U ziEFyQ7MN^QBn$1R5R<-9LT4i2Xe;oFgATK1fZ3;7cjy5`M_-g-hqt*ycTuv>mjl7# zU6fufO^nb)y5j`dNQ{qD*{f$?5mI8V9oWs9Io~$M?a~BY6QR37(Rrs|$tx625_>l| z(v$-f{w+guy#yQUqhhvjX1-T}MCf`@Msb}Zk2)^b{~IS_WYPvXq1K2Bis%Z zdh}ND!<8>eO+i?E$x-Ry+AkH4QBhi(9I>ZW(@}WlX7gC@hJmvM_0FeX`c8smaKBdi zsi@qEPRgH8t7k*%spJQ9?ddyARs1`tk9k*cBzI=*8PLQKo@EtPcm^?2^w_hJI;N-+ zp(0*`P#M7fuP};u8FxJF*VDl5h><1qi=dD1Q0w1V#k0zIRINs1q2Tt($CxSjqjvpd z!AIF%VV{RX4aGy>!{BhwfV-$9!4%W%`_q~BlSwu`yrLlPt)}$>ik4u@yeNkHsD~~Jm*65fO z+`z`%1S~iITb01^M)&1%Ln3!Vl?IY-MZPI*|AM9#d(RB6B^+Bw0H)C{GAjf8&p`iPv=&%^*k1fW7EzBhY#q;!=;qba{?z_4vg0 zq78JlAAKBhI;YY(D^gtTH1`{-zo$1kNeumGj>-UnJGo;0NBKB!t9qUbz+Ofm57Bd( zFiC2yZ=e-noXBbPJWzqgTIsYkw%cy1*!GIk_B*~nzit)V0#4f&yX_LEEg*uee5a9o zSvndOJN9wfLUvoJjK@*fx>U6l6lr?bBt>*aaYF2t7LpN(Td)vIcPs0Wotj3`Cv(Chk z0v-~&=E2zdd7XJrpUWmnBZ$UxM-Y z`%N_su5HrcCqhE}6psT&PM2GN>YRe#y38E!YaF;0Rc+KP{9MdtL#!sNmwRp1=hJmM%-cPOqDBp*l(sE@@k7?o zE11XnGUeQ+#Z1(2gL=Ge<1cXc##`!;LXhi7`${)lG3II~EJ8&h>=Ij;JM2ao1lFO9 z<$1pGl?oERbJp#O@Q)7cM2D$!hi0=bvG);bxPd=MX*zF&-c|lEH|DyX=eX9%4-w$` z_$)@?mCfrQ!(KVkvYVFpQDUlk&Iha6u;P^nc}j;1rZEs`jk_4N&z)1ud45<2^Udqq zC3#*nzrMb4tF|xFpe96o9E0;bm8_XJdr}dO^8n=S$6B^D+Xu)Es*rzA@Kvj%FwrkO{D|p^8tUo8w?>Qh6_VwQABK zckb+DQ0uM5(m(Q&dO1~Y9gJykia$qZx%-=`)+qd^FNg2i)$n~c!Pk7XUux1_&zr0I zU6IuGdGptPO+3{VGx6SXW0lM_o88bN>GhfBwKue@T}M5~5i5Mmg9~f&?dGH#Qr$HL zzvp(jK0IjMHq%^iL${>1?aX~QwCa1%w4(*D6ca}G(tXWbHDj)!C*-=Y>tKNO&26%6 z#O+r{b?htmkgu*(Ubd4HRI#!3gxRludf*)jR%M(!>YWQJ&%ozk@?cqgdAZ)0PMt&q z{}u{Cr{E5cha~<0U$}haPi60)IK){oB$OC8QzQT4FDVLFACWQtLy3buLCHl&NdN2j zGLQ97Z8$=_lUp8cedBV>*C;c#f+c420d)hLhRCzOU*dh#8gcF7KxAD3vv`^92Aia! zB^6QQBhdJqbIerm@njww`eBr@2giAfh8_i7z~+EWD7Y``oguU(@KiZ?%r%*^wRepe zVjQR#;!y+ytJ#+Dj%;JD9nd~-C2bhT9Ud*}L=AqA$a}KhX8fQlH&VjuYCJ^WkFSrM zo*R8ee8{flN>2iW9JkL{Yi6h^+{dkTXWo-E{FshMTz*m(WBC#xW8br9Pu@!76i1~s zaXA8cNL?AM^;u;Y#YjuEphy29#qcr`zOi6Dg zO@&C$*i$;2A1+s~X-FY%c<^WA3SQUHZk#fny!PwMFRat=6{^{~g-9e5z z@xREAnWFE&+0gbed6Yh*#KzLk-dF-_DRxpn0&|B3N?4ujT}YL@*lThRq*{W%>+x>1 zmG2YPuwTX=>s|D99#`LuC?earOaXt5ztk-FWVkF4jVP%EZLjn>lMOD?t)7b3qIy=W zNdxx^Pc}8dJzA{y?kNM)J7-1q_qxjc^iOI~uB*@&rk!O_-vt(n1dj)Ll%B@34eL`? z<@%=-eAm?Sfkt*ShIp!I6m7b>IrJ*4`%XpJLc+@hZn55W`j3PTw|D|RtS+41^KYq& zxwJ*Fzisgi%BZHudg#2Yn5W^p%8KJ@kRQa|MjM^(7rN_&ZnYRcw;g{rVN?7~WMu{a zCM>;ZK5|RjKqCkwRUx7fBZvK=M7R)ZjmFt>*nzurNE$uvfd4{2kT3aUg(;zuRi#EeB$jSK|4@i^)@5_~Zdyg!x- z@id#5XAacUVGSJ;$uNOH7gyrRSLdkMiC@&6bQEPTz^+D$+BMYgyy7p@=36trY(G;G z5cjx_)0@xz`UZEfHkOD7&XDMp|Ms9N%f}a+twM>+#3f83 za8c>}{-9z|IO&pE^HhV-7cxm1fkT%Gs;JjgVXJ z6D}F{F1!Sno%oh`-bML{3y+ehIdzfHcs~6JnwZN?t@VVea(&QLzgDwc#6&ft@rJSh zqFqA_Ks_0hmuuxE<7Bq33xCt7?o{Q?q~q3=Q_QTJJOLgK=AkunAUU**-&#NnDxZrc zvQ^4lpvq-$()#N&YL$c*$*Rfs^sIr+WhZckhLHkd07^##mc%kGNNhIc9 z%WX>HJqq4$c$Q+q{w-mKz;#Wer>oZ+$Q|<~n*{zO=LtV;~F?`;I%s)DKO4H&4WX`87my-}=&14_h6 zBxnJZp?!`=O3W;x5oHcEQWJLP>xiFDPkekcRXk?vR==PRLO-Nr)km4Au^5!q>R*5> zEChG2sN!t0ee}qwY9$4|)c!h^CfQ&0ZxJ5cr94KQ?{B=oIqON2}eY}m=o}tteoWD}j z&D!G7Hdfm&HNI#>9bm(O&His?M@y2HnB1tSlWsZ=tq0ha{qdbH@S)WZ@dg31GU0`BTWowfTd#iOqDd&rJAb*N`s zE}|tq;e<3B-ykAhIl!{W_>+^#P2wOkP_2T4DF1jD-xdGhWGZ9dzz7g@%{&A>0=tYq zgWk8PBW6FQC|t8CS*KWkQDX+EILPaCjM9USPf2SQ8b^vF-&H#nC}>XGLw4IJX=_cJ z_{le#-1qL$N~81|EaH;YxD2l_6>n&*EbQr`I%9{QpHdzXuBGZ-9^p1t0>j@}nx9C^ z)K0e-_d9d#Bf;u`>f`T<5=Y5e5%s)?n)N2#>f&vjv$v^wTtl>%#!1p>vBqg!PNV&| z0!B&GJ<_yCxuW+;>Bk!bE#du~;E3;Qs~B1?b1(0j1~3Y5pMEbd&CQd_gb&7*>wA(> z)b_y?ThqaC%TgM-ex}Vj{st1qtDc@JsDP3!X#QAdDy_Yf?KN_*-5yuWTuHR^lzp8v z28uG>GmGQ75HOl}eKCPO)R%?(OyS;?M!5wz|I2Fa)?04&P5wEvlE`cN=zQ5$FKCY% zvtY&4Kjz_O*Zg{>Pv2ek!})A6Xw?dyHpcnz|7Gg6L6ORfy~nLCq!H@;$j?}lU>`Y7 zT+Nix$ob#ZY@UdO)>^Ziu=Y}gd%bo@v_hDTi$hTH=W%#~_}@XYd>3^+;ZPaq4y}bF zm8Sz9`7y|bct0rZ7yDzbgVb5Q?9j6VTsd0@+u5co6XI;4LfhHu+0OQ^^r=dpcqPRN zB{>Akl>g2u4uX@y+#v%>44AQgx3DZA`?L%Xf4)*RPfh1#O2|B;c_t#^tF6^g$tq~* zi&CPcCQ4YzjslXWi{WN3zoBdu@Dg{mo{#89_nW2lds@NYq{`AID4rvS zaW0Q$NafEgU;eTgD9f8)#~>|uI>5NMt7OMB9=R~MPiWgY;#aFC*G*FQF8zbXm7scj z9`)Qdda^~=b5Gj3PPK`*y++*tTbqW`v4D>8F*HVvYLvw>jx#KAjGh6QoSCfzpQsD% z62;4(jv}*!Pc_BIV}i@zm=f!{rLb!byM$wsxHDr><6Rh(b|%5Zu@-=HEyK>PStD#+ zo)i9Y0z}jZf{GeP<*jznV=rAEp;8?5exUy&^tuE)(T@P#-mtspg?FKTHbL_cvzuKFy_t+P&3pbNlGk z_zlwMFty%Me2ne1%f8b@ZVo5-Vvi^DYXSEPe%K{H9=K)_rFO;0SOlF_MU8PDD4Fye zwwf30-txT5l_pv&pNG;1*m|M?LoQgb#d9AMP)YP7#tjL>GqjwYsq_% z_6km-&AJ3R@cpSa1idBpWzuNAKK#;V&tl=I{Wl)F2p%k|%H4NcRc$nX*8FAoCHh-t z%@M5{lQ2g3BWTH6<+k%sH0N9-=QO{?h#E<6nRz3cr@bbw8{F9W&QAvUB8Pp!pVRoG zD{5qZcZuPuW5!1GaFeIY-;YcxaM5w_o94G8I_n>pRYrER~LRq4~k0Xt?^UOO&W$JUyIinuq+cP>(cbjwXy~HdWT}@$) ztN2p$qQ*^9Ti@I;I*r;NN4HOrRl%FOnu>B6U91~o9 zrMaQ`<$aAib9Gv_6)ugiRHiDh<;08}98I2A?7)+v#wj^`7U5mL)-+S^Z>iUm?r!

~)vXkAX6u84U6h6WX#vvZ_h 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 0) { if (g_tok.type == T_EOF) break; + /* namespace-qualified name: ns::name -> name */ + if (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + Token nxt; + read_tok(&nxt); + if (nxt.type == T_PUNCT && !strcmp(nxt.text, "::")) { + next_tok(); /* consume '::' */ + continue; + } + unread_tok(&nxt); + } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "{")) { bd++; proto_emit(" {"); prev_dot = 0; next_tok(); continue; } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}")) { bd--; if (bd > 0) proto_emit("}"); next_tok(); continue; } if (g_tok.type == T_THIS) { proto_emit("this"); prev_dot = 0; next_tok(); continue; } @@ -823,6 +834,26 @@ static void parse_member_definition(const char *ret_type) int is_ctor = 0, is_dtor = 0; ClassInfo *ci; + /* skip namespace qualifiers: math::Point::draw -> Point::draw. + gather_decl already consumed the first '::', so the stream is at + the second segment; if the first segment is not a class it is a + namespace prefix that must be dropped. */ + if (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + /* skip the first namespace segment (its '::' already consumed) */ + next_tok(); /* g_tok = second segment */ + /* skip remaining 'ns ::' pairs */ + while (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + Token nxt; + read_tok(&nxt); + if (nxt.type == T_PUNCT && !strcmp(nxt.text, "::")) { + next_tok(); /* g_tok = segment after '::' */ + continue; + } + unread_tok(&nxt); + break; + } + } + strncpy(cls, g_tok.text, sizeof cls - 1); cls[sizeof cls - 1] = 0; next_tok(); @@ -937,6 +968,16 @@ static void parse_member_definition(const char *ret_type) int prev_dot = 0; while (!(g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}") && depth == 0)) { if (g_tok.type == T_EOF) break; + /* namespace-qualified name: ns::name -> name */ + if (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + Token nxt; + read_tok(&nxt); + if (nxt.type == T_PUNCT && !strcmp(nxt.text, "::")) { + next_tok(); /* consume '::' */ + continue; + } + unread_tok(&nxt); + } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "{")) { depth++; emit(" {"); prev_dot = 0; next_tok(); continue; } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}")) { if (depth > 0) { depth--; emit("}"); next_tok(); continue; } @@ -1207,6 +1248,16 @@ static void parse_free_operator(const char *ret_type, const char *name) while (!(g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}") && bdepth == 0)) { if (g_tok.type == T_EOF) break; + /* namespace-qualified name: ns::name -> name */ + if (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + Token nxt; + read_tok(&nxt); + if (nxt.type == T_PUNCT && !strcmp(nxt.text, "::")) { + next_tok(); /* consume '::' */ + continue; + } + unread_tok(&nxt); + } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "{")) { bdepth++; emit(" {"); @@ -1344,6 +1395,16 @@ static void parse_function(const char *ret_type, const char *name) next_tok(); while (!(g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}") && depth == 0)) { if (g_tok.type == T_EOF) break; + /* namespace-qualified name: ns::name -> name */ + if (g_tok.type == T_IDENT && !find_class(g_tok.text)) { + Token nxt; + read_tok(&nxt); + if (nxt.type == T_PUNCT && !strcmp(nxt.text, "::")) { + next_tok(); /* consume '::' */ + continue; + } + unread_tok(&nxt); + } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "{")) { depth++; emit(" {"); next_tok(); continue; } if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}")) { if (depth > 0) { depth--; emit("}"); next_tok(); continue; } @@ -1732,10 +1793,27 @@ static void parse_program(void) continue; } - if (g_tok.type == T_USING || g_tok.type == T_NAMESPACE || - g_tok.type == T_TEMPLATE || g_tok.type == T_INLINE || - g_tok.type == T_CONSTEXPR || g_tok.type == T_FRIEND || - g_tok.type == T_VIRTUAL) { + if (g_tok.type == T_NAMESPACE) { + /* namespace NAME { ... } -> flattened: parse the body at + top level; '}' (tracked by g_ns_open) closes it */ + next_tok(); + if (g_tok.type == T_IDENT) next_tok(); + if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "{")) { + next_tok(); + g_ns_open++; + } + continue; + } + /* '}' closes a namespace block */ + if (g_tok.type == T_PUNCT && !strcmp(g_tok.text, "}")) { + if (g_ns_open > 0) g_ns_open--; + next_tok(); + continue; + } + + if (g_tok.type == T_USING || g_tok.type == T_TEMPLATE || + g_tok.type == T_INLINE || g_tok.type == T_CONSTEXPR || + g_tok.type == T_FRIEND || g_tok.type == T_VIRTUAL) { next_tok(); while (!(g_tok.type == T_EOF)) { if (g_tok.type == T_PUNCT &&