From f51461c829c124288a930829a78e2a5a799f4039 Mon Sep 17 00:00:00 2001 From: "Gao, Liming" Date: Mon, 27 Jan 2014 05:23:15 +0000 Subject: [PATCH] Sync BaseTool trunk (version r2649) into EDKII BaseTools. Signed-off-by: Gao, Liming git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15188 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Bin/Win32/BPDG.exe | Bin 1042286 -> 1042283 bytes BaseTools/Bin/Win32/BootSectImage.exe | Bin 434176 -> 434176 bytes BaseTools/Bin/Win32/EfiLdrImage.exe | Bin 421888 -> 421888 bytes BaseTools/Bin/Win32/EfiRom.exe | Bin 446464 -> 446464 bytes BaseTools/Bin/Win32/GenBootSector.exe | Bin 425984 -> 425984 bytes BaseTools/Bin/Win32/GenCrc32.exe | Bin 425984 -> 425984 bytes BaseTools/Bin/Win32/GenDepex.exe | Bin 1081412 -> 1081407 bytes BaseTools/Bin/Win32/GenFds.exe | Bin 1402636 -> 1402627 bytes BaseTools/Bin/Win32/GenFfs.exe | Bin 430080 -> 430080 bytes BaseTools/Bin/Win32/GenFv.exe | Bin 479232 -> 479232 bytes BaseTools/Bin/Win32/GenFw.exe | Bin 499712 -> 499712 bytes BaseTools/Bin/Win32/GenPage.exe | Bin 425984 -> 425984 bytes BaseTools/Bin/Win32/GenPatchPcdTable.exe | Bin 1079036 -> 1079033 bytes BaseTools/Bin/Win32/GenSec.exe | Bin 446464 -> 446464 bytes BaseTools/Bin/Win32/GenVtf.exe | Bin 446464 -> 446464 bytes BaseTools/Bin/Win32/LzmaCompress.exe | Bin 397312 -> 397312 bytes BaseTools/Bin/Win32/PatchPcdValue.exe | Bin 1036118 -> 1036114 bytes BaseTools/Bin/Win32/Split.exe | Bin 425984 -> 425984 bytes BaseTools/Bin/Win32/TargetTool.exe | Bin 1044398 -> 1044395 bytes BaseTools/Bin/Win32/TianoCompress.exe | Bin 434176 -> 434176 bytes BaseTools/Bin/Win32/Trim.exe | Bin 1118260 -> 1118255 bytes BaseTools/Bin/Win32/UPT.exe | Bin 1681037 -> 1681034 bytes BaseTools/Bin/Win32/VfrCompile.exe | Bin 1286144 -> 1286144 bytes BaseTools/Bin/Win32/VolInfo.exe | Bin 471040 -> 471040 bytes BaseTools/Bin/Win32/build.exe | Bin 1806156 -> 1806151 bytes .../Conf/XMLSchema/DistributionPackage.xsd | 5534 +-- BaseTools/Conf/tools_def.template | 45 +- BaseTools/Source/C/GNUmakefile | 174 +- BaseTools/Source/C/GenFw/Elf32Convert.c | 2094 +- BaseTools/Source/C/GenFw/Elf32Convert.h | 48 +- BaseTools/Source/C/GenFw/Elf64Convert.c | 1866 +- BaseTools/Source/C/GenFw/Elf64Convert.h | 48 +- BaseTools/Source/C/GenFw/ElfConvert.c | 466 +- BaseTools/Source/C/GenFw/ElfConvert.h | 166 +- BaseTools/Source/C/GenFw/GenFw.h | 110 +- BaseTools/Source/C/GenFw/elf32.h | 516 +- BaseTools/Source/C/GenFw/elf64.h | 520 +- BaseTools/Source/C/GenFw/elf_common.h | 2090 +- .../Source/C/Include/Arm/ProcessorBind.h | 316 +- .../Source/C/Include/Common/BuildVersion.h | 2 +- BaseTools/Source/C/Makefiles/NmakeSubdirs.bat | 2 +- BaseTools/Source/C/Makefiles/app.makefile | 54 +- BaseTools/Source/C/Makefiles/footer.makefile | 50 +- BaseTools/Source/C/Makefiles/ms.app | 46 +- BaseTools/Source/C/Makefiles/ms.common | 102 +- BaseTools/Source/C/Makefiles/ms.lib | 44 +- BaseTools/Source/C/Makefiles/ms.rule | 30 +- BaseTools/Source/C/PyEfiCompressor/Makefile | 28 +- BaseTools/Source/C/PyUtility/Makefile | 28 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp | 8 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.h | 28 +- BaseTools/Source/C/VolInfo/VolInfo.c | 3652 +- BaseTools/Source/C/VolInfo/VolInfo.h | 82 +- .../Source/Python/AutoGen/BuildEngine.py | 1254 +- BaseTools/Source/Python/AutoGen/GenC.py | 3146 +- BaseTools/Source/Python/AutoGen/GenMake.py | 2822 +- .../Source/Python/Common/BuildToolError.py | 308 +- .../Source/Python/Common/BuildVersion.py | 2 +- BaseTools/Source/Python/Common/EdkLogger.py | 538 +- BaseTools/Source/Python/Common/GlobalData.py | 142 +- BaseTools/Source/Python/Common/Misc.py | 3498 +- BaseTools/Source/Python/Ecc/CLexer.py | 9856 ++-- BaseTools/Source/Python/Ecc/CParser.py | 37516 ++++++++-------- .../Ecc/MetaFileWorkspace/MetaFileParser.py | 3706 +- BaseTools/Source/Python/Ecc/Xml/__init__.py | 38 +- BaseTools/Source/Python/Eot/CLexer.py | 9856 ++-- BaseTools/Source/Python/Eot/CParser.py | 37516 ++++++++-------- BaseTools/Source/Python/Eot/FvImage.py | 2906 +- BaseTools/Source/Python/GenFds/EfiSection.py | 10 +- BaseTools/Source/Python/GenFds/Fv.py | 14 +- BaseTools/Source/Python/GenFds/GenFds.py | 1076 +- .../Python/GenFds/GenFdsGlobalVariable.py | 1436 +- .../GenPatchPcdTable/GenPatchPcdTable.py | 344 +- .../Python/PatchPcdValue/PatchPcdValue.py | 580 +- BaseTools/Source/Python/Trim/Trim.py | 1218 +- BaseTools/Source/Python/UPT/BuildVersion.py | 2 +- BaseTools/Source/Python/UPT/Core/__init__.py | 38 +- .../Source/Python/UPT/GenMetaFile/__init__.py | 38 +- .../Python/UPT/Library/ExpressionValidate.py | 2 +- .../Source/Python/UPT/Library/GlobalData.py | 196 +- BaseTools/Source/Python/UPT/Library/Misc.py | 1948 +- .../Source/Python/UPT/Library/Xml/__init__.py | 38 +- .../Source/Python/UPT/Library/__init__.py | 38 +- BaseTools/Source/Python/UPT/Logger/Log.py | 650 +- .../Source/Python/UPT/Logger/ToolError.py | 354 +- BaseTools/Source/Python/UPT/Xml/__init__.py | 38 +- .../Source/Python/Workspace/MetaFileParser.py | 3744 +- .../Python/Workspace/WorkspaceDatabase.py | 2 +- BaseTools/Source/Python/sitecustomize.py | 38 +- BaseTools/Tests/CToolsTests.py | 70 +- BaseTools/Tests/CheckPythonSyntax.py | 148 +- BaseTools/Tests/PythonToolsTests.py | 64 +- BaseTools/Tests/RunTests.py | 80 +- BaseTools/Tests/TestTools.py | 358 +- BaseTools/Tests/TianoCompress.py | 148 +- BaseTools/building-gcc.txt | 30 +- 96 files changed, 71975 insertions(+), 71980 deletions(-) diff --git a/BaseTools/Bin/Win32/BPDG.exe b/BaseTools/Bin/Win32/BPDG.exe index 76186caddd11509d0bda276a97f58dcf4b42b76e..7e7a62192f44e482852065f04934f7aba3c342c5 100644 GIT binary patch delta 5250 zcmY*d2QZxL_ukdZvU*Kef+ZpnMDO8h(S<}=ZFQoP5LtD#AS8UN*JP0(T11y#4q?YP3)nCUR!7I$@QOu&D)1`{A$@A zX?Ch(2>n++jX9|?abz5zx(dbD*H6$-4ci3Lv5MI1_n+v!`msd!pvFC)KV#@q4o|>u zsSpb7OAmYHUq9Ow^ban_4ldI!Iz^h&!eKd)n87vdBadnJZ+AK3s`%Q_XB5laIB&kTn5QIrWcvznKVkXmiZM?q z_8>Rqp3v8a_wJLk#39u688eMUimsMQ8B?I#vxI5y+(oJlGOZREFtkR>>l|>oCksRG z7#=9$MT%sMu<nWd0=^#jq;`}~ydNu?z924*qxdS+2Gun^jM zodf!S4iiX=!kinL6a5g)41sg5 zajbC~+|F@+VD|ti+xfoh{eaIsM-;o>P99(P3ulZo#$LAVvneF+vro%lrdkzSq~p?P{!J0QKM!{eyBG~!LM9) zWai9ejF$RU&pAG(asdiSuq%Ccc_Z9$g-!BC*#f;eo@sf%m8C2zrLri?pKt`tqT9W9 z#^-#(9=}}pF+%WpJloU3KY{VWsLoy%^f13De_ceqDSbXPYNRxL-A2?+qmA);;6}*L zq-5Tv)a}s1+wV;6o}&_GT=&vaAcuW)#YS2Kq53Lz&4?F_R|6dyLzARqyo|ojJeq!_ zF-Y3F?Ab8xmu)8SwOL06yLHxw@#_}NbXC-@CxX>x0$|14(;WMrEev?tU zy9ia=<@w>`dF7aRiYx<+}*1m3#~IL-d+*ZsvS+M0@@V!ojadZ7;cgVpy`c#LEM zN%G}y^5!fwO zE_0R{o2~p-FrU3Ge!rmsF=`;Am~h-u(d4xnT)aD0lCbKftQ|?A^4%2?8^DAa^f4}!9>?W>? z?*P9rxmzw{k3J$=5i`p<*TNnXXwARfw0a#fG{Ekj%vu4#2OG4xCw*}mFMCcXg!W3* z-VF>aaMn&n$vx!Vs;U^s)~%5JP_urQ@`wdR7 zek*K}v&Pu;S^NqTu?@M?=3d)DJ6B<)LJ*yB^@RaD?n*9Gx?e{JwjO2f_gN%3-}x0H z;4+|lPg(L_wfRkgq**a0)^bz7@0mrpRkEXke1^?h7m5P?QG-YH)%&1nKq5#)OZn~S zjCQC8o4dJ^E&q^9Am1taohIw|?iBrXr~B@!HQ&z$UffGMH&Vc8me;)8RW_ldek6e3 z6I}C*)s+mWkxonN>sq7lua*`%JkJv(JxsLmmuS^;YJ0uz{)6S+hV>khjV4HF9!u-% zQE4u`p^2hnb(e-)yk8K!zePf0B`Vk{B)NPYGg1C>q3k{?Z!F~VQGdCRbT7^%{-HE; zhNT?0t)>Jfvu}5@&+@fm`fWEop+4T6Csr=lYy@w*zz+U;^C?5|wtJiF*LwFlJh#wQ zAIUL1(^^9G=i!o731G6) zxtT<*F=UHNm0LCu7AE3Q{CUEJlpY(Li1=XfnNEo6f|ZP$4=zFEfH zekSgmG40mwa}VbR_4nhJEXJ2CKhaB{h3l=ELUAA%zC-gIx14>{9H&!ljMGdx(=4r-R?J^zS*CNP<>xc6ym|m}X6Yqc2iOF$J!EDXNWyxz z?E3l|iOBmf`!Y?j?#z=XA>`?TS5!Ma{eGG1`kQlxXy2cz#XR*UQkqQ}(pMlnHYcxMlPeP0Ti)T3 z^HpufU(lX|!`$chwP+4_Su}Z1XJSEOBOtf+>{i!RD`Qw%*QlJ!`aq`KuR*8GlS&iI zi*?&vHcge4vlBT~bs!ftj{!OM$<1wc()-lJDULC_1sLC{F zwU>D3&0g)uqr~ z`j;fX3`OIq{nm9_wSGJ_f%hqCH5ts4R2t?9SglB&SeYS2-Imm1M$&pOui#RI5qA9=^Du&4VN>0hy4AM1YKPJ7I9OEf}C0 zE=|fN$q|sPt1{z7>GJqA`=p7z?j9D)9@%{oB0f@Kr*0vB2F<5x2oSFmBIMaulWIVyi)N3RE`e0?XDPHR47IM>buR@k86uzN!h14K zat8F#A8HTO3nYIjk_JE|apaOYRF(FaRr};vHl|PY>kqkfx2F4ETnc6?($z{0_C;7= zQxu1d+gZf-$!MOdM%X7Krjbis@-6clXB{BAR5Ibu+7YD#c4ZMLK~F1CNAw$tnu%AL zQr=7SKj>$?zH@hce4D>j8NNN)KS^3PjGA`>n`dkR$pZHq-_5a3NKud0 zPvx*YZSD7wUV7Q6B!fTIo655z5nrtj>n|+5Z^=q~heSXk2M<40E{tWjKXvATo@RfE zLZn<)l;-a8u;nW<3zG9ty;$TZv05>oyl(aN-bDX{;xnuMR}~`7$OfMUb1umVGRfzR zM_kRGHh$X0^gOq#8he&Fc{X5o<8<0BeILzR*)k$r_&;p-qNM5JN)s2wY6YwUvknMa z=@nyX>6O?z&OZgvxfzxg=nBU!E}KsEk%HFj6HJZGiw9IoDW4B=;(l%2V)i<;qM}M> zM$2iDR~cS&t>J&sNm_lIsYjphc_x4Fy_>9(3k;6vPW#g*2#41!hO$Wh43+U)DO(A! zCi)K}ImUas2oy^q>1whhQ(d;dxIy8FEvm^TVpJS6vrDmlU(v&`!dU zd-P!2`PWW*Qv0cQe$G@8(s|3RjPGC~U%ql*RA!vM??>@X(@niiE%Hd39pv5~WbJKS z$J=9ssXOiz5Hvhl3{pSY7$^-11Zb`LzoDo3B1=oX5IY@m1)EtsnPc-I;Yu#2hsHC; z3f4TJg1WhXh3%d2o8lwyd;Gh%c;0|KhsHpqSJ##VoPMqR=_(*(*uf1i#2{$gAL%e( zUgjVXp)i!r^k}l!vXQC-fcT`X$q-&FjJ%7t;@kSpaM;Ljc+GeER!MvJ9jMlW%*X;| zcEgY6J~4Jx5Lyz?o`y?yYQ}9=?at05i(5OePPtw+CI&rS1Kkg*mSaUoR4P*udx@B9 zyuX||kCd{nE@0Gg5wU&F9k^SdNF1 zjsJMb>(pW^-ZS4$i|_1GD52us$G|m3bTO~ytBr3ZB^6V9L*Rr#8LxM^zqoxPlN_nN z8TC*YDzZ)!ss_0jS%7RN+6K%YQc)dZ*v}G7=Vf3@QWm)4Q5D>~E&7AD1WT1iPGLm% z+`)(H)`Nkqj-O9@ZlxgQH?@x@7d;Kjw4W1@lal4V)Y<-w+o_&G7Q(u_sk_njEonK` zXVcrizlQtW5JLzHgaW+0RB!CYE!!RC5e=wc^%u<1yxoi^33uG?zteTTyqx0BprF>} z;8wV{;hNN9zSmzTJCfWVys^Qd(0Cw_pB0zlr6b83Nqil;W=ql4%P&!+_OhF2OJiAuY()ngQ#@h{iwTDro=pBU|up_xO-fu>NZwBvl5rU zLRV{FyB>Ht=xkH;Sfr7D`o`6&5<+%!Ze=8sy?E1alMuc;Z5S?F-6U~rkA(?pp9jY;6YzY%Jhqiw!EFfP=9~@BYr`}i@GgFUiU;1D_6)~daOaXP5ABLwdjpKH5;yf6tPZ)$|}qnL8U?( z$|^Rz?kYCi|Ilp98_{mx^;y^B0tda+QuVsAr#jCUN*46om1A2JLvfn2nQV9#hoXAD zPh0=`CUyOrhESzfE0_?{Emg(dn^N`39Uv4*FtOP*dUuI4W@#h+p4as)Q)!|Z$UdF= zi^wO>6^3tj-yZZ$SeET(>qc~gW7D7%(3enM=peL&Dam!$K6_rGh-n-;0hNH>1CTE| zO_-7zLe5j3Lj_{rZdA5CPK19=K{;nR%hpa?ISZ-3fDhju_BD0cfq6Pk8eWV|rUCZPkiXSAQDV&5xxyww-`Yy=QdPc%E;$ zZ~Ioyj@7iKfwh4ZWfbt}gY4{H-5eji_Al@8QGr&q%$z4n7aRz65)g?wu4PA4@O6Cq zWW|)dXXfI!=33Lh?i9u`py^Daz44x1VdT3B76iEK{Yvkcj6bIK#lW0y#fSHskL?;K z4x_We9fT)fzp;AxpG&A-mb{s#QZuGCl5>@^V&_2^k0v9FQ6ucxL2IP#UFu@);d3*` zMCIk}A2t3c=}5XIPgaWA6wnF#0W_i~^U@0@uOy!ptpq$6HXroqVL_}&2u^y{b17x* zo(WEQTyUJcUe`XFKdmd#s9X5K(!hZPKRmVFia&gx5ZH$q-_wFrm1OIQN=vnD2r}Dd zU23rmU(td`QGA!B$>r0DCk-AlrDyB^=zia;vZ$M z4HR-F;e~ex?T>#-JWoFHx*A$e9kb3<^35CIvzESiJ(*EHiLAix%-m~R_~q27*}YH+ zM=$zYD=&yNAN+dz!_F+`o42Up_GtO`@2YvP8P{-{eU$m7_n2wRTDR-sS+GQ%R^i_J z*;LQTEyYbX`Aho?h2Luk=aPT2>sa4gd;p~7HnccyUPPHS4w{!0NF2xHIA{tHomQoN zuv+z>4iv7Ut_g#pZdBYhF6_mYc?Ao<{O|Bu>YEd-;pi z0}=W|&=U0>-0Zx2G-5c@C!3-hTwn0fqj=ZV zIjH3R1x`rwV-8X(Rl=Eg;@{HK^8Hz`*JLOse(~najeD>8*E@_jtjx^#e&tUp7DG zh*8;S5{-aH4?e9hu0jv?MmyfPHe?TLn_eMKYFiyu8e8#mVq0z zC(EvUQWpb5x2Jrr|J}l!`u1F&WS{hxU4smDiHPY42nfgtNV5bqnz_XW@_?`v{LSk$ z8zRb|4T3O5PJ!ZHHb-bch}7v)939DjJdTQ&%Wz&V;%CavW;%C^paXt_;sZ+z4LE@F z+mo*!8=#aaQ&hm&&nZ_0|0AHHui{F_S$Kp0NzR2=2L^FRC@4P71 z>@O1sW$-dzAjL;6nwwQ1o{ucujfDN2pB31uI)TZ?Zs*QjrjO^DDu7b9IE4uQtN5>0 zaJ%`0L>|yvg}_m|0j#|=`!)#j2m-J%7q3n&F{Y5Xhw3zwEt3PoZ)`8D{w?)|G3z@+ zp&@F*_~)$(=^~7Q@h6N&ME);)+Bam1Qc)@DRL$#4>g6kfxBi?eHDQG^1k-qOBt9xC z&QCm2X2?DeELNVsemPON>5`|cykYROO|$5Hv``e2n;?SnuL|)@^XOfLHZwENVu#0L zSCC1jnRAFTwr1|4BOHTPVv0478E2zLxz;{^*^Oo=;K6nWKsMA=!NqV6_N^M=-Bzx8MOa+8zPi^W@JZ-MYNjz0VI zCpor9F<0p)0yDNePsC6AxQ0VV#&z4*j*AQ?ej!o*VktSaa7OKXOee4L@tvmo+m+Dw zDe||XD~di~$|sWat~x5)&jZ@pKXYzgK1ZvmFTrKQ8Ame=IoDmORk8z$GHdjM>=@&v*U7KBj z`KW^@t;8<#ot)gy?Gwy~+%~YHS)dY0!+(3|8%3^gp5^mN)_e}8*YH#VO(p^A3}#^| zR5jX*f*@-QtJ08jCv9D1u5(_srRpgW)00z^d3xV@tLBTP;A0nfLHLJa4rCR($#Ql` zg;P#sCxpr!dj7ghV_^e6Cmnd84ZsBj1IhN}Ma}h_bMtQ03GM4mTXu)9fYA-j`$8T=R((^8?^0#v<+J8LSp(O2H*Aq)ot!`GD zI<*cx21bWgRZ#)Rv7N&X`g+=h?v*r`!lKVapc`z_fgW=MR!%~>Wme1{=_uXoS}7-B zmtlWa$KhSh<5=-7TL+*@m&y&>$-OQ$DU0YPVs|7L-?9)I84lYK>e{*gCHN0&s%N>V zWCkTkUKizPJ>=2pj2P%~zD$vJ;5do2&W$>=V^FqUUjv3+rC|Zp>khk|S*Q6*0Bp|3 zL37Mo35Uc!vBLVU<60>@3*=lB{ntS3RlYXy&7N+$h~Wn;1ohpByduwM;jfs|=Wguc z`a5DesgaBC#P%J!M86iH#J~zOHJWS?t=(}UrZRFuU%D92xKJUDHugd##=>VjRIITl zjZN#zM8r?DcObgQB{2-f3b)rVmAI>G$v>`egK2W%7Y_+)rP>>8BL7rPN^VG% z!mKxbWO@p^Y#Yn0QXU=q8DvTPCJNcRLu@rg#Z=vVZhlSP%t3CiUX&@qS;y6sXq0=` z`}=_PQ6}Nyw77eR-YvIZb@ahpcklRRg*>OTQ@?p!#IFfX8&{BqysPn(Tuxj@w_dzU zq@Q->*01&xUKX)OfoUTjTSAtlOQ<(eRdTC^R5U(FnIC9pue^UV?54w6?;XB(x*ziN z>(j^+y3UWE3Cbglpj05zmk-#_6-SxYG52q=_b;&I?FrDwWAcVV@1Dxq1&G=!rVj5z zG{H(Y3aT?LQYA7u!u}|+8YUHgrHFAnI9es@r1P}ed2+vZ2Nm4@0~P!8tt{808osI* zX8pU@*P-3xoT^|42Nz=YD$JyyZ8ihhjL`)ZJG;Xzpa5q=dsrjlwyr)FSw_-gP~a=~ zt-R-Em3G>LiqVRguQSmq0o?6td%=2j3tMD&!`#IyC913X-$7)%xZ)XEH$oF`Zde&x zFV|H+DZgoYzJmI4N?v{)vFT6O>0nM{;mNzmZF#tsnM(e&hU}Sw`3xtw-}uAnneoe! zGt-xwiu16ph*=Eix~Ogcz{@?1q09nXK$JaSvXor4rV%pyyCwbLMo@Rbto}x)GEZZx z*FBXJ7bjlY)mj6iWR{V)#JB#GKW<9V_w{iUjv2jseaitQ7jCXC{?41`q6Z1XIp#T^ zSmb|3PY+GDb(-vP2IBNUnqvAE9Cj1E;1gxgg=FV-A`iK*$f0g3ogO;$m|y~C&xP0y zBY(xfuV-Zz#%6>mw3GJy)vDhyU8zea#ybhhEndw?4-aUZFf-)Z)jYG+5i9CpG+EUx zJ6yw_>!94jrKH+3SsocADhC$vs!&lLL)-0B2A*Db&J4r`2qY2qpL(d4BO}!FP3Y>o z3l^Vk3){P86q*-_Fvc_#Q;Y4H=K5eU$BQDN&0EyKfbf})SG{oQr#ai~t6z-wl(Wa-k3Bp{M;p11e8mopY zioX&I$eo3;Jn!Cx;6Z^06c5VA?p-SC{r~rqW^M+i#PL7nh}V(5crfDe-|_(DW?_6B z{}XFq0s*#I4sz|k$>-xSy)p2!0P7h$p>Ex=(BrU*I( z-u(5-ftf{^JOok{{s_0 BfDQlv diff --git a/BaseTools/Bin/Win32/BootSectImage.exe b/BaseTools/Bin/Win32/BootSectImage.exe index 7e4bd4dd16ce385ad47e5158ac5ed8af3322bc93..a2ea5caf229f039e00e55253d9fd1599d02696e0 100755 GIT binary patch delta 72 zcmZoTAk}a{YQh8NTd$rpK5l)?*!q~M^)YknW0tLtSwAL#gtuQ$WIg&oz$Gl|;2}Lm cj|ok$w^m4LOy0i6i7i%^(Q-Ri0^2ux0A*Yv$N&HU delta 72 zcmZoTAk}a{YQh6%m&S9Ak6RxzwmxQReazhYm}To@){hAw;qBKGS&u#t_`W74`VTd$rpK5l)?*!q~M^)YknW0tLtSw9AVgtuQ0WZnBfK%iMaX1i;L c^Jo4tLB5nHM(qvdw40Jd-P0DOBRs{jB1 delta 72 zcmZp8AldLha>4^<*T!>=k6RxzwmxQReazhYm}To@){g-o;qBK0S@%8=U|woin{acv c%R1?&k;b3oer#W2#Fi?{Xt13tfbE++01iMQJOBUy diff --git a/BaseTools/Bin/Win32/EfiRom.exe b/BaseTools/Bin/Win32/EfiRom.exe index bec9d9bcc2115038835859a96066d44fccb4114a..306e2da4cfb73474342196cdd337ae68120e8abc 100755 GIT binary patch delta 72 zcmV-O0Jr~upc{ao8<6k=+v?g2cAkp=zW5TJPa eBKQucNS%FdfI{K?cemtn2AwGZIk$qG27WWMHYP#< delta 72 zcmV-O0Jr~upc{ao8<6k=MS;$N^M&&Ph4TW1^8u727WVP^(AZo diff --git a/BaseTools/Bin/Win32/GenBootSector.exe b/BaseTools/Bin/Win32/GenBootSector.exe index ac0abfb5b7102e07fc890d8cf221ebc360ecda28..c87126002e8d6702dc706a1cf80967d1e2e06fa3 100755 GIT binary patch delta 72 zcmZo@kZNdt<8 delta 72 zcmZo@kZNd(D7}*1h)xWHb0ei)J%< cFT0XvQeXIC`t~gbY=(-A2HT$nvPtOy0MjEM&j0`b diff --git a/BaseTools/Bin/Win32/GenCrc32.exe b/BaseTools/Bin/Win32/GenCrc32.exe index 3f4c4d8ab4d89879f711c614b26b0c9f245fda73..3d21de0df4aa59a533a333fe271cee0d730bfa2f 100755 GIT binary patch delta 72 zcmV-O0Jr~ufEs{+8j$b<-sg2cAQ3b`|5P$)j e&hVwTPOR0#qsIB;BDbtE23;KiIkyT>2KFzRJSCz4 delta 72 zcmZo@kZNdDE0)}s#uM46sE^-DbN cyrTEz%&Nar{%v1l#1<>dXt13tfbE+;01)*enE(I) diff --git a/BaseTools/Bin/Win32/GenDepex.exe b/BaseTools/Bin/Win32/GenDepex.exe index 3f7452a38c81030c98d1f7d0c7dffbccea9761e8..540efbdd3bb2877d48463ada36b19e00eccc476e 100755 GIT binary patch delta 15818 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ⅇ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

keSCB#1fM0mhj5zkUc#>|6MmNPBZQwLe4Ow_ z!jBTZMEEhnmkB>k_zK|@gr6sTl5mFblZ3xTIAeWJo27m_x8%9~WiHq9CV68tTb{a} zy*lfErSs6rFP7@^EhY zdU^KdxK}D)K3(*@mpo*?jN$;4E{_!!i&Ng^(VOM#h5Y5oLh(jvJ}Ynd5Wap@W_E=w~XXnTEK38I>Mk24hArwJ=D%Cqq4Lo1V^OTsfCB8P$8E z&d6xW8GkO*hXS3Q$OY(zcaxp|LUwl1yVGrMWVK}P=gQt(CNql<*=+WdttVg1G__rb zRqgBzH`3XM1hrL{Xp*zvG~kZ6V%oG~zDg_nWz_61BiWD}wf-nscd70~AekwDiC5$l zFUiRfsyymsg)1)_)V4p>j8 z4GEBV8Bk_qu{^(69?TWJsdAxzsJnh_aUNJ_C|4>g+)b>c@K4FXoLATy%&P0<%aRUA zEYDXZ9}51J)QTUFQ0e-h#QYM6NJ`;!;QO6Ox{!3EusXl6l0piK{FM~38OmKPW{Wq| z`BFKXpOSZ5LwCt2%X>BY0vJC^uSPmHb1?Xo%Zyd z^w>ynhpm&864RMfu}dgI=ws}RBym&4f@0gbSnlvTadyZ;mr(j+tFZFz|Eyk7mwcoq z=N5J^<02;vk>&jv8+dsp4z9+E+^Si9tCqL&=G`!{b^4JU5t_^|&b!&NM^bQRws18& zOR|V*G;LTD&LmH93)4D(lfH$SH9b(6o6F|iA$dpN->~6OBusAA)HL`%@SP?OOsnkX z4*Am^bhc$WyG~Sg4C}iURo$?f*Xx>N)&J0Xl;VJ2TS+f4HHgs00v?Q1u!60!O@laL z16smGdtoC;x?)dN`+gc0@!(*1;apdN?cO?dnQ_ghs$9sT)@j&Lsn>Ed6L+0V zSc!|38nDK4dwwH-7O4qtR<8z%4%cB5>+rNyZZ{Q>%TIr_Q|L@x%#;mfx@Bonr*mv( zj_)JB=rP#l9ahjLNdxmD)J91G^{ZQ%_v7Kb+sw1=d{%4U+#GE_=;k4>NxxAW05l2)~iDu`)rTt z+r4bWvvI#Sa)4u+Q}2em4Ds@ta+u zd_c?`40Ve&nZHj&rsg5YzWmDFidk0P63>RF{b60~GI{sn_Rw;XcTdWP@^{khW*v?w zesMDpa}J0v$E_HkB=PZ8ursB7WFnJ9q{&<5#>SF+OZaHMP)^DnU(QXs-c+(sOkVevlBIGnm!D>Zcb5t>oz*N_a;o5ZNy#H5 zB`24E8R{QCGtqx0HI|%PER~bjvoCl_x3GA1)=Mrd7RsJ%Qn9d@mn|wE;!ECAc5Z&w zJ5llWlgZs){_tYyiI=V)zMjpOc9$mPHzj+G`pgxI9`ZkY{Ndv$WG-7yMytb*U-gpn z#lj0YS9aj)`bn-9M6_(b9Xaf;OM5XJv+k;LSG~xb>AadMXC~5v;hYynF~dfN zGI+olJ~(my{BwN|fD7rx+{YH={K#NxNY29X{>)&%OwOkI2U8B27D*d~81Fxo85|pb z$PA`Vr-xHxnN^FRo(rZp=L>c8X23a$BDfaZ8$*TZX}M8CCA?y>P%L8~bb7=&-#?xi z9vRP!O^l9?IOC~7r)RAXpC0NTJFBkJ}Ek2%NIYTDR2IYOEAU}|_geL5|BzujyOoQLqveO2BW9guGfpB~Aa zNe!o*e)Nd*Ff#Adnb*NGlq}`)We4j{31Iu3emMtHjx1BQOwN~T&50~N7BVY;=WM6W zIhHz~&J2tUjSTBN3*OZW^pW{TrY6^brLwbs8>QUpk9Idw5v2jnUauCU4HF4^pm@mTGW%^em= z5_6~7`xd=@QNj*X?dR~Vx01axe05tnykH6k4$&VC%E4v^EAn) zZG49RF>8zbzgt3S`Oao*lU2*Vt#%XtHm!Qn#G&PnwZrkOGvV`F5BPs)tW8F zl&IKaU)CE9eR+_VF>a;utFp@Bk=(xIgyfJ(Qm=Owb>t2fE{o7!o8#zz4B?Y)il&ba z^^ap}WQOHjcg|yEfE<*F=!lsl4&(|BP`opVnF5BPe|+3YpPCp?5n1(L=uZ#zpBhRL zS#8{2wM`FpSXohHh4$L5a#&mC;N6p*j`bSq^w#w{-MNWmV|%wr_bwPZh`Czs*`DpF z=-CS?XAI~+=-jq@t#ccHb?0hb+U9$!nTfc`^PppmWj!kBDhIO3hf@zen>Nu6! zzPUuDG!(KYh>II_c-ghqAu6;9N}cYX7#a`tT?JVI`cMkiyMW)6SD5EecH+yF z@!YkgVg~xOdkx!$Z&{6NTQ{^{obU4crQ>e)ON0(7Q@Gqc)Hj`Xvv15UK5P|OyoWlc z>uz?Ap*;};$v50Xz0-X!^iIT9^yPJX$LF49`=U*L_wD!2gr>=ofi82$=kN7o&YQh3 zW77HU;L+rN!n>)?s~0l~u-oMZD%zP(DVpCcp3U=Yg2baUO=6}QABQ6EYvSg16sqpa z4875UzgDH-Ag?O?Yb@Na)(y#|?TEfp8?H={w~n>}SF|OMTQ9otI&Vc@PgH$t?QRSZgjmb$l@h;oh%oUy0mv` z7QECq-lTq7MNYKo{lTj*eK9ZpOy@l}`S7{W7y2l1eRB0ua-d?QVnOa)creFtMPyUu zA;E-pP77`Fcf-56fxKP2UV~9Xx_4p`-XAPNyVcri$E;o}X6>qhJbb(SzgOPfE_Yws ztL!CzUK{e77FCg#VjGFKp1K!EUf9s^r#1qqzjD7keJ}J&*xd4?_Ykpr=5BV5;UPno zr=MK2Z-6oyOy6v(By|l|nZk-?-%>9|12S5U8T+<(3);86Qv~*Hu-}p7=tWSynK~kV zTBf+_6h(qG#0JR-Tk62@r-d(mDEeaJ6<)M|lrfuM%E^Vt#H8Dx+ky@8pTP=8H?2XO z1odnRJ#Mgq$4%noLPMA?p+AQeMfxtEENKCk+|MP`gULKObqctgVWCg!(N>11A3_-= z&+5Db+1`T$Dzfn834zqJ9yjxdVxAJtJtzYNd|nwKq)w-y2G67imAzzu@nPwr#AyD1 z$p{BF{m#M$OhRMWsw4=%g87%!^RJ2e)wYlhw3kAWR;xqJNocQI&7AyLJUk~QH_>ed z=9Q-=E^09?m1&fkDkqmR${=$xz7m6-g{Mlo!+b`-HuG9s^^gTrkI(+!R=HEm zbcva6-2vzpOPSC4T?1A!f#U``Zx1eKHlq@y-wRc=7t2T@fpB$IPE*%7+s#{l_}mtD z=2osuUEgih>buloaqJo`WkQRptu%y2v1Of6Y-EmBHFk~bj@|d!w>@?ZFouK}?xQwf zW#;-9wtOKzvmF(B)Xr>&nIVeUF1k@&S@sUt`(cb4QN*>FWQVoMdn5a0CvKlyR%j_n zEVap2@XRh`qNU&_TmDWieFYYOhUNQ2c@L~D%lC`v8rey|Ay%4nZ!R}g?ad!ksQdfH zW!e5_vC<+|TE$A6SlJ|2+QmwTDDM-?t@zYRr&#V(-Q6Y1eYn8Plju4wiXV*One6(N zZjrA=f2^ogx*s3zUD*tq#pM>U+$@$il*IxmPT2L3t?t2zzrbzPwdm`cF?T?2A|2 z>Rpi&aT}~X0DnM$zcq%8p%aYhW0f1t?ryyTa`>FklPLdMC$3tq99bG;-qe@VCCsjZN= zlq;1_C}T~KB9atkpffQvRI1g$UYBK^rWN0{f-KNY&Zc#^@#3iTI+G-BsnfBt0~kB_ARGJCWZ&82%R?B2W1}A^qhB- z1~CEA9!j5b`sGG&V5om=e@yL;h8JgN^&usF3>L#KOS)PpsROVTN0{1zTmD%m=LRa? z<9`eGZgK+(HRrgptD|{X@KCmU;4G|iGU?%rygf0L3K=-^^;ADpqp&1ALs?4jXz;n= z{`2Vp+On;>n@K(EJdeJd7TR2nPsg7dO=ZT$o%HaT3|loi6&^O{f9+ ziX)>mXGDL8&uj5aTfpv6k)bUs7tHii6UINUt1i_9#uSRRUaKp=wfi?0EMWd-SlEcW3dF3)B6!^g4;@sTL2Ltd}06r9e59_nM zvRvBA@ldvRExS0Ye=IF|<9v2WvSN#KW4V{q$tYB4ObJ6`st(E;Q?hjfI1+q1JC~ci z=^qmw@DC%a9%Z2lRHbZ`c0ix$`#o@v@6g<1oelmmAvwrqtIuk%8e(0Nque3??y!#7 z2`dqUHQgb3_rX}Vgqvlaz95&~!~M^8?twPPaL8&Kt@auue<#{(*UI~`DnAK(YYh3i ztZuu*+G%g9va78X{D;d#AJ!Vj8ARUP;@QvFvc1FMNW0MoId88MD{l-=U z>-Yzs&crHO{Y-4ysNl+E$(7hsl4*%H!J68dFW16PJf^pKlH*>Qx0Z2K;<^Q< zyN0B_Rx@gnf4!A#6o5uDWIRY!dN<)XYw??c3|Iqrb;*D=1jiw|Whq+bSqJ)$lNPlR z2F!*;Rh`$cJtybQice>Ng0riC0T3&Wu=eg4K`(;9Ts zPO9T1axS7kWBws|Z+V}5(i|C8ND-Jq-DUJFJUg<~A>yzL0!54Z} zKj=BoYcKrQ;3N<@qgrygV3_`^HM#H~tx5D`508&+lGRfaqF0wnwksx<{#0-V`~gm% z>4B(0f3NngIT$U>f!7a&&UHZ`qV!A0wy zXvHo-ZU@*I&)btB%s~4@o@5BPHs?oiNl`+GZQH*d+mDHn=DK6p$ht8p^u-Qa6yeufAryWrt`SLV#H@;j>;5Oe4EfhY015i zPjo(rBwz&f9QI2qIVpQ`hl9?JCC&^VjL1tq3-0;ZcFnJ;8 z$MC|Is?1k)4a;fZ*VYG6{3>b^FEgv0z6G4!BpC94v?DXF@WvwT`; ze_@OB%cjZ|=v5sqL058&LaYf$w(}Xh>+>NTF7ge!lskP^{L8Y?XMq1NYW$z5X_XXq z8>#PBE1;x%?0~vm!0fADnN&2ME z{ZUll%VGQ?dnMJl6%&_Z0V$FwuBrHSvF3$nBH!&W{VwcWPR!%(+=#x8HIHmv%& z>;uq>Mv6`vMd>qkcpO0}R*&PRf6#p5x$Dp9503SLttSNm+^?bJXLh7P480j4f>>0oJ4`|-hSKItvZ(~nX?UX_x$vVRCKe^lLU@)CAt zVP{lVpmSAs1K(3uk|kL&6jiuJ?IzmE1_9XxA2uzI^at}{8){DJ1vNX7lx-tz0a<*I z`$fvrOEsqTeMIF?_=JhpUR!+P<0JaeaTRQGM*E$yl#@w0&WJ-gTYCG14&+Wtfy#e9&PBP3zDhoeJ^6!g9Hk(FAS^3)Ct zSpRyqlr5KwYE;|9g^$S2E%FQRGhZ0E?oHj0w^;4IW<$Z8UqkY%NIqw%iOl6w8#XmK zvxmp&5)T2ARHgH-w?uQhVI$(A2 zP*#U^P!gkE)@DhvV%8q5WWbTGR=dIKuqC0gw^^O?ZZi*ZHCX#4sY3qM_L;SnsM+XuK{^Pwzy;~lYJ{r{w`Ie4XK>#g|N7C0`cHxv7}M8(AZ z+^UHkQmmErX3r8!k1Lt`gWQ-)k{Q!(LITdnXP<1kFi<tgoncfL&;q#Xb3=Sw9&tsz=$sy_I&c^!sADUAE+lmr)E38UeMJYzz)I0j!s!3=SkQM8}IL#&G9Yg5BwGXbtLaa@(W0Q9tn8GzD|E>{|b^%h?n>b4lNitZvR&3cIlia z8`0o@u6*a^?9Ts`h5lQYJq-?g0X~d#LGlzuMeZ1e7vk?wb7<631vf2xuj?3T4@`HE)wy;}d z4v2;K+m{^@4l)E0c>HyjQxXnnf57xm-?3NbvZDKE#c6a}T6|l%eSW*)Dq!w7ohy@t zqRW}0(q7LY0!ihm1KLhvm#x+D%IBYPE9Y}+PL~zo!r8@UA> z*9G0{ehd+FgZ6eUp&KI{7H12}-HHTEnPLUI4GX2rI?LXi+J~3Q*^ zjf77_GLL;b*JJ3MX3Gc;ZG&>eK_AKOt)>;er-*xRUjn_3m_B5a)l(La&0W`{yC9E@5@sK38Xj zxH@Z};^8cK&y%Trzr5aWfA1!z*H)dgi^E}hujCVV$iLw5_Jlb+TXA^Ju~zbjt=2aB z;oBkqZ?)l{4;BjK{a7&ogG zb#t{CV~3VLtSQF$BE=ZVRdxMhRWU~LHHtBIy)uDaleVrUu~2l7bZA`(MKuB$5Q+=) zZdEGRw`E;Qwe3|?suPBElH{flr6oJ7D04ufb|Og{V&y!H1SE>2=}yxc$rg&=1g$BC zXiXIff)Z}my-Ep!e@!~Gn!-e72q49gsAFYX9Dz%=3}LW1QJ>Ko*A-ivBxPdy=?sH4 zX#IQ0p%I-njT_cXo5?#r&WT|rTIkeg63J)9omWv}8uq)cs?grJ?+UDm@k|od6xJ60 zH=2&QCaPNO4N*U7=_8xr-yGRbjaQ>)Tql)YtJ1hj1#*fUf6`|EeZpU0Z}-k^BoJ z-;3n?kbFOqA42lGNPZ6qEO!-+iDQK8kU-f-(JDD{f1*g|Nj!Mk((`J*Sb#^to60u( zJ~Q2nm6_6ghFmB+PnlhYiS&rg_NqXS*uhoC45NrX6f(>|!(}3dwHgY`tl<&nsuZu?cLOGEjUnF?p7+?5u$kBr02Tr2$9|81X zAJKd&e}X*jAnl`_KS~E`tCbY2uF6kCJQmk*yw2A5YHOR@8xnE;>`WvQO^JrYNFw~N zo<9lsJovYR_Y;YZ#MMM?qCc@e(VEztcqZW_W)qW%wnR-6ZIPlstM63)=%a1xg(m*E zbtgj;$JY%_d{Iefck#D{5r;b=fRoGlA`dqMf9QrJ4FH1_17MtD0KJS;EH*k$v9}Ka zsu5VWkMI^mrbf)%{k+`HM+XS+AbgOpit2laaFXz0!n+6`Axv@K#Rmwh@V-Y0tMI-L z5?0}Tk0GY*ZY&DYVTKT3Xg6AH(e8@gFR->8Ea>2?JYW!ob#=FtFy#+O253GFF-gQ^0lM z&~Ia?w(?qS3aVKkGr$>}PnLt0-rQvDHdxrfA#G>x2H+0RwOeuR-UPlWo4y%QTSEa& z1D+Hon4AL}&?b=S??9XW!3AU`bMdY!e^tL%qp*?@dQYgrtIo(`pQ$~xZdBw|(KlF#4S!Hou8Urbmf+dN8exttz&z7 zcRRM{zli%5z_%N_^AUgkYr)=;bz^s~va=-;_bk)9lyvai9vtg!TD4~xn;nak@( zsfz{3L;Ii)bYsrzh1t-P06TscJs=`Gecv$__xyLdv#>Ax)wu7Ijq!%4?YJkL_tW87 zAvxMVaIXJMsxs)$6-(TkzWYP0f8lQheS41uMyTl9dpx!e#TLJ}Zf9<+W5p`*c{Z*y zAinv^>dw%f6u~^yna=pN%Fg&DNG+i%pM7Tw8hiMZ0xV z$AOE~XVhsYaF$X4f&F9BoKTGK>j!cLwt?6jM#=9*pq|Ct0=*O~;)(Md3xUVHp$ z?>e9335uMrfT}X&&I~R$e`3J>bBpu2Sj|6wOBn{2RM@Ef4F6h$jlbL2VZ7^z-Ns=;-;xr`Y zdY!~vo2p{2n!t=oWj2_rM!tsV=fT9J0f(B7oS4<7BjW%Ce=duv*+o`(DY}g*_y<1P z3tTPy5t6S&XXG#Yb*X~$Hg1BNqr_piMd_NrM{`Y+o~JvlJ!+21`PxYvxm{J9Bm77u zHvHZVagGoN#$4lp?=@i+T_atp;A)Jmj4Oy{R?V$}j~i z$I?Fo_87eK?Z%aIt+B(X3105S+2(pPLp~uE-p2FAya^9&vB0#kY`&?;ACCk!Ym-Ka zc5>AC1c#0*veF^I+k`rPj5(^0A9EMk9n#{(N@!=1ZP(rIM{YN!;qM zcK;-CrTuR;gQ~!L01Qr)@iB-7kC!PO_C}ojMZl8MQBE_u_9Elc0RyKRy6v)88$jV_ zmp$CaKzq-ik^R;h%jR#9+=l51C?oAJQX#XEknCyQ3^Y91xlRUScT%;Gb7wLW!|4p{ zMU;uhf2+6dxQ2EF)*Ux+nMbmKq=W>f`N|N3DCTvRAuRWqaSv-X$q}Eov{7H6ji5tZ zC?gtFt?JJ<`DZ)y`^Vj#Q0gCt z^}%lW=RP5SkGp$>yI1~^W!^78uvK{5=xlNyfgM!z?-UXnx_!dkFEbtx?m_wIkZ=#n zfBZ?|9ue+U{yspHhTXzFYK#gVG)4u-j8VZu+Ni*Nn7}^aK0-hiew@I5;XX=0e&;a) z2Zj4M0r|-j1P%-L2?FxdCkZ?t+$RYf74B069u)4=1da*!83GRpx1Yen!aYUc5#bIH zI4;~l0*?weMc^^vo+j|PaL*7pA>6YBf1VI-n!rinzK+0?!aYaeDd7$gcv`sU2|Od* zVFLZa9U*W^xT6FHg!_5|gTi$Pq=Y+0;IweZ37iq`1c9@{y+9x>+(`nj6YjGF&I$K9 z0z<;RNZ`D1FA*3P?qvca!o5OZRJhL*c)f5l1RUXh3xP4=W(kZ7Zvv(lu)DZGf4EP0 z`#BRPd3iv12YLA{FAp*2bA%5QzDW21!j}jiC48CiF~U~}KScO>!VeS95PpR4w-7!~ zI7|3Z!dD4DMtF+wy!Z!#%NO+cT zKjAsTrwHc>4-hU89wa75gsA@2EwC+mkGa~@CxB^!f%9i4N&B(v#z0D+qgWXB0_Cr19zm#eb+!? zZoZKB@@4vr!x=9nOBq}$(e#G)ILcIK%1xIBi@6uHAN$PM^{iWXk>}_$e^s376Px#s zrId?P<)D@3G-Ig&fZi zs}`MUtbfSdVk_ijl}zXTf109l6A+8^kE&n?U|%p6;cGN_XynXD330gko<5N}HIUi= zbl;`^!xyg{+@Fzm#>NLT%cIW7>oUuTZ!Vw0egBwzk{KKtTF&&3$t3k`YX8#|s}BtD z1mOVLi?N~f@HzIq90%p3mUsA739MmY1vA#yZeXQVLG^)M2a0Ocf8s1?f|oU{?)R!p z{vmWXsf0XhxPWq@u2Y&JlT0eTIv#Q<9ku+0G54Y0!iI}MN&;D~eg}i=AX={T79_WP45}>l!3P9}e{}!E(s(a(Dwod|Zz?S7 zycKVD`jr}3ER_p$#zbFn7SU4!EFuzWr7J+%seHM3bF`4lmw9@iJ9sjYpDkqF^qkyH z^ARPT1BHC4TwKJ_1Kwm62EE9=8g=iQw(w)+bDr)UwOEw7pK7|Qnan_)xQ=b3_v)r+ zsVUXG(0tCne@mU(5BOcdt^7pEb5Grbv(jdB&(H5#J|$9Of|9a0G)$JC@ubjBjAT3J zy(QIlf+1(a?8WeI`tH~%cGd=N=U(GaB~7bl<9N}h1zP?%7PWDt&=jGL#{y}!vhRrq zm&=rYQtUal%1k9!BfqKGfKMB3ml7dHmy>TGsRLoTe>cv|7OrMz?}EK#e{IN`C1JPn zT;n}#GkI=3qWKTgW^%H&n$6_xbpMZ98);?d+rwyX`1w0C6lm047z)+Av7mX=Rfi?Q zB@g?JES-sJ|EYzcP3vBz-rr*Mv`R&#j9ZCD?vE(e6&_(zY3}x8mex#^(Iu5p(9Wj% z2U89rf7+c#l)Z{WzZ(|n)r78!G8(f1YDs8?_tv}9iT}#)#BEhNalAi0bl1Dk=writ zS!vA<#P+PsbYLN|%Ak6g9b{Z;PsiAMnOI;}U5=(t(dTtx9z~-`kLOQ)7bhx znw=cy0}I|O+(!w&4LX1MrXB!41k{gF2Wy!7e>|z(vI#B)Renr`eInGWUwTW-kIYq8 z(PLR325Lzd(-kWH+(s1vdf_cGU9~2b@ODdE9;gEQtZB0^$kSD^s)C9r<~A!g)|<3Z z0$6~!Y_?UVnF0e@w@{T@2lpUyqOa6x!-km-_%~XnF7%dGgx;sa%i_DAWi`4?H9lyn zf6-<7sS8CI0~_@wqsYQxvw&L>{pO#WH@k(h)G7Tn^6OH%SC^vV&knPc&8CzG>}j*D z(WN|L2c>LYT}nG&`yQ6kV@g>xrSzCm-W)2WXH_ZXUcNRN3;JC-P1#~f{53mg_EdRt z(MlH#(-O&x{hbYcakHAGTc9dA8NJadf9K^}V)~x@810vyj!vO2p&zd`fl&K;KZN)e zlbsV@&>5RK?uuUS);sHb+LUm*#=S3;=X8x8&--K@_pmxL$6oWAiO)Q9 zU$9HZojr0;5-O;&y3`nKA9QSLe~fN1juJv0^+DI>_9;siD`G9xOlzqx)dZmj8=-?+ zZW5I}9>fIS?|WOUnKnCq{pbK!TZ39{R}=Xw3`=)Vln&QM=G%d)^X=fOW-9CaL+q*P zS_P~7y-Kj*zv&)imA<ex+hSghNv&7&{`4qRJ0~bZMi=Bdpm|brIZqux?%4`{i1^`2e&2 zS)Cr}_-h;GU#Rl*tvkwJ=CB+SGY_G$z^3g)ne9ZG%1h_-iQtaKy6mdgFFtHO z^K^ZH$sXpH+I^(@h$8&;e+t$Q;BYJ7V6G67;3ynob+2>+CnFyCaeDBKi_PwXq?ZAC zZ4pb)iSna7CS&OAEg1HlVvO(_cw*`WE_RQx0UxP1_a0(p|G0kPBlW0b3)IY;^~24w zTzP*IAs!zyHcoWirM<{JOl*2Ip^@~%!PAp|clfvHYil!_uo-QrfAYel`v|-1aV2Ma zTtp6;F^CNmHW42tzU2uN3lnQUX2_?(a~UT!l!D6klg$-wrJHoBBBMS@Q&TS)}?rkV+i@N=2bk@WC5w?z}fLnHlzne_So zGbv^m7#SWLcP0kLe@7gpCQJF3V7SkZogSy|=*++XRSCm|aGe-ynBgQTFe&LMI*8(k zz|f`@)43Ns<=7+iP(@4cuXtl`se038uO`#!LrLZGQ+f7IW{cj52KmaAkq_ZN3@;g3 zO%C#vM(v>Kg0&C}%TJtGjg5_hPTe9({keLNbF;& z0cLos&`M>Ke;c(5V_v?LE6aJJLf>uW)HKoESIs5o+prIW(Yn&~IwJ$A zu`xMkA-m<|&V*+^C-&&GI!b&AjX03O&)yQ_ppS7J9vI{-c#_72tYPwj!DMjiw6rd2 zD6NkgN^78o(t4_y!lx5? zCV}bU)4sXiz{J@2$a&vGl=D-_{b3}(=qopP#`4WbTznBD5DGJER+;k?$on>7^dfUM1e{toCU+WD%>g!D?-VY(KjMA?7=N&@9$^se1FsiJg2Qp4KuQ>}dqy6LKDQ7st z&t1#q-R$hFQUuU?V|-*}h^sKeVUnFc1`oD8WjBLw(&^y)AW3A`S2+t!@tgBkNMOCL zY#0{jmAZumeF4vCz)ngN1gxdWdtm5(4&Q>ce>)d9a3M7>aebkpYcbB&UnBV)apxtl zFyVY7km?RfT(>cpZIjhZ^TPxWcf#2p4g+oR-4-EKe79X|ZPRx;^k2lpSr1lM?bar% z({7Vci?!M6vGI*fbcNf*z`5J>Vekg4UZ(fUdnb6}b|2sFK}mMIosjk1$|K_)yx(oB zfA`y|(r>l4+Dc@Ep!MycdhUw6)nT_=d#qSo*1_(OwQ7)Gt(8!Nd~c7ebvN^>koT)) zci%25lqxT4R@p!Mr1k-ZtA9-GUXO-$uabqvi^muYUWugKm_CP+kw|Xgn2^7d6<=}V z`uW1kVJ(abHRZEqWNUJeqpQO~KOQ-Pe^iOZwpKwHfDOk5bZ|FBgC=HTI)6);?8_`?*}L5zA*%LI?&hlU{RIW~ z>5J?3jc-w!uk4%Y+w7Z|C|=T+Gd#BKDzk`7+8G2oY+4`T4wF99bC8HA%c8edp=I2M z@+9NiH?$)gbVn+?{x_nR=`0Q;JuCOgPv6ZxF}^ln;Q6kN=#S}F?2q@~#s1)V(C@uB z`r!k2b6yy(II!mZm-j}meDGc%Pa#X@_um`c@}ZYXEeg5Zs}2q!5%5j<*Z>KrfP0|pf_gg4mtq^myIqCI0{#{ zc9uS;R>-H!m(MN^PyuO|ATJIs0cn>{FAg$)2bQ*WIC5QS7I4l>`#VWub4BI;wZdZF zt;7Zl+V;`)uz|KYsD=%GF`|*J!~r}2{C0x~Xy}q!Qs>8J3om*_q6R88U(6Qs3O!7| zB92gK0m@Hma>ujNj9X(Ar2_@mQ~2WUpbGU8QN>>XRh+0m6%GCm$ZE5_)7oM8PsY6zOqSUEJvPmnRf$qDk&cJnhjTxgKsvM*DuIckK zg4&m^ssWnR-Y@kSDNGFyZZY~QOTd5EOry4KjCg<7t|^}|h^9$rvKF2Y@^_8HAN0ic zvr(n*e~gaRANgyZ3;In+zSU4{#`^V^%4*@ps|;qN@a<8sS~u8hA3j-1)`ygT!3mBb zBH;QSCCz`1;3j_r!PNt@BB!r>g@f;P%K15KBl-2titn4VFo){3MUs&7lkEbt?lT?f zN{0QE6~-O`9CAUZaEO|OW}^PBny7yn#U$l=GYu0Ob1cWrhkh4GM$TKc5M+kIEA23U z1v#dz>+`l)csq@CYmGnF7=y8YlBMYmoU;mY6m^Ae+;x@I-UW#T-<5~@4$OR9fO zF+$il)QhE^pzwoNHj~8Hg9!oqV2(?5Sd%(>ZA>A)*F~04gTI7Gd>ayq_&y^LOdFPGe?AN}QDcy<+l`KZUL&OWqWYbSHE93No#D0w5UWl{0WJPV9<*xu=%xv=v^q z%Ir{=&nhYJF6MOfn~{;>Q++O-N5p+Y!{L$fO#g-c^bnlCsIX077%I)KBB#O{s;qya zM*7QvjT9{bN5lTyXx@Y!x}L|5H&rNVzis~Udzxy@;n|&*JGRN;Jc^ZczmM|`)(2%i zNTZ|e^7=lq`aTtSbvVR-NPFR{&iUAeqL0?#)24e<|A;y6I_7vZf;mRh>mUs|XTta* z`3eZ*Y7}97%tsirQG`MCFrQNjDurCCdK)%xc~#zj5{Nv6>@0=r>jh-d?N}ycHic`=^+`b1U$V9mk;; z7<$%VQo+PiodM73JKV7`$H{!N-bU+dHRa0<=B~glj*H0_OaG@uH|}3H(mc5(hg?eS z@!}Ly|G9-v(3_ioynhnXs+fN`Jsw(YFb=L^+iERI>y>m3ncB7UdTi=@g#QS|b_9>) z?m|E6(kJ||AeDSzB;-KckFJ6DyI)PUzWXC zRg?FMint-*WQRjSydO4;+}UFpnOqPDf^sy53kgK2fruHCx2lGT?kTq+ zVboxfvqY4ftsC=1gc|tC9*TL2libQ$^kj7ONKZd0!rXMoZEZmM zcm|KB@xFv)BM#!#$-4YH#<9mA$8Ek|smtn)b(k|aSb?2pG@V$*Xr7Cy7)dGyN-(CC zVb_csBJI*-LSIg+QdTrCt8I79<#hN`c7L9KyAfP87`HX@+ZI^ef`*dgJ(}j22_>7>x!DK@e#S;CTSTNW9Vohg8x3lC`N$MY%5Dcb9Q_m_?`hOWIqwyQ7%!hDb+W8Z)hFpR; zIZ#0!v$URqj&SqJoq=&5aoe zCF}J2ARo_a^3g6y#tv(T)ezff9hQGvtt~te-AjUkQ`p!lHS=UQayRqdcDbc$CxnyM zf#?P2rS}BeDgSis{gvCPo!0G=pK_hS&OfHOitiV`l+j@4L=-#wtOfUfPYOFXtbv_> zib41)u=CP!B@sMA1HuSCsMmocH%qd!Ir84ZhsET=8S&~-%2y+tN?jDC1j}35`jBU# zam=UISbWYw+b}Lw77iU5RBVX2Tr2z^D+cGNtv7kW+;)y_zu4|oBYUJZe8YZ!d_y-y*r*vjf$zzBcS1xQ#A5%q$y9r>X6>kT(|*Xhm~nz1 zkw(;rrBRE4>&{x2>#78<1BtE&MZ|JY5$qaF9J+YbAa=_ke|E(OU^S@kC|Q3qotCK; z-fltG-&i5*C*_u8T9fn7k!fiSLSxFQ2w8uvlJ&P5S$`YF8j^H>Yf|29#QC+dn$1R# zQL9)hwKHjtbcp0*DB);huWh2tzfH;fWyVcxXuDD+fIGNkO)e|RNQX89QkLT2lig30kZ04-78vmi#JM)=mxN zC@=Aw+zXq;E{u79S-CTO%0?NIK#L_u1xRSH=%`c}hiTcD!kBK4JgBiBm4K59A>RWAjM;14_@K#&?PUaJ=FH6&J zY>vKh)>d%%Y41ueAiO47$zC{K1k7}1r`dt*jOoh+>wP7E7R;R_nLZ8|W?45~H9~C^ zokT99D(I;sxyzZ|U=sn{$635Ze{g0G{CmnWO7DpUcRI*<|8;D6i{kmz)hM*O zOYR%ULaJ|LBQQEJh;JX^=ku(_t`gi|KY!`yl}k&1%g??m%;OhJq zlHW9pXF7jv(7TphoGr6RF1)ItVz*gholvo894B?!RTBMmRn^K*7wX{rHWG}7^EIK3 z)096)oO{n}(Y&&Y^U|dYm?!c{&tgcT;X5sMEOgZvYtqiWTCI9p-G>G4QM=P#eeUj%&#)I2>tl%~ z3CSTIlbb!sZ58*ZiyAQ&az07?dC1m(q6W2?P##BVIz62)6g}118|(yt3Xyav9PHie$|}A&0fT`=DqVH?-lnQP#VHRJD!7`PuaG-F##vb9H!$Kt-1nchbXWsAyaxOVuh$%$`a65e&P3tK=9v z+dnumS-wv{@|!(o4$F+lH=Xog3SI}#s({IVYH392oU}EzoET11UiD|V`(OOs{Ov|n z{tVvuERuhXA(;OclD|dr zzmfbMl5cQ+VO=GVG$FwmHfIxm5?IVS+mXQH&PgJHwT^Q?lKn^yAfX}>Dh%f#Tt0&2 zI1*~fQh=gSpA}k%X>dh&E+FV|6bN+~=|AC>KQYTa;wDK&rt|}G1<|7$HL5ouIDtWQ z1WuYHMx^Ccq~_c!8(3ufa4I* znym|BZ7o|=YXsKcemAZ7O%6rc0%xK8UWVgoy$OYr)c_4P{p3IX6#DuBJbu{LV-!Vi z0Y<%pwD4PHCEth0jcwL##MiEo|LxEdTRy4!MqM0lb?NdNTH9N7RPMuxhD1}ME|Eyo z$h0x>lky7x8WX|4Fs%N6ZA;vrXqGwSi7x%WJ8>k@A^$cdHYJWH+7q$FKTXt=Hija4 zulsWw`6zH&)opNf$baBPp`+%hG8GnFQqqeQF?lg@je5D4DSdkGVjR0LNCe{kts2A# zmwT?4Epd@&N#%o!_1KF6NMNrDfCnW3G(s`~pa}v70L>6H0BAvfz;KWIvx{vA%!}#7 zGgoqnTzlZiRCemR_rO&w-y`l-I=JOpR-SE7XR%yvu5Q>%e#3Gx1Ur|_JMK~HeB7fQ z*m2p29Alj$6uMW(Q0QJgL!rwS;8BBm)TkacsYlJ&y zC9}4l&ukh3@6VjC^l|-P9DnRl;|G?Q)CUn#cwj(N>?0p-6 zb3l?i8hqXj)~C&qpJkU|km^jA3|LjW#5eIo$2{P7Ox$#TjL~A?@vye5gg93}HmVIg zp5tSs=FpFox*={f3~}wH-S6V!4{8`Pz%iM3CPu|bot9!kwEGDahD=E{>y%|!y%we7 z`5*YtYw-YPZ1PXJPV4{GQSxOTS%g|fou6*-&68^Um#7led@n zj40b1e|9*3Gq&C~DvuWAH0eEBd$>pqr=0%r5htTg@bUR*zXMO0N@wYnv!JeH5}imo z&4tCIr~`{dzA{)CEtGKVZptf_)YqdEkc9Z0cXPT40K!D3}X#c%c7Gn-<#7Y|=)} zR&ZTgaa~t&t;~|OcCQUFs`ax@W1HATHJX62&n>kEHbYMqx#P#E-ily{&_fCHXb11? z4BbhpsRNu5qPPHK?eI7XfRGw1t% zlck&asq4i;zOYz&a^&=B6`(>rDtmMD8M)OgdQYBDogZ}mJj%O4kYoF&$Z^@flEPE7Wa~}$K0-0+HC$hAu#bT*YbP8stIi9^b z%OxYXnzFws4Y)cR+(?)_pytX`$kkcyo5?3o5C1I zN>D|E#tvRphCx>cbH$CoqnCjf4iHHttXk_ptjX$zw;@TmJ7PUnoBD}2S?w{zI7rBp z*aN-hGp6rT*ki^bn?=kZXO!f05PG(lgkA5LOGdR^qkYQNLUAg)F*6Q|B%tr=U4#M{I_5S^f7Tc z7FaYa9R*KGEwu_h)=qyyjpTTLhsJ+Fgs|Tc@^^Bn2>x^M$_#8Fbmcl>DS*mBAx{fN zU69f?*ITNsI(HYj=0<~C=`n1%8GQh+N<~Y-vOgAz)N2qM zKdKK!xvG*F0t^U^eH8P{`FE{Yc*)DFI65!Nq~UZnH=8UMk~s0hz(vJE0UD?Bbtt^l zmRT+^Xt3rv%aSD(ZRL;z5c-HpE7vP~#kpMGOTMVqbJEolPk9i^m6C-;YSrX@Z&!ob z#Fk#jb0ud0V3tk2P$G+ePCXaGGJyeZ@F#OnXr#RCE^hPuGM(?nf_xV^6Y5<8tcBBi zN^wQW{#S+O&r3IzbS!(dH21py*m77pJ+Y_q(jk9x@###myR8nA2b9hbVv&%6VO=s3P%w~KhJ zR>W&-<$j^d>at;)1wBwhe5c$~wDVjRkQB@dH_Io@R=kSFhk@0&u-xDXhOLhonCqH~ zYny@QWl8!?WvAqS`i_aHJa0(nbLCuiR+31yAcA=)X9eS+9XWD@b9L>UGDmW7WH_}; z9R=`bhVyNuc{8J{)xJ{HI-nrkF+sA;akf@2CxkP?xiV{I%kFS{8qCM}wciMBBvzUEu@z!}y;hJJ+PJZxyecDEl1%0c zRVwaJ{%8D(mriPR=Zx(OOk&y{x<1^cFMOZq`N-~xD$r%%rkBmkoGQ%C<;seELMKe2 z6No}L?gY~N<;Q;~n2E-5;uPwG8S5Jh|FH<|UZ<77i_O*+#Fjb!vvd*6zzmFSM@-0R zizL}LCxO&|sm7(lWB_6^<8CdDT2_LrX8}OSr4LvLh5u|t;Xfw^_Xw!hZDxknMX}^EbdS1i|F6#L|>G5J>x2GKV9um%X_?bWF|GJm)pF z!JW)E!`w~Dp=q-gGpCq(i3e+a-)X%<{!T7i(IKnzv3#Ry5_T61^S0=3DR^9!d_>eW znldkc(MK?-7QMFuH10k`1%1d^Xd@&P2k2F}kR`2}C=`*C}N~d4^rb`Dv{m<{f0C4!be9U3~>q6kYiDE?r9x z-5t{1h;(t=mW#0ej;atCTR& zJjkP7M0sK(tW3G~{#^IF4_igFZ+{Ld^M;~cU8}D{yN%^he{%9U z5pAE34Y+L*6+OT*gE!yw>FM+2mRA+5GgEYXF9=@p**wGNZg2Cw)4MJ-wj+VbTnYA; zTkf+8l&K%X9v8I91GL&s%wGJs+ZFXuK;A~MNm|HB>X-2g`xZ}utbGx5R)GuKZakk& zz+O+1M32=o#ZQGLZlSd;YCvpqonCN3kHWs6zd~W%+Qzw9K{Iovo8G4siOyb`=PKgcR)?4saek86`rVKZ&EdFlViq-Y z_fHU0>|;L^PPp7sDRwtjt>xf7ynU5^tb{d{66Ib{uzakUWz8wNo7V3vu?hNa4)z zi71oZWP~`|pvR3^n-k2m=m?h4Jq;JbCk9x*`ASf&PE-RnCM=Yj!D=TZpRUX2zXue) z5uYDGD3Hh~kWXSUkJvkxxMS{Dsh@LXpk=tbr@SYHy*RRwJ44KcG&6U5oaU-4?CfPLr7lcjo%QzP@-NNE zKVox5f<;uV1M>#oZ_4lt{2aW@5|$vj7<4V}q4?Ty5LG=+5@V={w*)OAO60H1FEO0> zXpoRxWFW_qs4v6IR2Ij(L{#8virdgs7EZ)#%YP#p!#kr^b^XZD;E2bNbHA@GlrdpM zuQuEy+EH2aCTahbHo6a!pIOUL>3TnFLxt+;lyhP*AMbR#80bs=q^czBL7^wNQe*NL zZYeuhq07!^0;?di{9>X4$#kwFo>!H2YkY}6P;5V~M!&T2eYSjRi`LHH7~<-9EOX$# z>Y&ZMVtM|3sCg+cPu81i)9UPa4O$xMX}UeAtr;Gr z>ybSOPTM3bNgYqQVEX(CE?*cQ5znmXQqnY&&~99_1}I7lz@N9LDKtegv%6ANh_uSw zSubotP;}Q9%e|NXoy9_`)5*>)hp#|V^zlrUscK;4xw6)`VUt`l+uGkce!Z8N=+E(z zE3~OTd%N~ZBHe#{K_V@h9FLrA;Zaqkd$m{PPz}0SgG~1@Y$hyjnKjYuH1`eG*H3;e zwaA8>VRb){dV`Pk?p1!o%>_5o0mKLrHntVu4P`7QZ5m$)E^Rj2W0m42q))QN6$YaW zakv?zYbcl&t6LkV1Kd-jrum1H7$4oOx>DR0>{{!f#n(ue-2pa<-ru6PQ49bs(ucc5 zBn=c66A3WK4+y*mS>oknDM}wtx0(%csj}!$?K7b^j=QxhPh9$k!Uzdh?wfC{pLs5p z*of~p-Y}Y+V33j#_4TYZ5BB{Q!-P}##xG4}%1`qRyZ`V)*;F$XS&`K5_=@5VSDXeD z-p{Z2aN~CAd#UIK(p)9+L%c7!r|K;VY@NRg`g^~_sJs^sOnmv_q+WM4>)QAv3h9oT z%+L9?=xO~^uNBRC)b%5C0dXXklYiVe-Iw3<=4~3XE6piFS~NfA3F~yiq%voAK*@${ zwY{{buStBaMTjkf^rD6Y*7$NL7KU%0yuQLXNJmhDq5)b>ZKb{|KaqSeH+V6$lLnW4twnN95smx@M!}2-~r^9B!i|UHFrC z*XzT)7KYha6!F9;<3&B{UK;tG>hRTNE#l_faS1h^Y|-tN*uB#b&ldgJFeGR5mGf}@ zIkrCT8tgOQ%QjbEn~E`(&bHJ_<1@oa>3jjHCPmqkAE|@~ls{8dkP4TEoApHKE|qUx z5g5lA_A#_VhGgqaIoIKu*T9ke~re%%={A>U$+DzPC z8#i!9BE8XR))~QV&7JLtx)=Ew89!r#lRLRpWxLI+kKP^ath{qUBK_Rm{SF=by$7D= z*|$Gn7M0+7t99&gXDr_~+o3>;I5?TCa%=mAwR0+6r}ia5OOCc6!9gY$?o+&1*0XKdu%nq%`kMZ>P%5f=Z@Gd3e)_(1T{bZ`eD(?&%ZI|AZ zAM>k;tJvDw@+3~yt9`igZpnoPU0#P~tGUfK#2#3W$DP~IxY(q-`LzGp{Bw&04V?kJ z9QV-2Ci;RNMM!jfg=U3?4`aBsP?8YFIj#Ix&Nor{R_#`%Oss%fnv@Y{wBe}d4%-3G zb89667ZdUR`|3{|e)kK`xi>iS>wI^wP9qbbZkH>J>v>EeGM5rFX+^&J12@J#Kd{!K z)}vY6*qKKS?Vu|>Xk0Y95Tmwi_LL~YBJ~6Hjku=nwYQ4T?K5V*h3p*{YmFZ6Vf5wJ zS0EwrI2`ch1#0O=KknWj=a4WBHPu zD_e3Wo)k68qH8l^%;7$u6;ra7c6>6CX14O?dnb1=(i_O{c+u9~?bh&CS8hpg(|2Ox z^49hP)0^Xk$x4Pu<-(-iRWm&zg8P!0 zgY4@YSvS4c8S_X#)*aV|woRAw-7G6kchX~5)2TT-@zq0`$!zZu(FUeg#1rbe%}%Qi5P0ll(xT zRUXpf)1o;?-Kz=ilEEeMVuN{YRD=;8rpz^Dks~f+TM)58g{AcjurOUILuC-ffBCJ0 zm!8PWwcZe81lghzy%1}j8upQ@NUU4>`V!)IHsIm3*BD~Q7CIFE%+UzxT z>qoJkdkFrEV0l0O^qc04u`N{kR!0?k(ys@}e<_}7bB!=_Sv}Gg6rnn^WS=aF>dFxL z@!c;CwcPVtYeD7RvLx=u;Q@;{7T5|~>o+8$THT620p}{wqnKRiAL+5OQ-LEH{TKi zUKsrFB11I%)`I^~@n;Oy@oYwM)kCG2Hs89b8y6eo?~DUZW3Qx_wpf;Xj5Gu2)1ia%sdXg*LMChzk_sL-+wA>Y<@9k+f%7NjGB-}rZ*nn+6t_0ZjEtqOym_{JSQnPkS(7I- zlp5yPE9EyKv^_M6fjbq)emnsE#lCz$PB{#yQvcM{xBkPz*Y!PoASUn?H&YMg%&?ax z<)>o=JqzCfIpqu<(`q8&w+eSv{M=shN88&fyl9rRuT9rd&)%sXB3{Vk-*w)ow5-}f zWYY^~1a(J#?N21!bi62XR=9ryVVhU7LxOt2K&Cf9`aDe%iAhMY^nD<|hijsZ@D}8% zSYDvvAhe7Aa(~+w;e}N$mj=*9edNz-)7AG2m6&@Jq7uV?OH*I;T5bkcCq_V7j*hTEg4}}IGtEAxJ9zulJUp3F zBJrQePOIeZQN!fr;=N@QI#~T==a@ zk&wyoea9#c$2M71npY zbDUx4C{2vvnNfwDg%vBsheSetAU=y^Hk;|~@j32fQk{%%`fQ7*x&62__4Ec^^OMmb zqI;8SC3L-v7=G%5C89Z9e8IlBij)i5jX>nJe0o2-LxzE3#v-{X(-6P239yhFP4987 z>6NTA{&|C-_`G>-)Upp{jLH|P+ihwxU6MkZc2%dYg~i_3$U9#BLwl%Ds_S~JP&|N6 z{gf&;aCRr<53VlLz|@@~9)J%rSpoy_f2ay@`oaFm9!=eqiMtc}XS}?S8i#>!S$f z&D)_rufk1pKZo~6+r{Ff!0)6Vy0a&5Qa1$S_Ju#Td@6}^=Dj^$|EoaAVI%dz#8-6; z>kD9Ry?d-e%@%K z7=D$BYG$+wFktnO)lEc()QV{NcUP`n*iuSRP)NL_zK9kmw70|fqE)7CcQ%(UTzpT8j-SaCg@Ic?Tdi^^&s?I>Rzt@81PvvadW5yY~KF zz~Yw>E64bjt!mCjQtXwTkm@SQ)R#25`RQ)dR-W9qdg&pm-PBV`scx31rR`oXR?f{b z>5!Oi0%_B?S=$tgEK+>?Pdvk+%@->MP%Dn8No~h&&5gmo_%qpE|}Phf9h>WZ=^^skm3?(!xU~}ZLy|)OYyLH z^;hpOKEhBPt-W359&3M*GT)#jw@1k=9%GA{UDAk0d^j~#!Y_PTgH}^W#!g%vw13== zNec8M3%UI4BhFX6%3dLy>raum{MqVF5Y}D%M!|9ZH}kst-JeZa<5{!P57SDkQX9R0 zlX5ES+K!D+HEV?*+)?)zH^0`YxX?+i2@`Xo#<$Z|ZD!nW5!gvD))nI(j(a(?%DEA7 zwkRqYBd`X?kF-oXh|S>rjzrm`?s0wf$MhU(+{EmrP9^=yx^8dDxT+y@ty3XfN9~Q$ z*)8$Y*+Ki5Iz{*nWzg9%T-D1|N?q7_-YeD$(Bf_UzBoIg)X%Jp)n-b`o}H@A(`q?T zr}f|*$wyb&Y;eRvd=wP;RB5HKdL)ebzB3^L;cxBt9%%3AGQCKN*}4v&e3$i|gyy5? zb&m1Wqvm&siTx8Qh>Fm*wS(mQU^xjwU#Mk>j3MOL>jQ0NuY0vNWra<;X4R>HpbnA0 zg8JL}!|p^@M%{##yH;Nj>os~HGXg<}naUArX2fvK9?sU2PObYn$I6J_UJ#3kDoAcA zMS7^-TfgsHQ@p2{m(ez!-NON>tBvGORx_n2oDTr0$PSX;9k{d zNNq-rRN_?8mxmkOqF$#}LMcbImn%)58T*hBLr9dK1ZNV(pS3SkPx}3?m;JGd*DjTU zqf!Q~bcT?`nrs9Q5C|@2lCHyuC3*7!a&ve`(XT5vKgGU$Xe4n*n9VUB(W>bj(*~k%W_|3*h{qs3qP>USF31@sH%eH9^N5WtHZ4juOa1YD-};ilv5_5i zSzB>UElE^n32Ex>i_p80krGPzKX%`3G}^*dw)m*a#V`3w92G9RK@kH-nGN;z)dwH% z-gkbHVzu5gS0W;}U8EkqAt7_PPSq~W?=;cbaMznk36+R>Rvt3g{$R$nX>_<(P@w3k zgBM)>yvLYIL^1Gmfq2Z4X|TjGkhGr{&Ccm6{O}`6WLw|SR+I^w!(2yinDxU$5j!LE zQ)vaUt=d)Q>bjW4>fAh|{R#XOI!EiTAJo=lWLI)%iec4F3ZtT-QuaQye+h_Uco&b6Vg-f21Xy>(oA%ukN`E0K5_KT@cWL4_PD z6i}gr3ROFeA9ch6!Qa;^&&}h>+jBGlX*eMv)YR(GA5H`pv;bv7ifnoHH~x3V3qV$F z0D#+qQrdtz{04Ye8&Ji*FHZ~>$rIBE8tcKasA1GF7>oe+*T8KP;xjoy7;FQ8{nHBx z{_jB!UTXt4;Sr#!4#36wSGP`0oE5}^!QydXFi8DBhcp-iDG~ftTBU|D1uAE{8u7??Mq4mrje4+ zf_r~kjbtR?3>gVEC~N=-5QI>Xz|@hqk>GPvfDw!^02m0%=%6n50Qc~}eYD(vp>(q4#(+Gw zkRAdw(L*qT2wQ-J{V&azW>MF~hz#V*U z3$TC+){uw*w6q3Pu)V~|z%+3(=6`qtD<#ON|8r?(fM2Wu4J=PZaMc6Su?V$)mL3?{B@p%xmhjJVNr|bb) zeDY9on5VBlc+(aNh|>X5%LbJl04d`BC*&|MWU!Yn%H>}hPaq-IX)f3RN#UQt4F||y zGsx@+NWkqu6Gx~e0VX*DG9&~_6fj?ZPfwJerw9nQ1?a#{M}UQB=phBnKfu-B%^i$( zg8*$wr}*y$SpX_JLF|x&p-xb)&%jzID9BQ9{clwRGCBhaM8ckwupp$Ln?L$r3lGyN z|7*byOm_w(2pP*LVNlr6edZrGpPiwcq`?bk$c_&vjs#?|33n(#ksV6lUyf3d01LbY ztV2Tc;28Xl1Qem{_+21u13)hqKpx*kkO~$Y?E9~|9v8?QA-LcIC_ofYyFzJKg9ffp z&N4w!cc}FZ^mm6^ z17OqNDi%C+huDn*B|HEXlG=~dun<4g?c46qtQ)X_D4KQya6r%lU?33Lf@FX1Bye{K V%}J;W9u0o=09f!YH2yv-{tp6OZw3GW delta 90799 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Ν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%0D9IvrGIB+j`LhF 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 delta 72 zcmZozAl0xyYQh6%kH&M2k6RxzwmxQReazhYm}To@){hAw;qBKGS@%8=xX60e+xwTY c%f#zf0%dM_PTao4iH%W#(O~xJt9h3f)^>jQ=B1hwl0>F@*K>g2cA@dfqZ5dR}( e(<9?jEW$c?avk2be{_R&q&t) f_+H8=u)Wg<03*>M0ssI2 delta 72 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 b0WAUT&qk1&fUb~O@FW2-QyGmx&=&j)kGA5e delta 18515 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 e>=Ox=LzF~j)?b5SwFq e(SFgPOo<@4YphMT8n={k2H770Ft=`!29iA-aU!Dt diff --git a/BaseTools/Bin/Win32/GenVtf.exe b/BaseTools/Bin/Win32/GenVtf.exe index 3a0324cd4d3ed5648fd1997b5edcab612d173ce9..f3689914fe0fdaaba021332f52ee82746ca494f1 100755 GIT binary patch delta 72 zcmZozAln+a delta 72 zcmZozAlxJt9h3f)^>jQ=B1hwl0=^z8=>g2cAAqB0m5Mk-+ e_d9Ow6~Pg1vwu9Ik(R81u`9h`Xvwm delta 72 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 Q0QVS(83WM+dioy!162zh_W%F@ delta 7988 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 diff --git a/BaseTools/Bin/Win32/Split.exe b/BaseTools/Bin/Win32/Split.exe index 9ea9592246257fc2a38cc4da2507a0f914cfc8c4..c8b56ecacf9b7ce125ba2c26a5682e1f890e2ac8 100755 GIT binary patch delta 72 zcmZo@kZNdZ?8Xr3 c*S945?mQK@jO{W`Y;R>5Ew^(euziyU07YXV-v9sr delta 72 zcmZo@kZNdD82R@Dar&AwKAKl@+% bE%?=5(^A}cX1k0N+gn*igY8@iY~SPo0VyH8 diff --git a/BaseTools/Bin/Win32/TargetTool.exe b/BaseTools/Bin/Win32/TargetTool.exe index 6cda989ca69927dbca77852c19e8370f9dd0836a..eb436e2de59f435adebd9734b11d3878b1f13a4a 100755 GIT binary patch delta 5225 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 delta 5152 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 diff --git a/BaseTools/Bin/Win32/TianoCompress.exe b/BaseTools/Bin/Win32/TianoCompress.exe index 0c756484b7ce8e9408af3166daf1613f824de37b..d48a3e1e1f73271d499820fab6ffa8ad9404112f 100755 GIT binary patch delta 72 zcmZoTAk}a{YQh8N7q6Z)K5l)?*!q~M^)YknW0tLtSwA*_gtuRBWIg*pU|!k;-wkcY cTo$k_l=E4q?!SFY65Cu^M$7F%4Q%V=0fOrzn*aa+ delta 72 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 delta 21553 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 UL9WB>pF diff --git a/BaseTools/Bin/Win32/UPT.exe b/BaseTools/Bin/Win32/UPT.exe index bea44d9e0d8c02f49b779a01a4862aa7c01dbafb..684e12bb7cce705dfa6df90b96d13105c2372167 100644 GIT binary patch delta 19395 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 diff --git a/BaseTools/Bin/Win32/VfrCompile.exe b/BaseTools/Bin/Win32/VfrCompile.exe index a35a4893eab79bb2d2d5f32945197e5475eb4558..c177920caa7592224c64c9e6427f038fcbc9e868 100755 GIT binary patch delta 39268 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 diff --git a/BaseTools/Bin/Win32/VolInfo.exe b/BaseTools/Bin/Win32/VolInfo.exe index 0ef74aa94347b62a21356dfba6eae03f3e0a7c60..cfc971a97221d7c95d0995a029ab3bd6ac9e388b 100755 GIT binary patch delta 89 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

  • 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≠pm|%2rfMf;fH&rir$(&+lMuZveXO z^}Crd2XwR|Z$B`wzN|Cpu57eKGWA=q{7{>uZK2%t1A~*bsl@ECOP-m%f^}G|cy82l zLsNcnbj8!yIY8lL#>PH?Vq7udBKXw_{&8X0I&4mlzZzx`1>F8{X(;!P0O*%F$0YT|c@mF*XDKG?-tXU4JHpSmQF0iNNew*h1Yi0{2C+hrUU6jl8XQUS!_T6z{ns{5$TL&+H)!4Sj4+ zIi4>ny=~}cwrF73hV@&vw{vGuS`=Z((gJ2Ces)I|U8buNC@=^Xr?f=K?&)aAwgEK? zLm`1$ifYa2IMDHl3_*=A`i(QM`Wwa1O<%?$x?6R|XIPX|v*Uj4ra&*w9XJ9e1LCgb zl%z_OfvLownIB67x+p~bV@D=X*mmO-c!UUk>{Lv6|Xx_;@?{B674U3y;_k|xb_3$l%si{#jA7 z-7NMwJNxH5{wreDyFI9g1#_Kk&KvoUUr%RP1B_O=ha~GK&g-+eh;6rd?F)^Dj!661 zhCD7j>jI79q-+~#mWk1f;trG?@CO%2yhSoCLtobN3PzPgTq?dxXD5AV65k}X71DESHZd3J6O zDQ{x&>(XqCo8|z!kg3r4sa_VI=uvV^(~y&!E|vxPEV7~(b>1e*-$Hed(XsAhKO5D63l}1qlxF~arq4`#*1Dt9DQ~h(Pf0KivdySx7J;4 zHQ@cj>|8dyu`d;ZGKkHIjnhS83^@L}OS078c;@Ae z!*a*s623+bx3Odrk(2CE{P;R~lPkl~|LyzfV(U8&cBs(rx7<3TJqY~)frpp89#U3_ zh^4YbtYHTO+WoKTWrAg7q^3piq!1$BSEWyMZ7>Xz=SMQ?`a%aGesc3!tbW`XiWIVp zK<;RR7pLB(BG-4V;y8cg7ZdN1@3yWuIFQ*s{9%^+ItF zp!6kO0?@u(!K)R^Sp%lsMXsMg+cUe>H2X2G8$8)h&XI#E8luV0A<`lYVl8EV(Iw!5k9mf7J4r_feXGmsoZ&$-*VOi!LI|a(}X9x7rs0dvZ_@Z2d2V(8iVH3tpl2o1?{zHe@(&6|H? z9VJ3ZU|ar-PmV^*$<)_76e?BaUROOcoJi8ED%ZOAGBHNF1e0Ag^p#o*2emx5o=s3t znJD{7lk_pdlCeF9et)5&rI0*-SDM0sB9EDSJ^qA9H#8(Q@jzaXohy2rNO>n=)Ykhh z%}L_-?^vQ><#e5f(d^uhzr2tO2~n5_paa^_C?>5(U8hqHBPY?bKx7|_6wg876D(9s zg70r5R4niXlU&+;#&yz(k0>aV`1*+hk9Ap3EUm0kse=|Ee`sjL^uviUJ|8}Ec-L+- zbP)T0RzzCIl%ekE9@VjqSdLE~|Ss|Am@v!nd~Fw&lG}j%QYwZsoXUV!V@m0n;iS;>21pW+;#L6=#>x zFaBQKmWNwUOxgOCqp->yO>*LsjVDJvXxF-8YG6gvye2gbLX{Kdyqnfm6-LL}vf1G8 zdJNCVN{!G*+o~{>KRAw$i zfg$5lS=#NPOTLsiaaXkAu*aOr+Zf2tNkT&mI}`O%hFlgJz0aYf24oobXWy}*UuBt_ zn^5~;?0H%9LOZBPxHxcU@9cDg5%51#TsT0?v^>Y!ep84Ky>$2tkX@?R`(NfFJsiR@xg{v9Tno0f8|hYDj>V4#x;XV1 zDIz`n7Eb<*mBk0B9H|3so2-AJ*qA%`{W0>CAvLuutnJ3}uHYgpb*I5RNje1rRQT!wOy+g>X2bk!hN>6m8X9XuLZ`PdT)8Z3V6` zx+WYanx^oG4iAgIiyv1=)%y{9h^D`5{)Qok2^^$^BWeGdHg{LI)E8^`sWe!2oUmcA zQxx-aO$-g5ZqWJX%+<3)u0IPz5_=zeukgBC`AbE+#MRG$kNEVA$`YY3@b$~~Cykzq zg6ia+P#p)&s(`6qbSGF2izE(t{r(!iy`oSX&k{7q2fXiPH(!S{$LXGRsxo~kXOGcX z9>6C-C6H5R&vgFFsBC52U!ky?8}mbVn@^T#wD8dc5j=qN+mDK*7G6cF3A`UPg9s8$ z;rsFd$K{@DYX59r`jtaIpePt+G8-M8thJw%3VrLb|H*zP#wzcDwc?%gnxWayZY1OI zZh+l=XI$QOQH5;~UDJ)6pd_kVf2dwu_bATkI`?d;1BB++dXwEK{p$jonT*PC`mjfX zKc`57XHWL(dk-gtW>>?{nL8nYXvt38cv*FUT}Ab}t!Ip(OK<)C@G2M3ua_g0(vq*J zETGOIW>Ltk-BL0axiqaK6e7-7L6zV4n2a_z{Bm3aCzhoHyBdB!{AK=;@9Xf1cI(l+ z<6Gr}yi|L#iLga@ofJ%@J{BWs0bPDZDYS%c-$;T(rtOz}f7lS|n9D`}`m5wm7n&>x z878N){6CCD5^N6cJ6Q+}^XnX|&W1_M*fpW`Tx-E@nj#4WiVgH#Ev70zEC062XGdy_ zdPoJzT-7j0B10m5>l$(K0#8RRlW%?5sf;OpxRhbosY=zvGYs5Be8;gp1+b!>#6+>z ztq=-q4$`+RgRF;bejG|ie?ITgk~cgrnMySu$?E%bY|d&VQjD(zgHYJ%ig-L2ZNLG& znXAuf?iuV*TkJmi89zZvDVSkaQk zmb$iB>Xp)*G?cIQQvvpd^@O!>&sk-Fj z8<+0h`@A1WHtvlEhU-$A>m_hC=#fNF8#e!WK8kha%V`q-Wp}523XWleVbVlN_F-#Z zvaeJ-@420g?Rg|MF%yEv#4vR2BQT^{(PC4!UqGneM$b?hZZO z#BnJ(j!*%rex1C7b5N5_+{?do(39M-M#jGsiiwe6Xqr&F#b#Z(8Q(VsV#S_Eo#a{f zmI?UyLR%+hZth*0>jZVK%-o{oR2R-L?9YT5m&u3YHr>^c>~E|1e_ zqI)=Wa#i?6uQ|UJP(ba7%)7Ligmn@*PVIHAElEc>5S&LEzbOib{m8cY3;GbIbFBX) zF~;ow!-LdC*_3Zo=aH;K6c%raYJilX`;Udyo(>M-ov4c=IpNS=f^Gp7)worG_vRy_ zGM^cXX*Mq#EL!%0HjE*K@dDe=jvL$!yrn~vUnMyyW0XXVNhyWC4a!H+Fm=77 zRId87tJ3B)p+f0xsU{dCUMMAL7eWT)XQE-BF}CXm4HV<^H@G?>-BcoY2c_w%T%0QT z`nK=XRf{ZteWqT>8d=H5H(%(3XyJC)!YW+mzjG=tpFsJIxL5+Toxa74{l@BGNI-=OnCo`$_kXoVcGuI_`0KBdT_My!6efi=Cd>MIrN2{*r_5^|+sI1Q1b`yKGI5V}ZhmYA0RVM!5mn7{2k^anJ z&Rxn@YGuR^4_{)_&h~0wH!_g0!Q=P-xG7rfG2|o7?FdllXF^@8sw}gqO|?yymBqJU zN;2$`>uA@ohx%jHR{YkiiD~&Wpe$&vYp&Wdp;xg_i9#D0lOAm7_75l_#; zXsbe(rkLC~gE4R)^t+h{RMo8&`~5K{W2hflnhd z_z`8Ok@GOqMeM6Vru^=hjmBuqUyG)r>b7hQqtW9@Hz-d?EaIPL$?jFN&0_qv!gNz@ zh3|<08W-O;p#1>%^w{#QMGk}h5ye3pRDQQ)%`ucNP9Sq$?7B%oDqQEDO}6NH$GC4Z zoNB{tg_vf@D{p$&ZZT_4JTBDom+Hb>?hpI136eL8t{9%qFXlqN=iUa|@=-u^tFrusqiN9;AwZMcy5gvRr$ux?!W zsyhEC`z4#_>c@bC9r z8I+$vMrvl-{P<4)H!}}p^V{U2wMA?cS24VV7qn1>rRG;2-E8JaxR9Oeo(aB?oiH)e zGM+?)WFbCum!Ns5&${Td^`Nl$UMIx*#X$O*FZqW0j+{0Hg_4++mTh|8x^|Nd@AF-V zXZOY(hBVcD#SauKbUd23>j>sXaPY8$q1)#_TZJ{HN(gHd{oZMm*0MT=g5Pn;w@b)){sNX0qA z_;%mlM16+G-{O!vV9<87v^RBkA0Spjx0IB03DF}99_H!n)C+ltm^!w?M12C@#%!7` zyU2`u$Dr+?=1f+eqR#W*{zV3lL&S9ES_z)Rx6`}?v&f)w*=N-~rZ36t8i>s&6iLe{ z-8Q?L{z#2=i7qDOg?i5?@!=3J;eajmjU#0p^$&<$G-H8LB zSMDjwYeN=g=xpe#RGV|I^z)ZdTh6l08tWayPvXNzvzUt8z)d+~bWcU`x`s(z=NIVL zTDN|Z#k&%suo^giHZm=oUK%dSxQ$R>GHKTaTK+7W6Bd7QdDd*~8nPmP?!K})2^HDe z&eSSQ9|DqLf8Y4Q9nwbhKdKg+Q=dczBcjHd`d;cxofDRQKNJ3N*jYsU@iXDnADwZY z?!ZCxMZ6RY#d(ZoU_RjI;$xuHx*Nq^qBdI?#$wS1l@)R5C44y6thv zY$K+MC3^(orkEyG{?FIak%RJ`6S5t=7)_$OeYEvOg9-@+nD)Q+`X3OW$sdl=G3x% zVlLEsU(fY4^mi9x&rGuK6Y1UZwZF7Xp}ngz$$NjC zP0~DOHE8A}r)9P{%R|1%CU;~np})ue7LYxtcZpogKi@U<)mKWZ2tuK`1Lt+*2mrt=I+*&E?>dz(EWPS#q1U0HH-aXy_Dre>ZMQlEG zB(RBHJzlh;W2-xu`Ro1r_i%;qp|{uAfkKnEhm5^XR~JBnVOt}()8Y{S?&e!jVI;*Q zdG`YJ_A-@6(0jKoRnUFZ(_QAtCv8FY&riWWBueiYFNxoyHzQXFhZF3auQq0X7hx7a zliY?l-3{rP7I3}XqY0+`NK0P&dZ4iVx4vOSpHHXVP&?b>vsTx6>=!`zlR&0Gw*T$o zA57uE$7!=f;rfcL0O&g*l4r&9_LdZG{3NpKUW3M2?ZUk8hGVI#vDv71uC9h?-b$yH zex^Mxy3oO*c2+TZW1YNlR!6*jh~NX^vDQ70Rn@<}4UvC-vr zJ<=Uvsz|CzQexz5t%R})SN(3Hc4cZ373ul#N?_4x?@%qg%?BFBAmS5B^XExSY$Eh_ z6_(cd^#F49gcH@BLce$M#ZSa8yQRS;&e*NK3KB-otTziN__0GSswD<*rj4{Tsvh0* zF(#a7dcAp#aF=-%?%W32ZaN9ZnL2pc4BCTysB;klJ~DM|aOSYB+YnQVkNWj;KQp#T z-ZqyO!B;qFMy^3gX2Ne~_NEo9(AVXcC|B*dH4w_Vg&jOw)(Gq>oQlhb5vrY!jlILh!`n;;?lGt8~ZAP{8c_25^o&{>F9E-B;l2SZ7dnY=rmebX% z2vdqB1N8L<3WaglZxDI1dy1}-9~V~s&cbCUlKwiQ0h~CL@2h2>E9Zw)wB4b${V@ag z%ml*ID83n6sld+cW6_&j+Zxb> zj+c@3@pVV_?aANqlT>#Xcm<&&YUU2r*;s;3x%rBxRf z4c`<98Rl@evqK~?73ZxB6TN3TYne1$-k0GE$J^MurSUSioMwMtv|JtdH`n$p+3 zQ1Xfnfu21o;hW6oEo%f;Uys*F8>$oJRLIpNt`%e88#kAVRPH#$)jlMq-wyL<1c}>> zQ0-w%bZ1gH-3AYl$|{Rk+xTzyD<{SHJtO(jdK=6s>toIWRV{hW^(1+{#kr5exspc0 zLBp6UzHtS+EZ<7Kk_ZATDz_f6+v>*K<8PO_&wI#xO~>dp)=OjmRIwTuirM*9B#Z{| zPA6H*&b`5jCdqhD7pQ8uX=FxyOBgZV19gagz#Zqb5|}P}@uE+l{jjxOJWxDvChkX_ zc3TqdJ2Rv#e&PXjq@j4FSkaDNjd6$B`PO|-K%=-XL{8TC6Ez(hU9}3^4QG+kq(Ph+ zA!78$)gFydqD|MytNJ&r=gejP&UNH|955({8nCB%v_X>6bTC{Z-(d2HO%Y*OkfB7! zE>O=p^k5&39Phufte@;KNi#+j4Q|L=W48SUx@3`B^v6aUj`o<-#>VH-{YIR$StE>h z>V1Xa6o2(pRYDwxW33x5DOA0)M1Q;!EchxQ0EA;+IA6b$0O@xO}8Ai zklE`g9{#z@3Emk)+EpravZMFDQRlqj5a+dO&R#NXg)MMP_hmO7=`kTXD*?)(`&xi} z!7~+WXMb3-DR|h;zjBWBzD|{AAU=Ysx~uWQK>tw$T?~RURw7m__gQQH_7W(dY}baGFQO z|Ik;nA>*U6<{KJ=ZQ=K462l5Qw6G$%Jspxw*Cl0#N%&8Y0b!xv=5r`QLKH_{8z^df z%w4Voa~|>qxH2VewcdCh#&zGd5YY<5aT3-Pe2S9qecj=bv2rgQF?{a!&aYzFhZIS# z8h$)yr=sT9@e4ZjDmnIdlFeNZaKXLfNf}yhQ!=xX0-X|%DU(8AECue$aEc8JWrxF#>eMeBH&ID81uodw<93uv;<8`26)k+T+#R9zdL)|H z!#>3FeQQE~w2_mO&o9Hx9UKxtynjBB%|lOkfTBt}6R%&!KDK6Tx!~8ErO`}PHp?(9 zgFXWpE}ez`^@l?1-QNj&bZLJlB#=`|$QG)CQ!kaWaB>u)X~~p08M!FCpqX&nj8qFB z^yho$A()kWJ(ra)Is&l*pKx~4Q}~^pnFVyPYf-JLiaVa}f3wdAAD~+`%%-NX<5A3Z z-Y4f9Wb~@x>6xeGplfS8$vBG7+pO}nVS2g^;uId6BUVGfy)JY$e%l9zE~opoJ8cQT zjp3G@#F7-7_tsBYG-s^SBm(T63!L?{xDfNBi_Se3AGKJE#1Q*qu}wuvH-$~{wD(Qg z%=j^iy@y=GVBoDb^DRxaYn~!lEvrxn%4eiGeIL}e4`TuE?hs`AN~Ynzttw)p5Rf4? zz;Pql7bipQjJ8!!%B`msdn-oSclV8}Td}<_IZyjwsmsDN?8u_Hb=FSb)1r7uRSw&# z37^qb2u2Vgp=99r<^A*@x_m#5JkKdmz<3uI!W-k_JGW7q%_U0QOU3JEY7Da zp|r>_*N;JMvN)kbIt3O3T2bWo-t?mrNAlP1SyFN6C$9IMqpKH4C*`UkDC^gjiXJ;bJ3-3O5+aiZpwNm-m!PKarlCOx?0YVO{f!J}a`~_d+oYGlE&d zs`craUn%pw-LmN|MN?h=>nqo!v2#rQbJg0JNic$irx0^Pqs*E?`+8V(TDNrgWUG%Y zMkdT3ikB&)X@IEtEOnLtR!aj%EC@EgF3~iQ@1+_ajm^ggUwua+gDZRDuO%2)0Ea%1 zsI^r4?Z-dr-5BA(GUwPUMDzs#E1mkU1y!WUFrpMHHru`yHN3!>-w5HnuVTCJZw5@! zHr4uC>8i}mlOtQ@ti>5LpX#mGFhAUK~2uSN(|L+mtM-J9)0$TlM^gz(jNQeP%B_iY7>fFn=2nvQ{K64uV#y) z;bd&b!{^H*DvZDVQG)fV$yS)gUrM5ZC!2&?k#-z0Tvaz;8NoStfK2Vn1*@La@7@;4 zYN$z@+-gck+J%1TrN2D&bQTl_t$#SSwVU$e*Rj4$y(ovYmP-}3r9L7#W;J-v@vc9r zJa-vhaM)zSJcpjxiSseu4ppmc?m7nVcV5jb&@A+3}k4?zplo5!tV{TU(lQz;w zB{)}C=cxUa#z=Tw;#pP*^ZdiPdwfC8EpK(nXjhB3Iqsq7Bre7p~Oygfm9H_fY3EG?@)%${DM_%gmd{H6u7A4xTAnz?EsIw{3f^1OKzx|`qo<5T{s zhL0P~<0&FNdH&|T7y5I)6no>^+53v0qKh?OVCnG47V&^a>-+kM1=9y}51}+Cb%nm; z5R+d7Pb{wzE0PnV+9lQgzJcB&BR2VOLRO27lXynGq+98rvm3eCm8o464b5XONqC;R z;gW%0bb(i>dKz_~WOPe+5Z$$To09{gR!*qCf81Pm*4;D`mEA3VxKj>hBD-pEKb> zyqVaMRU6ojGS)5Vitr8j;cnn9Zh-5_e1RR+szXj}<`!w_yiilg zWcMu(=4H*)ysgt0&#d6qC&%)G=LlutVOp*&qb?Cqy{yU?!bpD|95CU62@g#8U?Kq1 zKjlPVA_fyli@y$}5FVH^fgm8bYe`itah+6@B1Bmy(vae?TP{fh|M+Oj0 z*ik^-5F!Gfgz_4wMtMyDd@+PD!m0x!h7c)OV*uL-A^>ivQ#685|EncrY^!B54haS( z3=0N^80J5J@PR}l$XgUdFjQ+B4cllo@XZK<4-4)xG=hl3mH`lB$Vb>GK>wdh29RS6 zq5XG1{tO>g%E(1?@d85Isi9Qh%l@H&|nG?fn@}) zOd&$>Do*HttrI#WfM)tXy#vvn=vZj~mlG%uYzC2qUkE}6PJ+-0f$z=`EZ}eaf6=T0 zSmqEJcpw2Cs7(Mn^EU@U`~j4hgAJ1k(Sfo;bP9mn4;+Er7J>lq75!IhHbBS%A_JQM zL|H)Ok>0eT!$>%}1K7S0;(tj(_hu10R*)M8=JOg1495Ru4E*o=ziHXTje$ijvL#8wbN_%>opV2T)%0C2Jb z84m|CtsuPcgglr4D-T#0U;;|~UX}<-Tq@72)4%G(*P$&&~CMW z2uBFzze}Ow=2}2CSPJj`8w*JMjYSFUI6@dP?clKgw?`=t8*?Dv76JkIoxnaZ08J-| z96Tl#Hb94k{V!m!fPH-I|AgW> zXAo@);DZZ@HV@$I0yg*ybh?1LY64zdK+T;1{H_q@e^1R0d;BU5z}Xd?nw3C=D?}Au zTp1fMPzJjr_x+z42Ej35EY1R_7&;LQ48?x|^Z-z~LF8d)0Y^7*G+&_F4K$q<;J^(c z0ZR#RxPyg(fXhFZ8KBM`EQA0z|Ky+mj|b!Heh@O zY9hxQ@|x=Z3u&zfE~H$r{|^p{PyeFD1Aci!-opk1_&y-cd4P%!gb$V+i1h(Yk`oy6 z0afuCK=uVE#VjD>3#!l_i1Gys7l2V;ut5xf=m)9^3ds0@(qseieh^_eIB@FwK?Fg| ze(eu}dk@I?LwLZs73>e;LTc{Dg)s#|Q8I%N0a|^ynE$a5Dgej+ATzVTn*flD1;8i( z!Ubyxqy&JyJOI-HAQy-LP9Q`W-ZCB!2#m)g`?tzJ27pUmW&+-S8r~-$I}joPZvo%| z0RSEe@Ei!5S|z{$g~+0?=i$Max%)U<03sm}0w5U*A%{%|>Yxx&G}&4_7;_s-OM4qr zfIR?Q7a|ey|FhdbfF%gR^;#JRA0%^g_i(qd2dK;;B*4FThz$bmAsHwR0>S76_Jcs6 z0Dw98UzTqd46>gDR0e}Lt9jrIyuiV013V#M z2$+O|=y3uWp%7kVUorw1D|@H^;q53CLIMXz4WNX9I57f3VPG>8z$*;IPzI<5bBJW0 z2w-fS0PF||URpTF+YkT=2Z?e3^>DCLS0FANWRV@1_$P-1AVz?&`vM;$!0zw>j|i~v zHBj|WAtA8y&qWQOiUbRF0i8%t`RhRHKRF6uJQDH_ycxkpLAYW20iGyu{9k}$6odyA zcY_GV&B@Hp!W}q^0?}-LAo@=<>wsTTAOrdUWi&W-vH|00P}7k>PBaJ#5wIE!%8v>V z#(?b90rD{req_RUVi+efpNEXwJASAcUY$ekxp5(`oW1Dmm+^@;(sao~;GricUxE+WALeBwY;0nZEr3&9=# zf8xMtZ!-5sKjpEG! diff --git a/BaseTools/Conf/XMLSchema/DistributionPackage.xsd b/BaseTools/Conf/XMLSchema/DistributionPackage.xsd index c1f2184ca6..5fbbd59f93 100644 --- a/BaseTools/Conf/XMLSchema/DistributionPackage.xsd +++ b/BaseTools/Conf/XMLSchema/DistributionPackage.xsd @@ -1,2767 +1,2767 @@ - - - - - - This schema defines the UEFI/PI Distribution Package description (PKG) - file. It describes the content of: - 1) Package descriptions with definitions and headers. - 2) Modules in either source or binary format. (Note that Binary format - is for FFS leaf section file types only, complete FFS files cannot be distributed using this - distribution format.) - 3) The distribution of custom tools used to modify the binary images to - create UEFI/PI compliant images. - 4) Finally, it can be used to distribute other miscellaneous content - that is not specific to UEFI/PI images. - The Package Surface Area describes the content of packages, while the - Module Surface Area provides information relevant to source and/or binary distributions. - - - - - - - This header contains (legal) information usually required - for distributing both binary and/or source code. - - - - - The list of packages in this distribution. - Packages are groups of files and/or modules that are similar - in nature. - Packages are uniquely identified by a package GUID and a - package version. - A package can declare public mappings of C names to GUID - values. - A package can provide header files for library classes - and/or other industry standard definitions. - A package can also declare public mappings of platform - configuration database (PCD) "knobs" to control features and operation of modules - within a platform. - Finally, a package lists the library instances and/or - modules that are provided in a distribution package. - - - - - The listing of UEFI/PI compliant modules in this - distribution that are NOT part of a Package. Every module that is provided as part of a - package needs to be described in a PackageSurfaceArea.Modules section. - The ModuleSurfaceArea section describes how each module in a - distribution is coded, or, in the case of a binary module distribution, how it was built. - UEFI/PI compliant libraries and modules are uniquely - identified by the Module's GUID and version number. - This section will typically be used for modules that don't - require any additional files that would be included in a package. For example, the Enhanced - FAT driver binary does not need to have a package description, as no additional files are - provided. - - - - - This section is for distributing vendor specific executable - tools, tool source code and/or configuration files. These tools are primarily for - manipulating code and/or binary images. - Tools in this section can: - 1) Parse build meta-data files to create source code files - and build scripts. - 2) Modify image files to conform to UEFI/PI specifications. - 3) Generate binary files from certain types of text/unicode - files. - 4) Generate PCI Option Roms or Firmware Device images. - 5) Implement external encoding/decoding/signature/GUIDed - tools. - 6) Distribution Package create/install/remove tools. - - - - - - The list of miscellaneous files in this distribution. Any - files that are not listed in either the Package, Module or Tools sections can be listed - here. This section can be used to distribute specifications for packages and modules that - are not "industry standards" such as a specification for a chipset or a video - device. - - - - - The UserExtensions section is used to disseminate processing - instructions that may be custom to the content provided by the distribution. This section - contains information that is common to all aspects of this disribution. - - - - - - - - - - - This section defines the content of the UEIF/PI compliant Distribution - Package Header. This is the only required element of a UEFI/PI compliant distribution package. - - - - - - - This is the User Interface Name for this Distribution - Package. - Each Distribution Package is uniquely identified by it's - GUID and Version number. - - - - - - - The reference name of the Distribution - Package file. This single word name can be used by tools as a keyword or for - directory and/or file creation. - White space and special characters (dash and - underscore characters may be used) are not permitted in this name. - - - - - - - - - - This 128-bit GUID and the Version attribute uniquely - identify this Distribution Package. - Backward compatible releases of a distribution package need - only change the version number, while non-backward compatible changes require the GUID to - change (resetting the version number to 1.0 is optional.) - - - - - - - This value, along with the GUID, is used to - uniquely identify this object. The higher the number, the more recent the - content. - - - - - - - - - A string identifying who created this distribution package. - - - - - - The date and time this distribution was created. The format - is: YYYY-MM-DDThh:mm:ss, for example: 2001-01-31T13:30:00 (note the T character separator - between the calendar date and the time. - - - - - The copyright for this file that is generated by the creator - of the distribution. If a derivative work is generated from an existing distribution, then - the existing copyright must be maintained, and additional copyrights may be appended to the - end of this element. It may also be the primary copyright for all code provided in the - Distribution Package. - - - - - - - - - - - - - A license that describes any restrictions on the use of this - distribution. If a derivative work is allowed by the original license and a derivative work - is generated from an existing distribution, then the existing license must be maintained, - and additional licenses may be appended to the end of this element. It may also be the - primary license for all code provided in the distribution file. Alternatively, this may - point to a filename that contains the License. The file (included in the content zip file) - will be stored in the same location as the distribution package's .pkg file. - - - - - - - - - - - - - A one line description of the Distribution Package. - - - - - - - - - - - - - A complete description of the Distribution Package. This - description may include the release name of the file, the version of the file, and a - complete description of the file contents and/or features including a description of the - updates since the previous file release. - - - - - - - - - - - - The packaging utilities will use this MD5 sum value of the - included ZIP file containing files and/or code. If this element is not present, then - installation tools should assume that the content is correct, or that other methods may be - needed to verify content. - - - - - This version of this XML Schema is 1.1 - Changes to 1.1 from 1.0 - #1 Updated to present date and new version which is - important to reflect the present state of the matter - #2 Added definition/enumeration of UNDEFIND type 2 is - important since there is a large body of legacy code for which the GUID’s and other - code/data objects were not decorated with their usage. This document will allow for - importing today’s source artifacts and producing decorations using the ‘Undefined’ versus - having an error - #3 Allow for inclusion of ARM and future architecture - types - - - - - - If set to true, all content within this Distribution Package - should NOT be modified. The default permits modification of all content. - - - - - If set to true, then the content can be repackaged into another - distribution package. The default prohibits repackaging the Distribution content. - - - - - - - - - - A package is a collection of related objects - Includes, Libraries and - Modules. - Each package is uniquely identified by it's GUID and Version number. - Backward compatible releases of a package need only change the version number, while non-backward - compatible changes require the GUID to change (resetting the version number to 1.0 is optional.) - - - - - - - - - - - This is the User Interface Name for this - package. - - - - - - - This is a single word BaseName - of the package. This BaseName can be used by tools as a keyword - and for directory/file creation. - - - - - - - - - This GUID and the Version attribute uniquely - identify a given package. - - - - - - - This value, along with the GUID, - is used to uniquely identify this object. - Backward compatible changes must - make sure this number is incremented from the most recent - version. Non-backward compatible changes require a new GUID, and - the version can be reset. - - - - - - - - - If the package requires a different copyright - than the distribution package, this element can list one or more copyright - lines. - - - - - - - - - - - - - If the package requires licenses that are - different from the distribution package license, this element can contain one or - more license text paragraphs (or license filenames.) - - - - - - - - - - - - - A one line description of this package. - - - - - - - - - - - - - A complete description of a package. This - description may include the release name of the package, the version of the - package, and a complete description of the package contents and/or features - including a description of the updates since the previous package’s release. - - - - - - - - - - - - - This element is the location (in the ZIP file) - for the root directory of a package. - - - - - - - - - - The term cloned is used here to indicate that this package - as been copied and modified to a completely different package. An example might be for a new - generation of chipsets that have few or no elements in common with the original. - - - - - - - This GUID and the Version attribute uniquely - identify the Package that this Package was copied from. - - - - - - - This value, along with the GUID, - is used to uniquely identify the package that this package was - cloned from. - - - - - - - - - - - - - - Library Classes are public interfaces that can be used by - modules. One or more library instances can implement a library class, however only one - library instance can be linked to an individual module. This provides the platform - integrator with the flexibility of choosing one library instance's implementation over a - different library instance. - - - - - - - - - The header file provides definitions - and function prototypes for a library class. Modules can be coded - against these functions, using the definitions in this header, - without concerning themselves about the libraries' implementation - details. This is a PackagePath relative path and filename for the - include file. - - - - - - - - This GUID and the - Version attribute uniquely identify the Recommended Library - Instance. - - - - - - - This value, along with - the GUID, is used to uniquely identify this object. If this - value is not specified, then any version of the library - instance is recommended. - - - - - - - - - - - - - - The single word name of the Library - Class that module developers will use to identify a library class - dependency. - - - - - - - - - - - - - This section is used to list header files for industry - standards not under the auspices of UEFI.org. For example, headers that contain definitions - and data structures for the USB specifications. - - - - - - - - - The package relative path and - filename (in the content zip file) of the industry standard include - file. - - - - - - - - - - - - - - All top level header files that are included by a package - that are not listed above. They cannot be: - 1) Local to a module (module specific.) - 2) An industry standard header. - 3) A library class header. - - - - - - - - - This is the Package relative path - and filename location within the content ZIP file. - - - - - - - - - - - - - - - - - - - - - - - - - This section lists the Module Surface Area for - all modules provided with this package. - - - - - - - - - - This section defines the mapping of GUID C names to GUID - values as a Registry Format GUID. - Modules that use these GUIDs must specify their dependency - on this package. - - - - - - Individual GUID Declarations - - - - - - - - - - - - - - - - - - - - This section defines the mapping of Protocol C names to GUID - values as a Registry Format GUID. - Modules that use these Protocols must specify their - dependency on this package. - - - - - - Individual Protocol Declarations - - - - - - - - - - - - - - - - - - - - This section defines the mapping of Ppi C names to GUID - values as a Registry Format GUID. - Modules that use these Ppis must specify their dependency on - this package. - - - - - - Individual PPI Declarations - - - - - - - - - - - - - - - - - - - This section is used to declare platform configuration knobs - that are defined by this package. - Modules that use these PCD values must specify their - dependency on this package. - - - - - - - - - Specifies the C name of the Token - Space GUID of which this PCD Entry is a member. This C name should - also be listed in the GUIDs section, (specified above,) where the C - name is assigned to a GUID value. - - - - - Specifies the 32-bit token value for - this PCD Entry. The Token number must be unique to the Token Space - that declares the PCD. - The minLength of 3 is required to - handle the "0x" prefix to the hex number. - - - - - - - - - - - - A string that contains the data type - of this PCD Entry. PCD data types are restricted to the following - set:UINT8, UINT16, UINT32, UINT64, VOID*, BOOLEAN. - - - - - - A string that contains one or more - PCD Item types separated by spaces. The PCD Item types are - restricted to FeaturePcd, FixedPcd, PatchPcd, Pcd and/or PcdEx. - - - - - - - This is a recommended maximum data - size for VOID* data types, the actual value should be defined by the - Platform Integrator. It is not required for the other data types. - The minLength of 3 is required to - handle the "0x" prefix to the hex number. - - - - - - - - - - - This entry contains prompt - information, that may used by tools to assist platform integrators - with choosing the correct values - - - - - - - - - - - - - - Valid Error messages that may be - implemented in a module for the PCD Entry. Only One Error Number per - PcdError, (multiple ErrorMessage entries are permitted) and multiple - PcdError elements are permitted. - - - - - - One of the following - types of comparisons, which must be able to evaluate to - either true or false. - - - - The PCD Value must be - space separated list of values. Values are restricted to the - data type of this PCD. - - - - - - - - - - - - The PCD must be within a - specifed range of numeric values. Restricted to C style - Relational, Equality and Logicial Operators and parenthesis - are valid. Only the CName for this PCD is permitted in the - ValidValueRange expression. All other values must be - numeric. - LValue (op RValue)+ - - - - - - A in-fix logical - expression using C style logical operators. - - - - - - - A hexadecimal value for - the error message as defined by specifications. - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - This string should be - defined by specifications. There are pre-defined error - number ranges in the UEFI/PI specificaiton. - - - - - - - - - - - - - - - - - - - - - - - - - This section is used to describe any PCD interdependencies - or relationships. - - - - - - This entry must used - TokenSpaceGuidCName.PcdCname for every named PCD. Restricted to Relational, - Equality and Logical Operators (NOT, AND, OR, GT, GE, EQ, LE, LT and XOR) and - parenthesis are valid. Only the TokenSpaceGuidCName.PcdCname us permitted to - name PCDs in the expression. All other values must be numeric. - LValue (op RValue)+ - - - - - - - - - This section contains files that are not part of the code - distributed with this package. - - - - - - Only required if different from the Package - Copyright. - - - - - Only required if different from the Package - License. - - - - - A one line description of this section's - content. - - - - - A complete description of the files in this - section. - - - - - This is the PackagePath relative path and - filename location within the ZIP file. - - - - - - - If true, used by installation - tools to ensure that a file that must be executable has the - correct properties to permit execution. - - - - - - - - - - - - - - - This section is used for any processing instructions that - may be custom to the content provided by this package that are common to this package. - - - - - - - - - This is a single word identifier for grouping - similar content that does not fit into previously defined sections or other sections - of the Distribution. - - - - - This can be used to differentiate multiple sections - with a grouping. - For example, a PRE_PROCESS Identifier might indicate - specific steps and tools required before processing module content, while a - different UserExtensions section with a POST_PROCESS Identifier might describe steps - that need to be executed after operations on the modules in this package. - - - - - - - - - - - - - - - - Each module is uniquely identified by it's GUID and Version number. - Backward compatible releases of a module need only change the version number, while non-backward - compatible changes require the GUID to change (resetting the version number to 1.0 is optional.) - - - - - - - - - - - This is the User Interface Name for this Module. - - - - - - - - This is a single word BaseName - that will be used to create a module meta-data file. - This name should also be used to - create output file names and directories. - - - - - - - - - This GUID and the Version attribute uniquely - identify a given Module. - - - - - - - This value, along with the GUID, - is used to uniquely identify this object. - Backward compatible changes must - make sure this number is incremented from the most recent - version. Non-backward compatible changes require a new GUID, and - the version can be reset. - - - - - - - - - This is only required if the Copyright is - different from either the Package or Distribution copyright. Multiple copyright - lines are permitted within this section. - - - - - - - - - - - - This is only required if the license is - different from either the Package or Distribution license. Multiple licenses are - permitted within this section. - - - - - - - - - - - - A brief text description of the module. - - - - - - - - - - - - - A complete description of the module contents - and/or features including a description of the updates since the previous module - release. - - - - - - - - - - - - - - - - - List general information about a module, including the - Supported Architectures, this module's type, specifications the module is coded against, and - other informational content. - - - - - - One of the Enumerated module types that limit - the use of a module. - - - - - For stand-alone modules that are NOT part of any - package, this is the path to the root of the module as listed in the ZIP file. - For modules included in a package, this is the location, relative to the root of - the package (PackagePath) this module belongs to. - - - - - This element is only required for the PEIM that - produces the PCD PPI or the DXE Driver that produces the PCD Protocol. - - - - - - - - - - - - - - - - - This is a list of other specifications that this - module is written against. These entries can be used in #define statements - (depending on the build system implementation, they may be autogenerated.) - - - - - - - - - - - - - - Different firmware execution paths may be taken - based on a given state of the hardware, firmware, or through feature settings. A - BootMode may be declared (PRODUCES) or discovered (CONSUMES) based on these - states and feature settings. If the usage is UNDEFINE, it implies that a Boot - Mode is used, but the package creator does not know how it is used. The - supported boot modes map to the PI specification Boot Modes. The boot modes - listed with Recovery are to indicate that the BootMode is valid during a - recovery boot. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The module always supports - the given boot modes. - - - - - The module may support a - given mode on some execution paths. - - - - - The module will change the - boot mode. - - - - - The module will change the - boot mode on some exection paths. - - - - - The package creator does not - know how the boot mode is used. - - - - - - - - - - - - - The functions that make up the Event, Timer, and - Task Priority Services are used during preboot to create, close, signal, and - wait for events; to set timers; and to raise and restore task priority levels as - defined in the UEFI specification. GUIDed events should be listed in the Guids - section. - - - - - - - - - - - The module will register a - notification function and calls the function when it is - signaled. - - - - - The module will register a - notification function and calls the function when it is - signaled on some execution paths. - - - - - The module will signal all - events in an event group. - - - - - The module will signal all - events in an event group under some execution paths. - - - - - - The package creator does not - know how an event is used. - - - - - - - - - - - - - - - - - - - - - - - - This is a list of non-GUIDed Hand Off Blocks - (HOBs) produced or consumed by this module. - - - - - - - - - - - - - - - - - - - - - - - A HOB must be present in the - system. - - - - - If present, the HOB will be - used. - - - - - The HOB is always produced - by the module. - - - - - The HOB may be produced by - the module under some execution paths. - - - - - The package creator knows - that a HOB is used, but does not know how it is used. - - - - - - - - - - - - - - - - - - - - This section may be included for Modules that are copied - from a different module. - - - - - - This GUID and the Version attribute uniquely - identify the Module that this Module was copied from. - - - - - - - This value, along with the GUID, - is used to uniquely identify this object. - - - - - - - - - - - - - - A list of the different Library Classes consumed by a - driver, core and/or application module, or produced by a Library module. - - - - - - - - - Used by tools to identify different - instances of libraries that provide the library class. This keyword - identifies the library class this module needs to be linked against. - - - - - - - - - This GUID and the - Version attribute uniquely identify the recommended Library - Instance for this module . - - - - - - - This value, along with - the GUID, is used to uniquely identify this object. - - - - - - - - - - - - - - - - Library instances can provide code - for a library class, or may require other library instances - themselves. Since different execution paths in a library (or module) - may need different library classes based on some setting, library - classes may not alway be required. - - - - - - - - - - - - - - A FeatureFlag attribute must evaluate to - either true or false - it may be a fixed value of true or false, a C - name or an in-fix expression. - - - - - - - - - - - - - - - This is the module relative - (ModuleProperties.Path) path and filename location within the ZIP file. - - - - - - - - The Family attribute is used to - restrict usage to a given family of compilers, such as GCC or - MSFT. Since not all code processing tools use the same syntax, - especially for assembly, this field can be used to identify - different syntax. - - - - - - - - - - - - - - - - - - - - - - - - This is the module relative - (ModuleProperties.Path) path and filename location within the ZIP - file. - - - - - - - - - Binary file distribution - is limited to UEFI/PI FFS leaf section file types. - - - - - - - - A UEFI/PI FFS Leaf - section file type, not a raw PE32 file. - - - - - - - - - - - - - - - - - - - - - - - - - - - This section contains information - about how the module was coded, such as Compiler Tools, Flags, PCDs - (only PatchPcd and/or PcdEx) and Library Class Instances used to - build the binary. - - - - - - - The element is the - Patchable PCD Value that was used during the build. - - - - - - - - - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - - This field is required - if the Pcd Datum Type is VOID* - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - Error information - implemented by the module. - - - - - - - - - - - - - - - - - - - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - - - - - - - - - - - - - - - - The element is the - DynamicEx PCD Value that was used during the build. - - - - - - - - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - - This field is required - if the Pcd Datum Type is VOID* - - - - - - - - - - - - Error information - implemented by the module. - - - - - - - - - - - - - - - - - - - The minLength of 3 is - required to handle the "0x" prefix to the hex number. - - - - - - - - - - - - - - - - - - - - - - - - - - - This is the actual - library instance that was used to link against the module. - - - - - - - This GUID and the - Version attribute uniquely identify the actual Library - Instance linked in this module. - - - - - - - This value, along with - the GUID, is used to uniquely identify this object. - - - - - - - - - - - - - - - - Any description of OS, - Tool, and flags for the individual tool can go in this - section. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This GUID and the Version attribute - uniquely identify Package that this Module depends on. - - - - - - - - This value, along with - the GUID, is used to uniquely identify this object. If the - version attribute is not specified, the most recent version - of the package can be used. - - - - - - - - - - - - - - - - - - - - - - - - - - - - Only valid for Variable GUID types. - This can be either a Hex Array or C string in unicode - format: L"string" Data. - - - - - - - - - - The module does not install - the GUID, and the GUID must be present for the module to - execute. - - - - - The module does not install - the GUID, however, the GUID will be used if it is present. - - - - - - The module always installs - the GUID. - - - - - The Module will install the - GUID under certain execution paths. - - - - - The package creator knows - that a GUID is used, but does not know how it is used. - - - - - - - - - - - - - - - - - - - - A listing of protocols required or produced by this module. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A listing of PPIs required or produced by this module. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - These elements specify additional information about the - module. This area may be used by tools to generate code. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This section describes how a platform is coded with respect - to the platform configuration knobs. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This is the PEI dependency expression for a Dependency - Section. - - - - - - An in-fix expression, of C identifiers and TRUE, - FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix - notation. The operators are restricted to grammar defined in the PI - specification. - - - - - - - - - - - - - - This is the DXE dependency expression for a Dependency - Section. - - - - - - An in-fix expression, of C identifiers and TRUE, - FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix - notation. The operators are restricted to grammar defined in the PI - specification. - - - - - - - - - - - - - - This is the SMM dependency expression for a Dependency - Section. - - - - - - An in-fix expression, of C identifiers and TRUE, - FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix - notation. The operators are restricted to grammar defined in the PI - specification. - - - - - - - - - - - - - - - This section is used to provide comments and/or list - auxiliary files, such as pdb or map files. - - - - - - - - - - - - - - - This is the path and filename location within - the ZIP file. - - - - - - - If true, used by installation - tools to ensure that a file that must be executable has the - correct properties to permit execution. - - - - - - - - - - - - - - This section is used for any processing instructions that - may be custom to the content provided by the distribution that are common to module. - The content is vendor specific. - The content can be plain text as well as any user-defined, - properly formatted XML structure. - - - - - This is a single word identifier for grouping - similar content. For example, ReferenceBuild might be used to identify non-PI - compliant build steps, with two different UserExtensions sections, one with an - Identifier of Prebuild, and another of PostBuild. Both UserExtensions sections would - use the same UserId. - - - - - This can be any string used to differentiate or - identify this section from other UserExtensions sections. - For example, a PRE_PROCESS Identifier might indicate - specific steps and tools required before processing module content, while a - different UserExtensions section with a POST_PROCESS Identifier might describe steps - that need to be executed after operations on this module. - - - - - - - - - - - This attribute is used when the binaries are distributed for - this module and no code generation from source files is required. If set, then the BinaryFiles - section should be used, and any files listed in the SourceFiles section do not have to be built. - Additionally, the AsBuilt section for each binary file must be included. - - - - - - - - - - - - - - - - This is the User Interface Name for this Tools - Distribution. - - - - - This is only required if the Copyright is - different from the Distribution Package copyright. - - - - - This is only required if the License is - different from the Distribution Package license. - - - - - This is only required if the Abstract is - different from the Distribution Package Abstract. - - - - - - - - - - - - This is only required if the Description is - different from the Distribution Package Description. - - - - - - - - - - - - - - - - This is the path and filename location within the ZIP file. - - - - - - - - This is required for tools that execute; it - should not be used for configuration files. - - - - - If true, used by installation tools to - ensure that a file that must be executable has the correct properties to - permit execution. - - - - - - - - - - - - - - This section contains a list of files that are not part of the code - distributed with modules, packages or tools. - - - - - - - - - The User interface name for this content. - - - - - - This is only required if the Copyright is - different from the Distribution Package Copyright. - - - - - This is only required if the License is - different from the Distribution Package License. - - - - - - - - - - - - - - - - - - This is the path and filename location within the ZIP file. - - - - - - - - If true, used by installation tools to - ensure that a file that must be executable has the correct properties to - permit execution. - - - - - - - - - - - - - - - - - - - This is a single word identifier for grouping similar content. - For example, ReferenceBuild might be used to identify non-PI compliant build steps, with two - different UserExtensions sections, one with an Identifier of Prebuild, and another of PostBuild. - Both UserExtensions sections would use the same UserId. - - - - - This can be any string used to differentiate or identify this - section from other UserExtensions sections. - For example, a PRE_PROCESS Identifier might indicate specific - steps and tools required before processing distribution package content, while a different - UserExtensions section with a POST_PROCESS Identifier might describe steps that need to be - executed after operations on this content. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Any processor architecture not listed above. The Architecture - must be a target architecture of one or more compiler tool chains. - - - - - - - - - - - - - Any other family of build utilities for which compiler tools - exist. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following module types are defined by specifications. - Module types for components and libraries defined for this distribution - mechanism. - - - - - Use of this module is not restricted. - - - - - This module is only applicable to the DXE core. - - - - - - This module is only applicable to a DXE driver. - - - - - - This module is only applicable to a DXE runtime driver. - - - - - - This module is only applicable to an IPF DXE runtime driver. - - - - - - This module is only applicable to a DXE SMM driver. - - - - - - This module is only applicable to the PEI core. - - - - - - This module is only valid for PEI modules. - - - - - This module is only applicable to Security phase. - - - - - - This module is only valid for UEFI drivers. - - - - - This module is only valid for UEFI runtime - drivers. - - - - - This module is only valid for UEFI applications. - - - - - - This module is only applicable to the SMM - core. - - - - - This content is restricted to a specific implementation. - - - - - - This enumeration is for use in a list that where the package - creator does not know the what module types are supported by a module. - - - - - This pattern has been added for use in a module lists - for - future expansion. - - - - - - - - The following data types are defined by the PCD specification (or PCD - section of the UEFI/PI specifications.) - - - - - - - - - - - - - - - - - - - - The Feature PCD is a binary, evaluating to either true or false. - This is used during build to include/exclude content. It can also be used during execution to - force execution paths within drivers, or to enable/disable features within a driver for a given - platform. - - - - - The Fixed PCD is a #define value that is set at build time. - - - - - - The Patch PCD is a #define that is set at build time, and that - can be modified within a binary file. Additional information, such as the offset location of the - value, along with it's length may need to be provided. - - - - - This PCD type has an overloaded definition. Prior to build, the - platform integrator may choose to implement a PCD as Fixed, Patchable or a Dynamic PCD. If the - platform integrator choose to use the PCD as dynamic, then a PCD driver is required in the - platform (PEI/DXE/both) to track the PCD in some sort of 'database' of these items. For Dynamic - PCDs, the PcdGet* must pass in the token space guid and the token number to retrieve data - (PcdSet* also needs these values.) - - - - - The PCD can only be used as Dynamic, and the platform firmware - must contain a driver to maintain a 'database' of these items. For Dynamic PCDs, the PcdGet* - must pass in the token space guid and the token number to retrieve data (PcdSet* also needs - these values.) - - - - - - - - A GUID must contain five different Hexadecimal character sets that are - separated by a dash (-) character. - - - - - - - - - The EDK II build system supports workstations running one of the - following supported operating systems. This is the OS for the developer's workstation, not the target - platform. - - - - - For Windows 2003, Windows XP and Windows Vista. - - - - - - For Windows 2003, Windows XP and Windows Vista. - - - - - - - - - - - - - - - Typically, this is used for Windows Batch files. - - - - - - Typically use for shell scripts - valid for any Linux and Mac - OS/X. - - - - - - - + + + + + + This schema defines the UEFI/PI Distribution Package description (PKG) + file. It describes the content of: + 1) Package descriptions with definitions and headers. + 2) Modules in either source or binary format. (Note that Binary format + is for FFS leaf section file types only, complete FFS files cannot be distributed using this + distribution format.) + 3) The distribution of custom tools used to modify the binary images to + create UEFI/PI compliant images. + 4) Finally, it can be used to distribute other miscellaneous content + that is not specific to UEFI/PI images. + The Package Surface Area describes the content of packages, while the + Module Surface Area provides information relevant to source and/or binary distributions. + + + + + + + This header contains (legal) information usually required + for distributing both binary and/or source code. + + + + + The list of packages in this distribution. + Packages are groups of files and/or modules that are similar + in nature. + Packages are uniquely identified by a package GUID and a + package version. + A package can declare public mappings of C names to GUID + values. + A package can provide header files for library classes + and/or other industry standard definitions. + A package can also declare public mappings of platform + configuration database (PCD) "knobs" to control features and operation of modules + within a platform. + Finally, a package lists the library instances and/or + modules that are provided in a distribution package. + + + + + The listing of UEFI/PI compliant modules in this + distribution that are NOT part of a Package. Every module that is provided as part of a + package needs to be described in a PackageSurfaceArea.Modules section. + The ModuleSurfaceArea section describes how each module in a + distribution is coded, or, in the case of a binary module distribution, how it was built. + UEFI/PI compliant libraries and modules are uniquely + identified by the Module's GUID and version number. + This section will typically be used for modules that don't + require any additional files that would be included in a package. For example, the Enhanced + FAT driver binary does not need to have a package description, as no additional files are + provided. + + + + + This section is for distributing vendor specific executable + tools, tool source code and/or configuration files. These tools are primarily for + manipulating code and/or binary images. + Tools in this section can: + 1) Parse build meta-data files to create source code files + and build scripts. + 2) Modify image files to conform to UEFI/PI specifications. + 3) Generate binary files from certain types of text/unicode + files. + 4) Generate PCI Option Roms or Firmware Device images. + 5) Implement external encoding/decoding/signature/GUIDed + tools. + 6) Distribution Package create/install/remove tools. + + + + + + The list of miscellaneous files in this distribution. Any + files that are not listed in either the Package, Module or Tools sections can be listed + here. This section can be used to distribute specifications for packages and modules that + are not "industry standards" such as a specification for a chipset or a video + device. + + + + + The UserExtensions section is used to disseminate processing + instructions that may be custom to the content provided by the distribution. This section + contains information that is common to all aspects of this disribution. + + + + + + + + + + + This section defines the content of the UEIF/PI compliant Distribution + Package Header. This is the only required element of a UEFI/PI compliant distribution package. + + + + + + + This is the User Interface Name for this Distribution + Package. + Each Distribution Package is uniquely identified by it's + GUID and Version number. + + + + + + + The reference name of the Distribution + Package file. This single word name can be used by tools as a keyword or for + directory and/or file creation. + White space and special characters (dash and + underscore characters may be used) are not permitted in this name. + + + + + + + + + + This 128-bit GUID and the Version attribute uniquely + identify this Distribution Package. + Backward compatible releases of a distribution package need + only change the version number, while non-backward compatible changes require the GUID to + change (resetting the version number to 1.0 is optional.) + + + + + + + This value, along with the GUID, is used to + uniquely identify this object. The higher the number, the more recent the + content. + + + + + + + + + A string identifying who created this distribution package. + + + + + + The date and time this distribution was created. The format + is: YYYY-MM-DDThh:mm:ss, for example: 2001-01-31T13:30:00 (note the T character separator + between the calendar date and the time. + + + + + The copyright for this file that is generated by the creator + of the distribution. If a derivative work is generated from an existing distribution, then + the existing copyright must be maintained, and additional copyrights may be appended to the + end of this element. It may also be the primary copyright for all code provided in the + Distribution Package. + + + + + + + + + + + + + A license that describes any restrictions on the use of this + distribution. If a derivative work is allowed by the original license and a derivative work + is generated from an existing distribution, then the existing license must be maintained, + and additional licenses may be appended to the end of this element. It may also be the + primary license for all code provided in the distribution file. Alternatively, this may + point to a filename that contains the License. The file (included in the content zip file) + will be stored in the same location as the distribution package's .pkg file. + + + + + + + + + + + + + A one line description of the Distribution Package. + + + + + + + + + + + + + A complete description of the Distribution Package. This + description may include the release name of the file, the version of the file, and a + complete description of the file contents and/or features including a description of the + updates since the previous file release. + + + + + + + + + + + + The packaging utilities will use this MD5 sum value of the + included ZIP file containing files and/or code. If this element is not present, then + installation tools should assume that the content is correct, or that other methods may be + needed to verify content. + + + + + This version of this XML Schema is 1.1 + Changes to 1.1 from 1.0 + #1 Updated to present date and new version which is + important to reflect the present state of the matter + #2 Added definition/enumeration of UNDEFIND type 2 is + important since there is a large body of legacy code for which the GUID’s and other + code/data objects were not decorated with their usage. This document will allow for + importing today’s source artifacts and producing decorations using the ‘Undefined’ versus + having an error + #3 Allow for inclusion of ARM and future architecture + types + + + + + + If set to true, all content within this Distribution Package + should NOT be modified. The default permits modification of all content. + + + + + If set to true, then the content can be repackaged into another + distribution package. The default prohibits repackaging the Distribution content. + + + + + + + + + + A package is a collection of related objects - Includes, Libraries and + Modules. + Each package is uniquely identified by it's GUID and Version number. + Backward compatible releases of a package need only change the version number, while non-backward + compatible changes require the GUID to change (resetting the version number to 1.0 is optional.) + + + + + + + + + + + This is the User Interface Name for this + package. + + + + + + + This is a single word BaseName + of the package. This BaseName can be used by tools as a keyword + and for directory/file creation. + + + + + + + + + This GUID and the Version attribute uniquely + identify a given package. + + + + + + + This value, along with the GUID, + is used to uniquely identify this object. + Backward compatible changes must + make sure this number is incremented from the most recent + version. Non-backward compatible changes require a new GUID, and + the version can be reset. + + + + + + + + + If the package requires a different copyright + than the distribution package, this element can list one or more copyright + lines. + + + + + + + + + + + + + If the package requires licenses that are + different from the distribution package license, this element can contain one or + more license text paragraphs (or license filenames.) + + + + + + + + + + + + + A one line description of this package. + + + + + + + + + + + + + A complete description of a package. This + description may include the release name of the package, the version of the + package, and a complete description of the package contents and/or features + including a description of the updates since the previous package’s release. + + + + + + + + + + + + + This element is the location (in the ZIP file) + for the root directory of a package. + + + + + + + + + + The term cloned is used here to indicate that this package + as been copied and modified to a completely different package. An example might be for a new + generation of chipsets that have few or no elements in common with the original. + + + + + + + This GUID and the Version attribute uniquely + identify the Package that this Package was copied from. + + + + + + + This value, along with the GUID, + is used to uniquely identify the package that this package was + cloned from. + + + + + + + + + + + + + + Library Classes are public interfaces that can be used by + modules. One or more library instances can implement a library class, however only one + library instance can be linked to an individual module. This provides the platform + integrator with the flexibility of choosing one library instance's implementation over a + different library instance. + + + + + + + + + The header file provides definitions + and function prototypes for a library class. Modules can be coded + against these functions, using the definitions in this header, + without concerning themselves about the libraries' implementation + details. This is a PackagePath relative path and filename for the + include file. + + + + + + + + This GUID and the + Version attribute uniquely identify the Recommended Library + Instance. + + + + + + + This value, along with + the GUID, is used to uniquely identify this object. If this + value is not specified, then any version of the library + instance is recommended. + + + + + + + + + + + + + + The single word name of the Library + Class that module developers will use to identify a library class + dependency. + + + + + + + + + + + + + This section is used to list header files for industry + standards not under the auspices of UEFI.org. For example, headers that contain definitions + and data structures for the USB specifications. + + + + + + + + + The package relative path and + filename (in the content zip file) of the industry standard include + file. + + + + + + + + + + + + + + All top level header files that are included by a package + that are not listed above. They cannot be: + 1) Local to a module (module specific.) + 2) An industry standard header. + 3) A library class header. + + + + + + + + + This is the Package relative path + and filename location within the content ZIP file. + + + + + + + + + + + + + + + + + + + + + + + + + This section lists the Module Surface Area for + all modules provided with this package. + + + + + + + + + + This section defines the mapping of GUID C names to GUID + values as a Registry Format GUID. + Modules that use these GUIDs must specify their dependency + on this package. + + + + + + Individual GUID Declarations + + + + + + + + + + + + + + + + + + + + This section defines the mapping of Protocol C names to GUID + values as a Registry Format GUID. + Modules that use these Protocols must specify their + dependency on this package. + + + + + + Individual Protocol Declarations + + + + + + + + + + + + + + + + + + + + This section defines the mapping of Ppi C names to GUID + values as a Registry Format GUID. + Modules that use these Ppis must specify their dependency on + this package. + + + + + + Individual PPI Declarations + + + + + + + + + + + + + + + + + + + This section is used to declare platform configuration knobs + that are defined by this package. + Modules that use these PCD values must specify their + dependency on this package. + + + + + + + + + Specifies the C name of the Token + Space GUID of which this PCD Entry is a member. This C name should + also be listed in the GUIDs section, (specified above,) where the C + name is assigned to a GUID value. + + + + + Specifies the 32-bit token value for + this PCD Entry. The Token number must be unique to the Token Space + that declares the PCD. + The minLength of 3 is required to + handle the "0x" prefix to the hex number. + + + + + + + + + + + + A string that contains the data type + of this PCD Entry. PCD data types are restricted to the following + set:UINT8, UINT16, UINT32, UINT64, VOID*, BOOLEAN. + + + + + + A string that contains one or more + PCD Item types separated by spaces. The PCD Item types are + restricted to FeaturePcd, FixedPcd, PatchPcd, Pcd and/or PcdEx. + + + + + + + This is a recommended maximum data + size for VOID* data types, the actual value should be defined by the + Platform Integrator. It is not required for the other data types. + The minLength of 3 is required to + handle the "0x" prefix to the hex number. + + + + + + + + + + + This entry contains prompt + information, that may used by tools to assist platform integrators + with choosing the correct values + + + + + + + + + + + + + + Valid Error messages that may be + implemented in a module for the PCD Entry. Only One Error Number per + PcdError, (multiple ErrorMessage entries are permitted) and multiple + PcdError elements are permitted. + + + + + + One of the following + types of comparisons, which must be able to evaluate to + either true or false. + + + + The PCD Value must be + space separated list of values. Values are restricted to the + data type of this PCD. + + + + + + + + + + + + The PCD must be within a + specifed range of numeric values. Restricted to C style + Relational, Equality and Logicial Operators and parenthesis + are valid. Only the CName for this PCD is permitted in the + ValidValueRange expression. All other values must be + numeric. + LValue (op RValue)+ + + + + + + A in-fix logical + expression using C style logical operators. + + + + + + + A hexadecimal value for + the error message as defined by specifications. + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + This string should be + defined by specifications. There are pre-defined error + number ranges in the UEFI/PI specificaiton. + + + + + + + + + + + + + + + + + + + + + + + + + This section is used to describe any PCD interdependencies + or relationships. + + + + + + This entry must used + TokenSpaceGuidCName.PcdCname for every named PCD. Restricted to Relational, + Equality and Logical Operators (NOT, AND, OR, GT, GE, EQ, LE, LT and XOR) and + parenthesis are valid. Only the TokenSpaceGuidCName.PcdCname us permitted to + name PCDs in the expression. All other values must be numeric. + LValue (op RValue)+ + + + + + + + + + This section contains files that are not part of the code + distributed with this package. + + + + + + Only required if different from the Package + Copyright. + + + + + Only required if different from the Package + License. + + + + + A one line description of this section's + content. + + + + + A complete description of the files in this + section. + + + + + This is the PackagePath relative path and + filename location within the ZIP file. + + + + + + + If true, used by installation + tools to ensure that a file that must be executable has the + correct properties to permit execution. + + + + + + + + + + + + + + + This section is used for any processing instructions that + may be custom to the content provided by this package that are common to this package. + + + + + + + + + This is a single word identifier for grouping + similar content that does not fit into previously defined sections or other sections + of the Distribution. + + + + + This can be used to differentiate multiple sections + with a grouping. + For example, a PRE_PROCESS Identifier might indicate + specific steps and tools required before processing module content, while a + different UserExtensions section with a POST_PROCESS Identifier might describe steps + that need to be executed after operations on the modules in this package. + + + + + + + + + + + + + + + + Each module is uniquely identified by it's GUID and Version number. + Backward compatible releases of a module need only change the version number, while non-backward + compatible changes require the GUID to change (resetting the version number to 1.0 is optional.) + + + + + + + + + + + This is the User Interface Name for this Module. + + + + + + + + This is a single word BaseName + that will be used to create a module meta-data file. + This name should also be used to + create output file names and directories. + + + + + + + + + This GUID and the Version attribute uniquely + identify a given Module. + + + + + + + This value, along with the GUID, + is used to uniquely identify this object. + Backward compatible changes must + make sure this number is incremented from the most recent + version. Non-backward compatible changes require a new GUID, and + the version can be reset. + + + + + + + + + This is only required if the Copyright is + different from either the Package or Distribution copyright. Multiple copyright + lines are permitted within this section. + + + + + + + + + + + + This is only required if the license is + different from either the Package or Distribution license. Multiple licenses are + permitted within this section. + + + + + + + + + + + + A brief text description of the module. + + + + + + + + + + + + + A complete description of the module contents + and/or features including a description of the updates since the previous module + release. + + + + + + + + + + + + + + + + + List general information about a module, including the + Supported Architectures, this module's type, specifications the module is coded against, and + other informational content. + + + + + + One of the Enumerated module types that limit + the use of a module. + + + + + For stand-alone modules that are NOT part of any + package, this is the path to the root of the module as listed in the ZIP file. + For modules included in a package, this is the location, relative to the root of + the package (PackagePath) this module belongs to. + + + + + This element is only required for the PEIM that + produces the PCD PPI or the DXE Driver that produces the PCD Protocol. + + + + + + + + + + + + + + + + + This is a list of other specifications that this + module is written against. These entries can be used in #define statements + (depending on the build system implementation, they may be autogenerated.) + + + + + + + + + + + + + + Different firmware execution paths may be taken + based on a given state of the hardware, firmware, or through feature settings. A + BootMode may be declared (PRODUCES) or discovered (CONSUMES) based on these + states and feature settings. If the usage is UNDEFINE, it implies that a Boot + Mode is used, but the package creator does not know how it is used. The + supported boot modes map to the PI specification Boot Modes. The boot modes + listed with Recovery are to indicate that the BootMode is valid during a + recovery boot. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The module always supports + the given boot modes. + + + + + The module may support a + given mode on some execution paths. + + + + + The module will change the + boot mode. + + + + + The module will change the + boot mode on some exection paths. + + + + + The package creator does not + know how the boot mode is used. + + + + + + + + + + + + + The functions that make up the Event, Timer, and + Task Priority Services are used during preboot to create, close, signal, and + wait for events; to set timers; and to raise and restore task priority levels as + defined in the UEFI specification. GUIDed events should be listed in the Guids + section. + + + + + + + + + + + The module will register a + notification function and calls the function when it is + signaled. + + + + + The module will register a + notification function and calls the function when it is + signaled on some execution paths. + + + + + The module will signal all + events in an event group. + + + + + The module will signal all + events in an event group under some execution paths. + + + + + + The package creator does not + know how an event is used. + + + + + + + + + + + + + + + + + + + + + + + + This is a list of non-GUIDed Hand Off Blocks + (HOBs) produced or consumed by this module. + + + + + + + + + + + + + + + + + + + + + + + A HOB must be present in the + system. + + + + + If present, the HOB will be + used. + + + + + The HOB is always produced + by the module. + + + + + The HOB may be produced by + the module under some execution paths. + + + + + The package creator knows + that a HOB is used, but does not know how it is used. + + + + + + + + + + + + + + + + + + + + This section may be included for Modules that are copied + from a different module. + + + + + + This GUID and the Version attribute uniquely + identify the Module that this Module was copied from. + + + + + + + This value, along with the GUID, + is used to uniquely identify this object. + + + + + + + + + + + + + + A list of the different Library Classes consumed by a + driver, core and/or application module, or produced by a Library module. + + + + + + + + + Used by tools to identify different + instances of libraries that provide the library class. This keyword + identifies the library class this module needs to be linked against. + + + + + + + + + This GUID and the + Version attribute uniquely identify the recommended Library + Instance for this module . + + + + + + + This value, along with + the GUID, is used to uniquely identify this object. + + + + + + + + + + + + + + + + Library instances can provide code + for a library class, or may require other library instances + themselves. Since different execution paths in a library (or module) + may need different library classes based on some setting, library + classes may not alway be required. + + + + + + + + + + + + + + A FeatureFlag attribute must evaluate to + either true or false - it may be a fixed value of true or false, a C + name or an in-fix expression. + + + + + + + + + + + + + + + This is the module relative + (ModuleProperties.Path) path and filename location within the ZIP file. + + + + + + + + The Family attribute is used to + restrict usage to a given family of compilers, such as GCC or + MSFT. Since not all code processing tools use the same syntax, + especially for assembly, this field can be used to identify + different syntax. + + + + + + + + + + + + + + + + + + + + + + + + This is the module relative + (ModuleProperties.Path) path and filename location within the ZIP + file. + + + + + + + + + Binary file distribution + is limited to UEFI/PI FFS leaf section file types. + + + + + + + + A UEFI/PI FFS Leaf + section file type, not a raw PE32 file. + + + + + + + + + + + + + + + + + + + + + + + + + + + This section contains information + about how the module was coded, such as Compiler Tools, Flags, PCDs + (only PatchPcd and/or PcdEx) and Library Class Instances used to + build the binary. + + + + + + + The element is the + Patchable PCD Value that was used during the build. + + + + + + + + + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + + This field is required + if the Pcd Datum Type is VOID* + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + Error information + implemented by the module. + + + + + + + + + + + + + + + + + + + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + + + + + + + + + + + + + + + + The element is the + DynamicEx PCD Value that was used during the build. + + + + + + + + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + + This field is required + if the Pcd Datum Type is VOID* + + + + + + + + + + + + Error information + implemented by the module. + + + + + + + + + + + + + + + + + + + The minLength of 3 is + required to handle the "0x" prefix to the hex number. + + + + + + + + + + + + + + + + + + + + + + + + + + + This is the actual + library instance that was used to link against the module. + + + + + + + This GUID and the + Version attribute uniquely identify the actual Library + Instance linked in this module. + + + + + + + This value, along with + the GUID, is used to uniquely identify this object. + + + + + + + + + + + + + + + + Any description of OS, + Tool, and flags for the individual tool can go in this + section. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This GUID and the Version attribute + uniquely identify Package that this Module depends on. + + + + + + + + This value, along with + the GUID, is used to uniquely identify this object. If the + version attribute is not specified, the most recent version + of the package can be used. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Only valid for Variable GUID types. + This can be either a Hex Array or C string in unicode + format: L"string" Data. + + + + + + + + + + The module does not install + the GUID, and the GUID must be present for the module to + execute. + + + + + The module does not install + the GUID, however, the GUID will be used if it is present. + + + + + + The module always installs + the GUID. + + + + + The Module will install the + GUID under certain execution paths. + + + + + The package creator knows + that a GUID is used, but does not know how it is used. + + + + + + + + + + + + + + + + + + + + A listing of protocols required or produced by this module. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A listing of PPIs required or produced by this module. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + These elements specify additional information about the + module. This area may be used by tools to generate code. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This section describes how a platform is coded with respect + to the platform configuration knobs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This is the PEI dependency expression for a Dependency + Section. + + + + + + An in-fix expression, of C identifiers and TRUE, + FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix + notation. The operators are restricted to grammar defined in the PI + specification. + + + + + + + + + + + + + + This is the DXE dependency expression for a Dependency + Section. + + + + + + An in-fix expression, of C identifiers and TRUE, + FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix + notation. The operators are restricted to grammar defined in the PI + specification. + + + + + + + + + + + + + + This is the SMM dependency expression for a Dependency + Section. + + + + + + An in-fix expression, of C identifiers and TRUE, + FALSE, AND, OR, NOT, BEFORE, and AFTER as well as parenthesis () in the in-fix + notation. The operators are restricted to grammar defined in the PI + specification. + + + + + + + + + + + + + + + This section is used to provide comments and/or list + auxiliary files, such as pdb or map files. + + + + + + + + + + + + + + + This is the path and filename location within + the ZIP file. + + + + + + + If true, used by installation + tools to ensure that a file that must be executable has the + correct properties to permit execution. + + + + + + + + + + + + + + This section is used for any processing instructions that + may be custom to the content provided by the distribution that are common to module. + The content is vendor specific. + The content can be plain text as well as any user-defined, + properly formatted XML structure. + + + + + This is a single word identifier for grouping + similar content. For example, ReferenceBuild might be used to identify non-PI + compliant build steps, with two different UserExtensions sections, one with an + Identifier of Prebuild, and another of PostBuild. Both UserExtensions sections would + use the same UserId. + + + + + This can be any string used to differentiate or + identify this section from other UserExtensions sections. + For example, a PRE_PROCESS Identifier might indicate + specific steps and tools required before processing module content, while a + different UserExtensions section with a POST_PROCESS Identifier might describe steps + that need to be executed after operations on this module. + + + + + + + + + + + This attribute is used when the binaries are distributed for + this module and no code generation from source files is required. If set, then the BinaryFiles + section should be used, and any files listed in the SourceFiles section do not have to be built. + Additionally, the AsBuilt section for each binary file must be included. + + + + + + + + + + + + + + + + This is the User Interface Name for this Tools + Distribution. + + + + + This is only required if the Copyright is + different from the Distribution Package copyright. + + + + + This is only required if the License is + different from the Distribution Package license. + + + + + This is only required if the Abstract is + different from the Distribution Package Abstract. + + + + + + + + + + + + This is only required if the Description is + different from the Distribution Package Description. + + + + + + + + + + + + + + + + This is the path and filename location within the ZIP file. + + + + + + + + This is required for tools that execute; it + should not be used for configuration files. + + + + + If true, used by installation tools to + ensure that a file that must be executable has the correct properties to + permit execution. + + + + + + + + + + + + + + This section contains a list of files that are not part of the code + distributed with modules, packages or tools. + + + + + + + + + The User interface name for this content. + + + + + + This is only required if the Copyright is + different from the Distribution Package Copyright. + + + + + This is only required if the License is + different from the Distribution Package License. + + + + + + + + + + + + + + + + + + This is the path and filename location within the ZIP file. + + + + + + + + If true, used by installation tools to + ensure that a file that must be executable has the correct properties to + permit execution. + + + + + + + + + + + + + + + + + + + This is a single word identifier for grouping similar content. + For example, ReferenceBuild might be used to identify non-PI compliant build steps, with two + different UserExtensions sections, one with an Identifier of Prebuild, and another of PostBuild. + Both UserExtensions sections would use the same UserId. + + + + + This can be any string used to differentiate or identify this + section from other UserExtensions sections. + For example, a PRE_PROCESS Identifier might indicate specific + steps and tools required before processing distribution package content, while a different + UserExtensions section with a POST_PROCESS Identifier might describe steps that need to be + executed after operations on this content. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Any processor architecture not listed above. The Architecture + must be a target architecture of one or more compiler tool chains. + + + + + + + + + + + + + Any other family of build utilities for which compiler tools + exist. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The following module types are defined by specifications. + Module types for components and libraries defined for this distribution + mechanism. + + + + + Use of this module is not restricted. + + + + + This module is only applicable to the DXE core. + + + + + + This module is only applicable to a DXE driver. + + + + + + This module is only applicable to a DXE runtime driver. + + + + + + This module is only applicable to an IPF DXE runtime driver. + + + + + + This module is only applicable to a DXE SMM driver. + + + + + + This module is only applicable to the PEI core. + + + + + + This module is only valid for PEI modules. + + + + + This module is only applicable to Security phase. + + + + + + This module is only valid for UEFI drivers. + + + + + This module is only valid for UEFI runtime + drivers. + + + + + This module is only valid for UEFI applications. + + + + + + This module is only applicable to the SMM + core. + + + + + This content is restricted to a specific implementation. + + + + + + This enumeration is for use in a list that where the package + creator does not know the what module types are supported by a module. + + + + + This pattern has been added for use in a module lists - for + future expansion. + + + + + + + + The following data types are defined by the PCD specification (or PCD + section of the UEFI/PI specifications.) + + + + + + + + + + + + + + + + + + + + The Feature PCD is a binary, evaluating to either true or false. + This is used during build to include/exclude content. It can also be used during execution to + force execution paths within drivers, or to enable/disable features within a driver for a given + platform. + + + + + The Fixed PCD is a #define value that is set at build time. + + + + + + The Patch PCD is a #define that is set at build time, and that + can be modified within a binary file. Additional information, such as the offset location of the + value, along with it's length may need to be provided. + + + + + This PCD type has an overloaded definition. Prior to build, the + platform integrator may choose to implement a PCD as Fixed, Patchable or a Dynamic PCD. If the + platform integrator choose to use the PCD as dynamic, then a PCD driver is required in the + platform (PEI/DXE/both) to track the PCD in some sort of 'database' of these items. For Dynamic + PCDs, the PcdGet* must pass in the token space guid and the token number to retrieve data + (PcdSet* also needs these values.) + + + + + The PCD can only be used as Dynamic, and the platform firmware + must contain a driver to maintain a 'database' of these items. For Dynamic PCDs, the PcdGet* + must pass in the token space guid and the token number to retrieve data (PcdSet* also needs + these values.) + + + + + + + + A GUID must contain five different Hexadecimal character sets that are + separated by a dash (-) character. + + + + + + + + + The EDK II build system supports workstations running one of the + following supported operating systems. This is the OS for the developer's workstation, not the target + platform. + + + + + For Windows 2003, Windows XP and Windows Vista. + + + + + + For Windows 2003, Windows XP and Windows Vista. + + + + + + + + + + + + + + + Typically, this is used for Windows Batch files. + + + + + + Typically use for shell scripts - valid for any Linux and Mac + OS/X. + + + + + + + diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index ec4eb97527..a68218deac 100644 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -192,11 +192,6 @@ DEFINE IPHONE_TOOLS = /Developer/Platforms/iPhoneOS.platform/Develope DEFINE SOURCERY_CYGWIN_TOOLS = /cygdrive/c/Program Files/CodeSourcery/Sourcery G++ Lite/bin -# -# Change to the location clang was built -# -DEFINE CLANG_BIN = /usr/bin/ - #################################################################################### # # format: TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE = @@ -3136,11 +3131,11 @@ DEFINE GCC_ALL_CC_FLAGS = -g -Os -fshort-wchar -fno-strict-aliasing - DEFINE GCC_IA32_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2 -mno-stack-arg-probe DEFINE GCC_X64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address -mno-stack-arg-probe DEFINE GCC_IPF_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency -DEFINE GCC_ARM_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address +DEFINE GCC_ARM_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address -mthumb -mfloat-abi=soft DEFINE GCC_AARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mcmodel=large -mlittle-endian -fno-short-enums -save-temps -fverbose-asm -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-builtin -Wno-address DEFINE GCC_DLINK_FLAGS_COMMON = -nostdlib --pie DEFINE GCC_IA32_X64_DLINK_COMMON = DEF(GCC_DLINK_FLAGS_COMMON) --gc-sections -DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Ttext=0x0 --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map +DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Ttext=0x0 --emit-relocs -nostdlib --gc-sections -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEFINE GCC_ARM_AARCH64_ASLDLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) --entry ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEFINE GCC_IA32_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map @@ -3184,7 +3179,7 @@ DEFINE GCC46_IA32_X64_DLINK_FLAGS = DEF(GCC45_IA32_X64_DLINK_FLAGS) DEFINE GCC46_X64_DLINK_FLAGS = DEF(GCC45_X64_DLINK_FLAGS) DEFINE GCC46_ASM_FLAGS = DEF(GCC45_ASM_FLAGS) DEFINE GCC46_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ASM_FLAGS) -mlittle-endian -DEFINE GCC46_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC44_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char -mno-unaligned-access -Wno-address -fomit-frame-pointer +DEFINE GCC46_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC44_ALL_CC_FLAGS) DEF(GCC_ARM_CC_FLAGS) -mno-unaligned-access DEFINE GCC46_ARM_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) --oformat=elf32-littlearm DEFINE GCC46_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) --oformat=elf32-littlearm @@ -3198,7 +3193,7 @@ DEFINE GCC47_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) DEFINE GCC47_ARM_ASM_FLAGS = DEF(GCC46_ARM_ASM_FLAGS) DEFINE GCC47_AARCH64_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ASM_FLAGS) -mlittle-endian DEFINE GCC47_ARM_CC_FLAGS = DEF(GCC46_ARM_CC_FLAGS) -DEFINE GCC47_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC44_ALL_CC_FLAGS) -mcmodel=large -mlittle-endian -fno-short-enums -save-temps -fverbose-asm -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-builtin -Wno-address +DEFINE GCC47_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC44_ALL_CC_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) DEFINE GCC47_ARM_DLINK_FLAGS = DEF(GCC46_ARM_DLINK_FLAGS) DEFINE GCC47_AARCH64_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) DEFINE GCC47_ARM_ASLDLINK_FLAGS = DEF(GCC46_ARM_ASLDLINK_FLAGS) @@ -3516,7 +3511,7 @@ DEFINE GCC48_AARCH64_ASLDLINK_FLAGS = DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) *_GCC46_ARM_ASLPP_PATH = ENV(GCC46_ARM_PREFIX)gcc *_GCC46_ARM_RC_PATH = ENV(GCC46_ARM_PREFIX)objcopy -*_GCC46_ARM_ARCHCC_FLAGS = -mthumb +*_GCC46_ARM_ARCHCC_FLAGS = *_GCC46_ARM_PLATFORM_FLAGS = -march=armv7-a *_GCC46_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) @@ -3610,7 +3605,7 @@ RELEASE_GCC46_ARM_CC_FLAGS = DEF(GCC46_ARM_CC_FLAGS) -Wno-unused-but-set-v *_GCC47_ARM_ASLPP_PATH = ENV(GCC47_ARM_PREFIX)gcc *_GCC47_ARM_RC_PATH = ENV(GCC47_ARM_PREFIX)objcopy -*_GCC47_ARM_ARCHCC_FLAGS = -mthumb +*_GCC47_ARM_ARCHCC_FLAGS = *_GCC47_ARM_PLATFORM_FLAGS = -march=armv7-a *_GCC47_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) @@ -5484,15 +5479,15 @@ RELEASE_XCODE32_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mthumb-inter RELEASE_XCLANG_*_MTOC_FLAGS = -align 0x20 -*_XCLANG_*_CC_PATH = DEF(CLANG_BIN)clang +*_XCLANG_*_CC_PATH = ENV(CLANG_BIN)clang *_XCLANG_*_SLINK_PATH = libtool *_XCLANG_*_DLINK_PATH = ld *_XCLANG_*_ASM_PATH = as -*_XCLANG_*_PP_PATH = DEF(CLANG_BIN)clang -*_XCLANG_*_VFRPP_PATH = DEF(CLANG_BIN)clang +*_XCLANG_*_PP_PATH = ENV(CLANG_BIN)clang +*_XCLANG_*_VFRPP_PATH = ENV(CLANG_BIN)clang *_XCLANG_*_ASL_PATH = iasl -*_XCLANG_*_ASLCC_PATH = DEF(CLANG_BIN)clang -*_XCLANG_*_ASLPP_PATH = DEF(CLANG_BIN)clang +*_XCLANG_*_ASLCC_PATH = ENV(CLANG_BIN)clang +*_XCLANG_*_ASLPP_PATH = ENV(CLANG_BIN)clang *_XCLANG_*_ASLDLINK_PATH = ld #################### @@ -5550,7 +5545,7 @@ DEFINE RVCT_ALL_DLINK_FLAGS = --ro-base 0 --no_scanlib --reloc --no_exceptions # # Use default values, or override in DSC file # -*_RVCT_ARM_ARCHCC_FLAGS = --thumb +*_RVCT_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp *_RVCT_ARM_ARCHASM_FLAGS = *_RVCT_ARM_ARCHDLINK_FLAGS = *_RVCT_ARM_PLATFORM_FLAGS = --cpu 7-A @@ -5592,7 +5587,7 @@ RELEASE_RVCT_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --diag_suppress=5 # # Use default values, or override in DSC file # -*_RVCTLINUX_ARM_ARCHCC_FLAGS = --thumb +*_RVCTLINUX_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp *_RVCTLINUX_ARM_ARCHASM_FLAGS = *_RVCTLINUX_ARM_ARCHDLINK_FLAGS = *_RVCTLINUX_ARM_PLATFORM_FLAGS = --cpu 7-A @@ -5639,7 +5634,7 @@ RELEASE_RVCTLINUX_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) --diag_suppr # # Use default values, or override in DSC file # -*_RVCTCYGWIN_ARM_ARCHCC_FLAGS = --thumb +*_RVCTCYGWIN_ARM_ARCHCC_FLAGS = --thumb --fpu=softvfp *_RVCTCYGWIN_ARM_ARCHASM_FLAGS = *_RVCTCYGWIN_ARM_ARCHDLINK_FLAGS = *_RVCTCYGWIN_ARM_PLATFORM_FLAGS = --cpu 7-A @@ -5707,7 +5702,7 @@ RELEASE_RVCTCYGWIN_ARM_CC_FLAGS = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_F # # Use default values, or override in DSC file # -*_ARMGCC_ARM_ARCHCC_FLAGS = -mthumb +*_ARMGCC_ARM_ARCHCC_FLAGS = *_ARMGCC_ARM_ARCHASM_FLAGS = *_ARMGCC_ARM_ARCHDLINK_FLAGS = *_ARMGCC_ARM_PLATFORM_FLAGS = -march=armv7-a @@ -5719,7 +5714,7 @@ RELEASE_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-end *_ARMGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h *_ARMGCC_ARM_SLINK_FLAGS = -rc -*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map +*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(GCC_ARM_AARCH64_DLINK_COMMON) --oformat=elf32-littlearm DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -O0 RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -Wno-unused @@ -5755,7 +5750,7 @@ RELEASE_ARMGCC_AARCH64_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) *_ARMGCC_AARCH64_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h *_ARMGCC_AARCH64_SLINK_FLAGS = -rc -*_ARMGCC_AARCH64_DLINK_FLAGS = $(ARCHDLINK_FLAGS) -Ttext=0x0 --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map +*_ARMGCC_AARCH64_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(GCC_ARM_AARCH64_DLINK_COMMON) DEBUG_ARMGCC_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) -Wno-address -O0 RELEASE_ARMGCC_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable @@ -5801,7 +5796,7 @@ RELEASE_ARMGCC_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_AARC # # Use default values, or override in DSC file # -*_ARMLINUXGCC_ARM_ARCHCC_FLAGS = -mthumb +*_ARMLINUXGCC_ARM_ARCHCC_FLAGS = *_ARMLINUXGCC_ARM_ARCHASM_FLAGS = *_ARMLINUXGCC_ARM_ARCHDLINK_FLAGS = *_ARMLINUXGCC_ARM_PLATFORM_FLAGS = -march=armv7-a @@ -5813,7 +5808,7 @@ RELEASE_ARMLINUXGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittl *_ARMLINUXGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h *_ARMLINUXGCC_ARM_SLINK_FLAGS = -rc -*_ARMLINUXGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map +*_ARMLINUXGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(GCC_ARM_AARCH64_DLINK_COMMON) --oformat=elf32-littlearm DEBUG_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -fno-stack-protector -mno-unaligned-access -O0 RELEASE_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -fno-stack-protector -mno-unaligned-access -Wno-unused-but-set-variable @@ -5849,7 +5844,7 @@ RELEASE_ARMLINUXGCC_AARCH64_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) *_ARMLINUXGCC_AARCH64_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h *_ARMLINUXGCC_AARCH64_SLINK_FLAGS = -rc -*_ARMLINUXGCC_AARCH64_DLINK_FLAGS = $(ARCHDLINK_FLAGS) -Ttext=0x0 --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map +*_ARMLINUXGCC_AARCH64_DLINK_FLAGS = $(ARCHDLINK_FLAGS) DEF(GCC_ARM_AARCH64_DLINK_COMMON) DEBUG_ARMLINUXGCC_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) -Wno-address -O0 RELEASE_ARMLINUXGCC_AARCH64_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index ae07509496..124517b6c1 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -1,87 +1,87 @@ -## @file -# GNU/Linux makefile for C tools build. -# -# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -ifndef ARCH - # - # If ARCH is not defined, then we use 'uname -m' to attempt - # try to figure out the appropriate ARCH. - # - uname_m = $(shell uname -m) - $(info Attempting to detect ARCH from 'uname -m': $(uname_m)) - ifeq ($(uname_m),x86_64) - ARCH=X64 - endif - ifeq ($(patsubst i%86,IA32,$(uname_m)),IA32) - ARCH=IA32 - endif - ifndef ARCH - $(info Could not detected ARCH from uname results) - $(error ARCH is not defined!) - endif - $(info Detected ARCH of $(ARCH) using uname.) -endif - -export ARCH - -MAKEROOT = . - -include Makefiles/header.makefile - -all: makerootdir subdirs $(MAKEROOT)/libs - @echo Finished building BaseTools C Tools with ARCH=$(ARCH) - -LIBRARIES = Common -# NON_BUILDABLE_APPLICATIONS = GenBootSector BootSectImage -APPLICATIONS = \ - GnuGenBootSector \ - BootSectImage \ - EfiLdrImage \ - EfiRom \ - GenFfs \ - GenFv \ - GenFw \ - GenPage \ - GenSec \ - GenCrc32 \ - GenVtf \ - LzmaCompress \ - Split \ - TianoCompress \ - VolInfo \ - VfrCompile - -SUBDIRS := $(LIBRARIES) $(APPLICATIONS) - -.PHONY: outputdirs -makerootdir: - -mkdir -p $(MAKEROOT) - -.PHONY: subdirs $(SUBDIRS) -subdirs: $(SUBDIRS) -$(SUBDIRS): - $(MAKE) -C $@ - -.PHONY: $(patsubst %,%-clean,$(sort $(SUBDIRS))) -$(patsubst %,%-clean,$(sort $(SUBDIRS))): - -$(MAKE) -C $(@:-clean=) clean - -clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) - -clean: localClean - -localClean: - rm -f $(MAKEROOT)/bin/* - -rmdir $(MAKEROOT)/libs $(MAKEROOT)/bin - -include Makefiles/footer.makefile +## @file +# GNU/Linux makefile for C tools build. +# +# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +ifndef ARCH + # + # If ARCH is not defined, then we use 'uname -m' to attempt + # try to figure out the appropriate ARCH. + # + uname_m = $(shell uname -m) + $(info Attempting to detect ARCH from 'uname -m': $(uname_m)) + ifeq ($(uname_m),x86_64) + ARCH=X64 + endif + ifeq ($(patsubst i%86,IA32,$(uname_m)),IA32) + ARCH=IA32 + endif + ifndef ARCH + $(info Could not detected ARCH from uname results) + $(error ARCH is not defined!) + endif + $(info Detected ARCH of $(ARCH) using uname.) +endif + +export ARCH + +MAKEROOT = . + +include Makefiles/header.makefile + +all: makerootdir subdirs $(MAKEROOT)/libs + @echo Finished building BaseTools C Tools with ARCH=$(ARCH) + +LIBRARIES = Common +# NON_BUILDABLE_APPLICATIONS = GenBootSector BootSectImage +APPLICATIONS = \ + GnuGenBootSector \ + BootSectImage \ + EfiLdrImage \ + EfiRom \ + GenFfs \ + GenFv \ + GenFw \ + GenPage \ + GenSec \ + GenCrc32 \ + GenVtf \ + LzmaCompress \ + Split \ + TianoCompress \ + VolInfo \ + VfrCompile + +SUBDIRS := $(LIBRARIES) $(APPLICATIONS) + +.PHONY: outputdirs +makerootdir: + -mkdir -p $(MAKEROOT) + +.PHONY: subdirs $(SUBDIRS) +subdirs: $(SUBDIRS) +$(SUBDIRS): + $(MAKE) -C $@ + +.PHONY: $(patsubst %,%-clean,$(sort $(SUBDIRS))) +$(patsubst %,%-clean,$(sort $(SUBDIRS))): + -$(MAKE) -C $(@:-clean=) clean + +clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) + +clean: localClean + +localClean: + rm -f $(MAKEROOT)/bin/* + -rmdir $(MAKEROOT)/libs $(MAKEROOT)/bin + +include Makefiles/footer.makefile diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c b/BaseTools/Source/C/GenFw/Elf32Convert.c index 58ac333888..97c9380c8d 100644 --- a/BaseTools/Source/C/GenFw/Elf32Convert.c +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c @@ -1,1047 +1,1047 @@ -/** @file - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    -Portions copyright (c) 2013, ARM Ltd. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "WinNtInclude.h" - -#ifndef __GNUC__ -#include -#include -#endif -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "PeCoffLib.h" -#include "EfiUtilityMsgs.h" - -#include "GenFw.h" -#include "ElfConvert.h" -#include "Elf32Convert.h" - -STATIC -VOID -ScanSections32 ( - VOID - ); - -STATIC -BOOLEAN -WriteSections32 ( - SECTION_FILTER_TYPES FilterType - ); - -STATIC -VOID -WriteRelocations32 ( - VOID - ); - -STATIC -VOID -WriteDebug32 ( - VOID - ); - -STATIC -VOID -SetImageSize32 ( - VOID - ); - -STATIC -VOID -CleanUp32 ( - VOID - ); - -// -// Rename ELF32 strucutres to common names to help when porting to ELF64. -// -typedef Elf32_Shdr Elf_Shdr; -typedef Elf32_Ehdr Elf_Ehdr; -typedef Elf32_Rel Elf_Rel; -typedef Elf32_Sym Elf_Sym; -typedef Elf32_Phdr Elf_Phdr; -typedef Elf32_Dyn Elf_Dyn; -#define ELFCLASS ELFCLASS32 -#define ELF_R_TYPE(r) ELF32_R_TYPE(r) -#define ELF_R_SYM(r) ELF32_R_SYM(r) - -// -// Well known ELF structures. -// -STATIC Elf_Ehdr *mEhdr; -STATIC Elf_Shdr *mShdrBase; -STATIC Elf_Phdr *mPhdrBase; - -// -// Coff information -// -STATIC const UINT32 mCoffAlignment = 0x20; - -// -// PE section alignment. -// -STATIC const UINT16 mCoffNbrSections = 5; - -// -// ELF sections to offset in Coff file. -// -STATIC UINT32 *mCoffSectionsOffset = NULL; - -// -// Offsets in COFF file -// -STATIC UINT32 mNtHdrOffset; -STATIC UINT32 mTextOffset; -STATIC UINT32 mDataOffset; -STATIC UINT32 mHiiRsrcOffset; -STATIC UINT32 mRelocOffset; - -// -// Initialization Function -// -BOOLEAN -InitializeElf32 ( - UINT8 *FileBuffer, - ELF_FUNCTION_TABLE *ElfFunctions - ) -{ - // - // Initialize data pointer and structures. - // - mEhdr = (Elf_Ehdr*) FileBuffer; - - // - // Check the ELF32 specific header information. - // - if (mEhdr->e_ident[EI_CLASS] != ELFCLASS32) { - Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFCLASS32"); - return FALSE; - } - if (mEhdr->e_ident[EI_DATA] != ELFDATA2LSB) { - Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFDATA2LSB"); - return FALSE; - } - if ((mEhdr->e_type != ET_EXEC) && (mEhdr->e_type != ET_DYN)) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN"); - return FALSE; - } - if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_ARM))) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_machine not EM_386 or EM_ARM"); - return FALSE; - } - if (mEhdr->e_version != EV_CURRENT) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT); - return FALSE; - } - - // - // Update section header pointers - // - mShdrBase = (Elf_Shdr *)((UINT8 *)mEhdr + mEhdr->e_shoff); - mPhdrBase = (Elf_Phdr *)((UINT8 *)mEhdr + mEhdr->e_phoff); - - // - // Create COFF Section offset buffer and zero. - // - mCoffSectionsOffset = (UINT32 *)malloc(mEhdr->e_shnum * sizeof (UINT32)); - memset(mCoffSectionsOffset, 0, mEhdr->e_shnum * sizeof(UINT32)); - - // - // Fill in function pointers. - // - ElfFunctions->ScanSections = ScanSections32; - ElfFunctions->WriteSections = WriteSections32; - ElfFunctions->WriteRelocations = WriteRelocations32; - ElfFunctions->WriteDebug = WriteDebug32; - ElfFunctions->SetImageSize = SetImageSize32; - ElfFunctions->CleanUp = CleanUp32; - - return TRUE; -} - - -// -// Header by Index functions -// -STATIC -Elf_Shdr* -GetShdrByIndex ( - UINT32 Num - ) -{ - if (Num >= mEhdr->e_shnum) - return NULL; - return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize); -} - -STATIC -Elf_Phdr* -GetPhdrByIndex ( - UINT32 num - ) -{ - if (num >= mEhdr->e_phnum) { - return NULL; - } - - return (Elf_Phdr *)((UINT8*)mPhdrBase + num * mEhdr->e_phentsize); -} - -STATIC -UINT32 -CoffAlign ( - UINT32 Offset - ) -{ - return (Offset + mCoffAlignment - 1) & ~(mCoffAlignment - 1); -} - -// -// filter functions -// -STATIC -BOOLEAN -IsTextShdr ( - Elf_Shdr *Shdr - ) -{ - return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC); -} - -STATIC -BOOLEAN -IsHiiRsrcShdr ( - Elf_Shdr *Shdr - ) -{ - Elf_Shdr *Namedr = GetShdrByIndex(mEhdr->e_shstrndx); - - return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0); -} - -STATIC -BOOLEAN -IsDataShdr ( - Elf_Shdr *Shdr - ) -{ - if (IsHiiRsrcShdr(Shdr)) { - return FALSE; - } - return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE); -} - -// -// Elf functions interface implementation -// - -STATIC -VOID -ScanSections32 ( - VOID - ) -{ - UINT32 i; - EFI_IMAGE_DOS_HEADER *DosHdr; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - UINT32 CoffEntry; - UINT32 SectionCount; - BOOLEAN FoundText; - - CoffEntry = 0; - mCoffOffset = 0; - mTextOffset = 0; - FoundText = FALSE; - - // - // Coff file start with a DOS header. - // - mCoffOffset = sizeof(EFI_IMAGE_DOS_HEADER) + 0x40; - mNtHdrOffset = mCoffOffset; - switch (mEhdr->e_machine) { - case EM_386: - case EM_ARM: - mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); - break; - default: - VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)mEhdr->e_machine); - mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); - break; - } - - mTableOffset = mCoffOffset; - mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); - - // - // First text sections. - // - mCoffOffset = CoffAlign(mCoffOffset); - SectionCount = 0; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsTextShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - - /* Relocate entry. */ - if ((mEhdr->e_entry >= shdr->sh_addr) && - (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { - CoffEntry = mCoffOffset + mEhdr->e_entry - shdr->sh_addr; - } - - // - // Set mTextOffset with the offset of the first '.text' section - // - if (!FoundText) { - mTextOffset = mCoffOffset; - FoundText = TRUE; - } - - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += shdr->sh_size; - SectionCount ++; - } - } - - if (!FoundText) { - Error (NULL, 0, 3000, "Invalid", "Did not find any '.text' section."); - assert (FALSE); - } - - if (mEhdr->e_machine != EM_ARM) { - mCoffOffset = CoffAlign(mCoffOffset); - } - - if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { - Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName); - } - - // - // Then data sections. - // - mDataOffset = mCoffOffset; - SectionCount = 0; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsDataShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += shdr->sh_size; - SectionCount ++; - } - } - mCoffOffset = CoffAlign(mCoffOffset); - - if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { - Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName); - } - - // - // The HII resource sections. - // - mHiiRsrcOffset = mCoffOffset; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsHiiRsrcShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - if (shdr->sh_size != 0) { - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += shdr->sh_size; - mCoffOffset = CoffAlign(mCoffOffset); - SetHiiResourceHeader ((UINT8*) mEhdr + shdr->sh_offset, mHiiRsrcOffset); - } - break; - } - } - - mRelocOffset = mCoffOffset; - - // - // Allocate base Coff file. Will be expanded later for relocations. - // - mCoffFile = (UINT8 *)malloc(mCoffOffset); - memset(mCoffFile, 0, mCoffOffset); - - // - // Fill headers. - // - DosHdr = (EFI_IMAGE_DOS_HEADER *)mCoffFile; - DosHdr->e_magic = EFI_IMAGE_DOS_SIGNATURE; - DosHdr->e_lfanew = mNtHdrOffset; - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION*)(mCoffFile + mNtHdrOffset); - - NtHdr->Pe32.Signature = EFI_IMAGE_NT_SIGNATURE; - - switch (mEhdr->e_machine) { - case EM_386: - NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32; - NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; - break; - case EM_ARM: - NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_ARMT; - NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; - break; - default: - VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)mEhdr->e_machine); - NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32; - NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; - } - - NtHdr->Pe32.FileHeader.NumberOfSections = mCoffNbrSections; - NtHdr->Pe32.FileHeader.TimeDateStamp = (UINT32) time(NULL); - mImageTimeStamp = NtHdr->Pe32.FileHeader.TimeDateStamp; - NtHdr->Pe32.FileHeader.PointerToSymbolTable = 0; - NtHdr->Pe32.FileHeader.NumberOfSymbols = 0; - NtHdr->Pe32.FileHeader.SizeOfOptionalHeader = sizeof(NtHdr->Pe32.OptionalHeader); - NtHdr->Pe32.FileHeader.Characteristics = EFI_IMAGE_FILE_EXECUTABLE_IMAGE - | EFI_IMAGE_FILE_LINE_NUMS_STRIPPED - | EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED - | EFI_IMAGE_FILE_32BIT_MACHINE; - - NtHdr->Pe32.OptionalHeader.SizeOfCode = mDataOffset - mTextOffset; - NtHdr->Pe32.OptionalHeader.SizeOfInitializedData = mRelocOffset - mDataOffset; - NtHdr->Pe32.OptionalHeader.SizeOfUninitializedData = 0; - NtHdr->Pe32.OptionalHeader.AddressOfEntryPoint = CoffEntry; - - NtHdr->Pe32.OptionalHeader.BaseOfCode = mTextOffset; - - NtHdr->Pe32.OptionalHeader.BaseOfData = mDataOffset; - NtHdr->Pe32.OptionalHeader.ImageBase = 0; - NtHdr->Pe32.OptionalHeader.SectionAlignment = mCoffAlignment; - NtHdr->Pe32.OptionalHeader.FileAlignment = mCoffAlignment; - NtHdr->Pe32.OptionalHeader.SizeOfImage = 0; - - NtHdr->Pe32.OptionalHeader.SizeOfHeaders = mTextOffset; - NtHdr->Pe32.OptionalHeader.NumberOfRvaAndSizes = EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES; - - // - // Section headers. - // - if ((mDataOffset - mTextOffset) > 0) { - CreateSectionHeader (".text", mTextOffset, mDataOffset - mTextOffset, - EFI_IMAGE_SCN_CNT_CODE - | EFI_IMAGE_SCN_MEM_EXECUTE - | EFI_IMAGE_SCN_MEM_READ); - } else { - // Don't make a section of size 0. - NtHdr->Pe32.FileHeader.NumberOfSections--; - } - - if ((mHiiRsrcOffset - mDataOffset) > 0) { - CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset - mDataOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_WRITE - | EFI_IMAGE_SCN_MEM_READ); - } else { - // Don't make a section of size 0. - NtHdr->Pe32.FileHeader.NumberOfSections--; - } - - if ((mRelocOffset - mHiiRsrcOffset) > 0) { - CreateSectionHeader (".rsrc", mHiiRsrcOffset, mRelocOffset - mHiiRsrcOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_READ); - - NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = mRelocOffset - mHiiRsrcOffset; - NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = mHiiRsrcOffset; - } else { - // Don't make a section of size 0. - NtHdr->Pe32.FileHeader.NumberOfSections--; - } - -} - -STATIC -BOOLEAN -WriteSections32 ( - SECTION_FILTER_TYPES FilterType - ) -{ - UINT32 Idx; - Elf_Shdr *SecShdr; - UINT32 SecOffset; - BOOLEAN (*Filter)(Elf_Shdr *); - - // - // Initialize filter pointer - // - switch (FilterType) { - case SECTION_TEXT: - Filter = IsTextShdr; - break; - case SECTION_HII: - Filter = IsHiiRsrcShdr; - break; - case SECTION_DATA: - Filter = IsDataShdr; - break; - default: - return FALSE; - } - - // - // First: copy sections. - // - for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { - Elf_Shdr *Shdr = GetShdrByIndex(Idx); - if ((*Filter)(Shdr)) { - switch (Shdr->sh_type) { - case SHT_PROGBITS: - /* Copy. */ - memcpy(mCoffFile + mCoffSectionsOffset[Idx], - (UINT8*)mEhdr + Shdr->sh_offset, - Shdr->sh_size); - break; - - case SHT_NOBITS: - memset(mCoffFile + mCoffSectionsOffset[Idx], 0, Shdr->sh_size); - break; - - default: - // - // Ignore for unkown section type. - // - VerboseMsg ("%s unknown section type %x. We directly copy this section into Coff file", mInImageName, (unsigned)Shdr->sh_type); - break; - } - } - } - - // - // Second: apply relocations. - // - for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { - // - // Determine if this is a relocation section. - // - Elf_Shdr *RelShdr = GetShdrByIndex(Idx); - if ((RelShdr->sh_type != SHT_REL) && (RelShdr->sh_type != SHT_RELA)) { - continue; - } - - // - // Relocation section found. Now extract section information that the relocations - // apply to in the ELF data and the new COFF data. - // - SecShdr = GetShdrByIndex(RelShdr->sh_info); - SecOffset = mCoffSectionsOffset[RelShdr->sh_info]; - - // - // Only process relocations for the current filter type. - // - if (RelShdr->sh_type == SHT_REL && (*Filter)(SecShdr)) { - UINT32 RelOffset; - - // - // Determine the symbol table referenced by the relocation data. - // - Elf_Shdr *SymtabShdr = GetShdrByIndex(RelShdr->sh_link); - UINT8 *Symtab = (UINT8*)mEhdr + SymtabShdr->sh_offset; - - // - // Process all relocation entries for this section. - // - for (RelOffset = 0; RelOffset < RelShdr->sh_size; RelOffset += RelShdr->sh_entsize) { - // - // Set pointer to relocation entry - // - Elf_Rel *Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelOffset); - - // - // Set pointer to symbol table entry associated with the relocation entry. - // - Elf_Sym *Sym = (Elf_Sym *)(Symtab + ELF_R_SYM(Rel->r_info) * SymtabShdr->sh_entsize); - - Elf_Shdr *SymShdr; - UINT8 *Targ; - UINT16 Address; - - // - // Check section header index found in symbol table and get the section - // header location. - // - if (Sym->st_shndx == SHN_UNDEF - || Sym->st_shndx == SHN_ABS - || Sym->st_shndx > mEhdr->e_shnum) { - Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition.", mInImageName); - } - SymShdr = GetShdrByIndex(Sym->st_shndx); - - // - // Convert the relocation data to a pointer into the coff file. - // - // Note: - // r_offset is the virtual address of the storage unit to be relocated. - // sh_addr is the virtual address for the base of the section. - // - Targ = mCoffFile + SecOffset + (Rel->r_offset - SecShdr->sh_addr); - - // - // Determine how to handle each relocation type based on the machine type. - // - if (mEhdr->e_machine == EM_386) { - switch (ELF_R_TYPE(Rel->r_info)) { - case R_386_NONE: - break; - case R_386_32: - // - // Absolute relocation. - // Converts Targ from a absolute virtual address to the absolute - // COFF address. - // - *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr - + mCoffSectionsOffset[Sym->st_shndx]; - break; - case R_386_PC32: - // - // Relative relocation: Symbol - Ip + Addend - // - *(UINT32 *)Targ = *(UINT32 *)Targ - + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) - - (SecOffset - SecShdr->sh_addr); - break; - default: - Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else if (mEhdr->e_machine == EM_ARM) { - switch (ELF32_R_TYPE(Rel->r_info)) { - case R_ARM_RBASE: - // No relocation - no action required - // break skipped - - case R_ARM_PC24: - case R_ARM_XPC25: - case R_ARM_THM_PC22: - case R_ARM_THM_JUMP19: - case R_ARM_CALL: - case R_ARM_JMP24: - case R_ARM_THM_JUMP24: - case R_ARM_PREL31: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - case R_ARM_THM_JMP6: - case R_ARM_THM_ALU_PREL_11_0: - case R_ARM_THM_PC12: - case R_ARM_REL32_NOI: - case R_ARM_ALU_PC_G0_NC: - case R_ARM_ALU_PC_G0: - case R_ARM_ALU_PC_G1_NC: - case R_ARM_ALU_PC_G1: - case R_ARM_ALU_PC_G2: - case R_ARM_LDR_PC_G1: - case R_ARM_LDR_PC_G2: - case R_ARM_LDRS_PC_G0: - case R_ARM_LDRS_PC_G1: - case R_ARM_LDRS_PC_G2: - case R_ARM_LDC_PC_G0: - case R_ARM_LDC_PC_G1: - case R_ARM_LDC_PC_G2: - case R_ARM_GOT_PREL: - case R_ARM_THM_JUMP11: - case R_ARM_THM_JUMP8: - case R_ARM_TLS_GD32: - case R_ARM_TLS_LDM32: - case R_ARM_TLS_IE32: - // Thease are all PC-relative relocations and don't require modification - // GCC does not seem to have the concept of a application that just needs to get relocated. - break; - - case R_ARM_THM_MOVW_ABS_NC: - // MOVW is only lower 16-bits of the addres - Address = (UINT16)(Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); - ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); - break; - - case R_ARM_THM_MOVT_ABS: - // MOVT is only upper 16-bits of the addres - Address = (UINT16)((Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]) >> 16); - ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); - break; - - case R_ARM_ABS32: - case R_ARM_RABS32: - // - // Absolute relocation. - // - *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); - } - } - } - } - } - - return TRUE; -} - -UINTN gMovwOffset = 0; - -STATIC -VOID -WriteRelocations32 ( - VOID - ) -{ - UINT32 Index; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - EFI_IMAGE_DATA_DIRECTORY *Dir; - BOOLEAN FoundRelocations; - Elf_Dyn *Dyn; - Elf_Rel *Rel; - UINTN RelElementSize; - UINTN RelSize; - UINTN RelOffset; - UINTN K; - UINT8 *Targ; - Elf32_Phdr *DynamicSegment; - Elf32_Phdr *TargetSegment; - - for (Index = 0, FoundRelocations = FALSE; Index < mEhdr->e_shnum; Index++) { - Elf_Shdr *RelShdr = GetShdrByIndex(Index); - if ((RelShdr->sh_type == SHT_REL) || (RelShdr->sh_type == SHT_RELA)) { - Elf_Shdr *SecShdr = GetShdrByIndex (RelShdr->sh_info); - if (IsTextShdr(SecShdr) || IsDataShdr(SecShdr)) { - UINT32 RelIdx; - - FoundRelocations = TRUE; - for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) { - Elf_Rel *Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); - - if (mEhdr->e_machine == EM_386) { - switch (ELF_R_TYPE(Rel->r_info)) { - case R_386_NONE: - case R_386_PC32: - // - // No fixup entry required. - // - break; - case R_386_32: - // - // Creates a relative relocation entry from the absolute entry. - // - CoffAddFixup(mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr), - EFI_IMAGE_REL_BASED_HIGHLOW); - break; - default: - Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else if (mEhdr->e_machine == EM_ARM) { - switch (ELF32_R_TYPE(Rel->r_info)) { - case R_ARM_RBASE: - // No relocation - no action required - // break skipped - - case R_ARM_PC24: - case R_ARM_XPC25: - case R_ARM_THM_PC22: - case R_ARM_THM_JUMP19: - case R_ARM_CALL: - case R_ARM_JMP24: - case R_ARM_THM_JUMP24: - case R_ARM_PREL31: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - case R_ARM_THM_JMP6: - case R_ARM_THM_ALU_PREL_11_0: - case R_ARM_THM_PC12: - case R_ARM_REL32_NOI: - case R_ARM_ALU_PC_G0_NC: - case R_ARM_ALU_PC_G0: - case R_ARM_ALU_PC_G1_NC: - case R_ARM_ALU_PC_G1: - case R_ARM_ALU_PC_G2: - case R_ARM_LDR_PC_G1: - case R_ARM_LDR_PC_G2: - case R_ARM_LDRS_PC_G0: - case R_ARM_LDRS_PC_G1: - case R_ARM_LDRS_PC_G2: - case R_ARM_LDC_PC_G0: - case R_ARM_LDC_PC_G1: - case R_ARM_LDC_PC_G2: - case R_ARM_GOT_PREL: - case R_ARM_THM_JUMP11: - case R_ARM_THM_JUMP8: - case R_ARM_TLS_GD32: - case R_ARM_TLS_LDM32: - case R_ARM_TLS_IE32: - // Thease are all PC-relative relocations and don't require modification - break; - - case R_ARM_THM_MOVW_ABS_NC: - CoffAddFixup ( - mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr), - EFI_IMAGE_REL_BASED_ARM_MOV32T - ); - - // PE/COFF treats MOVW/MOVT relocation as single 64-bit instruction - // Track this address so we can log an error for unsupported sequence of MOVW/MOVT - gMovwOffset = mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr); - break; - - case R_ARM_THM_MOVT_ABS: - if ((gMovwOffset + 4) != (mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr))) { - Error (NULL, 0, 3000, "Not Supported", "PE/COFF requires MOVW+MOVT instruction sequence %x +4 != %x.", gMovwOffset, mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); - } - break; - - case R_ARM_ABS32: - case R_ARM_RABS32: - CoffAddFixup ( - mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr), - EFI_IMAGE_REL_BASED_HIGHLOW - ); - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); - } - } else { - Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) mEhdr->e_machine); - } - } - } - } - } - - if (!FoundRelocations && (mEhdr->e_machine == EM_ARM)) { - /* Try again, but look for PT_DYNAMIC instead of SHT_REL */ - - for (Index = 0; Index < mEhdr->e_phnum; Index++) { - RelElementSize = 0; - RelSize = 0; - RelOffset = 0; - - DynamicSegment = GetPhdrByIndex (Index); - - if (DynamicSegment->p_type == PT_DYNAMIC) { - Dyn = (Elf32_Dyn *) ((UINT8 *)mEhdr + DynamicSegment->p_offset); - - while (Dyn->d_tag != DT_NULL) { - switch (Dyn->d_tag) { - case DT_REL: - RelOffset = Dyn->d_un.d_val; - break; - - case DT_RELSZ: - RelSize = Dyn->d_un.d_val; - break; - - case DT_RELENT: - RelElementSize = Dyn->d_un.d_val; - break; - - default: - break; - } - Dyn++; - } - if (( RelOffset == 0 ) || ( RelSize == 0 ) || ( RelElementSize == 0 )) { - Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations.", mInImageName); - } - - for (K = 0; K < RelSize; K += RelElementSize) { - - if (DynamicSegment->p_paddr == 0) { - // Older versions of the ARM ELF (SWS ESPC 0003 B-02) specification define DT_REL - // as an offset in the dynamic segment. p_paddr is defined to be zero for ARM tools - Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + DynamicSegment->p_offset + RelOffset + K); - } else { - // This is how it reads in the generic ELF specification - Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + RelOffset + K); - } - - switch (ELF32_R_TYPE (Rel->r_info)) { - case R_ARM_RBASE: - break; - - case R_ARM_RABS32: - TargetSegment = GetPhdrByIndex (ELF32_R_SYM (Rel->r_info) - 1); - - // Note: r_offset in a memory address. Convert it to a pointer in the coff file. - Targ = mCoffFile + mCoffSectionsOffset[ ELF32_R_SYM( Rel->r_info ) ] + Rel->r_offset - TargetSegment->p_vaddr; - - *(UINT32 *)Targ = *(UINT32 *)Targ + mCoffSectionsOffset [ELF32_R_SYM( Rel->r_info )]; - - CoffAddFixup (mCoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW); - break; - - default: - Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info)); - break; - } - } - break; - } - } - } - - // - // Pad by adding empty entries. - // - while (mCoffOffset & (mCoffAlignment - 1)) { - CoffAddFixupEntry(0); - } - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - Dir = &NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; - Dir->Size = mCoffOffset - mRelocOffset; - if (Dir->Size == 0) { - // If no relocations, null out the directory entry and don't add the .reloc section - Dir->VirtualAddress = 0; - NtHdr->Pe32.FileHeader.NumberOfSections--; - } else { - Dir->VirtualAddress = mRelocOffset; - CreateSectionHeader (".reloc", mRelocOffset, mCoffOffset - mRelocOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_DISCARDABLE - | EFI_IMAGE_SCN_MEM_READ); - } - -} - -STATIC -VOID -WriteDebug32 ( - VOID - ) -{ - UINT32 Len; - UINT32 DebugOffset; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - EFI_IMAGE_DATA_DIRECTORY *DataDir; - EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; - EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; - - Len = strlen(mInImageName) + 1; - DebugOffset = mCoffOffset; - - mCoffOffset += sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) - + sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) - + Len; - mCoffOffset = CoffAlign(mCoffOffset); - - mCoffFile = realloc(mCoffFile, mCoffOffset); - memset(mCoffFile + DebugOffset, 0, mCoffOffset - DebugOffset); - - Dir = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + DebugOffset); - Dir->Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW; - Dir->SizeOfData = sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len; - Dir->RVA = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); - Dir->FileOffset = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); - - Nb10 = (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1); - Nb10->Signature = CODEVIEW_SIGNATURE_NB10; - strcpy ((char *)(Nb10 + 1), mInImageName); - - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - DataDir = &NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]; - DataDir->VirtualAddress = DebugOffset; - DataDir->Size = mCoffOffset - DebugOffset; - if (DataDir->Size == 0) { - // If no debug, null out the directory entry and don't add the .debug section - DataDir->VirtualAddress = 0; - NtHdr->Pe32.FileHeader.NumberOfSections--; - } else { - DataDir->VirtualAddress = DebugOffset; - CreateSectionHeader (".debug", DebugOffset, mCoffOffset - DebugOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_DISCARDABLE - | EFI_IMAGE_SCN_MEM_READ); - - } -} - -STATIC -VOID -SetImageSize32 ( - VOID - ) -{ - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - - // - // Set image size - // - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - NtHdr->Pe32.OptionalHeader.SizeOfImage = mCoffOffset; -} - -STATIC -VOID -CleanUp32 ( - VOID - ) -{ - if (mCoffSectionsOffset != NULL) { - free (mCoffSectionsOffset); - } -} - - +/** @file + +Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    +Portions copyright (c) 2013, ARM Ltd. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "WinNtInclude.h" + +#ifndef __GNUC__ +#include +#include +#endif +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "PeCoffLib.h" +#include "EfiUtilityMsgs.h" + +#include "GenFw.h" +#include "ElfConvert.h" +#include "Elf32Convert.h" + +STATIC +VOID +ScanSections32 ( + VOID + ); + +STATIC +BOOLEAN +WriteSections32 ( + SECTION_FILTER_TYPES FilterType + ); + +STATIC +VOID +WriteRelocations32 ( + VOID + ); + +STATIC +VOID +WriteDebug32 ( + VOID + ); + +STATIC +VOID +SetImageSize32 ( + VOID + ); + +STATIC +VOID +CleanUp32 ( + VOID + ); + +// +// Rename ELF32 strucutres to common names to help when porting to ELF64. +// +typedef Elf32_Shdr Elf_Shdr; +typedef Elf32_Ehdr Elf_Ehdr; +typedef Elf32_Rel Elf_Rel; +typedef Elf32_Sym Elf_Sym; +typedef Elf32_Phdr Elf_Phdr; +typedef Elf32_Dyn Elf_Dyn; +#define ELFCLASS ELFCLASS32 +#define ELF_R_TYPE(r) ELF32_R_TYPE(r) +#define ELF_R_SYM(r) ELF32_R_SYM(r) + +// +// Well known ELF structures. +// +STATIC Elf_Ehdr *mEhdr; +STATIC Elf_Shdr *mShdrBase; +STATIC Elf_Phdr *mPhdrBase; + +// +// Coff information +// +STATIC const UINT32 mCoffAlignment = 0x20; + +// +// PE section alignment. +// +STATIC const UINT16 mCoffNbrSections = 5; + +// +// ELF sections to offset in Coff file. +// +STATIC UINT32 *mCoffSectionsOffset = NULL; + +// +// Offsets in COFF file +// +STATIC UINT32 mNtHdrOffset; +STATIC UINT32 mTextOffset; +STATIC UINT32 mDataOffset; +STATIC UINT32 mHiiRsrcOffset; +STATIC UINT32 mRelocOffset; + +// +// Initialization Function +// +BOOLEAN +InitializeElf32 ( + UINT8 *FileBuffer, + ELF_FUNCTION_TABLE *ElfFunctions + ) +{ + // + // Initialize data pointer and structures. + // + mEhdr = (Elf_Ehdr*) FileBuffer; + + // + // Check the ELF32 specific header information. + // + if (mEhdr->e_ident[EI_CLASS] != ELFCLASS32) { + Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFCLASS32"); + return FALSE; + } + if (mEhdr->e_ident[EI_DATA] != ELFDATA2LSB) { + Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFDATA2LSB"); + return FALSE; + } + if ((mEhdr->e_type != ET_EXEC) && (mEhdr->e_type != ET_DYN)) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN"); + return FALSE; + } + if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_ARM))) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_machine not EM_386 or EM_ARM"); + return FALSE; + } + if (mEhdr->e_version != EV_CURRENT) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT); + return FALSE; + } + + // + // Update section header pointers + // + mShdrBase = (Elf_Shdr *)((UINT8 *)mEhdr + mEhdr->e_shoff); + mPhdrBase = (Elf_Phdr *)((UINT8 *)mEhdr + mEhdr->e_phoff); + + // + // Create COFF Section offset buffer and zero. + // + mCoffSectionsOffset = (UINT32 *)malloc(mEhdr->e_shnum * sizeof (UINT32)); + memset(mCoffSectionsOffset, 0, mEhdr->e_shnum * sizeof(UINT32)); + + // + // Fill in function pointers. + // + ElfFunctions->ScanSections = ScanSections32; + ElfFunctions->WriteSections = WriteSections32; + ElfFunctions->WriteRelocations = WriteRelocations32; + ElfFunctions->WriteDebug = WriteDebug32; + ElfFunctions->SetImageSize = SetImageSize32; + ElfFunctions->CleanUp = CleanUp32; + + return TRUE; +} + + +// +// Header by Index functions +// +STATIC +Elf_Shdr* +GetShdrByIndex ( + UINT32 Num + ) +{ + if (Num >= mEhdr->e_shnum) + return NULL; + return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize); +} + +STATIC +Elf_Phdr* +GetPhdrByIndex ( + UINT32 num + ) +{ + if (num >= mEhdr->e_phnum) { + return NULL; + } + + return (Elf_Phdr *)((UINT8*)mPhdrBase + num * mEhdr->e_phentsize); +} + +STATIC +UINT32 +CoffAlign ( + UINT32 Offset + ) +{ + return (Offset + mCoffAlignment - 1) & ~(mCoffAlignment - 1); +} + +// +// filter functions +// +STATIC +BOOLEAN +IsTextShdr ( + Elf_Shdr *Shdr + ) +{ + return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC); +} + +STATIC +BOOLEAN +IsHiiRsrcShdr ( + Elf_Shdr *Shdr + ) +{ + Elf_Shdr *Namedr = GetShdrByIndex(mEhdr->e_shstrndx); + + return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0); +} + +STATIC +BOOLEAN +IsDataShdr ( + Elf_Shdr *Shdr + ) +{ + if (IsHiiRsrcShdr(Shdr)) { + return FALSE; + } + return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE); +} + +// +// Elf functions interface implementation +// + +STATIC +VOID +ScanSections32 ( + VOID + ) +{ + UINT32 i; + EFI_IMAGE_DOS_HEADER *DosHdr; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + UINT32 CoffEntry; + UINT32 SectionCount; + BOOLEAN FoundText; + + CoffEntry = 0; + mCoffOffset = 0; + mTextOffset = 0; + FoundText = FALSE; + + // + // Coff file start with a DOS header. + // + mCoffOffset = sizeof(EFI_IMAGE_DOS_HEADER) + 0x40; + mNtHdrOffset = mCoffOffset; + switch (mEhdr->e_machine) { + case EM_386: + case EM_ARM: + mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); + break; + default: + VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)mEhdr->e_machine); + mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); + break; + } + + mTableOffset = mCoffOffset; + mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); + + // + // First text sections. + // + mCoffOffset = CoffAlign(mCoffOffset); + SectionCount = 0; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsTextShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + + /* Relocate entry. */ + if ((mEhdr->e_entry >= shdr->sh_addr) && + (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { + CoffEntry = mCoffOffset + mEhdr->e_entry - shdr->sh_addr; + } + + // + // Set mTextOffset with the offset of the first '.text' section + // + if (!FoundText) { + mTextOffset = mCoffOffset; + FoundText = TRUE; + } + + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += shdr->sh_size; + SectionCount ++; + } + } + + if (!FoundText) { + Error (NULL, 0, 3000, "Invalid", "Did not find any '.text' section."); + assert (FALSE); + } + + if (mEhdr->e_machine != EM_ARM) { + mCoffOffset = CoffAlign(mCoffOffset); + } + + if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { + Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName); + } + + // + // Then data sections. + // + mDataOffset = mCoffOffset; + SectionCount = 0; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsDataShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += shdr->sh_size; + SectionCount ++; + } + } + mCoffOffset = CoffAlign(mCoffOffset); + + if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { + Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName); + } + + // + // The HII resource sections. + // + mHiiRsrcOffset = mCoffOffset; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsHiiRsrcShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + if (shdr->sh_size != 0) { + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += shdr->sh_size; + mCoffOffset = CoffAlign(mCoffOffset); + SetHiiResourceHeader ((UINT8*) mEhdr + shdr->sh_offset, mHiiRsrcOffset); + } + break; + } + } + + mRelocOffset = mCoffOffset; + + // + // Allocate base Coff file. Will be expanded later for relocations. + // + mCoffFile = (UINT8 *)malloc(mCoffOffset); + memset(mCoffFile, 0, mCoffOffset); + + // + // Fill headers. + // + DosHdr = (EFI_IMAGE_DOS_HEADER *)mCoffFile; + DosHdr->e_magic = EFI_IMAGE_DOS_SIGNATURE; + DosHdr->e_lfanew = mNtHdrOffset; + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION*)(mCoffFile + mNtHdrOffset); + + NtHdr->Pe32.Signature = EFI_IMAGE_NT_SIGNATURE; + + switch (mEhdr->e_machine) { + case EM_386: + NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32; + NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; + break; + case EM_ARM: + NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_ARMT; + NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; + break; + default: + VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)mEhdr->e_machine); + NtHdr->Pe32.FileHeader.Machine = EFI_IMAGE_MACHINE_IA32; + NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; + } + + NtHdr->Pe32.FileHeader.NumberOfSections = mCoffNbrSections; + NtHdr->Pe32.FileHeader.TimeDateStamp = (UINT32) time(NULL); + mImageTimeStamp = NtHdr->Pe32.FileHeader.TimeDateStamp; + NtHdr->Pe32.FileHeader.PointerToSymbolTable = 0; + NtHdr->Pe32.FileHeader.NumberOfSymbols = 0; + NtHdr->Pe32.FileHeader.SizeOfOptionalHeader = sizeof(NtHdr->Pe32.OptionalHeader); + NtHdr->Pe32.FileHeader.Characteristics = EFI_IMAGE_FILE_EXECUTABLE_IMAGE + | EFI_IMAGE_FILE_LINE_NUMS_STRIPPED + | EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED + | EFI_IMAGE_FILE_32BIT_MACHINE; + + NtHdr->Pe32.OptionalHeader.SizeOfCode = mDataOffset - mTextOffset; + NtHdr->Pe32.OptionalHeader.SizeOfInitializedData = mRelocOffset - mDataOffset; + NtHdr->Pe32.OptionalHeader.SizeOfUninitializedData = 0; + NtHdr->Pe32.OptionalHeader.AddressOfEntryPoint = CoffEntry; + + NtHdr->Pe32.OptionalHeader.BaseOfCode = mTextOffset; + + NtHdr->Pe32.OptionalHeader.BaseOfData = mDataOffset; + NtHdr->Pe32.OptionalHeader.ImageBase = 0; + NtHdr->Pe32.OptionalHeader.SectionAlignment = mCoffAlignment; + NtHdr->Pe32.OptionalHeader.FileAlignment = mCoffAlignment; + NtHdr->Pe32.OptionalHeader.SizeOfImage = 0; + + NtHdr->Pe32.OptionalHeader.SizeOfHeaders = mTextOffset; + NtHdr->Pe32.OptionalHeader.NumberOfRvaAndSizes = EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES; + + // + // Section headers. + // + if ((mDataOffset - mTextOffset) > 0) { + CreateSectionHeader (".text", mTextOffset, mDataOffset - mTextOffset, + EFI_IMAGE_SCN_CNT_CODE + | EFI_IMAGE_SCN_MEM_EXECUTE + | EFI_IMAGE_SCN_MEM_READ); + } else { + // Don't make a section of size 0. + NtHdr->Pe32.FileHeader.NumberOfSections--; + } + + if ((mHiiRsrcOffset - mDataOffset) > 0) { + CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset - mDataOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_WRITE + | EFI_IMAGE_SCN_MEM_READ); + } else { + // Don't make a section of size 0. + NtHdr->Pe32.FileHeader.NumberOfSections--; + } + + if ((mRelocOffset - mHiiRsrcOffset) > 0) { + CreateSectionHeader (".rsrc", mHiiRsrcOffset, mRelocOffset - mHiiRsrcOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_READ); + + NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = mRelocOffset - mHiiRsrcOffset; + NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = mHiiRsrcOffset; + } else { + // Don't make a section of size 0. + NtHdr->Pe32.FileHeader.NumberOfSections--; + } + +} + +STATIC +BOOLEAN +WriteSections32 ( + SECTION_FILTER_TYPES FilterType + ) +{ + UINT32 Idx; + Elf_Shdr *SecShdr; + UINT32 SecOffset; + BOOLEAN (*Filter)(Elf_Shdr *); + + // + // Initialize filter pointer + // + switch (FilterType) { + case SECTION_TEXT: + Filter = IsTextShdr; + break; + case SECTION_HII: + Filter = IsHiiRsrcShdr; + break; + case SECTION_DATA: + Filter = IsDataShdr; + break; + default: + return FALSE; + } + + // + // First: copy sections. + // + for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { + Elf_Shdr *Shdr = GetShdrByIndex(Idx); + if ((*Filter)(Shdr)) { + switch (Shdr->sh_type) { + case SHT_PROGBITS: + /* Copy. */ + memcpy(mCoffFile + mCoffSectionsOffset[Idx], + (UINT8*)mEhdr + Shdr->sh_offset, + Shdr->sh_size); + break; + + case SHT_NOBITS: + memset(mCoffFile + mCoffSectionsOffset[Idx], 0, Shdr->sh_size); + break; + + default: + // + // Ignore for unkown section type. + // + VerboseMsg ("%s unknown section type %x. We directly copy this section into Coff file", mInImageName, (unsigned)Shdr->sh_type); + break; + } + } + } + + // + // Second: apply relocations. + // + for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { + // + // Determine if this is a relocation section. + // + Elf_Shdr *RelShdr = GetShdrByIndex(Idx); + if ((RelShdr->sh_type != SHT_REL) && (RelShdr->sh_type != SHT_RELA)) { + continue; + } + + // + // Relocation section found. Now extract section information that the relocations + // apply to in the ELF data and the new COFF data. + // + SecShdr = GetShdrByIndex(RelShdr->sh_info); + SecOffset = mCoffSectionsOffset[RelShdr->sh_info]; + + // + // Only process relocations for the current filter type. + // + if (RelShdr->sh_type == SHT_REL && (*Filter)(SecShdr)) { + UINT32 RelOffset; + + // + // Determine the symbol table referenced by the relocation data. + // + Elf_Shdr *SymtabShdr = GetShdrByIndex(RelShdr->sh_link); + UINT8 *Symtab = (UINT8*)mEhdr + SymtabShdr->sh_offset; + + // + // Process all relocation entries for this section. + // + for (RelOffset = 0; RelOffset < RelShdr->sh_size; RelOffset += RelShdr->sh_entsize) { + // + // Set pointer to relocation entry + // + Elf_Rel *Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelOffset); + + // + // Set pointer to symbol table entry associated with the relocation entry. + // + Elf_Sym *Sym = (Elf_Sym *)(Symtab + ELF_R_SYM(Rel->r_info) * SymtabShdr->sh_entsize); + + Elf_Shdr *SymShdr; + UINT8 *Targ; + UINT16 Address; + + // + // Check section header index found in symbol table and get the section + // header location. + // + if (Sym->st_shndx == SHN_UNDEF + || Sym->st_shndx == SHN_ABS + || Sym->st_shndx > mEhdr->e_shnum) { + Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition.", mInImageName); + } + SymShdr = GetShdrByIndex(Sym->st_shndx); + + // + // Convert the relocation data to a pointer into the coff file. + // + // Note: + // r_offset is the virtual address of the storage unit to be relocated. + // sh_addr is the virtual address for the base of the section. + // + Targ = mCoffFile + SecOffset + (Rel->r_offset - SecShdr->sh_addr); + + // + // Determine how to handle each relocation type based on the machine type. + // + if (mEhdr->e_machine == EM_386) { + switch (ELF_R_TYPE(Rel->r_info)) { + case R_386_NONE: + break; + case R_386_32: + // + // Absolute relocation. + // Converts Targ from a absolute virtual address to the absolute + // COFF address. + // + *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + + mCoffSectionsOffset[Sym->st_shndx]; + break; + case R_386_PC32: + // + // Relative relocation: Symbol - Ip + Addend + // + *(UINT32 *)Targ = *(UINT32 *)Targ + + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) + - (SecOffset - SecShdr->sh_addr); + break; + default: + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else if (mEhdr->e_machine == EM_ARM) { + switch (ELF32_R_TYPE(Rel->r_info)) { + case R_ARM_RBASE: + // No relocation - no action required + // break skipped + + case R_ARM_PC24: + case R_ARM_XPC25: + case R_ARM_THM_PC22: + case R_ARM_THM_JUMP19: + case R_ARM_CALL: + case R_ARM_JMP24: + case R_ARM_THM_JUMP24: + case R_ARM_PREL31: + case R_ARM_MOVW_PREL_NC: + case R_ARM_MOVT_PREL: + case R_ARM_THM_MOVW_PREL_NC: + case R_ARM_THM_MOVT_PREL: + case R_ARM_THM_JMP6: + case R_ARM_THM_ALU_PREL_11_0: + case R_ARM_THM_PC12: + case R_ARM_REL32_NOI: + case R_ARM_ALU_PC_G0_NC: + case R_ARM_ALU_PC_G0: + case R_ARM_ALU_PC_G1_NC: + case R_ARM_ALU_PC_G1: + case R_ARM_ALU_PC_G2: + case R_ARM_LDR_PC_G1: + case R_ARM_LDR_PC_G2: + case R_ARM_LDRS_PC_G0: + case R_ARM_LDRS_PC_G1: + case R_ARM_LDRS_PC_G2: + case R_ARM_LDC_PC_G0: + case R_ARM_LDC_PC_G1: + case R_ARM_LDC_PC_G2: + case R_ARM_GOT_PREL: + case R_ARM_THM_JUMP11: + case R_ARM_THM_JUMP8: + case R_ARM_TLS_GD32: + case R_ARM_TLS_LDM32: + case R_ARM_TLS_IE32: + // Thease are all PC-relative relocations and don't require modification + // GCC does not seem to have the concept of a application that just needs to get relocated. + break; + + case R_ARM_THM_MOVW_ABS_NC: + // MOVW is only lower 16-bits of the addres + Address = (UINT16)(Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); + ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); + break; + + case R_ARM_THM_MOVT_ABS: + // MOVT is only upper 16-bits of the addres + Address = (UINT16)((Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]) >> 16); + ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); + break; + + case R_ARM_ABS32: + case R_ARM_RABS32: + // + // Absolute relocation. + // + *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; + break; + + default: + Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); + } + } + } + } + } + + return TRUE; +} + +UINTN gMovwOffset = 0; + +STATIC +VOID +WriteRelocations32 ( + VOID + ) +{ + UINT32 Index; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_DATA_DIRECTORY *Dir; + BOOLEAN FoundRelocations; + Elf_Dyn *Dyn; + Elf_Rel *Rel; + UINTN RelElementSize; + UINTN RelSize; + UINTN RelOffset; + UINTN K; + UINT8 *Targ; + Elf32_Phdr *DynamicSegment; + Elf32_Phdr *TargetSegment; + + for (Index = 0, FoundRelocations = FALSE; Index < mEhdr->e_shnum; Index++) { + Elf_Shdr *RelShdr = GetShdrByIndex(Index); + if ((RelShdr->sh_type == SHT_REL) || (RelShdr->sh_type == SHT_RELA)) { + Elf_Shdr *SecShdr = GetShdrByIndex (RelShdr->sh_info); + if (IsTextShdr(SecShdr) || IsDataShdr(SecShdr)) { + UINT32 RelIdx; + + FoundRelocations = TRUE; + for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) { + Elf_Rel *Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); + + if (mEhdr->e_machine == EM_386) { + switch (ELF_R_TYPE(Rel->r_info)) { + case R_386_NONE: + case R_386_PC32: + // + // No fixup entry required. + // + break; + case R_386_32: + // + // Creates a relative relocation entry from the absolute entry. + // + CoffAddFixup(mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr), + EFI_IMAGE_REL_BASED_HIGHLOW); + break; + default: + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else if (mEhdr->e_machine == EM_ARM) { + switch (ELF32_R_TYPE(Rel->r_info)) { + case R_ARM_RBASE: + // No relocation - no action required + // break skipped + + case R_ARM_PC24: + case R_ARM_XPC25: + case R_ARM_THM_PC22: + case R_ARM_THM_JUMP19: + case R_ARM_CALL: + case R_ARM_JMP24: + case R_ARM_THM_JUMP24: + case R_ARM_PREL31: + case R_ARM_MOVW_PREL_NC: + case R_ARM_MOVT_PREL: + case R_ARM_THM_MOVW_PREL_NC: + case R_ARM_THM_MOVT_PREL: + case R_ARM_THM_JMP6: + case R_ARM_THM_ALU_PREL_11_0: + case R_ARM_THM_PC12: + case R_ARM_REL32_NOI: + case R_ARM_ALU_PC_G0_NC: + case R_ARM_ALU_PC_G0: + case R_ARM_ALU_PC_G1_NC: + case R_ARM_ALU_PC_G1: + case R_ARM_ALU_PC_G2: + case R_ARM_LDR_PC_G1: + case R_ARM_LDR_PC_G2: + case R_ARM_LDRS_PC_G0: + case R_ARM_LDRS_PC_G1: + case R_ARM_LDRS_PC_G2: + case R_ARM_LDC_PC_G0: + case R_ARM_LDC_PC_G1: + case R_ARM_LDC_PC_G2: + case R_ARM_GOT_PREL: + case R_ARM_THM_JUMP11: + case R_ARM_THM_JUMP8: + case R_ARM_TLS_GD32: + case R_ARM_TLS_LDM32: + case R_ARM_TLS_IE32: + // Thease are all PC-relative relocations and don't require modification + break; + + case R_ARM_THM_MOVW_ABS_NC: + CoffAddFixup ( + mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr), + EFI_IMAGE_REL_BASED_ARM_MOV32T + ); + + // PE/COFF treats MOVW/MOVT relocation as single 64-bit instruction + // Track this address so we can log an error for unsupported sequence of MOVW/MOVT + gMovwOffset = mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr); + break; + + case R_ARM_THM_MOVT_ABS: + if ((gMovwOffset + 4) != (mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr))) { + Error (NULL, 0, 3000, "Not Supported", "PE/COFF requires MOVW+MOVT instruction sequence %x +4 != %x.", gMovwOffset, mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); + } + break; + + case R_ARM_ABS32: + case R_ARM_RABS32: + CoffAddFixup ( + mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr), + EFI_IMAGE_REL_BASED_HIGHLOW + ); + break; + + default: + Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); + } + } else { + Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) mEhdr->e_machine); + } + } + } + } + } + + if (!FoundRelocations && (mEhdr->e_machine == EM_ARM)) { + /* Try again, but look for PT_DYNAMIC instead of SHT_REL */ + + for (Index = 0; Index < mEhdr->e_phnum; Index++) { + RelElementSize = 0; + RelSize = 0; + RelOffset = 0; + + DynamicSegment = GetPhdrByIndex (Index); + + if (DynamicSegment->p_type == PT_DYNAMIC) { + Dyn = (Elf32_Dyn *) ((UINT8 *)mEhdr + DynamicSegment->p_offset); + + while (Dyn->d_tag != DT_NULL) { + switch (Dyn->d_tag) { + case DT_REL: + RelOffset = Dyn->d_un.d_val; + break; + + case DT_RELSZ: + RelSize = Dyn->d_un.d_val; + break; + + case DT_RELENT: + RelElementSize = Dyn->d_un.d_val; + break; + + default: + break; + } + Dyn++; + } + if (( RelOffset == 0 ) || ( RelSize == 0 ) || ( RelElementSize == 0 )) { + Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations.", mInImageName); + } + + for (K = 0; K < RelSize; K += RelElementSize) { + + if (DynamicSegment->p_paddr == 0) { + // Older versions of the ARM ELF (SWS ESPC 0003 B-02) specification define DT_REL + // as an offset in the dynamic segment. p_paddr is defined to be zero for ARM tools + Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + DynamicSegment->p_offset + RelOffset + K); + } else { + // This is how it reads in the generic ELF specification + Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + RelOffset + K); + } + + switch (ELF32_R_TYPE (Rel->r_info)) { + case R_ARM_RBASE: + break; + + case R_ARM_RABS32: + TargetSegment = GetPhdrByIndex (ELF32_R_SYM (Rel->r_info) - 1); + + // Note: r_offset in a memory address. Convert it to a pointer in the coff file. + Targ = mCoffFile + mCoffSectionsOffset[ ELF32_R_SYM( Rel->r_info ) ] + Rel->r_offset - TargetSegment->p_vaddr; + + *(UINT32 *)Targ = *(UINT32 *)Targ + mCoffSectionsOffset [ELF32_R_SYM( Rel->r_info )]; + + CoffAddFixup (mCoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW); + break; + + default: + Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info)); + break; + } + } + break; + } + } + } + + // + // Pad by adding empty entries. + // + while (mCoffOffset & (mCoffAlignment - 1)) { + CoffAddFixupEntry(0); + } + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + Dir = &NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; + Dir->Size = mCoffOffset - mRelocOffset; + if (Dir->Size == 0) { + // If no relocations, null out the directory entry and don't add the .reloc section + Dir->VirtualAddress = 0; + NtHdr->Pe32.FileHeader.NumberOfSections--; + } else { + Dir->VirtualAddress = mRelocOffset; + CreateSectionHeader (".reloc", mRelocOffset, mCoffOffset - mRelocOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_DISCARDABLE + | EFI_IMAGE_SCN_MEM_READ); + } + +} + +STATIC +VOID +WriteDebug32 ( + VOID + ) +{ + UINT32 Len; + UINT32 DebugOffset; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_DATA_DIRECTORY *DataDir; + EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; + EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; + + Len = strlen(mInImageName) + 1; + DebugOffset = mCoffOffset; + + mCoffOffset += sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) + + sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + + Len; + mCoffOffset = CoffAlign(mCoffOffset); + + mCoffFile = realloc(mCoffFile, mCoffOffset); + memset(mCoffFile + DebugOffset, 0, mCoffOffset - DebugOffset); + + Dir = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + DebugOffset); + Dir->Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW; + Dir->SizeOfData = sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len; + Dir->RVA = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + Dir->FileOffset = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + + Nb10 = (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1); + Nb10->Signature = CODEVIEW_SIGNATURE_NB10; + strcpy ((char *)(Nb10 + 1), mInImageName); + + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + DataDir = &NtHdr->Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]; + DataDir->VirtualAddress = DebugOffset; + DataDir->Size = mCoffOffset - DebugOffset; + if (DataDir->Size == 0) { + // If no debug, null out the directory entry and don't add the .debug section + DataDir->VirtualAddress = 0; + NtHdr->Pe32.FileHeader.NumberOfSections--; + } else { + DataDir->VirtualAddress = DebugOffset; + CreateSectionHeader (".debug", DebugOffset, mCoffOffset - DebugOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_DISCARDABLE + | EFI_IMAGE_SCN_MEM_READ); + + } +} + +STATIC +VOID +SetImageSize32 ( + VOID + ) +{ + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + + // + // Set image size + // + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + NtHdr->Pe32.OptionalHeader.SizeOfImage = mCoffOffset; +} + +STATIC +VOID +CleanUp32 ( + VOID + ) +{ + if (mCoffSectionsOffset != NULL) { + free (mCoffSectionsOffset); + } +} + + diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.h b/BaseTools/Source/C/GenFw/Elf32Convert.h index 2eafbec258..e6a11d57bc 100644 --- a/BaseTools/Source/C/GenFw/Elf32Convert.h +++ b/BaseTools/Source/C/GenFw/Elf32Convert.h @@ -1,24 +1,24 @@ -/** @file - -Copyright (c) 2010, Intel Corporation. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ELF_32_CONVERT_ -#define _ELF_32_CONVERT_ - -BOOLEAN -InitializeElf32 ( - UINT8 *FileBuffer, - ELF_FUNCTION_TABLE *ElfFunctions - ); - -#endif +/** @file + +Copyright (c) 2010, Intel Corporation. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _ELF_32_CONVERT_ +#define _ELF_32_CONVERT_ + +BOOLEAN +InitializeElf32 ( + UINT8 *FileBuffer, + ELF_FUNCTION_TABLE *ElfFunctions + ); + +#endif diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 713f8f7e47..606c7284f7 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -1,933 +1,933 @@ -/** @file - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    -Portions copyright (c) 2013, ARM Ltd. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "WinNtInclude.h" - -#ifndef __GNUC__ -#include -#include -#endif -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "PeCoffLib.h" -#include "EfiUtilityMsgs.h" - -#include "GenFw.h" -#include "ElfConvert.h" -#include "Elf64Convert.h" - -STATIC -VOID -ScanSections64 ( - VOID - ); - -STATIC -BOOLEAN -WriteSections64 ( - SECTION_FILTER_TYPES FilterType - ); - -STATIC -VOID -WriteRelocations64 ( - VOID - ); - -STATIC -VOID -WriteDebug64 ( - VOID - ); - -STATIC -VOID -SetImageSize64 ( - VOID - ); - -STATIC -VOID -CleanUp64 ( - VOID - ); - -// -// Rename ELF32 strucutres to common names to help when porting to ELF64. -// -typedef Elf64_Shdr Elf_Shdr; -typedef Elf64_Ehdr Elf_Ehdr; -typedef Elf64_Rel Elf_Rel; -typedef Elf64_Rela Elf_Rela; -typedef Elf64_Sym Elf_Sym; -typedef Elf64_Phdr Elf_Phdr; -typedef Elf64_Dyn Elf_Dyn; -#define ELFCLASS ELFCLASS64 -#define ELF_R_TYPE(r) ELF64_R_TYPE(r) -#define ELF_R_SYM(r) ELF64_R_SYM(r) - -// -// Well known ELF structures. -// -STATIC Elf_Ehdr *mEhdr; -STATIC Elf_Shdr *mShdrBase; -STATIC Elf_Phdr *mPhdrBase; - -// -// Coff information -// -STATIC const UINT32 mCoffAlignment = 0x20; - -// -// PE section alignment. -// -STATIC const UINT16 mCoffNbrSections = 5; - -// -// ELF sections to offset in Coff file. -// -STATIC UINT32 *mCoffSectionsOffset = NULL; - -// -// Offsets in COFF file -// -STATIC UINT32 mNtHdrOffset; -STATIC UINT32 mTextOffset; -STATIC UINT32 mDataOffset; -STATIC UINT32 mHiiRsrcOffset; -STATIC UINT32 mRelocOffset; - -// -// Initialization Function -// -BOOLEAN -InitializeElf64 ( - UINT8 *FileBuffer, - ELF_FUNCTION_TABLE *ElfFunctions - ) -{ - // - // Initialize data pointer and structures. - // - VerboseMsg ("Set EHDR"); - mEhdr = (Elf_Ehdr*) FileBuffer; - - // - // Check the ELF64 specific header information. - // - VerboseMsg ("Check ELF64 Header Information"); - if (mEhdr->e_ident[EI_CLASS] != ELFCLASS64) { - Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFCLASS64"); - return FALSE; - } - if (mEhdr->e_ident[EI_DATA] != ELFDATA2LSB) { - Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFDATA2LSB"); - return FALSE; - } - if ((mEhdr->e_type != ET_EXEC) && (mEhdr->e_type != ET_DYN)) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN"); - return FALSE; - } - if (!((mEhdr->e_machine == EM_X86_64) || (mEhdr->e_machine == EM_AARCH64))) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_machine not EM_X86_64 or EM_AARCH64"); - return FALSE; - } - if (mEhdr->e_version != EV_CURRENT) { - Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT); - return FALSE; - } - - // - // Update section header pointers - // - VerboseMsg ("Update Header Pointers"); - mShdrBase = (Elf_Shdr *)((UINT8 *)mEhdr + mEhdr->e_shoff); - mPhdrBase = (Elf_Phdr *)((UINT8 *)mEhdr + mEhdr->e_phoff); - - // - // Create COFF Section offset buffer and zero. - // - VerboseMsg ("Create COFF Section Offset Buffer"); - mCoffSectionsOffset = (UINT32 *)malloc(mEhdr->e_shnum * sizeof (UINT32)); - memset(mCoffSectionsOffset, 0, mEhdr->e_shnum * sizeof(UINT32)); - - // - // Fill in function pointers. - // - VerboseMsg ("Fill in Function Pointers"); - ElfFunctions->ScanSections = ScanSections64; - ElfFunctions->WriteSections = WriteSections64; - ElfFunctions->WriteRelocations = WriteRelocations64; - ElfFunctions->WriteDebug = WriteDebug64; - ElfFunctions->SetImageSize = SetImageSize64; - ElfFunctions->CleanUp = CleanUp64; - - return TRUE; -} - - -// -// Header by Index functions -// -STATIC -Elf_Shdr* -GetShdrByIndex ( - UINT32 Num - ) -{ - if (Num >= mEhdr->e_shnum) - return NULL; - return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize); -} - -STATIC -UINT32 -CoffAlign ( - UINT32 Offset - ) -{ - return (Offset + mCoffAlignment - 1) & ~(mCoffAlignment - 1); -} - -// -// filter functions -// -STATIC -BOOLEAN -IsTextShdr ( - Elf_Shdr *Shdr - ) -{ - return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC); -} - -STATIC -BOOLEAN -IsHiiRsrcShdr ( - Elf_Shdr *Shdr - ) -{ - Elf_Shdr *Namedr = GetShdrByIndex(mEhdr->e_shstrndx); - - return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0); -} - -STATIC -BOOLEAN -IsDataShdr ( - Elf_Shdr *Shdr - ) -{ - if (IsHiiRsrcShdr(Shdr)) { - return FALSE; - } - return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE); -} - -// -// Elf functions interface implementation -// - -STATIC -VOID -ScanSections64 ( - VOID - ) -{ - UINT32 i; - EFI_IMAGE_DOS_HEADER *DosHdr; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - UINT32 CoffEntry; - UINT32 SectionCount; - BOOLEAN FoundText; - - CoffEntry = 0; - mCoffOffset = 0; - mTextOffset = 0; - FoundText = FALSE; - - // - // Coff file start with a DOS header. - // - mCoffOffset = sizeof(EFI_IMAGE_DOS_HEADER) + 0x40; - mNtHdrOffset = mCoffOffset; - switch (mEhdr->e_machine) { - case EM_X86_64: - case EM_IA_64: - case EM_AARCH64: - mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); - break; - default: - VerboseMsg ("%s unknown e_machine type. Assume X64", (UINTN)mEhdr->e_machine); - mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); - break; - } - - mTableOffset = mCoffOffset; - mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); - - // - // First text sections. - // - mCoffOffset = CoffAlign(mCoffOffset); - SectionCount = 0; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsTextShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - - /* Relocate entry. */ - if ((mEhdr->e_entry >= shdr->sh_addr) && - (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { - CoffEntry = (UINT32) (mCoffOffset + mEhdr->e_entry - shdr->sh_addr); - } - - // - // Set mTextOffset with the offset of the first '.text' section - // - if (!FoundText) { - mTextOffset = mCoffOffset; - FoundText = TRUE; - } - - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += (UINT32) shdr->sh_size; - SectionCount ++; - } - } - - if (!FoundText) { - Error (NULL, 0, 3000, "Invalid", "Did not find any '.text' section."); - assert (FALSE); - } - - if (mEhdr->e_machine != EM_ARM) { - mCoffOffset = CoffAlign(mCoffOffset); - } - - if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { - Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName); - } - - // - // Then data sections. - // - mDataOffset = mCoffOffset; - SectionCount = 0; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsDataShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += (UINT32) shdr->sh_size; - SectionCount ++; - } - } - mCoffOffset = CoffAlign(mCoffOffset); - - if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { - Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName); - } - - // - // The HII resource sections. - // - mHiiRsrcOffset = mCoffOffset; - for (i = 0; i < mEhdr->e_shnum; i++) { - Elf_Shdr *shdr = GetShdrByIndex(i); - if (IsHiiRsrcShdr(shdr)) { - if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { - // the alignment field is valid - if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { - // if the section address is aligned we must align PE/COFF - mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); - } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { - // ARM RVCT tools have behavior outside of the ELF specification to try - // and make images smaller. If sh_addr is not aligned to sh_addralign - // then the section needs to preserve sh_addr MOD sh_addralign. - // Normally doing nothing here works great. - Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); - } - } - if (shdr->sh_size != 0) { - mCoffSectionsOffset[i] = mCoffOffset; - mCoffOffset += (UINT32) shdr->sh_size; - mCoffOffset = CoffAlign(mCoffOffset); - SetHiiResourceHeader ((UINT8*) mEhdr + shdr->sh_offset, mHiiRsrcOffset); - } - break; - } - } - - mRelocOffset = mCoffOffset; - - // - // Allocate base Coff file. Will be expanded later for relocations. - // - mCoffFile = (UINT8 *)malloc(mCoffOffset); - memset(mCoffFile, 0, mCoffOffset); - - // - // Fill headers. - // - DosHdr = (EFI_IMAGE_DOS_HEADER *)mCoffFile; - DosHdr->e_magic = EFI_IMAGE_DOS_SIGNATURE; - DosHdr->e_lfanew = mNtHdrOffset; - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION*)(mCoffFile + mNtHdrOffset); - - NtHdr->Pe32Plus.Signature = EFI_IMAGE_NT_SIGNATURE; - - switch (mEhdr->e_machine) { - case EM_X86_64: - NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_X64; - NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; - break; - case EM_IA_64: - NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_IPF; - NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; - break; - case EM_AARCH64: - NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_AARCH64; - NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; - break; - default: - VerboseMsg ("%s unknown e_machine type. Assume X64", (UINTN)mEhdr->e_machine); - NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_X64; - NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; - } - - NtHdr->Pe32Plus.FileHeader.NumberOfSections = mCoffNbrSections; - NtHdr->Pe32Plus.FileHeader.TimeDateStamp = (UINT32) time(NULL); - mImageTimeStamp = NtHdr->Pe32Plus.FileHeader.TimeDateStamp; - NtHdr->Pe32Plus.FileHeader.PointerToSymbolTable = 0; - NtHdr->Pe32Plus.FileHeader.NumberOfSymbols = 0; - NtHdr->Pe32Plus.FileHeader.SizeOfOptionalHeader = sizeof(NtHdr->Pe32Plus.OptionalHeader); - NtHdr->Pe32Plus.FileHeader.Characteristics = EFI_IMAGE_FILE_EXECUTABLE_IMAGE - | EFI_IMAGE_FILE_LINE_NUMS_STRIPPED - | EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED - | EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE; - - NtHdr->Pe32Plus.OptionalHeader.SizeOfCode = mDataOffset - mTextOffset; - NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData = mRelocOffset - mDataOffset; - NtHdr->Pe32Plus.OptionalHeader.SizeOfUninitializedData = 0; - NtHdr->Pe32Plus.OptionalHeader.AddressOfEntryPoint = CoffEntry; - - NtHdr->Pe32Plus.OptionalHeader.BaseOfCode = mTextOffset; - - NtHdr->Pe32Plus.OptionalHeader.ImageBase = 0; - NtHdr->Pe32Plus.OptionalHeader.SectionAlignment = mCoffAlignment; - NtHdr->Pe32Plus.OptionalHeader.FileAlignment = mCoffAlignment; - NtHdr->Pe32Plus.OptionalHeader.SizeOfImage = 0; - - NtHdr->Pe32Plus.OptionalHeader.SizeOfHeaders = mTextOffset; - NtHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes = EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES; - - // - // Section headers. - // - if ((mDataOffset - mTextOffset) > 0) { - CreateSectionHeader (".text", mTextOffset, mDataOffset - mTextOffset, - EFI_IMAGE_SCN_CNT_CODE - | EFI_IMAGE_SCN_MEM_EXECUTE - | EFI_IMAGE_SCN_MEM_READ); - } else { - // Don't make a section of size 0. - NtHdr->Pe32Plus.FileHeader.NumberOfSections--; - } - - if ((mHiiRsrcOffset - mDataOffset) > 0) { - CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset - mDataOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_WRITE - | EFI_IMAGE_SCN_MEM_READ); - } else { - // Don't make a section of size 0. - NtHdr->Pe32Plus.FileHeader.NumberOfSections--; - } - - if ((mRelocOffset - mHiiRsrcOffset) > 0) { - CreateSectionHeader (".rsrc", mHiiRsrcOffset, mRelocOffset - mHiiRsrcOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_READ); - - NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = mRelocOffset - mHiiRsrcOffset; - NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = mHiiRsrcOffset; - } else { - // Don't make a section of size 0. - NtHdr->Pe32Plus.FileHeader.NumberOfSections--; - } - -} - -STATIC -BOOLEAN -WriteSections64 ( - SECTION_FILTER_TYPES FilterType - ) -{ - UINT32 Idx; - Elf_Shdr *SecShdr; - UINT32 SecOffset; - BOOLEAN (*Filter)(Elf_Shdr *); - - // - // Initialize filter pointer - // - switch (FilterType) { - case SECTION_TEXT: - Filter = IsTextShdr; - break; - case SECTION_HII: - Filter = IsHiiRsrcShdr; - break; - case SECTION_DATA: - Filter = IsDataShdr; - break; - default: - return FALSE; - } - - // - // First: copy sections. - // - for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { - Elf_Shdr *Shdr = GetShdrByIndex(Idx); - if ((*Filter)(Shdr)) { - switch (Shdr->sh_type) { - case SHT_PROGBITS: - /* Copy. */ - memcpy(mCoffFile + mCoffSectionsOffset[Idx], - (UINT8*)mEhdr + Shdr->sh_offset, - (size_t) Shdr->sh_size); - break; - - case SHT_NOBITS: - memset(mCoffFile + mCoffSectionsOffset[Idx], 0, (size_t) Shdr->sh_size); - break; - - default: - // - // Ignore for unkown section type. - // - VerboseMsg ("%s unknown section type %x. We directly copy this section into Coff file", mInImageName, (unsigned)Shdr->sh_type); - break; - } - } - } - - // - // Second: apply relocations. - // - VerboseMsg ("Applying Relocations..."); - for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { - // - // Determine if this is a relocation section. - // - Elf_Shdr *RelShdr = GetShdrByIndex(Idx); - if ((RelShdr->sh_type != SHT_REL) && (RelShdr->sh_type != SHT_RELA)) { - continue; - } - - // - // Relocation section found. Now extract section information that the relocations - // apply to in the ELF data and the new COFF data. - // - SecShdr = GetShdrByIndex(RelShdr->sh_info); - SecOffset = mCoffSectionsOffset[RelShdr->sh_info]; - - // - // Only process relocations for the current filter type. - // - if (RelShdr->sh_type == SHT_RELA && (*Filter)(SecShdr)) { - UINT64 RelIdx; - - // - // Determine the symbol table referenced by the relocation data. - // - Elf_Shdr *SymtabShdr = GetShdrByIndex(RelShdr->sh_link); - UINT8 *Symtab = (UINT8*)mEhdr + SymtabShdr->sh_offset; - - // - // Process all relocation entries for this section. - // - for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += (UINT32) RelShdr->sh_entsize) { - - // - // Set pointer to relocation entry - // - Elf_Rela *Rel = (Elf_Rela *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); - - // - // Set pointer to symbol table entry associated with the relocation entry. - // - Elf_Sym *Sym = (Elf_Sym *)(Symtab + ELF_R_SYM(Rel->r_info) * SymtabShdr->sh_entsize); - - Elf_Shdr *SymShdr; - UINT8 *Targ; - - // - // Check section header index found in symbol table and get the section - // header location. - // - if (Sym->st_shndx == SHN_UNDEF - || Sym->st_shndx == SHN_ABS - || Sym->st_shndx > mEhdr->e_shnum) { - Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition.", mInImageName); - } - SymShdr = GetShdrByIndex(Sym->st_shndx); - - // - // Convert the relocation data to a pointer into the coff file. - // - // Note: - // r_offset is the virtual address of the storage unit to be relocated. - // sh_addr is the virtual address for the base of the section. - // - // r_offset in a memory address. - // Convert it to a pointer in the coff file. - // - Targ = mCoffFile + SecOffset + (Rel->r_offset - SecShdr->sh_addr); - - // - // Determine how to handle each relocation type based on the machine type. - // - if (mEhdr->e_machine == EM_X86_64) { - switch (ELF_R_TYPE(Rel->r_info)) { - case R_X86_64_NONE: - break; - case R_X86_64_64: - // - // Absolute relocation. - // - VerboseMsg ("R_X86_64_64"); - VerboseMsg ("Offset: 0x%08X, Addend: 0x%016LX", - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), - *(UINT64 *)Targ); - *(UINT64 *)Targ = *(UINT64 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; - VerboseMsg ("Relocation: 0x%016LX", *(UINT64*)Targ); - break; - case R_X86_64_32: - VerboseMsg ("R_X86_64_32"); - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), - *(UINT32 *)Targ); - *(UINT32 *)Targ = (UINT32)((UINT64)(*(UINT32 *)Targ) - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); - VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); - break; - case R_X86_64_32S: - VerboseMsg ("R_X86_64_32S"); - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), - *(UINT32 *)Targ); - *(INT32 *)Targ = (INT32)((INT64)(*(INT32 *)Targ) - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); - VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); - break; - case R_X86_64_PC32: - // - // Relative relocation: Symbol - Ip + Addend - // - VerboseMsg ("R_X86_64_PC32"); - VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", - (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), - *(UINT32 *)Targ); - *(UINT32 *)Targ = (UINT32) (*(UINT32 *)Targ - + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) - - (SecOffset - SecShdr->sh_addr)); - VerboseMsg ("Relocation: 0x%08X", *(UINT32 *)Targ); - break; - default: - Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_X86_64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else if (mEhdr->e_machine == EM_AARCH64) { - - // AARCH64 GCC uses RELA relocation, so all relocations have to be fixed up. - // As opposed to ARM32 using REL. - - switch (ELF_R_TYPE(Rel->r_info)) { - - case R_AARCH64_LD_PREL_LO19: - if (Rel->r_addend != 0 ) { /* TODO */ - Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_LD_PREL_LO19 Need to fixup with addend!."); - } - break; - - case R_AARCH64_CALL26: - if (Rel->r_addend != 0 ) { /* TODO */ - Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_CALL26 Need to fixup with addend!."); - } - break; - - case R_AARCH64_JUMP26: - if (Rel->r_addend != 0 ) { /* TODO : AArch64 '-O2' optimisation. */ - Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_JUMP26 Need to fixup with addend!."); - } - break; - - case R_AARCH64_ADR_PREL_PG_HI21: - // TODO : AArch64 'small' memory model. - Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADR_PREL_PG_HI21.", mInImageName); - break; - - case R_AARCH64_ADD_ABS_LO12_NC: - // TODO : AArch64 'small' memory model. - Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADD_ABS_LO12_NC.", mInImageName); - break; - - // Absolute relocations. - case R_AARCH64_ABS64: - *(UINT64 *)Targ = *(UINT64 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else { - Error (NULL, 0, 3000, "Invalid", "Not a supported machine type"); - } - } - } - } - - return TRUE; -} - -STATIC -VOID -WriteRelocations64 ( - VOID - ) -{ - UINT32 Index; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - EFI_IMAGE_DATA_DIRECTORY *Dir; - - for (Index = 0; Index < mEhdr->e_shnum; Index++) { - Elf_Shdr *RelShdr = GetShdrByIndex(Index); - if ((RelShdr->sh_type == SHT_REL) || (RelShdr->sh_type == SHT_RELA)) { - Elf_Shdr *SecShdr = GetShdrByIndex (RelShdr->sh_info); - if (IsTextShdr(SecShdr) || IsDataShdr(SecShdr)) { - UINT64 RelIdx; - - for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) { - Elf_Rela *Rel = (Elf_Rela *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); - - if (mEhdr->e_machine == EM_X86_64) { - switch (ELF_R_TYPE(Rel->r_info)) { - case R_X86_64_NONE: - case R_X86_64_PC32: - break; - case R_X86_64_64: - VerboseMsg ("EFI_IMAGE_REL_BASED_DIR64 Offset: 0x%08X", - mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); - CoffAddFixup( - (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr)), - EFI_IMAGE_REL_BASED_DIR64); - break; - case R_X86_64_32S: - case R_X86_64_32: - VerboseMsg ("EFI_IMAGE_REL_BASED_HIGHLOW Offset: 0x%08X", - mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); - CoffAddFixup( - (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr)), - EFI_IMAGE_REL_BASED_HIGHLOW); - break; - default: - Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_X86_64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else if (mEhdr->e_machine == EM_AARCH64) { - // AArch64 GCC uses RELA relocation, so all relocations has to be fixed up. ARM32 uses REL. - switch (ELF_R_TYPE(Rel->r_info)) { - case R_AARCH64_LD_PREL_LO19: - break; - - case R_AARCH64_CALL26: - break; - - case R_AARCH64_JUMP26: - break; - - case R_AARCH64_ADR_PREL_PG_HI21: - // TODO : AArch64 'small' memory model. - Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADR_PREL_PG_HI21.", mInImageName); - break; - - case R_AARCH64_ADD_ABS_LO12_NC: - // TODO : AArch64 'small' memory model. - Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADD_ABS_LO12_NC.", mInImageName); - break; - - case R_AARCH64_ABS64: - CoffAddFixup( - (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr)), - EFI_IMAGE_REL_BASED_DIR64); - break; - - case R_AARCH64_ABS32: - CoffAddFixup( - (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr)), - EFI_IMAGE_REL_BASED_HIGHLOW); - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); - } - } else { - Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) mEhdr->e_machine); - } - } - } - } - } - - // - // Pad by adding empty entries. - // - while (mCoffOffset & (mCoffAlignment - 1)) { - CoffAddFixupEntry(0); - } - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - Dir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; - Dir->Size = mCoffOffset - mRelocOffset; - if (Dir->Size == 0) { - // If no relocations, null out the directory entry and don't add the .reloc section - Dir->VirtualAddress = 0; - NtHdr->Pe32Plus.FileHeader.NumberOfSections--; - } else { - Dir->VirtualAddress = mRelocOffset; - CreateSectionHeader (".reloc", mRelocOffset, mCoffOffset - mRelocOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_DISCARDABLE - | EFI_IMAGE_SCN_MEM_READ); - } -} - -STATIC -VOID -WriteDebug64 ( - VOID - ) -{ - UINT32 Len; - UINT32 DebugOffset; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - EFI_IMAGE_DATA_DIRECTORY *DataDir; - EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; - EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; - - Len = strlen(mInImageName) + 1; - DebugOffset = mCoffOffset; - - mCoffOffset += sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) - + sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) - + Len; - mCoffOffset = CoffAlign(mCoffOffset); - - mCoffFile = realloc(mCoffFile, mCoffOffset); - memset(mCoffFile + DebugOffset, 0, mCoffOffset - DebugOffset); - - Dir = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + DebugOffset); - Dir->Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW; - Dir->SizeOfData = sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len; - Dir->RVA = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); - Dir->FileOffset = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); - - Nb10 = (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1); - Nb10->Signature = CODEVIEW_SIGNATURE_NB10; - strcpy ((char *)(Nb10 + 1), mInImageName); - - - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - DataDir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]; - DataDir->VirtualAddress = DebugOffset; - DataDir->Size = mCoffOffset - DebugOffset; - if (DataDir->Size == 0) { - // If no debug, null out the directory entry and don't add the .debug section - DataDir->VirtualAddress = 0; - NtHdr->Pe32Plus.FileHeader.NumberOfSections--; - } else { - DataDir->VirtualAddress = DebugOffset; - CreateSectionHeader (".debug", DebugOffset, mCoffOffset - DebugOffset, - EFI_IMAGE_SCN_CNT_INITIALIZED_DATA - | EFI_IMAGE_SCN_MEM_DISCARDABLE - | EFI_IMAGE_SCN_MEM_READ); - - } -} - -STATIC -VOID -SetImageSize64 ( - VOID - ) -{ - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - - // - // Set image size - // - NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - NtHdr->Pe32Plus.OptionalHeader.SizeOfImage = mCoffOffset; -} - -STATIC -VOID -CleanUp64 ( - VOID - ) -{ - if (mCoffSectionsOffset != NULL) { - free (mCoffSectionsOffset); - } -} - - +/** @file + +Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    +Portions copyright (c) 2013, ARM Ltd. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "WinNtInclude.h" + +#ifndef __GNUC__ +#include +#include +#endif +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "PeCoffLib.h" +#include "EfiUtilityMsgs.h" + +#include "GenFw.h" +#include "ElfConvert.h" +#include "Elf64Convert.h" + +STATIC +VOID +ScanSections64 ( + VOID + ); + +STATIC +BOOLEAN +WriteSections64 ( + SECTION_FILTER_TYPES FilterType + ); + +STATIC +VOID +WriteRelocations64 ( + VOID + ); + +STATIC +VOID +WriteDebug64 ( + VOID + ); + +STATIC +VOID +SetImageSize64 ( + VOID + ); + +STATIC +VOID +CleanUp64 ( + VOID + ); + +// +// Rename ELF32 strucutres to common names to help when porting to ELF64. +// +typedef Elf64_Shdr Elf_Shdr; +typedef Elf64_Ehdr Elf_Ehdr; +typedef Elf64_Rel Elf_Rel; +typedef Elf64_Rela Elf_Rela; +typedef Elf64_Sym Elf_Sym; +typedef Elf64_Phdr Elf_Phdr; +typedef Elf64_Dyn Elf_Dyn; +#define ELFCLASS ELFCLASS64 +#define ELF_R_TYPE(r) ELF64_R_TYPE(r) +#define ELF_R_SYM(r) ELF64_R_SYM(r) + +// +// Well known ELF structures. +// +STATIC Elf_Ehdr *mEhdr; +STATIC Elf_Shdr *mShdrBase; +STATIC Elf_Phdr *mPhdrBase; + +// +// Coff information +// +STATIC const UINT32 mCoffAlignment = 0x20; + +// +// PE section alignment. +// +STATIC const UINT16 mCoffNbrSections = 5; + +// +// ELF sections to offset in Coff file. +// +STATIC UINT32 *mCoffSectionsOffset = NULL; + +// +// Offsets in COFF file +// +STATIC UINT32 mNtHdrOffset; +STATIC UINT32 mTextOffset; +STATIC UINT32 mDataOffset; +STATIC UINT32 mHiiRsrcOffset; +STATIC UINT32 mRelocOffset; + +// +// Initialization Function +// +BOOLEAN +InitializeElf64 ( + UINT8 *FileBuffer, + ELF_FUNCTION_TABLE *ElfFunctions + ) +{ + // + // Initialize data pointer and structures. + // + VerboseMsg ("Set EHDR"); + mEhdr = (Elf_Ehdr*) FileBuffer; + + // + // Check the ELF64 specific header information. + // + VerboseMsg ("Check ELF64 Header Information"); + if (mEhdr->e_ident[EI_CLASS] != ELFCLASS64) { + Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFCLASS64"); + return FALSE; + } + if (mEhdr->e_ident[EI_DATA] != ELFDATA2LSB) { + Error (NULL, 0, 3000, "Unsupported", "ELF EI_DATA not ELFDATA2LSB"); + return FALSE; + } + if ((mEhdr->e_type != ET_EXEC) && (mEhdr->e_type != ET_DYN)) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN"); + return FALSE; + } + if (!((mEhdr->e_machine == EM_X86_64) || (mEhdr->e_machine == EM_AARCH64))) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_machine not EM_X86_64 or EM_AARCH64"); + return FALSE; + } + if (mEhdr->e_version != EV_CURRENT) { + Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT); + return FALSE; + } + + // + // Update section header pointers + // + VerboseMsg ("Update Header Pointers"); + mShdrBase = (Elf_Shdr *)((UINT8 *)mEhdr + mEhdr->e_shoff); + mPhdrBase = (Elf_Phdr *)((UINT8 *)mEhdr + mEhdr->e_phoff); + + // + // Create COFF Section offset buffer and zero. + // + VerboseMsg ("Create COFF Section Offset Buffer"); + mCoffSectionsOffset = (UINT32 *)malloc(mEhdr->e_shnum * sizeof (UINT32)); + memset(mCoffSectionsOffset, 0, mEhdr->e_shnum * sizeof(UINT32)); + + // + // Fill in function pointers. + // + VerboseMsg ("Fill in Function Pointers"); + ElfFunctions->ScanSections = ScanSections64; + ElfFunctions->WriteSections = WriteSections64; + ElfFunctions->WriteRelocations = WriteRelocations64; + ElfFunctions->WriteDebug = WriteDebug64; + ElfFunctions->SetImageSize = SetImageSize64; + ElfFunctions->CleanUp = CleanUp64; + + return TRUE; +} + + +// +// Header by Index functions +// +STATIC +Elf_Shdr* +GetShdrByIndex ( + UINT32 Num + ) +{ + if (Num >= mEhdr->e_shnum) + return NULL; + return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize); +} + +STATIC +UINT32 +CoffAlign ( + UINT32 Offset + ) +{ + return (Offset + mCoffAlignment - 1) & ~(mCoffAlignment - 1); +} + +// +// filter functions +// +STATIC +BOOLEAN +IsTextShdr ( + Elf_Shdr *Shdr + ) +{ + return (BOOLEAN) ((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC); +} + +STATIC +BOOLEAN +IsHiiRsrcShdr ( + Elf_Shdr *Shdr + ) +{ + Elf_Shdr *Namedr = GetShdrByIndex(mEhdr->e_shstrndx); + + return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0); +} + +STATIC +BOOLEAN +IsDataShdr ( + Elf_Shdr *Shdr + ) +{ + if (IsHiiRsrcShdr(Shdr)) { + return FALSE; + } + return (BOOLEAN) (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE); +} + +// +// Elf functions interface implementation +// + +STATIC +VOID +ScanSections64 ( + VOID + ) +{ + UINT32 i; + EFI_IMAGE_DOS_HEADER *DosHdr; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + UINT32 CoffEntry; + UINT32 SectionCount; + BOOLEAN FoundText; + + CoffEntry = 0; + mCoffOffset = 0; + mTextOffset = 0; + FoundText = FALSE; + + // + // Coff file start with a DOS header. + // + mCoffOffset = sizeof(EFI_IMAGE_DOS_HEADER) + 0x40; + mNtHdrOffset = mCoffOffset; + switch (mEhdr->e_machine) { + case EM_X86_64: + case EM_IA_64: + case EM_AARCH64: + mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); + break; + default: + VerboseMsg ("%s unknown e_machine type. Assume X64", (UINTN)mEhdr->e_machine); + mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); + break; + } + + mTableOffset = mCoffOffset; + mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); + + // + // First text sections. + // + mCoffOffset = CoffAlign(mCoffOffset); + SectionCount = 0; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsTextShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + + /* Relocate entry. */ + if ((mEhdr->e_entry >= shdr->sh_addr) && + (mEhdr->e_entry < shdr->sh_addr + shdr->sh_size)) { + CoffEntry = (UINT32) (mCoffOffset + mEhdr->e_entry - shdr->sh_addr); + } + + // + // Set mTextOffset with the offset of the first '.text' section + // + if (!FoundText) { + mTextOffset = mCoffOffset; + FoundText = TRUE; + } + + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += (UINT32) shdr->sh_size; + SectionCount ++; + } + } + + if (!FoundText) { + Error (NULL, 0, 3000, "Invalid", "Did not find any '.text' section."); + assert (FALSE); + } + + if (mEhdr->e_machine != EM_ARM) { + mCoffOffset = CoffAlign(mCoffOffset); + } + + if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { + Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text section. Source level debug might not work correctly.", mInImageName); + } + + // + // Then data sections. + // + mDataOffset = mCoffOffset; + SectionCount = 0; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsDataShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += (UINT32) shdr->sh_size; + SectionCount ++; + } + } + mCoffOffset = CoffAlign(mCoffOffset); + + if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) { + Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 data section. Source level debug might not work correctly.", mInImageName); + } + + // + // The HII resource sections. + // + mHiiRsrcOffset = mCoffOffset; + for (i = 0; i < mEhdr->e_shnum; i++) { + Elf_Shdr *shdr = GetShdrByIndex(i); + if (IsHiiRsrcShdr(shdr)) { + if ((shdr->sh_addralign != 0) && (shdr->sh_addralign != 1)) { + // the alignment field is valid + if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) { + // if the section address is aligned we must align PE/COFF + mCoffOffset = (UINT32) ((mCoffOffset + shdr->sh_addralign - 1) & ~(shdr->sh_addralign - 1)); + } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % shdr->sh_addralign)) { + // ARM RVCT tools have behavior outside of the ELF specification to try + // and make images smaller. If sh_addr is not aligned to sh_addralign + // then the section needs to preserve sh_addr MOD sh_addralign. + // Normally doing nothing here works great. + Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment."); + } + } + if (shdr->sh_size != 0) { + mCoffSectionsOffset[i] = mCoffOffset; + mCoffOffset += (UINT32) shdr->sh_size; + mCoffOffset = CoffAlign(mCoffOffset); + SetHiiResourceHeader ((UINT8*) mEhdr + shdr->sh_offset, mHiiRsrcOffset); + } + break; + } + } + + mRelocOffset = mCoffOffset; + + // + // Allocate base Coff file. Will be expanded later for relocations. + // + mCoffFile = (UINT8 *)malloc(mCoffOffset); + memset(mCoffFile, 0, mCoffOffset); + + // + // Fill headers. + // + DosHdr = (EFI_IMAGE_DOS_HEADER *)mCoffFile; + DosHdr->e_magic = EFI_IMAGE_DOS_SIGNATURE; + DosHdr->e_lfanew = mNtHdrOffset; + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION*)(mCoffFile + mNtHdrOffset); + + NtHdr->Pe32Plus.Signature = EFI_IMAGE_NT_SIGNATURE; + + switch (mEhdr->e_machine) { + case EM_X86_64: + NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_X64; + NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + break; + case EM_IA_64: + NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_IPF; + NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + break; + case EM_AARCH64: + NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_AARCH64; + NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + break; + default: + VerboseMsg ("%s unknown e_machine type. Assume X64", (UINTN)mEhdr->e_machine); + NtHdr->Pe32Plus.FileHeader.Machine = EFI_IMAGE_MACHINE_X64; + NtHdr->Pe32Plus.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + } + + NtHdr->Pe32Plus.FileHeader.NumberOfSections = mCoffNbrSections; + NtHdr->Pe32Plus.FileHeader.TimeDateStamp = (UINT32) time(NULL); + mImageTimeStamp = NtHdr->Pe32Plus.FileHeader.TimeDateStamp; + NtHdr->Pe32Plus.FileHeader.PointerToSymbolTable = 0; + NtHdr->Pe32Plus.FileHeader.NumberOfSymbols = 0; + NtHdr->Pe32Plus.FileHeader.SizeOfOptionalHeader = sizeof(NtHdr->Pe32Plus.OptionalHeader); + NtHdr->Pe32Plus.FileHeader.Characteristics = EFI_IMAGE_FILE_EXECUTABLE_IMAGE + | EFI_IMAGE_FILE_LINE_NUMS_STRIPPED + | EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED + | EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE; + + NtHdr->Pe32Plus.OptionalHeader.SizeOfCode = mDataOffset - mTextOffset; + NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData = mRelocOffset - mDataOffset; + NtHdr->Pe32Plus.OptionalHeader.SizeOfUninitializedData = 0; + NtHdr->Pe32Plus.OptionalHeader.AddressOfEntryPoint = CoffEntry; + + NtHdr->Pe32Plus.OptionalHeader.BaseOfCode = mTextOffset; + + NtHdr->Pe32Plus.OptionalHeader.ImageBase = 0; + NtHdr->Pe32Plus.OptionalHeader.SectionAlignment = mCoffAlignment; + NtHdr->Pe32Plus.OptionalHeader.FileAlignment = mCoffAlignment; + NtHdr->Pe32Plus.OptionalHeader.SizeOfImage = 0; + + NtHdr->Pe32Plus.OptionalHeader.SizeOfHeaders = mTextOffset; + NtHdr->Pe32Plus.OptionalHeader.NumberOfRvaAndSizes = EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES; + + // + // Section headers. + // + if ((mDataOffset - mTextOffset) > 0) { + CreateSectionHeader (".text", mTextOffset, mDataOffset - mTextOffset, + EFI_IMAGE_SCN_CNT_CODE + | EFI_IMAGE_SCN_MEM_EXECUTE + | EFI_IMAGE_SCN_MEM_READ); + } else { + // Don't make a section of size 0. + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } + + if ((mHiiRsrcOffset - mDataOffset) > 0) { + CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset - mDataOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_WRITE + | EFI_IMAGE_SCN_MEM_READ); + } else { + // Don't make a section of size 0. + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } + + if ((mRelocOffset - mHiiRsrcOffset) > 0) { + CreateSectionHeader (".rsrc", mHiiRsrcOffset, mRelocOffset - mHiiRsrcOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_READ); + + NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = mRelocOffset - mHiiRsrcOffset; + NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = mHiiRsrcOffset; + } else { + // Don't make a section of size 0. + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } + +} + +STATIC +BOOLEAN +WriteSections64 ( + SECTION_FILTER_TYPES FilterType + ) +{ + UINT32 Idx; + Elf_Shdr *SecShdr; + UINT32 SecOffset; + BOOLEAN (*Filter)(Elf_Shdr *); + + // + // Initialize filter pointer + // + switch (FilterType) { + case SECTION_TEXT: + Filter = IsTextShdr; + break; + case SECTION_HII: + Filter = IsHiiRsrcShdr; + break; + case SECTION_DATA: + Filter = IsDataShdr; + break; + default: + return FALSE; + } + + // + // First: copy sections. + // + for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { + Elf_Shdr *Shdr = GetShdrByIndex(Idx); + if ((*Filter)(Shdr)) { + switch (Shdr->sh_type) { + case SHT_PROGBITS: + /* Copy. */ + memcpy(mCoffFile + mCoffSectionsOffset[Idx], + (UINT8*)mEhdr + Shdr->sh_offset, + (size_t) Shdr->sh_size); + break; + + case SHT_NOBITS: + memset(mCoffFile + mCoffSectionsOffset[Idx], 0, (size_t) Shdr->sh_size); + break; + + default: + // + // Ignore for unkown section type. + // + VerboseMsg ("%s unknown section type %x. We directly copy this section into Coff file", mInImageName, (unsigned)Shdr->sh_type); + break; + } + } + } + + // + // Second: apply relocations. + // + VerboseMsg ("Applying Relocations..."); + for (Idx = 0; Idx < mEhdr->e_shnum; Idx++) { + // + // Determine if this is a relocation section. + // + Elf_Shdr *RelShdr = GetShdrByIndex(Idx); + if ((RelShdr->sh_type != SHT_REL) && (RelShdr->sh_type != SHT_RELA)) { + continue; + } + + // + // Relocation section found. Now extract section information that the relocations + // apply to in the ELF data and the new COFF data. + // + SecShdr = GetShdrByIndex(RelShdr->sh_info); + SecOffset = mCoffSectionsOffset[RelShdr->sh_info]; + + // + // Only process relocations for the current filter type. + // + if (RelShdr->sh_type == SHT_RELA && (*Filter)(SecShdr)) { + UINT64 RelIdx; + + // + // Determine the symbol table referenced by the relocation data. + // + Elf_Shdr *SymtabShdr = GetShdrByIndex(RelShdr->sh_link); + UINT8 *Symtab = (UINT8*)mEhdr + SymtabShdr->sh_offset; + + // + // Process all relocation entries for this section. + // + for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += (UINT32) RelShdr->sh_entsize) { + + // + // Set pointer to relocation entry + // + Elf_Rela *Rel = (Elf_Rela *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); + + // + // Set pointer to symbol table entry associated with the relocation entry. + // + Elf_Sym *Sym = (Elf_Sym *)(Symtab + ELF_R_SYM(Rel->r_info) * SymtabShdr->sh_entsize); + + Elf_Shdr *SymShdr; + UINT8 *Targ; + + // + // Check section header index found in symbol table and get the section + // header location. + // + if (Sym->st_shndx == SHN_UNDEF + || Sym->st_shndx == SHN_ABS + || Sym->st_shndx > mEhdr->e_shnum) { + Error (NULL, 0, 3000, "Invalid", "%s bad symbol definition.", mInImageName); + } + SymShdr = GetShdrByIndex(Sym->st_shndx); + + // + // Convert the relocation data to a pointer into the coff file. + // + // Note: + // r_offset is the virtual address of the storage unit to be relocated. + // sh_addr is the virtual address for the base of the section. + // + // r_offset in a memory address. + // Convert it to a pointer in the coff file. + // + Targ = mCoffFile + SecOffset + (Rel->r_offset - SecShdr->sh_addr); + + // + // Determine how to handle each relocation type based on the machine type. + // + if (mEhdr->e_machine == EM_X86_64) { + switch (ELF_R_TYPE(Rel->r_info)) { + case R_X86_64_NONE: + break; + case R_X86_64_64: + // + // Absolute relocation. + // + VerboseMsg ("R_X86_64_64"); + VerboseMsg ("Offset: 0x%08X, Addend: 0x%016LX", + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), + *(UINT64 *)Targ); + *(UINT64 *)Targ = *(UINT64 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; + VerboseMsg ("Relocation: 0x%016LX", *(UINT64*)Targ); + break; + case R_X86_64_32: + VerboseMsg ("R_X86_64_32"); + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), + *(UINT32 *)Targ); + *(UINT32 *)Targ = (UINT32)((UINT64)(*(UINT32 *)Targ) - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); + VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); + break; + case R_X86_64_32S: + VerboseMsg ("R_X86_64_32S"); + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), + *(UINT32 *)Targ); + *(INT32 *)Targ = (INT32)((INT64)(*(INT32 *)Targ) - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); + VerboseMsg ("Relocation: 0x%08X", *(UINT32*)Targ); + break; + case R_X86_64_PC32: + // + // Relative relocation: Symbol - Ip + Addend + // + VerboseMsg ("R_X86_64_PC32"); + VerboseMsg ("Offset: 0x%08X, Addend: 0x%08X", + (UINT32)(SecOffset + (Rel->r_offset - SecShdr->sh_addr)), + *(UINT32 *)Targ); + *(UINT32 *)Targ = (UINT32) (*(UINT32 *)Targ + + (mCoffSectionsOffset[Sym->st_shndx] - SymShdr->sh_addr) + - (SecOffset - SecShdr->sh_addr)); + VerboseMsg ("Relocation: 0x%08X", *(UINT32 *)Targ); + break; + default: + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_X86_64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else if (mEhdr->e_machine == EM_AARCH64) { + + // AARCH64 GCC uses RELA relocation, so all relocations have to be fixed up. + // As opposed to ARM32 using REL. + + switch (ELF_R_TYPE(Rel->r_info)) { + + case R_AARCH64_LD_PREL_LO19: + if (Rel->r_addend != 0 ) { /* TODO */ + Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_LD_PREL_LO19 Need to fixup with addend!."); + } + break; + + case R_AARCH64_CALL26: + if (Rel->r_addend != 0 ) { /* TODO */ + Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_CALL26 Need to fixup with addend!."); + } + break; + + case R_AARCH64_JUMP26: + if (Rel->r_addend != 0 ) { /* TODO : AArch64 '-O2' optimisation. */ + Error (NULL, 0, 3000, "Invalid", "AArch64: R_AARCH64_JUMP26 Need to fixup with addend!."); + } + break; + + case R_AARCH64_ADR_PREL_PG_HI21: + // TODO : AArch64 'small' memory model. + Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADR_PREL_PG_HI21.", mInImageName); + break; + + case R_AARCH64_ADD_ABS_LO12_NC: + // TODO : AArch64 'small' memory model. + Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADD_ABS_LO12_NC.", mInImageName); + break; + + // Absolute relocations. + case R_AARCH64_ABS64: + *(UINT64 *)Targ = *(UINT64 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; + break; + + default: + Error (NULL, 0, 3000, "Invalid", "WriteSections64(): %s unsupported ELF EM_AARCH64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else { + Error (NULL, 0, 3000, "Invalid", "Not a supported machine type"); + } + } + } + } + + return TRUE; +} + +STATIC +VOID +WriteRelocations64 ( + VOID + ) +{ + UINT32 Index; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_DATA_DIRECTORY *Dir; + + for (Index = 0; Index < mEhdr->e_shnum; Index++) { + Elf_Shdr *RelShdr = GetShdrByIndex(Index); + if ((RelShdr->sh_type == SHT_REL) || (RelShdr->sh_type == SHT_RELA)) { + Elf_Shdr *SecShdr = GetShdrByIndex (RelShdr->sh_info); + if (IsTextShdr(SecShdr) || IsDataShdr(SecShdr)) { + UINT64 RelIdx; + + for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) { + Elf_Rela *Rel = (Elf_Rela *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); + + if (mEhdr->e_machine == EM_X86_64) { + switch (ELF_R_TYPE(Rel->r_info)) { + case R_X86_64_NONE: + case R_X86_64_PC32: + break; + case R_X86_64_64: + VerboseMsg ("EFI_IMAGE_REL_BASED_DIR64 Offset: 0x%08X", + mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); + CoffAddFixup( + (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr)), + EFI_IMAGE_REL_BASED_DIR64); + break; + case R_X86_64_32S: + case R_X86_64_32: + VerboseMsg ("EFI_IMAGE_REL_BASED_HIGHLOW Offset: 0x%08X", + mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); + CoffAddFixup( + (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr)), + EFI_IMAGE_REL_BASED_HIGHLOW); + break; + default: + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_X86_64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else if (mEhdr->e_machine == EM_AARCH64) { + // AArch64 GCC uses RELA relocation, so all relocations has to be fixed up. ARM32 uses REL. + switch (ELF_R_TYPE(Rel->r_info)) { + case R_AARCH64_LD_PREL_LO19: + break; + + case R_AARCH64_CALL26: + break; + + case R_AARCH64_JUMP26: + break; + + case R_AARCH64_ADR_PREL_PG_HI21: + // TODO : AArch64 'small' memory model. + Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADR_PREL_PG_HI21.", mInImageName); + break; + + case R_AARCH64_ADD_ABS_LO12_NC: + // TODO : AArch64 'small' memory model. + Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation R_AARCH64_ADD_ABS_LO12_NC.", mInImageName); + break; + + case R_AARCH64_ABS64: + CoffAddFixup( + (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr)), + EFI_IMAGE_REL_BASED_DIR64); + break; + + case R_AARCH64_ABS32: + CoffAddFixup( + (UINT32) ((UINT64) mCoffSectionsOffset[RelShdr->sh_info] + + (Rel->r_offset - SecShdr->sh_addr)), + EFI_IMAGE_REL_BASED_HIGHLOW); + break; + + default: + Error (NULL, 0, 3000, "Invalid", "WriteRelocations64(): %s unsupported ELF EM_AARCH64 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + } + } else { + Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) mEhdr->e_machine); + } + } + } + } + } + + // + // Pad by adding empty entries. + // + while (mCoffOffset & (mCoffAlignment - 1)) { + CoffAddFixupEntry(0); + } + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + Dir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]; + Dir->Size = mCoffOffset - mRelocOffset; + if (Dir->Size == 0) { + // If no relocations, null out the directory entry and don't add the .reloc section + Dir->VirtualAddress = 0; + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } else { + Dir->VirtualAddress = mRelocOffset; + CreateSectionHeader (".reloc", mRelocOffset, mCoffOffset - mRelocOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_DISCARDABLE + | EFI_IMAGE_SCN_MEM_READ); + } +} + +STATIC +VOID +WriteDebug64 ( + VOID + ) +{ + UINT32 Len; + UINT32 DebugOffset; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_DATA_DIRECTORY *DataDir; + EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; + EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; + + Len = strlen(mInImageName) + 1; + DebugOffset = mCoffOffset; + + mCoffOffset += sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) + + sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + + Len; + mCoffOffset = CoffAlign(mCoffOffset); + + mCoffFile = realloc(mCoffFile, mCoffOffset); + memset(mCoffFile + DebugOffset, 0, mCoffOffset - DebugOffset); + + Dir = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + DebugOffset); + Dir->Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW; + Dir->SizeOfData = sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len; + Dir->RVA = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + Dir->FileOffset = DebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + + Nb10 = (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1); + Nb10->Signature = CODEVIEW_SIGNATURE_NB10; + strcpy ((char *)(Nb10 + 1), mInImageName); + + + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + DataDir = &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]; + DataDir->VirtualAddress = DebugOffset; + DataDir->Size = mCoffOffset - DebugOffset; + if (DataDir->Size == 0) { + // If no debug, null out the directory entry and don't add the .debug section + DataDir->VirtualAddress = 0; + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } else { + DataDir->VirtualAddress = DebugOffset; + CreateSectionHeader (".debug", DebugOffset, mCoffOffset - DebugOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_DISCARDABLE + | EFI_IMAGE_SCN_MEM_READ); + + } +} + +STATIC +VOID +SetImageSize64 ( + VOID + ) +{ + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + + // + // Set image size + // + NtHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + NtHdr->Pe32Plus.OptionalHeader.SizeOfImage = mCoffOffset; +} + +STATIC +VOID +CleanUp64 ( + VOID + ) +{ + if (mCoffSectionsOffset != NULL) { + free (mCoffSectionsOffset); + } +} + + diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.h b/BaseTools/Source/C/GenFw/Elf64Convert.h index 1fb95a8e42..1e3a0dfcc2 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.h +++ b/BaseTools/Source/C/GenFw/Elf64Convert.h @@ -1,24 +1,24 @@ -/** @file - -Copyright (c) 2010, Intel Corporation. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ELF_64_CONVERT_ -#define _ELF_64_CONVERT_ - -BOOLEAN -InitializeElf64 ( - UINT8 *FileBuffer, - ELF_FUNCTION_TABLE *ElfFunctions - ); - -#endif +/** @file + +Copyright (c) 2010, Intel Corporation. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _ELF_64_CONVERT_ +#define _ELF_64_CONVERT_ + +BOOLEAN +InitializeElf64 ( + UINT8 *FileBuffer, + ELF_FUNCTION_TABLE *ElfFunctions + ); + +#endif diff --git a/BaseTools/Source/C/GenFw/ElfConvert.c b/BaseTools/Source/C/GenFw/ElfConvert.c index e573554d03..17689cf27f 100644 --- a/BaseTools/Source/C/GenFw/ElfConvert.c +++ b/BaseTools/Source/C/GenFw/ElfConvert.c @@ -1,233 +1,233 @@ -/** @file - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "WinNtInclude.h" - -#ifndef __GNUC__ -#include -#include -#endif -#include -#include -#include -#include -#include - -#include -#include - -#include "EfiUtilityMsgs.h" - -#include "GenFw.h" -#include "ElfConvert.h" -#include "Elf32Convert.h" -#include "Elf64Convert.h" - -// -// Result Coff file in memory. -// -UINT8 *mCoffFile = NULL; - -// -// COFF relocation data -// -EFI_IMAGE_BASE_RELOCATION *mCoffBaseRel; -UINT16 *mCoffEntryRel; - -// -// Current offset in coff file. -// -UINT32 mCoffOffset; - -// -// Offset in Coff file of headers and sections. -// -UINT32 mTableOffset; - -// -//***************************************************************************** -// Common ELF Functions -//***************************************************************************** -// - -VOID -CoffAddFixupEntry( - UINT16 Val - ) -{ - *mCoffEntryRel = Val; - mCoffEntryRel++; - mCoffBaseRel->SizeOfBlock += 2; - mCoffOffset += 2; -} - -VOID -CoffAddFixup( - UINT32 Offset, - UINT8 Type - ) -{ - if (mCoffBaseRel == NULL - || mCoffBaseRel->VirtualAddress != (Offset & ~0xfff)) { - if (mCoffBaseRel != NULL) { - // - // Add a null entry (is it required ?) - // - CoffAddFixupEntry (0); - - // - // Pad for alignment. - // - if (mCoffOffset % 4 != 0) - CoffAddFixupEntry (0); - } - - mCoffFile = realloc ( - mCoffFile, - mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 - ); - memset ( - mCoffFile + mCoffOffset, 0, - sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 - ); - - mCoffBaseRel = (EFI_IMAGE_BASE_RELOCATION*)(mCoffFile + mCoffOffset); - mCoffBaseRel->VirtualAddress = Offset & ~0xfff; - mCoffBaseRel->SizeOfBlock = sizeof(EFI_IMAGE_BASE_RELOCATION); - - mCoffEntryRel = (UINT16 *)(mCoffBaseRel + 1); - mCoffOffset += sizeof(EFI_IMAGE_BASE_RELOCATION); - } - - // - // Fill the entry. - // - CoffAddFixupEntry((UINT16) ((Type << 12) | (Offset & 0xfff))); -} - -VOID -CreateSectionHeader ( - const CHAR8 *Name, - UINT32 Offset, - UINT32 Size, - UINT32 Flags - ) -{ - EFI_IMAGE_SECTION_HEADER *Hdr; - Hdr = (EFI_IMAGE_SECTION_HEADER*)(mCoffFile + mTableOffset); - - strcpy((char *)Hdr->Name, Name); - Hdr->Misc.VirtualSize = Size; - Hdr->VirtualAddress = Offset; - Hdr->SizeOfRawData = Size; - Hdr->PointerToRawData = Offset; - Hdr->PointerToRelocations = 0; - Hdr->PointerToLinenumbers = 0; - Hdr->NumberOfRelocations = 0; - Hdr->NumberOfLinenumbers = 0; - Hdr->Characteristics = Flags; - - mTableOffset += sizeof (EFI_IMAGE_SECTION_HEADER); -} - -// -//***************************************************************************** -// Functions called from GenFw main code. -//***************************************************************************** -// - -INTN -IsElfHeader ( - UINT8 *FileBuffer -) -{ - return (FileBuffer[EI_MAG0] == ELFMAG0 && - FileBuffer[EI_MAG1] == ELFMAG1 && - FileBuffer[EI_MAG2] == ELFMAG2 && - FileBuffer[EI_MAG3] == ELFMAG3); -} - -BOOLEAN -ConvertElf ( - UINT8 **FileBuffer, - UINT32 *FileLength - ) -{ - ELF_FUNCTION_TABLE ElfFunctions; - UINT8 EiClass; - - // - // Determine ELF type and set function table pointer correctly. - // - VerboseMsg ("Check Elf Image Header"); - EiClass = (*FileBuffer)[EI_CLASS]; - if (EiClass == ELFCLASS32) { - if (!InitializeElf32 (*FileBuffer, &ElfFunctions)) { - return FALSE; - } - } else if (EiClass == ELFCLASS64) { - if (!InitializeElf64 (*FileBuffer, &ElfFunctions)) { - return FALSE; - } - } else { - Error (NULL, 0, 3000, "Unsupported", "ELF EI_CLASS not supported."); - return FALSE; - } - - // - // Compute sections new address. - // - VerboseMsg ("Compute sections new address."); - ElfFunctions.ScanSections (); - - // - // Write and relocate sections. - // - VerboseMsg ("Write and relocate sections."); - ElfFunctions.WriteSections (SECTION_TEXT); - ElfFunctions.WriteSections (SECTION_DATA); - ElfFunctions.WriteSections (SECTION_HII); - - // - // Translate and write relocations. - // - VerboseMsg ("Translate and write relocations."); - ElfFunctions.WriteRelocations (); - - // - // Write debug info. - // - VerboseMsg ("Write debug info."); - ElfFunctions.WriteDebug (); - - // - // Make sure image size is correct before returning the new image. - // - VerboseMsg ("Set image size."); - ElfFunctions.SetImageSize (); - - // - // Replace. - // - free (*FileBuffer); - *FileBuffer = mCoffFile; - *FileLength = mCoffOffset; - - // - // Free resources used by ELF functions. - // - ElfFunctions.CleanUp (); - - return TRUE; -} +/** @file + +Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "WinNtInclude.h" + +#ifndef __GNUC__ +#include +#include +#endif +#include +#include +#include +#include +#include + +#include +#include + +#include "EfiUtilityMsgs.h" + +#include "GenFw.h" +#include "ElfConvert.h" +#include "Elf32Convert.h" +#include "Elf64Convert.h" + +// +// Result Coff file in memory. +// +UINT8 *mCoffFile = NULL; + +// +// COFF relocation data +// +EFI_IMAGE_BASE_RELOCATION *mCoffBaseRel; +UINT16 *mCoffEntryRel; + +// +// Current offset in coff file. +// +UINT32 mCoffOffset; + +// +// Offset in Coff file of headers and sections. +// +UINT32 mTableOffset; + +// +//***************************************************************************** +// Common ELF Functions +//***************************************************************************** +// + +VOID +CoffAddFixupEntry( + UINT16 Val + ) +{ + *mCoffEntryRel = Val; + mCoffEntryRel++; + mCoffBaseRel->SizeOfBlock += 2; + mCoffOffset += 2; +} + +VOID +CoffAddFixup( + UINT32 Offset, + UINT8 Type + ) +{ + if (mCoffBaseRel == NULL + || mCoffBaseRel->VirtualAddress != (Offset & ~0xfff)) { + if (mCoffBaseRel != NULL) { + // + // Add a null entry (is it required ?) + // + CoffAddFixupEntry (0); + + // + // Pad for alignment. + // + if (mCoffOffset % 4 != 0) + CoffAddFixupEntry (0); + } + + mCoffFile = realloc ( + mCoffFile, + mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 + ); + memset ( + mCoffFile + mCoffOffset, 0, + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 + ); + + mCoffBaseRel = (EFI_IMAGE_BASE_RELOCATION*)(mCoffFile + mCoffOffset); + mCoffBaseRel->VirtualAddress = Offset & ~0xfff; + mCoffBaseRel->SizeOfBlock = sizeof(EFI_IMAGE_BASE_RELOCATION); + + mCoffEntryRel = (UINT16 *)(mCoffBaseRel + 1); + mCoffOffset += sizeof(EFI_IMAGE_BASE_RELOCATION); + } + + // + // Fill the entry. + // + CoffAddFixupEntry((UINT16) ((Type << 12) | (Offset & 0xfff))); +} + +VOID +CreateSectionHeader ( + const CHAR8 *Name, + UINT32 Offset, + UINT32 Size, + UINT32 Flags + ) +{ + EFI_IMAGE_SECTION_HEADER *Hdr; + Hdr = (EFI_IMAGE_SECTION_HEADER*)(mCoffFile + mTableOffset); + + strcpy((char *)Hdr->Name, Name); + Hdr->Misc.VirtualSize = Size; + Hdr->VirtualAddress = Offset; + Hdr->SizeOfRawData = Size; + Hdr->PointerToRawData = Offset; + Hdr->PointerToRelocations = 0; + Hdr->PointerToLinenumbers = 0; + Hdr->NumberOfRelocations = 0; + Hdr->NumberOfLinenumbers = 0; + Hdr->Characteristics = Flags; + + mTableOffset += sizeof (EFI_IMAGE_SECTION_HEADER); +} + +// +//***************************************************************************** +// Functions called from GenFw main code. +//***************************************************************************** +// + +INTN +IsElfHeader ( + UINT8 *FileBuffer +) +{ + return (FileBuffer[EI_MAG0] == ELFMAG0 && + FileBuffer[EI_MAG1] == ELFMAG1 && + FileBuffer[EI_MAG2] == ELFMAG2 && + FileBuffer[EI_MAG3] == ELFMAG3); +} + +BOOLEAN +ConvertElf ( + UINT8 **FileBuffer, + UINT32 *FileLength + ) +{ + ELF_FUNCTION_TABLE ElfFunctions; + UINT8 EiClass; + + // + // Determine ELF type and set function table pointer correctly. + // + VerboseMsg ("Check Elf Image Header"); + EiClass = (*FileBuffer)[EI_CLASS]; + if (EiClass == ELFCLASS32) { + if (!InitializeElf32 (*FileBuffer, &ElfFunctions)) { + return FALSE; + } + } else if (EiClass == ELFCLASS64) { + if (!InitializeElf64 (*FileBuffer, &ElfFunctions)) { + return FALSE; + } + } else { + Error (NULL, 0, 3000, "Unsupported", "ELF EI_CLASS not supported."); + return FALSE; + } + + // + // Compute sections new address. + // + VerboseMsg ("Compute sections new address."); + ElfFunctions.ScanSections (); + + // + // Write and relocate sections. + // + VerboseMsg ("Write and relocate sections."); + ElfFunctions.WriteSections (SECTION_TEXT); + ElfFunctions.WriteSections (SECTION_DATA); + ElfFunctions.WriteSections (SECTION_HII); + + // + // Translate and write relocations. + // + VerboseMsg ("Translate and write relocations."); + ElfFunctions.WriteRelocations (); + + // + // Write debug info. + // + VerboseMsg ("Write debug info."); + ElfFunctions.WriteDebug (); + + // + // Make sure image size is correct before returning the new image. + // + VerboseMsg ("Set image size."); + ElfFunctions.SetImageSize (); + + // + // Replace. + // + free (*FileBuffer); + *FileBuffer = mCoffFile; + *FileLength = mCoffOffset; + + // + // Free resources used by ELF functions. + // + ElfFunctions.CleanUp (); + + return TRUE; +} diff --git a/BaseTools/Source/C/GenFw/ElfConvert.h b/BaseTools/Source/C/GenFw/ElfConvert.h index 185dbb759c..241dd6f44f 100644 --- a/BaseTools/Source/C/GenFw/ElfConvert.h +++ b/BaseTools/Source/C/GenFw/ElfConvert.h @@ -1,83 +1,83 @@ -/** @file - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ELF_CONVERT_H_ -#define _ELF_CONVERT_H_ - -#include "elf_common.h" -#include "elf32.h" -#include "elf64.h" - -// -// Externally defined variables -// -extern UINT32 mCoffOffset; -extern CHAR8 *mInImageName; -extern UINT32 mImageTimeStamp; -extern UINT8 *mCoffFile; -extern UINT32 mTableOffset; -extern UINT32 mOutImageType; - -// -// Common EFI specific data. -// -#define ELF_HII_SECTION_NAME ".hii" - -// -// Filter Types -// -typedef enum { - SECTION_TEXT, - SECTION_HII, - SECTION_DATA - -} SECTION_FILTER_TYPES; - -// -// FunctionTalbe -// -typedef struct { - VOID (*ScanSections) (); - BOOLEAN (*WriteSections) (SECTION_FILTER_TYPES FilterType); - VOID (*WriteRelocations) (); - VOID (*WriteDebug) (); - VOID (*SetImageSize) (); - VOID (*CleanUp) (); - -} ELF_FUNCTION_TABLE; - -// -// Common functions -// -VOID -CoffAddFixup ( - UINT32 Offset, - UINT8 Type - ); - -VOID -CoffAddFixupEntry ( - UINT16 Val - ); - - -VOID -CreateSectionHeader ( - const CHAR8 *Name, - UINT32 Offset, - UINT32 Size, - UINT32 Flags - ); - -#endif +/** @file + +Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _ELF_CONVERT_H_ +#define _ELF_CONVERT_H_ + +#include "elf_common.h" +#include "elf32.h" +#include "elf64.h" + +// +// Externally defined variables +// +extern UINT32 mCoffOffset; +extern CHAR8 *mInImageName; +extern UINT32 mImageTimeStamp; +extern UINT8 *mCoffFile; +extern UINT32 mTableOffset; +extern UINT32 mOutImageType; + +// +// Common EFI specific data. +// +#define ELF_HII_SECTION_NAME ".hii" + +// +// Filter Types +// +typedef enum { + SECTION_TEXT, + SECTION_HII, + SECTION_DATA + +} SECTION_FILTER_TYPES; + +// +// FunctionTalbe +// +typedef struct { + VOID (*ScanSections) (); + BOOLEAN (*WriteSections) (SECTION_FILTER_TYPES FilterType); + VOID (*WriteRelocations) (); + VOID (*WriteDebug) (); + VOID (*SetImageSize) (); + VOID (*CleanUp) (); + +} ELF_FUNCTION_TABLE; + +// +// Common functions +// +VOID +CoffAddFixup ( + UINT32 Offset, + UINT8 Type + ); + +VOID +CoffAddFixupEntry ( + UINT16 Val + ); + + +VOID +CreateSectionHeader ( + const CHAR8 *Name, + UINT32 Offset, + UINT32 Size, + UINT32 Flags + ); + +#endif diff --git a/BaseTools/Source/C/GenFw/GenFw.h b/BaseTools/Source/C/GenFw/GenFw.h index e36dc085ff..5249337745 100644 --- a/BaseTools/Source/C/GenFw/GenFw.h +++ b/BaseTools/Source/C/GenFw/GenFw.h @@ -1,55 +1,55 @@ -/** @file - -Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    - -This program and the accompanying materials are licensed and made available -under the terms and conditions of the BSD License which accompanies this -distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _GEN_FW_H_ -#define _GEN_FW_H_ - -// -// Action for this tool. -// -#define FW_DUMMY_IMAGE 0 -#define FW_EFI_IMAGE 1 -#define FW_TE_IMAGE 2 -#define FW_ACPI_IMAGE 3 -#define FW_BIN_IMAGE 4 -#define FW_ZERO_DEBUG_IMAGE 5 -#define FW_SET_STAMP_IMAGE 6 -#define FW_MCI_IMAGE 7 -#define FW_MERGE_IMAGE 8 -#define FW_RELOC_STRIPEED_IMAGE 9 -#define FW_HII_PACKAGE_LIST_RCIMAGE 10 -#define FW_HII_PACKAGE_LIST_BINIMAGE 11 -#define FW_REBASE_IMAGE 12 -#define FW_SET_ADDRESS_IMAGE 13 - -#define DUMP_TE_HEADER 0x11 - -VOID -SetHiiResourceHeader ( - UINT8 *HiiBinData, - UINT32 OffsetToFile - ); - -INTN -IsElfHeader ( - UINT8 *FileBuffer - ); - -BOOLEAN -ConvertElf ( - UINT8 **FileBuffer, - UINT32 *FileLength - ); - -#endif +/** @file + +Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
    + +This program and the accompanying materials are licensed and made available +under the terms and conditions of the BSD License which accompanies this +distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef _GEN_FW_H_ +#define _GEN_FW_H_ + +// +// Action for this tool. +// +#define FW_DUMMY_IMAGE 0 +#define FW_EFI_IMAGE 1 +#define FW_TE_IMAGE 2 +#define FW_ACPI_IMAGE 3 +#define FW_BIN_IMAGE 4 +#define FW_ZERO_DEBUG_IMAGE 5 +#define FW_SET_STAMP_IMAGE 6 +#define FW_MCI_IMAGE 7 +#define FW_MERGE_IMAGE 8 +#define FW_RELOC_STRIPEED_IMAGE 9 +#define FW_HII_PACKAGE_LIST_RCIMAGE 10 +#define FW_HII_PACKAGE_LIST_BINIMAGE 11 +#define FW_REBASE_IMAGE 12 +#define FW_SET_ADDRESS_IMAGE 13 + +#define DUMP_TE_HEADER 0x11 + +VOID +SetHiiResourceHeader ( + UINT8 *HiiBinData, + UINT32 OffsetToFile + ); + +INTN +IsElfHeader ( + UINT8 *FileBuffer + ); + +BOOLEAN +ConvertElf ( + UINT8 **FileBuffer, + UINT32 *FileLength + ); + +#endif diff --git a/BaseTools/Source/C/GenFw/elf32.h b/BaseTools/Source/C/GenFw/elf32.h index 63946aad84..dd4e132598 100644 --- a/BaseTools/Source/C/GenFw/elf32.h +++ b/BaseTools/Source/C/GenFw/elf32.h @@ -1,258 +1,258 @@ -/** @file -Ported ELF include files from FreeBSD - -Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - -**/ -/*- - * Copyright (c) 1996-1998 John D. Polstra. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.2 2007/12/03 21:30:36 marius Exp $ - */ - -#ifndef _SYS_ELF32_H_ -#define _SYS_ELF32_H_ 1 - - -/* - * ELF definitions common to all 32-bit architectures. - */ - -typedef UINT32 Elf32_Addr; -typedef UINT16 Elf32_Half; -typedef UINT32 Elf32_Off; -typedef INT32 Elf32_Sword; -typedef UINT32 Elf32_Word; -typedef UINT64 Elf32_Lword; - -typedef Elf32_Word Elf32_Hashelt; - -/* Non-standard class-dependent datatype used for abstraction. */ -typedef Elf32_Word Elf32_Size; -typedef Elf32_Sword Elf32_Ssize; - -/* - * ELF header. - */ - -typedef struct { - unsigned char e_ident[EI_NIDENT]; /* File identification. */ - Elf32_Half e_type; /* File type. */ - Elf32_Half e_machine; /* Machine architecture. */ - Elf32_Word e_version; /* ELF format version. */ - Elf32_Addr e_entry; /* Entry point. */ - Elf32_Off e_phoff; /* Program header file offset. */ - Elf32_Off e_shoff; /* Section header file offset. */ - Elf32_Word e_flags; /* Architecture-specific flags. */ - Elf32_Half e_ehsize; /* Size of ELF header in bytes. */ - Elf32_Half e_phentsize; /* Size of program header entry. */ - Elf32_Half e_phnum; /* Number of program header entries. */ - Elf32_Half e_shentsize; /* Size of section header entry. */ - Elf32_Half e_shnum; /* Number of section header entries. */ - Elf32_Half e_shstrndx; /* Section name strings section. */ -} Elf32_Ehdr; - -/* - * Section header. - */ - -typedef struct { - Elf32_Word sh_name; /* Section name (index into the - section header string table). */ - Elf32_Word sh_type; /* Section type. */ - Elf32_Word sh_flags; /* Section flags. */ - Elf32_Addr sh_addr; /* Address in memory image. */ - Elf32_Off sh_offset; /* Offset in file. */ - Elf32_Word sh_size; /* Size in bytes. */ - Elf32_Word sh_link; /* Index of a related section. */ - Elf32_Word sh_info; /* Depends on section type. */ - Elf32_Word sh_addralign; /* Alignment in bytes. */ - Elf32_Word sh_entsize; /* Size of each entry in section. */ -} Elf32_Shdr; - -/* - * Program header. - */ - -typedef struct { - Elf32_Word p_type; /* Entry type. */ - Elf32_Off p_offset; /* File offset of contents. */ - Elf32_Addr p_vaddr; /* Virtual address in memory image. */ - Elf32_Addr p_paddr; /* Physical address (not used). */ - Elf32_Word p_filesz; /* Size of contents in file. */ - Elf32_Word p_memsz; /* Size of contents in memory. */ - Elf32_Word p_flags; /* Access permission flags. */ - Elf32_Word p_align; /* Alignment in memory and file. */ -} Elf32_Phdr; - -/* - * Dynamic structure. The ".dynamic" section contains an array of them. - */ - -typedef struct { - Elf32_Sword d_tag; /* Entry type. */ - union { - Elf32_Word d_val; /* Integer value. */ - Elf32_Addr d_ptr; /* Address value. */ - } d_un; -} Elf32_Dyn; - -/* - * Relocation entries. - */ - -/* Relocations that don't need an addend field. */ -typedef struct { - Elf32_Addr r_offset; /* Location to be relocated. */ - Elf32_Word r_info; /* Relocation type and symbol index. */ -} Elf32_Rel; - -/* Relocations that need an addend field. */ -typedef struct { - Elf32_Addr r_offset; /* Location to be relocated. */ - Elf32_Word r_info; /* Relocation type and symbol index. */ - Elf32_Sword r_addend; /* Addend. */ -} Elf32_Rela; - -/* Macros for accessing the fields of r_info. */ -#define ELF32_R_SYM(info) ((info) >> 8) -#define ELF32_R_TYPE(info) ((unsigned char)(info)) - -/* Macro for constructing r_info from field values. */ -#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type)) - -/* - * Note entry header - */ -typedef Elf_Note Elf32_Nhdr; - -/* - * Move entry - */ -typedef struct { - Elf32_Lword m_value; /* symbol value */ - Elf32_Word m_info; /* size + index */ - Elf32_Word m_poffset; /* symbol offset */ - Elf32_Half m_repeat; /* repeat count */ - Elf32_Half m_stride; /* stride info */ -} Elf32_Move; - -/* - * The macros compose and decompose values for Move.r_info - * - * sym = ELF32_M_SYM(M.m_info) - * size = ELF32_M_SIZE(M.m_info) - * M.m_info = ELF32_M_INFO(sym, size) - */ -#define ELF32_M_SYM(info) ((info)>>8) -#define ELF32_M_SIZE(info) ((unsigned char)(info)) -#define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) - -/* - * Hardware/Software capabilities entry - */ -typedef struct { - Elf32_Word c_tag; /* how to interpret value */ - union { - Elf32_Word c_val; - Elf32_Addr c_ptr; - } c_un; -} Elf32_Cap; - -/* - * Symbol table entries. - */ - -typedef struct { - Elf32_Word st_name; /* String table index of name. */ - Elf32_Addr st_value; /* Symbol value. */ - Elf32_Word st_size; /* Size of associated object. */ - unsigned char st_info; /* Type and binding information. */ - unsigned char st_other; /* Reserved (not used). */ - Elf32_Half st_shndx; /* Section index of symbol. */ -} Elf32_Sym; - -/* Macros for accessing the fields of st_info. */ -#define ELF32_ST_BIND(info) ((info) >> 4) -#define ELF32_ST_TYPE(info) ((info) & 0xf) - -/* Macro for constructing st_info from field values. */ -#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -/* Macro for accessing the fields of st_other. */ -#define ELF32_ST_VISIBILITY(oth) ((oth) & 0x3) - -/* Structures used by Sun & GNU symbol versioning. */ -typedef struct -{ - Elf32_Half vd_version; - Elf32_Half vd_flags; - Elf32_Half vd_ndx; - Elf32_Half vd_cnt; - Elf32_Word vd_hash; - Elf32_Word vd_aux; - Elf32_Word vd_next; -} Elf32_Verdef; - -typedef struct -{ - Elf32_Word vda_name; - Elf32_Word vda_next; -} Elf32_Verdaux; - -typedef struct -{ - Elf32_Half vn_version; - Elf32_Half vn_cnt; - Elf32_Word vn_file; - Elf32_Word vn_aux; - Elf32_Word vn_next; -} Elf32_Verneed; - -typedef struct -{ - Elf32_Word vna_hash; - Elf32_Half vna_flags; - Elf32_Half vna_other; - Elf32_Word vna_name; - Elf32_Word vna_next; -} Elf32_Vernaux; - -typedef Elf32_Half Elf32_Versym; - -typedef struct { - Elf32_Half si_boundto; /* direct bindings - symbol bound to */ - Elf32_Half si_flags; /* per symbol flags */ -} Elf32_Syminfo; - -#endif /* !_SYS_ELF32_H_ */ +/** @file +Ported ELF include files from FreeBSD + +Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +**/ +/*- + * Copyright (c) 1996-1998 John D. Polstra. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.2 2007/12/03 21:30:36 marius Exp $ + */ + +#ifndef _SYS_ELF32_H_ +#define _SYS_ELF32_H_ 1 + + +/* + * ELF definitions common to all 32-bit architectures. + */ + +typedef UINT32 Elf32_Addr; +typedef UINT16 Elf32_Half; +typedef UINT32 Elf32_Off; +typedef INT32 Elf32_Sword; +typedef UINT32 Elf32_Word; +typedef UINT64 Elf32_Lword; + +typedef Elf32_Word Elf32_Hashelt; + +/* Non-standard class-dependent datatype used for abstraction. */ +typedef Elf32_Word Elf32_Size; +typedef Elf32_Sword Elf32_Ssize; + +/* + * ELF header. + */ + +typedef struct { + unsigned char e_ident[EI_NIDENT]; /* File identification. */ + Elf32_Half e_type; /* File type. */ + Elf32_Half e_machine; /* Machine architecture. */ + Elf32_Word e_version; /* ELF format version. */ + Elf32_Addr e_entry; /* Entry point. */ + Elf32_Off e_phoff; /* Program header file offset. */ + Elf32_Off e_shoff; /* Section header file offset. */ + Elf32_Word e_flags; /* Architecture-specific flags. */ + Elf32_Half e_ehsize; /* Size of ELF header in bytes. */ + Elf32_Half e_phentsize; /* Size of program header entry. */ + Elf32_Half e_phnum; /* Number of program header entries. */ + Elf32_Half e_shentsize; /* Size of section header entry. */ + Elf32_Half e_shnum; /* Number of section header entries. */ + Elf32_Half e_shstrndx; /* Section name strings section. */ +} Elf32_Ehdr; + +/* + * Section header. + */ + +typedef struct { + Elf32_Word sh_name; /* Section name (index into the + section header string table). */ + Elf32_Word sh_type; /* Section type. */ + Elf32_Word sh_flags; /* Section flags. */ + Elf32_Addr sh_addr; /* Address in memory image. */ + Elf32_Off sh_offset; /* Offset in file. */ + Elf32_Word sh_size; /* Size in bytes. */ + Elf32_Word sh_link; /* Index of a related section. */ + Elf32_Word sh_info; /* Depends on section type. */ + Elf32_Word sh_addralign; /* Alignment in bytes. */ + Elf32_Word sh_entsize; /* Size of each entry in section. */ +} Elf32_Shdr; + +/* + * Program header. + */ + +typedef struct { + Elf32_Word p_type; /* Entry type. */ + Elf32_Off p_offset; /* File offset of contents. */ + Elf32_Addr p_vaddr; /* Virtual address in memory image. */ + Elf32_Addr p_paddr; /* Physical address (not used). */ + Elf32_Word p_filesz; /* Size of contents in file. */ + Elf32_Word p_memsz; /* Size of contents in memory. */ + Elf32_Word p_flags; /* Access permission flags. */ + Elf32_Word p_align; /* Alignment in memory and file. */ +} Elf32_Phdr; + +/* + * Dynamic structure. The ".dynamic" section contains an array of them. + */ + +typedef struct { + Elf32_Sword d_tag; /* Entry type. */ + union { + Elf32_Word d_val; /* Integer value. */ + Elf32_Addr d_ptr; /* Address value. */ + } d_un; +} Elf32_Dyn; + +/* + * Relocation entries. + */ + +/* Relocations that don't need an addend field. */ +typedef struct { + Elf32_Addr r_offset; /* Location to be relocated. */ + Elf32_Word r_info; /* Relocation type and symbol index. */ +} Elf32_Rel; + +/* Relocations that need an addend field. */ +typedef struct { + Elf32_Addr r_offset; /* Location to be relocated. */ + Elf32_Word r_info; /* Relocation type and symbol index. */ + Elf32_Sword r_addend; /* Addend. */ +} Elf32_Rela; + +/* Macros for accessing the fields of r_info. */ +#define ELF32_R_SYM(info) ((info) >> 8) +#define ELF32_R_TYPE(info) ((unsigned char)(info)) + +/* Macro for constructing r_info from field values. */ +#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type)) + +/* + * Note entry header + */ +typedef Elf_Note Elf32_Nhdr; + +/* + * Move entry + */ +typedef struct { + Elf32_Lword m_value; /* symbol value */ + Elf32_Word m_info; /* size + index */ + Elf32_Word m_poffset; /* symbol offset */ + Elf32_Half m_repeat; /* repeat count */ + Elf32_Half m_stride; /* stride info */ +} Elf32_Move; + +/* + * The macros compose and decompose values for Move.r_info + * + * sym = ELF32_M_SYM(M.m_info) + * size = ELF32_M_SIZE(M.m_info) + * M.m_info = ELF32_M_INFO(sym, size) + */ +#define ELF32_M_SYM(info) ((info)>>8) +#define ELF32_M_SIZE(info) ((unsigned char)(info)) +#define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) + +/* + * Hardware/Software capabilities entry + */ +typedef struct { + Elf32_Word c_tag; /* how to interpret value */ + union { + Elf32_Word c_val; + Elf32_Addr c_ptr; + } c_un; +} Elf32_Cap; + +/* + * Symbol table entries. + */ + +typedef struct { + Elf32_Word st_name; /* String table index of name. */ + Elf32_Addr st_value; /* Symbol value. */ + Elf32_Word st_size; /* Size of associated object. */ + unsigned char st_info; /* Type and binding information. */ + unsigned char st_other; /* Reserved (not used). */ + Elf32_Half st_shndx; /* Section index of symbol. */ +} Elf32_Sym; + +/* Macros for accessing the fields of st_info. */ +#define ELF32_ST_BIND(info) ((info) >> 4) +#define ELF32_ST_TYPE(info) ((info) & 0xf) + +/* Macro for constructing st_info from field values. */ +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +/* Macro for accessing the fields of st_other. */ +#define ELF32_ST_VISIBILITY(oth) ((oth) & 0x3) + +/* Structures used by Sun & GNU symbol versioning. */ +typedef struct +{ + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct +{ + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct +{ + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct +{ + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef Elf32_Half Elf32_Versym; + +typedef struct { + Elf32_Half si_boundto; /* direct bindings - symbol bound to */ + Elf32_Half si_flags; /* per symbol flags */ +} Elf32_Syminfo; + +#endif /* !_SYS_ELF32_H_ */ diff --git a/BaseTools/Source/C/GenFw/elf64.h b/BaseTools/Source/C/GenFw/elf64.h index 6c87207ede..572085995d 100644 --- a/BaseTools/Source/C/GenFw/elf64.h +++ b/BaseTools/Source/C/GenFw/elf64.h @@ -1,260 +1,260 @@ -/** @file -Ported ELF include files from FreeBSD - -Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ -/*- - * Copyright (c) 1996-1998 John D. Polstra. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.2 2007/12/03 21:30:36 marius Exp $ - */ - -#ifndef _SYS_ELF64_H_ -#define _SYS_ELF64_H_ 1 - - -/* - * ELF definitions common to all 64-bit architectures. - */ - -typedef UINT64 Elf64_Addr; -typedef UINT16 Elf64_Half; -typedef UINT64 Elf64_Off; -typedef INT32 Elf64_Sword; -typedef INT64 Elf64_Sxword; -typedef UINT32 Elf64_Word; -typedef UINT64 Elf64_Lword; -typedef UINT64 Elf64_Xword; - -/* - * Types of dynamic symbol hash table bucket and chain elements. - * - * This is inconsistent among 64 bit architectures, so a machine dependent - * typedef is required. - */ - -typedef Elf64_Word Elf64_Hashelt; - -/* Non-standard class-dependent datatype used for abstraction. */ -typedef Elf64_Xword Elf64_Size; -typedef Elf64_Sxword Elf64_Ssize; - -/* - * ELF header. - */ - -typedef struct { - unsigned char e_ident[EI_NIDENT]; /* File identification. */ - Elf64_Half e_type; /* File type. */ - Elf64_Half e_machine; /* Machine architecture. */ - Elf64_Word e_version; /* ELF format version. */ - Elf64_Addr e_entry; /* Entry point. */ - Elf64_Off e_phoff; /* Program header file offset. */ - Elf64_Off e_shoff; /* Section header file offset. */ - Elf64_Word e_flags; /* Architecture-specific flags. */ - Elf64_Half e_ehsize; /* Size of ELF header in bytes. */ - Elf64_Half e_phentsize; /* Size of program header entry. */ - Elf64_Half e_phnum; /* Number of program header entries. */ - Elf64_Half e_shentsize; /* Size of section header entry. */ - Elf64_Half e_shnum; /* Number of section header entries. */ - Elf64_Half e_shstrndx; /* Section name strings section. */ -} Elf64_Ehdr; - -/* - * Section header. - */ - -typedef struct { - Elf64_Word sh_name; /* Section name (index into the - section header string table). */ - Elf64_Word sh_type; /* Section type. */ - Elf64_Xword sh_flags; /* Section flags. */ - Elf64_Addr sh_addr; /* Address in memory image. */ - Elf64_Off sh_offset; /* Offset in file. */ - Elf64_Xword sh_size; /* Size in bytes. */ - Elf64_Word sh_link; /* Index of a related section. */ - Elf64_Word sh_info; /* Depends on section type. */ - Elf64_Xword sh_addralign; /* Alignment in bytes. */ - Elf64_Xword sh_entsize; /* Size of each entry in section. */ -} Elf64_Shdr; - -/* - * Program header. - */ - -typedef struct { - Elf64_Word p_type; /* Entry type. */ - Elf64_Word p_flags; /* Access permission flags. */ - Elf64_Off p_offset; /* File offset of contents. */ - Elf64_Addr p_vaddr; /* Virtual address in memory image. */ - Elf64_Addr p_paddr; /* Physical address (not used). */ - Elf64_Xword p_filesz; /* Size of contents in file. */ - Elf64_Xword p_memsz; /* Size of contents in memory. */ - Elf64_Xword p_align; /* Alignment in memory and file. */ -} Elf64_Phdr; - -/* - * Dynamic structure. The ".dynamic" section contains an array of them. - */ - -typedef struct { - Elf64_Sxword d_tag; /* Entry type. */ - union { - Elf64_Xword d_val; /* Integer value. */ - Elf64_Addr d_ptr; /* Address value. */ - } d_un; -} Elf64_Dyn; - -/* - * Relocation entries. - */ - -/* Relocations that don't need an addend field. */ -typedef struct { - Elf64_Addr r_offset; /* Location to be relocated. */ - Elf64_Xword r_info; /* Relocation type and symbol index. */ -} Elf64_Rel; - -/* Relocations that need an addend field. */ -typedef struct { - Elf64_Addr r_offset; /* Location to be relocated. */ - Elf64_Xword r_info; /* Relocation type and symbol index. */ - Elf64_Sxword r_addend; /* Addend. */ -} Elf64_Rela; - -/* Macros for accessing the fields of r_info. */ -#define ELF64_R_SYM(info) ((info) >> 32) -#define ELF64_R_TYPE(info) ((info) & 0xffffffffL) - -/* Macro for constructing r_info from field values. */ -#define ELF64_R_INFO(sym, type) (((sym) << 32) + ((type) & 0xffffffffL)) - -#define ELF64_R_TYPE_DATA(info) (((Elf64_Xword)(info)<<32)>>40) -#define ELF64_R_TYPE_ID(info) (((Elf64_Xword)(info)<<56)>>56) -#define ELF64_R_TYPE_INFO(data, type) \ - (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type)) - -/* - * Note entry header - */ -typedef Elf_Note Elf64_Nhdr; - -/* - * Move entry - */ -typedef struct { - Elf64_Lword m_value; /* symbol value */ - Elf64_Xword m_info; /* size + index */ - Elf64_Xword m_poffset; /* symbol offset */ - Elf64_Half m_repeat; /* repeat count */ - Elf64_Half m_stride; /* stride info */ -} Elf64_Move; - -#define ELF64_M_SYM(info) ((info)>>8) -#define ELF64_M_SIZE(info) ((unsigned char)(info)) -#define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) - -/* - * Hardware/Software capabilities entry - */ -typedef struct { - Elf64_Xword c_tag; /* how to interpret value */ - union { - Elf64_Xword c_val; - Elf64_Addr c_ptr; - } c_un; -} Elf64_Cap; - -/* - * Symbol table entries. - */ - -typedef struct { - Elf64_Word st_name; /* String table index of name. */ - unsigned char st_info; /* Type and binding information. */ - unsigned char st_other; /* Reserved (not used). */ - Elf64_Half st_shndx; /* Section index of symbol. */ - Elf64_Addr st_value; /* Symbol value. */ - Elf64_Xword st_size; /* Size of associated object. */ -} Elf64_Sym; - -/* Macros for accessing the fields of st_info. */ -#define ELF64_ST_BIND(info) ((info) >> 4) -#define ELF64_ST_TYPE(info) ((info) & 0xf) - -/* Macro for constructing st_info from field values. */ -#define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -/* Macro for accessing the fields of st_other. */ -#define ELF64_ST_VISIBILITY(oth) ((oth) & 0x3) - -/* Structures used by Sun & GNU-style symbol versioning. */ -typedef struct { - Elf64_Half vd_version; - Elf64_Half vd_flags; - Elf64_Half vd_ndx; - Elf64_Half vd_cnt; - Elf64_Word vd_hash; - Elf64_Word vd_aux; - Elf64_Word vd_next; -} Elf64_Verdef; - -typedef struct { - Elf64_Word vda_name; - Elf64_Word vda_next; -} Elf64_Verdaux; - -typedef struct { - Elf64_Half vn_version; - Elf64_Half vn_cnt; - Elf64_Word vn_file; - Elf64_Word vn_aux; - Elf64_Word vn_next; -} Elf64_Verneed; - -typedef struct { - Elf64_Word vna_hash; - Elf64_Half vna_flags; - Elf64_Half vna_other; - Elf64_Word vna_name; - Elf64_Word vna_next; -} Elf64_Vernaux; - -typedef Elf64_Half Elf64_Versym; - -typedef struct { - Elf64_Half si_boundto; /* direct bindings - symbol bound to */ - Elf64_Half si_flags; /* per symbol flags */ -} Elf64_Syminfo; - -#endif /* !_SYS_ELF64_H_ */ +/** @file +Ported ELF include files from FreeBSD + +Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +/*- + * Copyright (c) 1996-1998 John D. Polstra. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.2 2007/12/03 21:30:36 marius Exp $ + */ + +#ifndef _SYS_ELF64_H_ +#define _SYS_ELF64_H_ 1 + + +/* + * ELF definitions common to all 64-bit architectures. + */ + +typedef UINT64 Elf64_Addr; +typedef UINT16 Elf64_Half; +typedef UINT64 Elf64_Off; +typedef INT32 Elf64_Sword; +typedef INT64 Elf64_Sxword; +typedef UINT32 Elf64_Word; +typedef UINT64 Elf64_Lword; +typedef UINT64 Elf64_Xword; + +/* + * Types of dynamic symbol hash table bucket and chain elements. + * + * This is inconsistent among 64 bit architectures, so a machine dependent + * typedef is required. + */ + +typedef Elf64_Word Elf64_Hashelt; + +/* Non-standard class-dependent datatype used for abstraction. */ +typedef Elf64_Xword Elf64_Size; +typedef Elf64_Sxword Elf64_Ssize; + +/* + * ELF header. + */ + +typedef struct { + unsigned char e_ident[EI_NIDENT]; /* File identification. */ + Elf64_Half e_type; /* File type. */ + Elf64_Half e_machine; /* Machine architecture. */ + Elf64_Word e_version; /* ELF format version. */ + Elf64_Addr e_entry; /* Entry point. */ + Elf64_Off e_phoff; /* Program header file offset. */ + Elf64_Off e_shoff; /* Section header file offset. */ + Elf64_Word e_flags; /* Architecture-specific flags. */ + Elf64_Half e_ehsize; /* Size of ELF header in bytes. */ + Elf64_Half e_phentsize; /* Size of program header entry. */ + Elf64_Half e_phnum; /* Number of program header entries. */ + Elf64_Half e_shentsize; /* Size of section header entry. */ + Elf64_Half e_shnum; /* Number of section header entries. */ + Elf64_Half e_shstrndx; /* Section name strings section. */ +} Elf64_Ehdr; + +/* + * Section header. + */ + +typedef struct { + Elf64_Word sh_name; /* Section name (index into the + section header string table). */ + Elf64_Word sh_type; /* Section type. */ + Elf64_Xword sh_flags; /* Section flags. */ + Elf64_Addr sh_addr; /* Address in memory image. */ + Elf64_Off sh_offset; /* Offset in file. */ + Elf64_Xword sh_size; /* Size in bytes. */ + Elf64_Word sh_link; /* Index of a related section. */ + Elf64_Word sh_info; /* Depends on section type. */ + Elf64_Xword sh_addralign; /* Alignment in bytes. */ + Elf64_Xword sh_entsize; /* Size of each entry in section. */ +} Elf64_Shdr; + +/* + * Program header. + */ + +typedef struct { + Elf64_Word p_type; /* Entry type. */ + Elf64_Word p_flags; /* Access permission flags. */ + Elf64_Off p_offset; /* File offset of contents. */ + Elf64_Addr p_vaddr; /* Virtual address in memory image. */ + Elf64_Addr p_paddr; /* Physical address (not used). */ + Elf64_Xword p_filesz; /* Size of contents in file. */ + Elf64_Xword p_memsz; /* Size of contents in memory. */ + Elf64_Xword p_align; /* Alignment in memory and file. */ +} Elf64_Phdr; + +/* + * Dynamic structure. The ".dynamic" section contains an array of them. + */ + +typedef struct { + Elf64_Sxword d_tag; /* Entry type. */ + union { + Elf64_Xword d_val; /* Integer value. */ + Elf64_Addr d_ptr; /* Address value. */ + } d_un; +} Elf64_Dyn; + +/* + * Relocation entries. + */ + +/* Relocations that don't need an addend field. */ +typedef struct { + Elf64_Addr r_offset; /* Location to be relocated. */ + Elf64_Xword r_info; /* Relocation type and symbol index. */ +} Elf64_Rel; + +/* Relocations that need an addend field. */ +typedef struct { + Elf64_Addr r_offset; /* Location to be relocated. */ + Elf64_Xword r_info; /* Relocation type and symbol index. */ + Elf64_Sxword r_addend; /* Addend. */ +} Elf64_Rela; + +/* Macros for accessing the fields of r_info. */ +#define ELF64_R_SYM(info) ((info) >> 32) +#define ELF64_R_TYPE(info) ((info) & 0xffffffffL) + +/* Macro for constructing r_info from field values. */ +#define ELF64_R_INFO(sym, type) (((sym) << 32) + ((type) & 0xffffffffL)) + +#define ELF64_R_TYPE_DATA(info) (((Elf64_Xword)(info)<<32)>>40) +#define ELF64_R_TYPE_ID(info) (((Elf64_Xword)(info)<<56)>>56) +#define ELF64_R_TYPE_INFO(data, type) \ + (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type)) + +/* + * Note entry header + */ +typedef Elf_Note Elf64_Nhdr; + +/* + * Move entry + */ +typedef struct { + Elf64_Lword m_value; /* symbol value */ + Elf64_Xword m_info; /* size + index */ + Elf64_Xword m_poffset; /* symbol offset */ + Elf64_Half m_repeat; /* repeat count */ + Elf64_Half m_stride; /* stride info */ +} Elf64_Move; + +#define ELF64_M_SYM(info) ((info)>>8) +#define ELF64_M_SIZE(info) ((unsigned char)(info)) +#define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size)) + +/* + * Hardware/Software capabilities entry + */ +typedef struct { + Elf64_Xword c_tag; /* how to interpret value */ + union { + Elf64_Xword c_val; + Elf64_Addr c_ptr; + } c_un; +} Elf64_Cap; + +/* + * Symbol table entries. + */ + +typedef struct { + Elf64_Word st_name; /* String table index of name. */ + unsigned char st_info; /* Type and binding information. */ + unsigned char st_other; /* Reserved (not used). */ + Elf64_Half st_shndx; /* Section index of symbol. */ + Elf64_Addr st_value; /* Symbol value. */ + Elf64_Xword st_size; /* Size of associated object. */ +} Elf64_Sym; + +/* Macros for accessing the fields of st_info. */ +#define ELF64_ST_BIND(info) ((info) >> 4) +#define ELF64_ST_TYPE(info) ((info) & 0xf) + +/* Macro for constructing st_info from field values. */ +#define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +/* Macro for accessing the fields of st_other. */ +#define ELF64_ST_VISIBILITY(oth) ((oth) & 0x3) + +/* Structures used by Sun & GNU-style symbol versioning. */ +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + +typedef Elf64_Half Elf64_Versym; + +typedef struct { + Elf64_Half si_boundto; /* direct bindings - symbol bound to */ + Elf64_Half si_flags; /* per symbol flags */ +} Elf64_Syminfo; + +#endif /* !_SYS_ELF64_H_ */ diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/GenFw/elf_common.h index df22472dc2..766d0e42ef 100644 --- a/BaseTools/Source/C/GenFw/elf_common.h +++ b/BaseTools/Source/C/GenFw/elf_common.h @@ -1,750 +1,750 @@ -/** @file -Ported ELF include files from FreeBSD - -Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    -Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
    -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - - -**/ -/*- - * Copyright (c) 1998 John D. Polstra. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.2 2007/12/03 21:30:36 marius Exp $ - */ - -#ifndef _SYS_ELF_COMMON_H_ -#define _SYS_ELF_COMMON_H_ 1 - -/* - * ELF definitions that are independent of architecture or word size. - */ - -/* - * Note header. The ".note" section contains an array of notes. Each - * begins with this header, aligned to a word boundary. Immediately - * following the note header is n_namesz bytes of name, padded to the - * next word boundary. Then comes n_descsz bytes of descriptor, again - * padded to a word boundary. The values of n_namesz and n_descsz do - * not include the padding. - */ - -typedef struct { - UINT32 n_namesz; /* Length of name. */ - UINT32 n_descsz; /* Length of descriptor. */ - UINT32 n_type; /* Type of this note. */ -} Elf_Note; - -/* Indexes into the e_ident array. Keep synced with - http://www.sco.com/developers/gabi/latest/ch4.eheader.html */ -#define EI_MAG0 0 /* Magic number, byte 0. */ -#define EI_MAG1 1 /* Magic number, byte 1. */ -#define EI_MAG2 2 /* Magic number, byte 2. */ -#define EI_MAG3 3 /* Magic number, byte 3. */ -#define EI_CLASS 4 /* Class of machine. */ -#define EI_DATA 5 /* Data format. */ -#define EI_VERSION 6 /* ELF format version. */ -#define EI_OSABI 7 /* Operating system / ABI identification */ -#define EI_ABIVERSION 8 /* ABI version */ -#define OLD_EI_BRAND 8 /* Start of architecture identification. */ -#define EI_PAD 9 /* Start of padding (per SVR4 ABI). */ -#define EI_NIDENT 16 /* Size of e_ident array. */ - -/* Values for the magic number bytes. */ -#define ELFMAG0 0x7f -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFMAG "\177ELF" /* magic string */ -#define SELFMAG 4 /* magic string size */ - -/* Values for e_ident[EI_VERSION] and e_version. */ -#define EV_NONE 0 -#define EV_CURRENT 1 - -/* Values for e_ident[EI_CLASS]. */ -#define ELFCLASSNONE 0 /* Unknown class. */ -#define ELFCLASS32 1 /* 32-bit architecture. */ -#define ELFCLASS64 2 /* 64-bit architecture. */ - -/* Values for e_ident[EI_DATA]. */ -#define ELFDATANONE 0 /* Unknown data format. */ -#define ELFDATA2LSB 1 /* 2's complement little-endian. */ -#define ELFDATA2MSB 2 /* 2's complement big-endian. */ - -/* Values for e_ident[EI_OSABI]. */ -#define ELFOSABI_NONE 0 /* UNIX System V ABI */ -#define ELFOSABI_HPUX 1 /* HP-UX operating system */ -#define ELFOSABI_NETBSD 2 /* NetBSD */ -#define ELFOSABI_LINUX 3 /* GNU/Linux */ -#define ELFOSABI_HURD 4 /* GNU/Hurd */ -#define ELFOSABI_86OPEN 5 /* 86Open common IA32 ABI */ -#define ELFOSABI_SOLARIS 6 /* Solaris */ -#define ELFOSABI_AIX 7 /* AIX */ -#define ELFOSABI_IRIX 8 /* IRIX */ -#define ELFOSABI_FREEBSD 9 /* FreeBSD */ -#define ELFOSABI_TRU64 10 /* TRU64 UNIX */ -#define ELFOSABI_MODESTO 11 /* Novell Modesto */ -#define ELFOSABI_OPENBSD 12 /* OpenBSD */ -#define ELFOSABI_OPENVMS 13 /* Open VMS */ -#define ELFOSABI_NSK 14 /* HP Non-Stop Kernel */ -#define ELFOSABI_ARM 97 /* ARM */ -#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ - -#define ELFOSABI_SYSV ELFOSABI_NONE /* symbol used in old spec */ -#define ELFOSABI_MONTEREY ELFOSABI_AIX /* Monterey */ - -/* e_ident */ -#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \ - (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \ - (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \ - (ehdr).e_ident[EI_MAG3] == ELFMAG3) - -/* Values for e_type. */ -#define ET_NONE 0 /* Unknown type. */ -#define ET_REL 1 /* Relocatable. */ -#define ET_EXEC 2 /* Executable. */ -#define ET_DYN 3 /* Shared object. */ -#define ET_CORE 4 /* Core file. */ -#define ET_LOOS 0xfe00 /* First operating system specific. */ -#define ET_HIOS 0xfeff /* Last operating system-specific. */ -#define ET_LOPROC 0xff00 /* First processor-specific. */ -#define ET_HIPROC 0xffff /* Last processor-specific. */ - -/* Values for e_machine. */ -#define EM_NONE 0 /* Unknown machine. */ -#define EM_M32 1 /* AT&T WE32100. */ -#define EM_SPARC 2 /* Sun SPARC. */ -#define EM_386 3 /* Intel i386. */ -#define EM_68K 4 /* Motorola 68000. */ -#define EM_88K 5 /* Motorola 88000. */ -#define EM_860 7 /* Intel i860. */ -#define EM_MIPS 8 /* MIPS R3000 Big-Endian only. */ -#define EM_S370 9 /* IBM System/370. */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 Little-Endian. */ -#define EM_PARISC 15 /* HP PA-RISC. */ -#define EM_VPP500 17 /* Fujitsu VPP500. */ -#define EM_SPARC32PLUS 18 /* SPARC v8plus. */ -#define EM_960 19 /* Intel 80960. */ -#define EM_PPC 20 /* PowerPC 32-bit. */ -#define EM_PPC64 21 /* PowerPC 64-bit. */ -#define EM_S390 22 /* IBM System/390. */ -#define EM_V800 36 /* NEC V800. */ -#define EM_FR20 37 /* Fujitsu FR20. */ -#define EM_RH32 38 /* TRW RH-32. */ -#define EM_RCE 39 /* Motorola RCE. */ -#define EM_ARM 40 /* ARM. */ -#define EM_SH 42 /* Hitachi SH. */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit. */ -#define EM_TRICORE 44 /* Siemens TriCore embedded processor. */ -#define EM_ARC 45 /* Argonaut RISC Core. */ -#define EM_H8_300 46 /* Hitachi H8/300. */ -#define EM_H8_300H 47 /* Hitachi H8/300H. */ -#define EM_H8S 48 /* Hitachi H8S. */ -#define EM_H8_500 49 /* Hitachi H8/500. */ -#define EM_IA_64 50 /* Intel IA-64 Processor. */ -#define EM_MIPS_X 51 /* Stanford MIPS-X. */ -#define EM_COLDFIRE 52 /* Motorola ColdFire. */ -#define EM_68HC12 53 /* Motorola M68HC12. */ -#define EM_MMA 54 /* Fujitsu MMA. */ -#define EM_PCP 55 /* Siemens PCP. */ -#define EM_NCPU 56 /* Sony nCPU. */ -#define EM_NDR1 57 /* Denso NDR1 microprocessor. */ -#define EM_STARCORE 58 /* Motorola Star*Core processor. */ -#define EM_ME16 59 /* Toyota ME16 processor. */ -#define EM_ST100 60 /* STMicroelectronics ST100 processor. */ -#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ processor. */ -#define EM_X86_64 62 /* Advanced Micro Devices x86-64 */ -#define EM_AMD64 EM_X86_64 /* Advanced Micro Devices x86-64 (compat) */ -#define EM_AARCH64 183 /* ARM 64bit Architecture */ - -/* Non-standard or deprecated. */ -#define EM_486 6 /* Intel i486. */ -#define EM_MIPS_RS4_BE 10 /* MIPS R4000 Big-Endian */ -#define EM_ALPHA_STD 41 /* Digital Alpha (standard value). */ -#define EM_ALPHA 0x9026 /* Alpha (written in the absence of an ABI) */ - -/* Special section indexes. */ -#define SHN_UNDEF 0 /* Undefined, missing, irrelevant. */ -#define SHN_LORESERVE 0xff00 /* First of reserved range. */ -#define SHN_LOPROC 0xff00 /* First processor-specific. */ -#define SHN_HIPROC 0xff1f /* Last processor-specific. */ -#define SHN_LOOS 0xff20 /* First operating system-specific. */ -#define SHN_HIOS 0xff3f /* Last operating system-specific. */ -#define SHN_ABS 0xfff1 /* Absolute values. */ -#define SHN_COMMON 0xfff2 /* Common data. */ -#define SHN_XINDEX 0xffff /* Escape -- index stored elsewhere. */ -#define SHN_HIRESERVE 0xffff /* Last of reserved range. */ - -/* sh_type */ -#define SHT_NULL 0 /* inactive */ -#define SHT_PROGBITS 1 /* program defined information */ -#define SHT_SYMTAB 2 /* symbol table section */ -#define SHT_STRTAB 3 /* string table section */ -#define SHT_RELA 4 /* relocation section with addends */ -#define SHT_HASH 5 /* symbol hash table section */ -#define SHT_DYNAMIC 6 /* dynamic section */ -#define SHT_NOTE 7 /* note section */ -#define SHT_NOBITS 8 /* no space section */ -#define SHT_REL 9 /* relocation section - no addends */ -#define SHT_SHLIB 10 /* reserved - purpose unknown */ -#define SHT_DYNSYM 11 /* dynamic symbol table section */ -#define SHT_INIT_ARRAY 14 /* Initialization function pointers. */ -#define SHT_FINI_ARRAY 15 /* Termination function pointers. */ -#define SHT_PREINIT_ARRAY 16 /* Pre-initialization function ptrs. */ -#define SHT_GROUP 17 /* Section group. */ -#define SHT_SYMTAB_SHNDX 18 /* Section indexes (see SHN_XINDEX). */ -#define SHT_LOOS 0x60000000 /* First of OS specific semantics */ -#define SHT_LOSUNW 0x6ffffff4 -#define SHT_SUNW_dof 0x6ffffff4 -#define SHT_SUNW_cap 0x6ffffff5 -#define SHT_SUNW_SIGNATURE 0x6ffffff6 -#define SHT_SUNW_ANNOTATE 0x6ffffff7 -#define SHT_SUNW_DEBUGSTR 0x6ffffff8 -#define SHT_SUNW_DEBUG 0x6ffffff9 -#define SHT_SUNW_move 0x6ffffffa -#define SHT_SUNW_COMDAT 0x6ffffffb -#define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_SUNW_verdef 0x6ffffffd -#define SHT_GNU_verdef 0x6ffffffd /* Symbol versions provided */ -#define SHT_SUNW_verneed 0x6ffffffe -#define SHT_GNU_verneed 0x6ffffffe /* Symbol versions required */ -#define SHT_SUNW_versym 0x6fffffff -#define SHT_GNU_versym 0x6fffffff /* Symbol version table */ -#define SHT_HISUNW 0x6fffffff -#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ -#define SHT_LOPROC 0x70000000 /* reserved range for processor */ -#define SHT_AMD64_UNWIND 0x70000001 /* unwind information */ -#define SHT_HIPROC 0x7fffffff /* specific section header types */ -#define SHT_LOUSER 0x80000000 /* reserved range for application */ -#define SHT_HIUSER 0xffffffff /* specific indexes */ - -/* Flags for sh_flags. */ -#define SHF_WRITE 0x1 /* Section contains writable data. */ -#define SHF_ALLOC 0x2 /* Section occupies memory. */ -#define SHF_EXECINSTR 0x4 /* Section contains instructions. */ -#define SHF_MERGE 0x10 /* Section may be merged. */ -#define SHF_STRINGS 0x20 /* Section contains strings. */ -#define SHF_INFO_LINK 0x40 /* sh_info holds section index. */ -#define SHF_LINK_ORDER 0x80 /* Special ordering requirements. */ -#define SHF_OS_NONCONFORMING 0x100 /* OS-specific processing required. */ -#define SHF_GROUP 0x200 /* Member of section group. */ -#define SHF_TLS 0x400 /* Section contains TLS data. */ -#define SHF_MASKOS 0x0ff00000 /* OS-specific semantics. */ -#define SHF_MASKPROC 0xf0000000 /* Processor-specific semantics. */ - -/* Values for p_type. */ -#define PT_NULL 0 /* Unused entry. */ -#define PT_LOAD 1 /* Loadable segment. */ -#define PT_DYNAMIC 2 /* Dynamic linking information segment. */ -#define PT_INTERP 3 /* Pathname of interpreter. */ -#define PT_NOTE 4 /* Auxiliary information. */ -#define PT_SHLIB 5 /* Reserved (not used). */ -#define PT_PHDR 6 /* Location of program header itself. */ -#define PT_TLS 7 /* Thread local storage segment */ -#define PT_LOOS 0x60000000 /* First OS-specific. */ -#define PT_SUNW_UNWIND 0x6464e550 /* amd64 UNWIND program header */ -#define PT_GNU_EH_FRAME 0x6474e550 -#define PT_LOSUNW 0x6ffffffa -#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ -#define PT_SUNWSTACK 0x6ffffffb /* describes the stack segment */ -#define PT_SUNWDTRACE 0x6ffffffc /* private */ -#define PT_SUNWCAP 0x6ffffffd /* hard/soft capabilities segment */ -#define PT_HISUNW 0x6fffffff -#define PT_HIOS 0x6fffffff /* Last OS-specific. */ -#define PT_LOPROC 0x70000000 /* First processor-specific type. */ -#define PT_HIPROC 0x7fffffff /* Last processor-specific type. */ - -/* Values for p_flags. */ -#define PF_X 0x1 /* Executable. */ -#define PF_W 0x2 /* Writable. */ -#define PF_R 0x4 /* Readable. */ -#define PF_MASKOS 0x0ff00000 /* Operating system-specific. */ -#define PF_MASKPROC 0xf0000000 /* Processor-specific. */ - -/* Extended program header index. */ -#define PN_XNUM 0xffff - -/* Values for d_tag. */ -#define DT_NULL 0 /* Terminating entry. */ -#define DT_NEEDED 1 /* String table offset of a needed shared - library. */ -#define DT_PLTRELSZ 2 /* Total size in bytes of PLT relocations. */ -#define DT_PLTGOT 3 /* Processor-dependent address. */ -#define DT_HASH 4 /* Address of symbol hash table. */ -#define DT_STRTAB 5 /* Address of string table. */ -#define DT_SYMTAB 6 /* Address of symbol table. */ -#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ -#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ -#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ -#define DT_STRSZ 10 /* Size of string table. */ -#define DT_SYMENT 11 /* Size of each symbol table entry. */ -#define DT_INIT 12 /* Address of initialization function. */ -#define DT_FINI 13 /* Address of finalization function. */ -#define DT_SONAME 14 /* String table offset of shared object - name. */ -#define DT_RPATH 15 /* String table offset of library path. [sup] */ -#define DT_SYMBOLIC 16 /* Indicates "symbolic" linking. [sup] */ -#define DT_REL 17 /* Address of ElfNN_Rel relocations. */ -#define DT_RELSZ 18 /* Total size of ElfNN_Rel relocations. */ -#define DT_RELENT 19 /* Size of each ElfNN_Rel relocation. */ -#define DT_PLTREL 20 /* Type of relocation used for PLT. */ -#define DT_DEBUG 21 /* Reserved (not used). */ -#define DT_TEXTREL 22 /* Indicates there may be relocations in - non-writable segments. [sup] */ -#define DT_JMPREL 23 /* Address of PLT relocations. */ -#define DT_BIND_NOW 24 /* [sup] */ -#define DT_INIT_ARRAY 25 /* Address of the array of pointers to - initialization functions */ -#define DT_FINI_ARRAY 26 /* Address of the array of pointers to - termination functions */ -#define DT_INIT_ARRAYSZ 27 /* Size in bytes of the array of - initialization functions. */ -#define DT_FINI_ARRAYSZ 28 /* Size in bytes of the array of - terminationfunctions. */ -#define DT_RUNPATH 29 /* String table offset of a null-terminated - library search path string. */ -#define DT_FLAGS 30 /* Object specific flag values. */ -#define DT_ENCODING 32 /* Values greater than or equal to DT_ENCODING - and less than DT_LOOS follow the rules for - the interpretation of the d_un union - as follows: even == 'd_ptr', even == 'd_val' - or none */ -#define DT_PREINIT_ARRAY 32 /* Address of the array of pointers to - pre-initialization functions. */ -#define DT_PREINIT_ARRAYSZ 33 /* Size in bytes of the array of - pre-initialization functions. */ -#define DT_MAXPOSTAGS 34 /* number of positive tags */ -#define DT_LOOS 0x6000000d /* First OS-specific */ -#define DT_SUNW_AUXILIARY 0x6000000d /* symbol auxiliary name */ -#define DT_SUNW_RTLDINF 0x6000000e /* ld.so.1 info (private) */ -#define DT_SUNW_FILTER 0x6000000f /* symbol filter name */ -#define DT_SUNW_CAP 0x60000010 /* hardware/software */ -#define DT_HIOS 0x6ffff000 /* Last OS-specific */ - -/* - * DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the - * Dyn.d_un.d_val field of the Elf*_Dyn structure. - */ -#define DT_VALRNGLO 0x6ffffd00 -#define DT_CHECKSUM 0x6ffffdf8 /* elf checksum */ -#define DT_PLTPADSZ 0x6ffffdf9 /* pltpadding size */ -#define DT_MOVEENT 0x6ffffdfa /* move table entry size */ -#define DT_MOVESZ 0x6ffffdfb /* move table size */ -#define DT_FEATURE_1 0x6ffffdfc /* feature holder */ -#define DT_POSFLAG_1 0x6ffffdfd /* flags for DT_* entries, effecting */ - /* the following DT_* entry. */ - /* See DF_P1_* definitions */ -#define DT_SYMINSZ 0x6ffffdfe /* syminfo table size (in bytes) */ -#define DT_SYMINENT 0x6ffffdff /* syminfo entry size (in bytes) */ -#define DT_VALRNGHI 0x6ffffdff - -/* - * DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the - * Dyn.d_un.d_ptr field of the Elf*_Dyn structure. - * - * If any adjustment is made to the ELF object after it has been - * built, these entries will need to be adjusted. - */ -#define DT_ADDRRNGLO 0x6ffffe00 -#define DT_CONFIG 0x6ffffefa /* configuration information */ -#define DT_DEPAUDIT 0x6ffffefb /* dependency auditing */ -#define DT_AUDIT 0x6ffffefc /* object auditing */ -#define DT_PLTPAD 0x6ffffefd /* pltpadding (sparcv9) */ -#define DT_MOVETAB 0x6ffffefe /* move table */ -#define DT_SYMINFO 0x6ffffeff /* syminfo table */ -#define DT_ADDRRNGHI 0x6ffffeff - -#define DT_VERSYM 0x6ffffff0 /* Address of versym section. */ -#define DT_RELACOUNT 0x6ffffff9 /* number of RELATIVE relocations */ -#define DT_RELCOUNT 0x6ffffffa /* number of RELATIVE relocations */ -#define DT_FLAGS_1 0x6ffffffb /* state flags - see DF_1_* defs */ -#define DT_VERDEF 0x6ffffffc /* Address of verdef section. */ -#define DT_VERDEFNUM 0x6ffffffd /* Number of elems in verdef section */ -#define DT_VERNEED 0x6ffffffe /* Address of verneed section. */ -#define DT_VERNEEDNUM 0x6fffffff /* Number of elems in verneed section */ - -#define DT_LOPROC 0x70000000 /* First processor-specific type. */ -#define DT_DEPRECATED_SPARC_REGISTER 0x7000001 -#define DT_AUXILIARY 0x7ffffffd /* shared library auxiliary name */ -#define DT_USED 0x7ffffffe /* ignored - same as needed */ -#define DT_FILTER 0x7fffffff /* shared library filter name */ -#define DT_HIPROC 0x7fffffff /* Last processor-specific type. */ - -/* Values for DT_FLAGS */ -#define DF_ORIGIN 0x0001 /* Indicates that the object being loaded may - make reference to the $ORIGIN substitution - string */ -#define DF_SYMBOLIC 0x0002 /* Indicates "symbolic" linking. */ -#define DF_TEXTREL 0x0004 /* Indicates there may be relocations in - non-writable segments. */ -#define DF_BIND_NOW 0x0008 /* Indicates that the dynamic linker should - process all relocations for the object - containing this entry before transferring - control to the program. */ -#define DF_STATIC_TLS 0x0010 /* Indicates that the shared object or - executable contains code using a static - thread-local storage scheme. */ - -/* Values for n_type. Used in core files. */ -#define NT_PRSTATUS 1 /* Process status. */ -#define NT_FPREGSET 2 /* Floating point registers. */ -#define NT_PRPSINFO 3 /* Process state info. */ - -/* Symbol Binding - ELFNN_ST_BIND - st_info */ -#define STB_LOCAL 0 /* Local symbol */ -#define STB_GLOBAL 1 /* Global symbol */ -#define STB_WEAK 2 /* like global - lower precedence */ -#define STB_LOOS 10 /* Reserved range for operating system */ -#define STB_HIOS 12 /* specific semantics. */ -#define STB_LOPROC 13 /* reserved range for processor */ -#define STB_HIPROC 15 /* specific semantics. */ - -/* Symbol type - ELFNN_ST_TYPE - st_info */ -#define STT_NOTYPE 0 /* Unspecified type. */ -#define STT_OBJECT 1 /* Data object. */ -#define STT_FUNC 2 /* Function. */ -#define STT_SECTION 3 /* Section. */ -#define STT_FILE 4 /* Source file. */ -#define STT_COMMON 5 /* Uninitialized common block. */ -#define STT_TLS 6 /* TLS object. */ -#define STT_NUM 7 -#define STT_LOOS 10 /* Reserved range for operating system */ -#define STT_HIOS 12 /* specific semantics. */ -#define STT_LOPROC 13 /* reserved range for processor */ -#define STT_HIPROC 15 /* specific semantics. */ - -/* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */ -#define STV_DEFAULT 0x0 /* Default visibility (see binding). */ -#define STV_INTERNAL 0x1 /* Special meaning in relocatable objects. */ -#define STV_HIDDEN 0x2 /* Not visible. */ -#define STV_PROTECTED 0x3 /* Visible but not preemptible. */ - -/* Special symbol table indexes. */ -#define STN_UNDEF 0 /* Undefined symbol index. */ - -/* Symbol versioning flags. */ -#define VER_DEF_CURRENT 1 -#define VER_DEF_IDX(x) VER_NDX(x) - -#define VER_FLG_BASE 0x01 -#define VER_FLG_WEAK 0x02 - -#define VER_NEED_CURRENT 1 -#define VER_NEED_WEAK (1u << 15) -#define VER_NEED_HIDDEN VER_NDX_HIDDEN -#define VER_NEED_IDX(x) VER_NDX(x) - -#define VER_NDX_LOCAL 0 -#define VER_NDX_GLOBAL 1 -#define VER_NDX_GIVEN 2 - -#define VER_NDX_HIDDEN (1u << 15) -#define VER_NDX(x) ((x) & ~(1u << 15)) - -#define CA_SUNW_NULL 0 -#define CA_SUNW_HW_1 1 /* first hardware capabilities entry */ -#define CA_SUNW_SF_1 2 /* first software capabilities entry */ - -/* - * Syminfo flag values - */ -#define SYMINFO_FLG_DIRECT 0x0001 /* symbol ref has direct association */ - /* to object containing defn. */ -#define SYMINFO_FLG_PASSTHRU 0x0002 /* ignored - see SYMINFO_FLG_FILTER */ -#define SYMINFO_FLG_COPY 0x0004 /* symbol is a copy-reloc */ -#define SYMINFO_FLG_LAZYLOAD 0x0008 /* object containing defn should be */ - /* lazily-loaded */ -#define SYMINFO_FLG_DIRECTBIND 0x0010 /* ref should be bound directly to */ - /* object containing defn. */ -#define SYMINFO_FLG_NOEXTDIRECT 0x0020 /* don't let an external reference */ - /* directly bind to this symbol */ -#define SYMINFO_FLG_FILTER 0x0002 /* symbol ref is associated to a */ -#define SYMINFO_FLG_AUXILIARY 0x0040 /* standard or auxiliary filter */ - -/* - * Syminfo.si_boundto values. - */ -#define SYMINFO_BT_SELF 0xffff /* symbol bound to self */ -#define SYMINFO_BT_PARENT 0xfffe /* symbol bound to parent */ -#define SYMINFO_BT_NONE 0xfffd /* no special symbol binding */ -#define SYMINFO_BT_EXTERN 0xfffc /* symbol defined as external */ -#define SYMINFO_BT_LOWRESERVE 0xff00 /* beginning of reserved entries */ - -/* - * Syminfo version values. - */ -#define SYMINFO_NONE 0 /* Syminfo version */ -#define SYMINFO_CURRENT 1 -#define SYMINFO_NUM 2 - -/* - * Relocation types. - * - * All machine architectures are defined here to allow tools on one to - * handle others. - */ - -#define R_386_NONE 0 /* No relocation. */ -#define R_386_32 1 /* Add symbol value. */ -#define R_386_PC32 2 /* Add PC-relative symbol value. */ -#define R_386_GOT32 3 /* Add PC-relative GOT offset. */ -#define R_386_PLT32 4 /* Add PC-relative PLT offset. */ -#define R_386_COPY 5 /* Copy data from shared object. */ -#define R_386_GLOB_DAT 6 /* Set GOT entry to data address. */ -#define R_386_JMP_SLOT 7 /* Set GOT entry to code address. */ -#define R_386_RELATIVE 8 /* Add load address of shared object. */ -#define R_386_GOTOFF 9 /* Add GOT-relative symbol address. */ -#define R_386_GOTPC 10 /* Add PC-relative GOT table address. */ -#define R_386_TLS_TPOFF 14 /* Negative offset in static TLS block */ -#define R_386_TLS_IE 15 /* Absolute address of GOT for -ve static TLS */ -#define R_386_TLS_GOTIE 16 /* GOT entry for negative static TLS block */ -#define R_386_TLS_LE 17 /* Negative offset relative to static TLS */ -#define R_386_TLS_GD 18 /* 32 bit offset to GOT (index,off) pair */ -#define R_386_TLS_LDM 19 /* 32 bit offset to GOT (index,zero) pair */ -#define R_386_TLS_GD_32 24 /* 32 bit offset to GOT (index,off) pair */ -#define R_386_TLS_GD_PUSH 25 /* pushl instruction for Sun ABI GD sequence */ -#define R_386_TLS_GD_CALL 26 /* call instruction for Sun ABI GD sequence */ -#define R_386_TLS_GD_POP 27 /* popl instruction for Sun ABI GD sequence */ -#define R_386_TLS_LDM_32 28 /* 32 bit offset to GOT (index,zero) pair */ -#define R_386_TLS_LDM_PUSH 29 /* pushl instruction for Sun ABI LD sequence */ -#define R_386_TLS_LDM_CALL 30 /* call instruction for Sun ABI LD sequence */ -#define R_386_TLS_LDM_POP 31 /* popl instruction for Sun ABI LD sequence */ -#define R_386_TLS_LDO_32 32 /* 32 bit offset from start of TLS block */ -#define R_386_TLS_IE_32 33 /* 32 bit offset to GOT static TLS offset entry */ -#define R_386_TLS_LE_32 34 /* 32 bit offset within static TLS block */ -#define R_386_TLS_DTPMOD32 35 /* GOT entry containing TLS index */ -#define R_386_TLS_DTPOFF32 36 /* GOT entry containing TLS offset */ -#define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */ - -/* Null relocation */ -#define R_AARCH64_NONE 256 /* No relocation */ -/* Static AArch64 relocations */ - /* Static data relocations */ -#define R_AARCH64_ABS64 257 /* S + A */ -#define R_AARCH64_ABS32 258 /* S + A */ -#define R_AARCH64_ABS16 259 /* S + A */ -#define R_AARCH64_PREL64 260 /* S + A - P */ -#define R_AARCH64_PREL32 261 /* S + A - P */ -#define R_AARCH64_PREL16 262 /* S + A - P */ - /* Group relocations to create a 16, 32, 48, or 64 bit unsigned data value or address inline */ -#define R_AARCH64_MOVW_UABS_G0 263 /* S + A */ -#define R_AARCH64_MOVW_UABS_G0_NC 264 /* S + A */ -#define R_AARCH64_MOVW_UABS_G1 265 /* S + A */ -#define R_AARCH64_MOVW_UABS_G1_NC 266 /* S + A */ -#define R_AARCH64_MOVW_UABS_G2 267 /* S + A */ -#define R_AARCH64_MOVW_UABS_G2_NC 268 /* S + A */ -#define R_AARCH64_MOVW_UABS_G3 269 /* S + A */ - /* Group relocations to create a 16, 32, 48, or 64 bit signed data or offset value inline */ -#define R_AARCH64_MOVW_SABS_G0 270 /* S + A */ -#define R_AARCH64_MOVW_SABS_G1 271 /* S + A */ -#define R_AARCH64_MOVW_SABS_G2 272 /* S + A */ - /* Relocations to generate 19, 21 and 33 bit PC-relative addresses */ -#define R_AARCH64_LD_PREL_LO19 273 /* S + A - P */ -#define R_AARCH64_ADR_PREL_LO21 274 /* S + A - P */ -#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page(S+A) - Page(P) */ -#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Page(S+A) - Page(P) */ -#define R_AARCH64_ADD_ABS_LO12_NC 277 /* S + A */ -#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* S + A */ -#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* S + A */ -#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* S + A */ -#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* S + A */ -#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* S + A */ - /* Relocations for control-flow instructions - all offsets are a multiple of 4 */ -#define R_AARCH64_TSTBR14 279 /* S+A-P */ -#define R_AARCH64_CONDBR19 280 /* S+A-P */ -#define R_AARCH64_JUMP26 282 /* S+A-P */ -#define R_AARCH64_CALL26 283 /* S+A-P */ - /* Group relocations to create a 16, 32, 48, or 64 bit PC-relative offset inline */ -#define R_AARCH64_MOVW_PREL_G0 287 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G0_NC 288 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G1 289 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G1_NC 290 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G2 291 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G2_NC 292 /* S+A-P */ -#define R_AARCH64_MOVW_PREL_G3 293 /* S+A-P */ - /* Group relocations to create a 16, 32, 48, or 64 bit GOT-relative offsets inline */ -#define R_AARCH64_MOVW_GOTOFF_G0 300 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G1 302 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G2 304 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* G(S)-GOT */ -#define R_AARCH64_MOVW_GOTOFF_G3 306 /* G(S)-GOT */ - /* GOT-relative data relocations */ -#define R_AARCH64_GOTREL64 307 /* S+A-GOT */ -#define R_AARCH64_GOTREL32 308 /* S+A-GOT */ - /* GOT-relative instruction relocations */ -#define R_AARCH64_GOT_LD_PREL19 309 /* G(S)-P */ -#define R_AARCH64_LD64_GOTOFF_LO15 310 /* G(S)-GOT */ -#define R_AARCH64_ADR_GOT_PAGE 311 /* Page(G(S))-Page(P) */ -#define R_AARCH64_LD64_GOT_LO12_NC 312 /* G(S) */ -#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* G(S)-Page(GOT) */ -/* Relocations for thread-local storage */ - /* General Dynamic TLS relocations */ -#define R_AARCH64_TLSGD_ADR_PREL21 512 /* G(TLSIDX(S+A)) - P */ -#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* Page(G(TLSIDX(S+A))) - Page(P) */ -#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* G(TLSIDX(S+A)) */ -#define R_AARCH64_TLSGD_MOVW_G1 515 /* G(TLSIDX(S+A)) - GOT */ -#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* G(TLSIDX(S+A)) - GOT */ - /* Local Dynamic TLS relocations */ -#define R_AARCH64_TLSLD_ADR_PREL21 517 /* G(LDM(S))) - P */ -#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Page(G(LDM(S)))-Page(P) */ -#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* G(LDM(S)) */ -#define R_AARCH64_TLSLD_MOVW_G1 520 /* G(LDM(S)) - GOT */ -#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* G(LDM(S)) - GOT */ -#define R_AARCH64_TLSLD_LD_PREL19 522 /* G(LDM(S)) - P */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTPREL(S+A) */ -#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* DTPREL(S+A) */ - /* Initial Exec TLS relocations */ -#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* G(TPREL(S+A)) - GOT */ -#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* G(TPREL(S+A)) - GOT */ -#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page(G(TPREL(S+A))) - Page(P) */ -#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* G(TPREL(S+A)) */ -#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* G(TPREL(S+A)) - P */ - /* Local Exec TLS relocations */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TPREL(S+A) */ -#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* TPREL(S+A) */ -/* Dynamic relocations */ - /* Dynamic relocations */ -#define R_AARCH64_COPY 1024 -#define R_AARCH64_GLOB_DAT 1025 /* S + A */ -#define R_AARCH64_JUMP_SLOT 1026 /* S + A */ -#define R_AARCH64_RELATIVE 1027 /* Delta(S) + A , Delta(P) + A */ -#define R_AARCH64_TLS_DTPREL64 1028 /* DTPREL(S+A) */ -#define R_AARCH64_TLS_DTPMOD64 1029 /* LDM(S) */ -#define R_AARCH64_TLS_TPREL64 1030 /* TPREL(S+A) */ -#define R_AARCH64_TLS_DTPREL32 1031 /* DTPREL(S+A) */ -#define R_AARCH64_TLS_DTPMOD32 1032 /* LDM(S) */ -#define R_AARCH64_TLS_TPREL32 1033 /* DTPREL(S+A) */ - -#define R_ALPHA_NONE 0 /* No reloc */ -#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ -#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ -#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ -#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ -#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ -#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ -#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ -#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ -#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ -#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ -#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ -#define R_ALPHA_OP_PUSH 12 /* OP stack push */ -#define R_ALPHA_OP_STORE 13 /* OP stack pop and store */ -#define R_ALPHA_OP_PSUB 14 /* OP stack subtract */ -#define R_ALPHA_OP_PRSHIFT 15 /* OP stack right shift */ -#define R_ALPHA_GPVALUE 16 -#define R_ALPHA_GPRELHIGH 17 -#define R_ALPHA_GPRELLOW 18 -#define R_ALPHA_IMMED_GP_16 19 -#define R_ALPHA_IMMED_GP_HI32 20 -#define R_ALPHA_IMMED_SCN_HI32 21 -#define R_ALPHA_IMMED_BR_HI32 22 -#define R_ALPHA_IMMED_LO32 23 -#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ -#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ -#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ -#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ - -#define R_ARM_NONE 0 /* No relocation. */ -#define R_ARM_PC24 1 -#define R_ARM_ABS32 2 -#define R_ARM_REL32 3 -#define R_ARM_PC13 4 -#define R_ARM_ABS16 5 -#define R_ARM_ABS12 6 -#define R_ARM_THM_ABS5 7 -#define R_ARM_ABS8 8 -#define R_ARM_SBREL32 9 -#define R_ARM_THM_PC22 10 -#define R_ARM_THM_PC8 11 -#define R_ARM_AMP_VCALL9 12 -#define R_ARM_SWI24 13 -#define R_ARM_THM_SWI8 14 -#define R_ARM_XPC25 15 -#define R_ARM_THM_XPC22 16 -#define R_ARM_COPY 20 /* Copy data from shared object. */ -#define R_ARM_GLOB_DAT 21 /* Set GOT entry to data address. */ -#define R_ARM_JUMP_SLOT 22 /* Set GOT entry to code address. */ -#define R_ARM_RELATIVE 23 /* Add load address of shared object. */ -#define R_ARM_GOTOFF 24 /* Add GOT-relative symbol address. */ -#define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */ -#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */ -#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */ -#define R_ARM_CALL 28 -#define R_ARM_JMP24 29 -#define R_ARM_THM_MOVW_ABS_NC 47 -#define R_ARM_THM_MOVT_ABS 48 - -// Block of PC-relative relocations added to work around gcc putting -// object relocations in static executables. -#define R_ARM_THM_JUMP24 30 -#define R_ARM_PREL31 42 -#define R_ARM_MOVW_PREL_NC 45 -#define R_ARM_MOVT_PREL 46 -#define R_ARM_THM_MOVW_PREL_NC 49 -#define R_ARM_THM_MOVT_PREL 50 -#define R_ARM_THM_JMP6 52 -#define R_ARM_THM_ALU_PREL_11_0 53 -#define R_ARM_THM_PC12 54 -#define R_ARM_REL32_NOI 56 +/** @file +Ported ELF include files from FreeBSD + +Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    +Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
    +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +**/ +/*- + * Copyright (c) 1998 John D. Polstra. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.2 2007/12/03 21:30:36 marius Exp $ + */ + +#ifndef _SYS_ELF_COMMON_H_ +#define _SYS_ELF_COMMON_H_ 1 + +/* + * ELF definitions that are independent of architecture or word size. + */ + +/* + * Note header. The ".note" section contains an array of notes. Each + * begins with this header, aligned to a word boundary. Immediately + * following the note header is n_namesz bytes of name, padded to the + * next word boundary. Then comes n_descsz bytes of descriptor, again + * padded to a word boundary. The values of n_namesz and n_descsz do + * not include the padding. + */ + +typedef struct { + UINT32 n_namesz; /* Length of name. */ + UINT32 n_descsz; /* Length of descriptor. */ + UINT32 n_type; /* Type of this note. */ +} Elf_Note; + +/* Indexes into the e_ident array. Keep synced with + http://www.sco.com/developers/gabi/latest/ch4.eheader.html */ +#define EI_MAG0 0 /* Magic number, byte 0. */ +#define EI_MAG1 1 /* Magic number, byte 1. */ +#define EI_MAG2 2 /* Magic number, byte 2. */ +#define EI_MAG3 3 /* Magic number, byte 3. */ +#define EI_CLASS 4 /* Class of machine. */ +#define EI_DATA 5 /* Data format. */ +#define EI_VERSION 6 /* ELF format version. */ +#define EI_OSABI 7 /* Operating system / ABI identification */ +#define EI_ABIVERSION 8 /* ABI version */ +#define OLD_EI_BRAND 8 /* Start of architecture identification. */ +#define EI_PAD 9 /* Start of padding (per SVR4 ABI). */ +#define EI_NIDENT 16 /* Size of e_ident array. */ + +/* Values for the magic number bytes. */ +#define ELFMAG0 0x7f +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' +#define ELFMAG "\177ELF" /* magic string */ +#define SELFMAG 4 /* magic string size */ + +/* Values for e_ident[EI_VERSION] and e_version. */ +#define EV_NONE 0 +#define EV_CURRENT 1 + +/* Values for e_ident[EI_CLASS]. */ +#define ELFCLASSNONE 0 /* Unknown class. */ +#define ELFCLASS32 1 /* 32-bit architecture. */ +#define ELFCLASS64 2 /* 64-bit architecture. */ + +/* Values for e_ident[EI_DATA]. */ +#define ELFDATANONE 0 /* Unknown data format. */ +#define ELFDATA2LSB 1 /* 2's complement little-endian. */ +#define ELFDATA2MSB 2 /* 2's complement big-endian. */ + +/* Values for e_ident[EI_OSABI]. */ +#define ELFOSABI_NONE 0 /* UNIX System V ABI */ +#define ELFOSABI_HPUX 1 /* HP-UX operating system */ +#define ELFOSABI_NETBSD 2 /* NetBSD */ +#define ELFOSABI_LINUX 3 /* GNU/Linux */ +#define ELFOSABI_HURD 4 /* GNU/Hurd */ +#define ELFOSABI_86OPEN 5 /* 86Open common IA32 ABI */ +#define ELFOSABI_SOLARIS 6 /* Solaris */ +#define ELFOSABI_AIX 7 /* AIX */ +#define ELFOSABI_IRIX 8 /* IRIX */ +#define ELFOSABI_FREEBSD 9 /* FreeBSD */ +#define ELFOSABI_TRU64 10 /* TRU64 UNIX */ +#define ELFOSABI_MODESTO 11 /* Novell Modesto */ +#define ELFOSABI_OPENBSD 12 /* OpenBSD */ +#define ELFOSABI_OPENVMS 13 /* Open VMS */ +#define ELFOSABI_NSK 14 /* HP Non-Stop Kernel */ +#define ELFOSABI_ARM 97 /* ARM */ +#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ + +#define ELFOSABI_SYSV ELFOSABI_NONE /* symbol used in old spec */ +#define ELFOSABI_MONTEREY ELFOSABI_AIX /* Monterey */ + +/* e_ident */ +#define IS_ELF(ehdr) ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \ + (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \ + (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \ + (ehdr).e_ident[EI_MAG3] == ELFMAG3) + +/* Values for e_type. */ +#define ET_NONE 0 /* Unknown type. */ +#define ET_REL 1 /* Relocatable. */ +#define ET_EXEC 2 /* Executable. */ +#define ET_DYN 3 /* Shared object. */ +#define ET_CORE 4 /* Core file. */ +#define ET_LOOS 0xfe00 /* First operating system specific. */ +#define ET_HIOS 0xfeff /* Last operating system-specific. */ +#define ET_LOPROC 0xff00 /* First processor-specific. */ +#define ET_HIPROC 0xffff /* Last processor-specific. */ + +/* Values for e_machine. */ +#define EM_NONE 0 /* Unknown machine. */ +#define EM_M32 1 /* AT&T WE32100. */ +#define EM_SPARC 2 /* Sun SPARC. */ +#define EM_386 3 /* Intel i386. */ +#define EM_68K 4 /* Motorola 68000. */ +#define EM_88K 5 /* Motorola 88000. */ +#define EM_860 7 /* Intel i860. */ +#define EM_MIPS 8 /* MIPS R3000 Big-Endian only. */ +#define EM_S370 9 /* IBM System/370. */ +#define EM_MIPS_RS3_LE 10 /* MIPS R3000 Little-Endian. */ +#define EM_PARISC 15 /* HP PA-RISC. */ +#define EM_VPP500 17 /* Fujitsu VPP500. */ +#define EM_SPARC32PLUS 18 /* SPARC v8plus. */ +#define EM_960 19 /* Intel 80960. */ +#define EM_PPC 20 /* PowerPC 32-bit. */ +#define EM_PPC64 21 /* PowerPC 64-bit. */ +#define EM_S390 22 /* IBM System/390. */ +#define EM_V800 36 /* NEC V800. */ +#define EM_FR20 37 /* Fujitsu FR20. */ +#define EM_RH32 38 /* TRW RH-32. */ +#define EM_RCE 39 /* Motorola RCE. */ +#define EM_ARM 40 /* ARM. */ +#define EM_SH 42 /* Hitachi SH. */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit. */ +#define EM_TRICORE 44 /* Siemens TriCore embedded processor. */ +#define EM_ARC 45 /* Argonaut RISC Core. */ +#define EM_H8_300 46 /* Hitachi H8/300. */ +#define EM_H8_300H 47 /* Hitachi H8/300H. */ +#define EM_H8S 48 /* Hitachi H8S. */ +#define EM_H8_500 49 /* Hitachi H8/500. */ +#define EM_IA_64 50 /* Intel IA-64 Processor. */ +#define EM_MIPS_X 51 /* Stanford MIPS-X. */ +#define EM_COLDFIRE 52 /* Motorola ColdFire. */ +#define EM_68HC12 53 /* Motorola M68HC12. */ +#define EM_MMA 54 /* Fujitsu MMA. */ +#define EM_PCP 55 /* Siemens PCP. */ +#define EM_NCPU 56 /* Sony nCPU. */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor. */ +#define EM_STARCORE 58 /* Motorola Star*Core processor. */ +#define EM_ME16 59 /* Toyota ME16 processor. */ +#define EM_ST100 60 /* STMicroelectronics ST100 processor. */ +#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ processor. */ +#define EM_X86_64 62 /* Advanced Micro Devices x86-64 */ +#define EM_AMD64 EM_X86_64 /* Advanced Micro Devices x86-64 (compat) */ +#define EM_AARCH64 183 /* ARM 64bit Architecture */ + +/* Non-standard or deprecated. */ +#define EM_486 6 /* Intel i486. */ +#define EM_MIPS_RS4_BE 10 /* MIPS R4000 Big-Endian */ +#define EM_ALPHA_STD 41 /* Digital Alpha (standard value). */ +#define EM_ALPHA 0x9026 /* Alpha (written in the absence of an ABI) */ + +/* Special section indexes. */ +#define SHN_UNDEF 0 /* Undefined, missing, irrelevant. */ +#define SHN_LORESERVE 0xff00 /* First of reserved range. */ +#define SHN_LOPROC 0xff00 /* First processor-specific. */ +#define SHN_HIPROC 0xff1f /* Last processor-specific. */ +#define SHN_LOOS 0xff20 /* First operating system-specific. */ +#define SHN_HIOS 0xff3f /* Last operating system-specific. */ +#define SHN_ABS 0xfff1 /* Absolute values. */ +#define SHN_COMMON 0xfff2 /* Common data. */ +#define SHN_XINDEX 0xffff /* Escape -- index stored elsewhere. */ +#define SHN_HIRESERVE 0xffff /* Last of reserved range. */ + +/* sh_type */ +#define SHT_NULL 0 /* inactive */ +#define SHT_PROGBITS 1 /* program defined information */ +#define SHT_SYMTAB 2 /* symbol table section */ +#define SHT_STRTAB 3 /* string table section */ +#define SHT_RELA 4 /* relocation section with addends */ +#define SHT_HASH 5 /* symbol hash table section */ +#define SHT_DYNAMIC 6 /* dynamic section */ +#define SHT_NOTE 7 /* note section */ +#define SHT_NOBITS 8 /* no space section */ +#define SHT_REL 9 /* relocation section - no addends */ +#define SHT_SHLIB 10 /* reserved - purpose unknown */ +#define SHT_DYNSYM 11 /* dynamic symbol table section */ +#define SHT_INIT_ARRAY 14 /* Initialization function pointers. */ +#define SHT_FINI_ARRAY 15 /* Termination function pointers. */ +#define SHT_PREINIT_ARRAY 16 /* Pre-initialization function ptrs. */ +#define SHT_GROUP 17 /* Section group. */ +#define SHT_SYMTAB_SHNDX 18 /* Section indexes (see SHN_XINDEX). */ +#define SHT_LOOS 0x60000000 /* First of OS specific semantics */ +#define SHT_LOSUNW 0x6ffffff4 +#define SHT_SUNW_dof 0x6ffffff4 +#define SHT_SUNW_cap 0x6ffffff5 +#define SHT_SUNW_SIGNATURE 0x6ffffff6 +#define SHT_SUNW_ANNOTATE 0x6ffffff7 +#define SHT_SUNW_DEBUGSTR 0x6ffffff8 +#define SHT_SUNW_DEBUG 0x6ffffff9 +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_SUNW_verdef 0x6ffffffd +#define SHT_GNU_verdef 0x6ffffffd /* Symbol versions provided */ +#define SHT_SUNW_verneed 0x6ffffffe +#define SHT_GNU_verneed 0x6ffffffe /* Symbol versions required */ +#define SHT_SUNW_versym 0x6fffffff +#define SHT_GNU_versym 0x6fffffff /* Symbol version table */ +#define SHT_HISUNW 0x6fffffff +#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ +#define SHT_LOPROC 0x70000000 /* reserved range for processor */ +#define SHT_AMD64_UNWIND 0x70000001 /* unwind information */ +#define SHT_HIPROC 0x7fffffff /* specific section header types */ +#define SHT_LOUSER 0x80000000 /* reserved range for application */ +#define SHT_HIUSER 0xffffffff /* specific indexes */ + +/* Flags for sh_flags. */ +#define SHF_WRITE 0x1 /* Section contains writable data. */ +#define SHF_ALLOC 0x2 /* Section occupies memory. */ +#define SHF_EXECINSTR 0x4 /* Section contains instructions. */ +#define SHF_MERGE 0x10 /* Section may be merged. */ +#define SHF_STRINGS 0x20 /* Section contains strings. */ +#define SHF_INFO_LINK 0x40 /* sh_info holds section index. */ +#define SHF_LINK_ORDER 0x80 /* Special ordering requirements. */ +#define SHF_OS_NONCONFORMING 0x100 /* OS-specific processing required. */ +#define SHF_GROUP 0x200 /* Member of section group. */ +#define SHF_TLS 0x400 /* Section contains TLS data. */ +#define SHF_MASKOS 0x0ff00000 /* OS-specific semantics. */ +#define SHF_MASKPROC 0xf0000000 /* Processor-specific semantics. */ + +/* Values for p_type. */ +#define PT_NULL 0 /* Unused entry. */ +#define PT_LOAD 1 /* Loadable segment. */ +#define PT_DYNAMIC 2 /* Dynamic linking information segment. */ +#define PT_INTERP 3 /* Pathname of interpreter. */ +#define PT_NOTE 4 /* Auxiliary information. */ +#define PT_SHLIB 5 /* Reserved (not used). */ +#define PT_PHDR 6 /* Location of program header itself. */ +#define PT_TLS 7 /* Thread local storage segment */ +#define PT_LOOS 0x60000000 /* First OS-specific. */ +#define PT_SUNW_UNWIND 0x6464e550 /* amd64 UNWIND program header */ +#define PT_GNU_EH_FRAME 0x6474e550 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ +#define PT_SUNWSTACK 0x6ffffffb /* describes the stack segment */ +#define PT_SUNWDTRACE 0x6ffffffc /* private */ +#define PT_SUNWCAP 0x6ffffffd /* hard/soft capabilities segment */ +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff /* Last OS-specific. */ +#define PT_LOPROC 0x70000000 /* First processor-specific type. */ +#define PT_HIPROC 0x7fffffff /* Last processor-specific type. */ + +/* Values for p_flags. */ +#define PF_X 0x1 /* Executable. */ +#define PF_W 0x2 /* Writable. */ +#define PF_R 0x4 /* Readable. */ +#define PF_MASKOS 0x0ff00000 /* Operating system-specific. */ +#define PF_MASKPROC 0xf0000000 /* Processor-specific. */ + +/* Extended program header index. */ +#define PN_XNUM 0xffff + +/* Values for d_tag. */ +#define DT_NULL 0 /* Terminating entry. */ +#define DT_NEEDED 1 /* String table offset of a needed shared + library. */ +#define DT_PLTRELSZ 2 /* Total size in bytes of PLT relocations. */ +#define DT_PLTGOT 3 /* Processor-dependent address. */ +#define DT_HASH 4 /* Address of symbol hash table. */ +#define DT_STRTAB 5 /* Address of string table. */ +#define DT_SYMTAB 6 /* Address of symbol table. */ +#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ +#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ +#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ +#define DT_STRSZ 10 /* Size of string table. */ +#define DT_SYMENT 11 /* Size of each symbol table entry. */ +#define DT_INIT 12 /* Address of initialization function. */ +#define DT_FINI 13 /* Address of finalization function. */ +#define DT_SONAME 14 /* String table offset of shared object + name. */ +#define DT_RPATH 15 /* String table offset of library path. [sup] */ +#define DT_SYMBOLIC 16 /* Indicates "symbolic" linking. [sup] */ +#define DT_REL 17 /* Address of ElfNN_Rel relocations. */ +#define DT_RELSZ 18 /* Total size of ElfNN_Rel relocations. */ +#define DT_RELENT 19 /* Size of each ElfNN_Rel relocation. */ +#define DT_PLTREL 20 /* Type of relocation used for PLT. */ +#define DT_DEBUG 21 /* Reserved (not used). */ +#define DT_TEXTREL 22 /* Indicates there may be relocations in + non-writable segments. [sup] */ +#define DT_JMPREL 23 /* Address of PLT relocations. */ +#define DT_BIND_NOW 24 /* [sup] */ +#define DT_INIT_ARRAY 25 /* Address of the array of pointers to + initialization functions */ +#define DT_FINI_ARRAY 26 /* Address of the array of pointers to + termination functions */ +#define DT_INIT_ARRAYSZ 27 /* Size in bytes of the array of + initialization functions. */ +#define DT_FINI_ARRAYSZ 28 /* Size in bytes of the array of + terminationfunctions. */ +#define DT_RUNPATH 29 /* String table offset of a null-terminated + library search path string. */ +#define DT_FLAGS 30 /* Object specific flag values. */ +#define DT_ENCODING 32 /* Values greater than or equal to DT_ENCODING + and less than DT_LOOS follow the rules for + the interpretation of the d_un union + as follows: even == 'd_ptr', even == 'd_val' + or none */ +#define DT_PREINIT_ARRAY 32 /* Address of the array of pointers to + pre-initialization functions. */ +#define DT_PREINIT_ARRAYSZ 33 /* Size in bytes of the array of + pre-initialization functions. */ +#define DT_MAXPOSTAGS 34 /* number of positive tags */ +#define DT_LOOS 0x6000000d /* First OS-specific */ +#define DT_SUNW_AUXILIARY 0x6000000d /* symbol auxiliary name */ +#define DT_SUNW_RTLDINF 0x6000000e /* ld.so.1 info (private) */ +#define DT_SUNW_FILTER 0x6000000f /* symbol filter name */ +#define DT_SUNW_CAP 0x60000010 /* hardware/software */ +#define DT_HIOS 0x6ffff000 /* Last OS-specific */ + +/* + * DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the + * Dyn.d_un.d_val field of the Elf*_Dyn structure. + */ +#define DT_VALRNGLO 0x6ffffd00 +#define DT_CHECKSUM 0x6ffffdf8 /* elf checksum */ +#define DT_PLTPADSZ 0x6ffffdf9 /* pltpadding size */ +#define DT_MOVEENT 0x6ffffdfa /* move table entry size */ +#define DT_MOVESZ 0x6ffffdfb /* move table size */ +#define DT_FEATURE_1 0x6ffffdfc /* feature holder */ +#define DT_POSFLAG_1 0x6ffffdfd /* flags for DT_* entries, effecting */ + /* the following DT_* entry. */ + /* See DF_P1_* definitions */ +#define DT_SYMINSZ 0x6ffffdfe /* syminfo table size (in bytes) */ +#define DT_SYMINENT 0x6ffffdff /* syminfo entry size (in bytes) */ +#define DT_VALRNGHI 0x6ffffdff + +/* + * DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the + * Dyn.d_un.d_ptr field of the Elf*_Dyn structure. + * + * If any adjustment is made to the ELF object after it has been + * built, these entries will need to be adjusted. + */ +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_CONFIG 0x6ffffefa /* configuration information */ +#define DT_DEPAUDIT 0x6ffffefb /* dependency auditing */ +#define DT_AUDIT 0x6ffffefc /* object auditing */ +#define DT_PLTPAD 0x6ffffefd /* pltpadding (sparcv9) */ +#define DT_MOVETAB 0x6ffffefe /* move table */ +#define DT_SYMINFO 0x6ffffeff /* syminfo table */ +#define DT_ADDRRNGHI 0x6ffffeff + +#define DT_VERSYM 0x6ffffff0 /* Address of versym section. */ +#define DT_RELACOUNT 0x6ffffff9 /* number of RELATIVE relocations */ +#define DT_RELCOUNT 0x6ffffffa /* number of RELATIVE relocations */ +#define DT_FLAGS_1 0x6ffffffb /* state flags - see DF_1_* defs */ +#define DT_VERDEF 0x6ffffffc /* Address of verdef section. */ +#define DT_VERDEFNUM 0x6ffffffd /* Number of elems in verdef section */ +#define DT_VERNEED 0x6ffffffe /* Address of verneed section. */ +#define DT_VERNEEDNUM 0x6fffffff /* Number of elems in verneed section */ + +#define DT_LOPROC 0x70000000 /* First processor-specific type. */ +#define DT_DEPRECATED_SPARC_REGISTER 0x7000001 +#define DT_AUXILIARY 0x7ffffffd /* shared library auxiliary name */ +#define DT_USED 0x7ffffffe /* ignored - same as needed */ +#define DT_FILTER 0x7fffffff /* shared library filter name */ +#define DT_HIPROC 0x7fffffff /* Last processor-specific type. */ + +/* Values for DT_FLAGS */ +#define DF_ORIGIN 0x0001 /* Indicates that the object being loaded may + make reference to the $ORIGIN substitution + string */ +#define DF_SYMBOLIC 0x0002 /* Indicates "symbolic" linking. */ +#define DF_TEXTREL 0x0004 /* Indicates there may be relocations in + non-writable segments. */ +#define DF_BIND_NOW 0x0008 /* Indicates that the dynamic linker should + process all relocations for the object + containing this entry before transferring + control to the program. */ +#define DF_STATIC_TLS 0x0010 /* Indicates that the shared object or + executable contains code using a static + thread-local storage scheme. */ + +/* Values for n_type. Used in core files. */ +#define NT_PRSTATUS 1 /* Process status. */ +#define NT_FPREGSET 2 /* Floating point registers. */ +#define NT_PRPSINFO 3 /* Process state info. */ + +/* Symbol Binding - ELFNN_ST_BIND - st_info */ +#define STB_LOCAL 0 /* Local symbol */ +#define STB_GLOBAL 1 /* Global symbol */ +#define STB_WEAK 2 /* like global - lower precedence */ +#define STB_LOOS 10 /* Reserved range for operating system */ +#define STB_HIOS 12 /* specific semantics. */ +#define STB_LOPROC 13 /* reserved range for processor */ +#define STB_HIPROC 15 /* specific semantics. */ + +/* Symbol type - ELFNN_ST_TYPE - st_info */ +#define STT_NOTYPE 0 /* Unspecified type. */ +#define STT_OBJECT 1 /* Data object. */ +#define STT_FUNC 2 /* Function. */ +#define STT_SECTION 3 /* Section. */ +#define STT_FILE 4 /* Source file. */ +#define STT_COMMON 5 /* Uninitialized common block. */ +#define STT_TLS 6 /* TLS object. */ +#define STT_NUM 7 +#define STT_LOOS 10 /* Reserved range for operating system */ +#define STT_HIOS 12 /* specific semantics. */ +#define STT_LOPROC 13 /* reserved range for processor */ +#define STT_HIPROC 15 /* specific semantics. */ + +/* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */ +#define STV_DEFAULT 0x0 /* Default visibility (see binding). */ +#define STV_INTERNAL 0x1 /* Special meaning in relocatable objects. */ +#define STV_HIDDEN 0x2 /* Not visible. */ +#define STV_PROTECTED 0x3 /* Visible but not preemptible. */ + +/* Special symbol table indexes. */ +#define STN_UNDEF 0 /* Undefined symbol index. */ + +/* Symbol versioning flags. */ +#define VER_DEF_CURRENT 1 +#define VER_DEF_IDX(x) VER_NDX(x) + +#define VER_FLG_BASE 0x01 +#define VER_FLG_WEAK 0x02 + +#define VER_NEED_CURRENT 1 +#define VER_NEED_WEAK (1u << 15) +#define VER_NEED_HIDDEN VER_NDX_HIDDEN +#define VER_NEED_IDX(x) VER_NDX(x) + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 +#define VER_NDX_GIVEN 2 + +#define VER_NDX_HIDDEN (1u << 15) +#define VER_NDX(x) ((x) & ~(1u << 15)) + +#define CA_SUNW_NULL 0 +#define CA_SUNW_HW_1 1 /* first hardware capabilities entry */ +#define CA_SUNW_SF_1 2 /* first software capabilities entry */ + +/* + * Syminfo flag values + */ +#define SYMINFO_FLG_DIRECT 0x0001 /* symbol ref has direct association */ + /* to object containing defn. */ +#define SYMINFO_FLG_PASSTHRU 0x0002 /* ignored - see SYMINFO_FLG_FILTER */ +#define SYMINFO_FLG_COPY 0x0004 /* symbol is a copy-reloc */ +#define SYMINFO_FLG_LAZYLOAD 0x0008 /* object containing defn should be */ + /* lazily-loaded */ +#define SYMINFO_FLG_DIRECTBIND 0x0010 /* ref should be bound directly to */ + /* object containing defn. */ +#define SYMINFO_FLG_NOEXTDIRECT 0x0020 /* don't let an external reference */ + /* directly bind to this symbol */ +#define SYMINFO_FLG_FILTER 0x0002 /* symbol ref is associated to a */ +#define SYMINFO_FLG_AUXILIARY 0x0040 /* standard or auxiliary filter */ + +/* + * Syminfo.si_boundto values. + */ +#define SYMINFO_BT_SELF 0xffff /* symbol bound to self */ +#define SYMINFO_BT_PARENT 0xfffe /* symbol bound to parent */ +#define SYMINFO_BT_NONE 0xfffd /* no special symbol binding */ +#define SYMINFO_BT_EXTERN 0xfffc /* symbol defined as external */ +#define SYMINFO_BT_LOWRESERVE 0xff00 /* beginning of reserved entries */ + +/* + * Syminfo version values. + */ +#define SYMINFO_NONE 0 /* Syminfo version */ +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +/* + * Relocation types. + * + * All machine architectures are defined here to allow tools on one to + * handle others. + */ + +#define R_386_NONE 0 /* No relocation. */ +#define R_386_32 1 /* Add symbol value. */ +#define R_386_PC32 2 /* Add PC-relative symbol value. */ +#define R_386_GOT32 3 /* Add PC-relative GOT offset. */ +#define R_386_PLT32 4 /* Add PC-relative PLT offset. */ +#define R_386_COPY 5 /* Copy data from shared object. */ +#define R_386_GLOB_DAT 6 /* Set GOT entry to data address. */ +#define R_386_JMP_SLOT 7 /* Set GOT entry to code address. */ +#define R_386_RELATIVE 8 /* Add load address of shared object. */ +#define R_386_GOTOFF 9 /* Add GOT-relative symbol address. */ +#define R_386_GOTPC 10 /* Add PC-relative GOT table address. */ +#define R_386_TLS_TPOFF 14 /* Negative offset in static TLS block */ +#define R_386_TLS_IE 15 /* Absolute address of GOT for -ve static TLS */ +#define R_386_TLS_GOTIE 16 /* GOT entry for negative static TLS block */ +#define R_386_TLS_LE 17 /* Negative offset relative to static TLS */ +#define R_386_TLS_GD 18 /* 32 bit offset to GOT (index,off) pair */ +#define R_386_TLS_LDM 19 /* 32 bit offset to GOT (index,zero) pair */ +#define R_386_TLS_GD_32 24 /* 32 bit offset to GOT (index,off) pair */ +#define R_386_TLS_GD_PUSH 25 /* pushl instruction for Sun ABI GD sequence */ +#define R_386_TLS_GD_CALL 26 /* call instruction for Sun ABI GD sequence */ +#define R_386_TLS_GD_POP 27 /* popl instruction for Sun ABI GD sequence */ +#define R_386_TLS_LDM_32 28 /* 32 bit offset to GOT (index,zero) pair */ +#define R_386_TLS_LDM_PUSH 29 /* pushl instruction for Sun ABI LD sequence */ +#define R_386_TLS_LDM_CALL 30 /* call instruction for Sun ABI LD sequence */ +#define R_386_TLS_LDM_POP 31 /* popl instruction for Sun ABI LD sequence */ +#define R_386_TLS_LDO_32 32 /* 32 bit offset from start of TLS block */ +#define R_386_TLS_IE_32 33 /* 32 bit offset to GOT static TLS offset entry */ +#define R_386_TLS_LE_32 34 /* 32 bit offset within static TLS block */ +#define R_386_TLS_DTPMOD32 35 /* GOT entry containing TLS index */ +#define R_386_TLS_DTPOFF32 36 /* GOT entry containing TLS offset */ +#define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */ + +/* Null relocation */ +#define R_AARCH64_NONE 256 /* No relocation */ +/* Static AArch64 relocations */ + /* Static data relocations */ +#define R_AARCH64_ABS64 257 /* S + A */ +#define R_AARCH64_ABS32 258 /* S + A */ +#define R_AARCH64_ABS16 259 /* S + A */ +#define R_AARCH64_PREL64 260 /* S + A - P */ +#define R_AARCH64_PREL32 261 /* S + A - P */ +#define R_AARCH64_PREL16 262 /* S + A - P */ + /* Group relocations to create a 16, 32, 48, or 64 bit unsigned data value or address inline */ +#define R_AARCH64_MOVW_UABS_G0 263 /* S + A */ +#define R_AARCH64_MOVW_UABS_G0_NC 264 /* S + A */ +#define R_AARCH64_MOVW_UABS_G1 265 /* S + A */ +#define R_AARCH64_MOVW_UABS_G1_NC 266 /* S + A */ +#define R_AARCH64_MOVW_UABS_G2 267 /* S + A */ +#define R_AARCH64_MOVW_UABS_G2_NC 268 /* S + A */ +#define R_AARCH64_MOVW_UABS_G3 269 /* S + A */ + /* Group relocations to create a 16, 32, 48, or 64 bit signed data or offset value inline */ +#define R_AARCH64_MOVW_SABS_G0 270 /* S + A */ +#define R_AARCH64_MOVW_SABS_G1 271 /* S + A */ +#define R_AARCH64_MOVW_SABS_G2 272 /* S + A */ + /* Relocations to generate 19, 21 and 33 bit PC-relative addresses */ +#define R_AARCH64_LD_PREL_LO19 273 /* S + A - P */ +#define R_AARCH64_ADR_PREL_LO21 274 /* S + A - P */ +#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page(S+A) - Page(P) */ +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Page(S+A) - Page(P) */ +#define R_AARCH64_ADD_ABS_LO12_NC 277 /* S + A */ +#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* S + A */ +#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* S + A */ +#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* S + A */ +#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* S + A */ +#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* S + A */ + /* Relocations for control-flow instructions - all offsets are a multiple of 4 */ +#define R_AARCH64_TSTBR14 279 /* S+A-P */ +#define R_AARCH64_CONDBR19 280 /* S+A-P */ +#define R_AARCH64_JUMP26 282 /* S+A-P */ +#define R_AARCH64_CALL26 283 /* S+A-P */ + /* Group relocations to create a 16, 32, 48, or 64 bit PC-relative offset inline */ +#define R_AARCH64_MOVW_PREL_G0 287 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G0_NC 288 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G1 289 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G1_NC 290 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G2 291 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G2_NC 292 /* S+A-P */ +#define R_AARCH64_MOVW_PREL_G3 293 /* S+A-P */ + /* Group relocations to create a 16, 32, 48, or 64 bit GOT-relative offsets inline */ +#define R_AARCH64_MOVW_GOTOFF_G0 300 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G1 302 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G2 304 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* G(S)-GOT */ +#define R_AARCH64_MOVW_GOTOFF_G3 306 /* G(S)-GOT */ + /* GOT-relative data relocations */ +#define R_AARCH64_GOTREL64 307 /* S+A-GOT */ +#define R_AARCH64_GOTREL32 308 /* S+A-GOT */ + /* GOT-relative instruction relocations */ +#define R_AARCH64_GOT_LD_PREL19 309 /* G(S)-P */ +#define R_AARCH64_LD64_GOTOFF_LO15 310 /* G(S)-GOT */ +#define R_AARCH64_ADR_GOT_PAGE 311 /* Page(G(S))-Page(P) */ +#define R_AARCH64_LD64_GOT_LO12_NC 312 /* G(S) */ +#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* G(S)-Page(GOT) */ +/* Relocations for thread-local storage */ + /* General Dynamic TLS relocations */ +#define R_AARCH64_TLSGD_ADR_PREL21 512 /* G(TLSIDX(S+A)) - P */ +#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* Page(G(TLSIDX(S+A))) - Page(P) */ +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* G(TLSIDX(S+A)) */ +#define R_AARCH64_TLSGD_MOVW_G1 515 /* G(TLSIDX(S+A)) - GOT */ +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* G(TLSIDX(S+A)) - GOT */ + /* Local Dynamic TLS relocations */ +#define R_AARCH64_TLSLD_ADR_PREL21 517 /* G(LDM(S))) - P */ +#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Page(G(LDM(S)))-Page(P) */ +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* G(LDM(S)) */ +#define R_AARCH64_TLSLD_MOVW_G1 520 /* G(LDM(S)) - GOT */ +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* G(LDM(S)) - GOT */ +#define R_AARCH64_TLSLD_LD_PREL19 522 /* G(LDM(S)) - P */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTPREL(S+A) */ +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* DTPREL(S+A) */ + /* Initial Exec TLS relocations */ +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* G(TPREL(S+A)) - GOT */ +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* G(TPREL(S+A)) - GOT */ +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page(G(TPREL(S+A))) - Page(P) */ +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* G(TPREL(S+A)) */ +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* G(TPREL(S+A)) - P */ + /* Local Exec TLS relocations */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TPREL(S+A) */ +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* TPREL(S+A) */ +/* Dynamic relocations */ + /* Dynamic relocations */ +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 /* S + A */ +#define R_AARCH64_JUMP_SLOT 1026 /* S + A */ +#define R_AARCH64_RELATIVE 1027 /* Delta(S) + A , Delta(P) + A */ +#define R_AARCH64_TLS_DTPREL64 1028 /* DTPREL(S+A) */ +#define R_AARCH64_TLS_DTPMOD64 1029 /* LDM(S) */ +#define R_AARCH64_TLS_TPREL64 1030 /* TPREL(S+A) */ +#define R_AARCH64_TLS_DTPREL32 1031 /* DTPREL(S+A) */ +#define R_AARCH64_TLS_DTPMOD32 1032 /* LDM(S) */ +#define R_AARCH64_TLS_TPREL32 1033 /* DTPREL(S+A) */ + +#define R_ALPHA_NONE 0 /* No reloc */ +#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ +#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ +#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ +#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ +#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ +#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ +#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ +#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ +#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ +#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ +#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ +#define R_ALPHA_OP_PUSH 12 /* OP stack push */ +#define R_ALPHA_OP_STORE 13 /* OP stack pop and store */ +#define R_ALPHA_OP_PSUB 14 /* OP stack subtract */ +#define R_ALPHA_OP_PRSHIFT 15 /* OP stack right shift */ +#define R_ALPHA_GPVALUE 16 +#define R_ALPHA_GPRELHIGH 17 +#define R_ALPHA_GPRELLOW 18 +#define R_ALPHA_IMMED_GP_16 19 +#define R_ALPHA_IMMED_GP_HI32 20 +#define R_ALPHA_IMMED_SCN_HI32 21 +#define R_ALPHA_IMMED_BR_HI32 22 +#define R_ALPHA_IMMED_LO32 23 +#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ +#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ +#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ +#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ + +#define R_ARM_NONE 0 /* No relocation. */ +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_REL32 3 +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 +#define R_ARM_ABS12 6 +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_SWI24 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_COPY 20 /* Copy data from shared object. */ +#define R_ARM_GLOB_DAT 21 /* Set GOT entry to data address. */ +#define R_ARM_JUMP_SLOT 22 /* Set GOT entry to code address. */ +#define R_ARM_RELATIVE 23 /* Add load address of shared object. */ +#define R_ARM_GOTOFF 24 /* Add GOT-relative symbol address. */ +#define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */ +#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */ +#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */ +#define R_ARM_CALL 28 +#define R_ARM_JMP24 29 +#define R_ARM_THM_MOVW_ABS_NC 47 +#define R_ARM_THM_MOVT_ABS 48 + +// Block of PC-relative relocations added to work around gcc putting +// object relocations in static executables. +#define R_ARM_THM_JUMP24 30 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_PREL_NC 45 +#define R_ARM_MOVT_PREL 46 +#define R_ARM_THM_MOVW_PREL_NC 49 +#define R_ARM_THM_MOVT_PREL 50 +#define R_ARM_THM_JMP6 52 +#define R_ARM_THM_ALU_PREL_11_0 53 +#define R_ARM_THM_PC12 54 +#define R_ARM_REL32_NOI 56 #define R_ARM_ALU_PC_G0_NC 57 #define R_ARM_ALU_PC_G0 58 #define R_ARM_ALU_PC_G1_NC 59 @@ -757,301 +757,301 @@ typedef struct { #define R_ARM_LDRS_PC_G2 66 #define R_ARM_LDC_PC_G0 67 #define R_ARM_LDC_PC_G1 68 -#define R_ARM_LDC_PC_G2 69 -#define R_ARM_GOT_PREL 96 -#define R_ARM_THM_JUMP11 102 -#define R_ARM_THM_JUMP8 103 -#define R_ARM_TLS_GD32 104 -#define R_ARM_TLS_LDM32 105 -#define R_ARM_TLS_IE32 107 - -#define R_ARM_THM_JUMP19 51 -#define R_ARM_GNU_VTENTRY 100 -#define R_ARM_GNU_VTINHERIT 101 -#define R_ARM_RSBREL32 250 -#define R_ARM_THM_RPC22 251 -#define R_ARM_RREL32 252 -#define R_ARM_RABS32 253 -#define R_ARM_RPC24 254 -#define R_ARM_RBASE 255 - - - -/* Name Value Field Calculation */ -#define R_IA_64_NONE 0 /* None */ -#define R_IA_64_IMM14 0x21 /* immediate14 S + A */ -#define R_IA_64_IMM22 0x22 /* immediate22 S + A */ -#define R_IA_64_IMM64 0x23 /* immediate64 S + A */ -#define R_IA_64_DIR32MSB 0x24 /* word32 MSB S + A */ -#define R_IA_64_DIR32LSB 0x25 /* word32 LSB S + A */ -#define R_IA_64_DIR64MSB 0x26 /* word64 MSB S + A */ -#define R_IA_64_DIR64LSB 0x27 /* word64 LSB S + A */ -#define R_IA_64_GPREL22 0x2a /* immediate22 @gprel(S + A) */ -#define R_IA_64_GPREL64I 0x2b /* immediate64 @gprel(S + A) */ -#define R_IA_64_GPREL32MSB 0x2c /* word32 MSB @gprel(S + A) */ -#define R_IA_64_GPREL32LSB 0x2d /* word32 LSB @gprel(S + A) */ -#define R_IA_64_GPREL64MSB 0x2e /* word64 MSB @gprel(S + A) */ -#define R_IA_64_GPREL64LSB 0x2f /* word64 LSB @gprel(S + A) */ -#define R_IA_64_LTOFF22 0x32 /* immediate22 @ltoff(S + A) */ -#define R_IA_64_LTOFF64I 0x33 /* immediate64 @ltoff(S + A) */ -#define R_IA_64_PLTOFF22 0x3a /* immediate22 @pltoff(S + A) */ -#define R_IA_64_PLTOFF64I 0x3b /* immediate64 @pltoff(S + A) */ -#define R_IA_64_PLTOFF64MSB 0x3e /* word64 MSB @pltoff(S + A) */ -#define R_IA_64_PLTOFF64LSB 0x3f /* word64 LSB @pltoff(S + A) */ -#define R_IA_64_FPTR64I 0x43 /* immediate64 @fptr(S + A) */ -#define R_IA_64_FPTR32MSB 0x44 /* word32 MSB @fptr(S + A) */ -#define R_IA_64_FPTR32LSB 0x45 /* word32 LSB @fptr(S + A) */ -#define R_IA_64_FPTR64MSB 0x46 /* word64 MSB @fptr(S + A) */ -#define R_IA_64_FPTR64LSB 0x47 /* word64 LSB @fptr(S + A) */ -#define R_IA_64_PCREL60B 0x48 /* immediate60 form1 S + A - P */ -#define R_IA_64_PCREL21B 0x49 /* immediate21 form1 S + A - P */ -#define R_IA_64_PCREL21M 0x4a /* immediate21 form2 S + A - P */ -#define R_IA_64_PCREL21F 0x4b /* immediate21 form3 S + A - P */ -#define R_IA_64_PCREL32MSB 0x4c /* word32 MSB S + A - P */ -#define R_IA_64_PCREL32LSB 0x4d /* word32 LSB S + A - P */ -#define R_IA_64_PCREL64MSB 0x4e /* word64 MSB S + A - P */ -#define R_IA_64_PCREL64LSB 0x4f /* word64 LSB S + A - P */ -#define R_IA_64_LTOFF_FPTR22 0x52 /* immediate22 @ltoff(@fptr(S + A)) */ -#define R_IA_64_LTOFF_FPTR64I 0x53 /* immediate64 @ltoff(@fptr(S + A)) */ -#define R_IA_64_LTOFF_FPTR32MSB 0x54 /* word32 MSB @ltoff(@fptr(S + A)) */ -#define R_IA_64_LTOFF_FPTR32LSB 0x55 /* word32 LSB @ltoff(@fptr(S + A)) */ -#define R_IA_64_LTOFF_FPTR64MSB 0x56 /* word64 MSB @ltoff(@fptr(S + A)) */ -#define R_IA_64_LTOFF_FPTR64LSB 0x57 /* word64 LSB @ltoff(@fptr(S + A)) */ -#define R_IA_64_SEGREL32MSB 0x5c /* word32 MSB @segrel(S + A) */ -#define R_IA_64_SEGREL32LSB 0x5d /* word32 LSB @segrel(S + A) */ -#define R_IA_64_SEGREL64MSB 0x5e /* word64 MSB @segrel(S + A) */ -#define R_IA_64_SEGREL64LSB 0x5f /* word64 LSB @segrel(S + A) */ -#define R_IA_64_SECREL32MSB 0x64 /* word32 MSB @secrel(S + A) */ -#define R_IA_64_SECREL32LSB 0x65 /* word32 LSB @secrel(S + A) */ -#define R_IA_64_SECREL64MSB 0x66 /* word64 MSB @secrel(S + A) */ -#define R_IA_64_SECREL64LSB 0x67 /* word64 LSB @secrel(S + A) */ -#define R_IA_64_REL32MSB 0x6c /* word32 MSB BD + A */ -#define R_IA_64_REL32LSB 0x6d /* word32 LSB BD + A */ -#define R_IA_64_REL64MSB 0x6e /* word64 MSB BD + A */ -#define R_IA_64_REL64LSB 0x6f /* word64 LSB BD + A */ -#define R_IA_64_LTV32MSB 0x74 /* word32 MSB S + A */ -#define R_IA_64_LTV32LSB 0x75 /* word32 LSB S + A */ -#define R_IA_64_LTV64MSB 0x76 /* word64 MSB S + A */ -#define R_IA_64_LTV64LSB 0x77 /* word64 LSB S + A */ -#define R_IA_64_PCREL21BI 0x79 /* immediate21 form1 S + A - P */ -#define R_IA_64_PCREL22 0x7a /* immediate22 S + A - P */ -#define R_IA_64_PCREL64I 0x7b /* immediate64 S + A - P */ -#define R_IA_64_IPLTMSB 0x80 /* function descriptor MSB special */ -#define R_IA_64_IPLTLSB 0x81 /* function descriptor LSB speciaal */ -#define R_IA_64_SUB 0x85 /* immediate64 A - S */ -#define R_IA_64_LTOFF22X 0x86 /* immediate22 special */ -#define R_IA_64_LDXMOV 0x87 /* immediate22 special */ -#define R_IA_64_TPREL14 0x91 /* imm14 @tprel(S + A) */ -#define R_IA_64_TPREL22 0x92 /* imm22 @tprel(S + A) */ -#define R_IA_64_TPREL64I 0x93 /* imm64 @tprel(S + A) */ -#define R_IA_64_TPREL64MSB 0x96 /* word64 MSB @tprel(S + A) */ -#define R_IA_64_TPREL64LSB 0x97 /* word64 LSB @tprel(S + A) */ -#define R_IA_64_LTOFF_TPREL22 0x9a /* imm22 @ltoff(@tprel(S+A)) */ -#define R_IA_64_DTPMOD64MSB 0xa6 /* word64 MSB @dtpmod(S + A) */ -#define R_IA_64_DTPMOD64LSB 0xa7 /* word64 LSB @dtpmod(S + A) */ -#define R_IA_64_LTOFF_DTPMOD22 0xaa /* imm22 @ltoff(@dtpmod(S+A)) */ -#define R_IA_64_DTPREL14 0xb1 /* imm14 @dtprel(S + A) */ -#define R_IA_64_DTPREL22 0xb2 /* imm22 @dtprel(S + A) */ -#define R_IA_64_DTPREL64I 0xb3 /* imm64 @dtprel(S + A) */ -#define R_IA_64_DTPREL32MSB 0xb4 /* word32 MSB @dtprel(S + A) */ -#define R_IA_64_DTPREL32LSB 0xb5 /* word32 LSB @dtprel(S + A) */ -#define R_IA_64_DTPREL64MSB 0xb6 /* word64 MSB @dtprel(S + A) */ -#define R_IA_64_DTPREL64LSB 0xb7 /* word64 LSB @dtprel(S + A) */ -#define R_IA_64_LTOFF_DTPREL22 0xba /* imm22 @ltoff(@dtprel(S+A)) */ - -#define R_PPC_NONE 0 /* No relocation. */ -#define R_PPC_ADDR32 1 -#define R_PPC_ADDR24 2 -#define R_PPC_ADDR16 3 -#define R_PPC_ADDR16_LO 4 -#define R_PPC_ADDR16_HI 5 -#define R_PPC_ADDR16_HA 6 -#define R_PPC_ADDR14 7 -#define R_PPC_ADDR14_BRTAKEN 8 -#define R_PPC_ADDR14_BRNTAKEN 9 -#define R_PPC_REL24 10 -#define R_PPC_REL14 11 -#define R_PPC_REL14_BRTAKEN 12 -#define R_PPC_REL14_BRNTAKEN 13 -#define R_PPC_GOT16 14 -#define R_PPC_GOT16_LO 15 -#define R_PPC_GOT16_HI 16 -#define R_PPC_GOT16_HA 17 -#define R_PPC_PLTREL24 18 -#define R_PPC_COPY 19 -#define R_PPC_GLOB_DAT 20 -#define R_PPC_JMP_SLOT 21 -#define R_PPC_RELATIVE 22 -#define R_PPC_LOCAL24PC 23 -#define R_PPC_UADDR32 24 -#define R_PPC_UADDR16 25 -#define R_PPC_REL32 26 -#define R_PPC_PLT32 27 -#define R_PPC_PLTREL32 28 -#define R_PPC_PLT16_LO 29 -#define R_PPC_PLT16_HI 30 -#define R_PPC_PLT16_HA 31 -#define R_PPC_SDAREL16 32 -#define R_PPC_SECTOFF 33 -#define R_PPC_SECTOFF_LO 34 -#define R_PPC_SECTOFF_HI 35 -#define R_PPC_SECTOFF_HA 36 - -/* - * TLS relocations - */ -#define R_PPC_TLS 67 -#define R_PPC_DTPMOD32 68 -#define R_PPC_TPREL16 69 -#define R_PPC_TPREL16_LO 70 -#define R_PPC_TPREL16_HI 71 -#define R_PPC_TPREL16_HA 72 -#define R_PPC_TPREL32 73 -#define R_PPC_DTPREL16 74 -#define R_PPC_DTPREL16_LO 75 -#define R_PPC_DTPREL16_HI 76 -#define R_PPC_DTPREL16_HA 77 -#define R_PPC_DTPREL32 78 -#define R_PPC_GOT_TLSGD16 79 -#define R_PPC_GOT_TLSGD16_LO 80 -#define R_PPC_GOT_TLSGD16_HI 81 -#define R_PPC_GOT_TLSGD16_HA 82 -#define R_PPC_GOT_TLSLD16 83 -#define R_PPC_GOT_TLSLD16_LO 84 -#define R_PPC_GOT_TLSLD16_HI 85 -#define R_PPC_GOT_TLSLD16_HA 86 -#define R_PPC_GOT_TPREL16 87 -#define R_PPC_GOT_TPREL16_LO 88 -#define R_PPC_GOT_TPREL16_HI 89 -#define R_PPC_GOT_TPREL16_HA 90 - -/* - * The remaining relocs are from the Embedded ELF ABI, and are not in the - * SVR4 ELF ABI. - */ - -#define R_PPC_EMB_NADDR32 101 -#define R_PPC_EMB_NADDR16 102 -#define R_PPC_EMB_NADDR16_LO 103 -#define R_PPC_EMB_NADDR16_HI 104 -#define R_PPC_EMB_NADDR16_HA 105 -#define R_PPC_EMB_SDAI16 106 -#define R_PPC_EMB_SDA2I16 107 -#define R_PPC_EMB_SDA2REL 108 -#define R_PPC_EMB_SDA21 109 -#define R_PPC_EMB_MRKREF 110 -#define R_PPC_EMB_RELSEC16 111 -#define R_PPC_EMB_RELST_LO 112 -#define R_PPC_EMB_RELST_HI 113 -#define R_PPC_EMB_RELST_HA 114 -#define R_PPC_EMB_BIT_FLD 115 -#define R_PPC_EMB_RELSDA 116 - -#define R_SPARC_NONE 0 -#define R_SPARC_8 1 -#define R_SPARC_16 2 -#define R_SPARC_32 3 -#define R_SPARC_DISP8 4 -#define R_SPARC_DISP16 5 -#define R_SPARC_DISP32 6 -#define R_SPARC_WDISP30 7 -#define R_SPARC_WDISP22 8 -#define R_SPARC_HI22 9 -#define R_SPARC_22 10 -#define R_SPARC_13 11 -#define R_SPARC_LO10 12 -#define R_SPARC_GOT10 13 -#define R_SPARC_GOT13 14 -#define R_SPARC_GOT22 15 -#define R_SPARC_PC10 16 -#define R_SPARC_PC22 17 -#define R_SPARC_WPLT30 18 -#define R_SPARC_COPY 19 -#define R_SPARC_GLOB_DAT 20 -#define R_SPARC_JMP_SLOT 21 -#define R_SPARC_RELATIVE 22 -#define R_SPARC_UA32 23 -#define R_SPARC_PLT32 24 -#define R_SPARC_HIPLT22 25 -#define R_SPARC_LOPLT10 26 -#define R_SPARC_PCPLT32 27 -#define R_SPARC_PCPLT22 28 -#define R_SPARC_PCPLT10 29 -#define R_SPARC_10 30 -#define R_SPARC_11 31 -#define R_SPARC_64 32 -#define R_SPARC_OLO10 33 -#define R_SPARC_HH22 34 -#define R_SPARC_HM10 35 -#define R_SPARC_LM22 36 -#define R_SPARC_PC_HH22 37 -#define R_SPARC_PC_HM10 38 -#define R_SPARC_PC_LM22 39 -#define R_SPARC_WDISP16 40 -#define R_SPARC_WDISP19 41 -#define R_SPARC_GLOB_JMP 42 -#define R_SPARC_7 43 -#define R_SPARC_5 44 -#define R_SPARC_6 45 -#define R_SPARC_DISP64 46 -#define R_SPARC_PLT64 47 -#define R_SPARC_HIX22 48 -#define R_SPARC_LOX10 49 -#define R_SPARC_H44 50 -#define R_SPARC_M44 51 -#define R_SPARC_L44 52 -#define R_SPARC_REGISTER 53 -#define R_SPARC_UA64 54 -#define R_SPARC_UA16 55 -#define R_SPARC_TLS_GD_HI22 56 -#define R_SPARC_TLS_GD_LO10 57 -#define R_SPARC_TLS_GD_ADD 58 -#define R_SPARC_TLS_GD_CALL 59 -#define R_SPARC_TLS_LDM_HI22 60 -#define R_SPARC_TLS_LDM_LO10 61 -#define R_SPARC_TLS_LDM_ADD 62 -#define R_SPARC_TLS_LDM_CALL 63 -#define R_SPARC_TLS_LDO_HIX22 64 -#define R_SPARC_TLS_LDO_LOX10 65 -#define R_SPARC_TLS_LDO_ADD 66 -#define R_SPARC_TLS_IE_HI22 67 -#define R_SPARC_TLS_IE_LO10 68 -#define R_SPARC_TLS_IE_LD 69 -#define R_SPARC_TLS_IE_LDX 70 -#define R_SPARC_TLS_IE_ADD 71 -#define R_SPARC_TLS_LE_HIX22 72 -#define R_SPARC_TLS_LE_LOX10 73 -#define R_SPARC_TLS_DTPMOD32 74 -#define R_SPARC_TLS_DTPMOD64 75 -#define R_SPARC_TLS_DTPOFF32 76 -#define R_SPARC_TLS_DTPOFF64 77 -#define R_SPARC_TLS_TPOFF32 78 -#define R_SPARC_TLS_TPOFF64 79 - -#define R_X86_64_NONE 0 /* No relocation. */ -#define R_X86_64_64 1 /* Add 64 bit symbol value. */ -#define R_X86_64_PC32 2 /* PC-relative 32 bit signed sym value. */ -#define R_X86_64_GOT32 3 /* PC-relative 32 bit GOT offset. */ -#define R_X86_64_PLT32 4 /* PC-relative 32 bit PLT offset. */ -#define R_X86_64_COPY 5 /* Copy data from shared object. */ -#define R_X86_64_GLOB_DAT 6 /* Set GOT entry to data address. */ -#define R_X86_64_JMP_SLOT 7 /* Set GOT entry to code address. */ -#define R_X86_64_RELATIVE 8 /* Add load address of shared object. */ -#define R_X86_64_GOTPCREL 9 /* Add 32 bit signed pcrel offset to GOT. */ -#define R_X86_64_32 10 /* Add 32 bit zero extended symbol value */ -#define R_X86_64_32S 11 /* Add 32 bit sign extended symbol value */ -#define R_X86_64_16 12 /* Add 16 bit zero extended symbol value */ -#define R_X86_64_PC16 13 /* Add 16 bit signed extended pc relative symbol value */ -#define R_X86_64_8 14 /* Add 8 bit zero extended symbol value */ -#define R_X86_64_PC8 15 /* Add 8 bit signed extended pc relative symbol value */ -#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ -#define R_X86_64_DTPOFF64 17 /* Offset in TLS block */ -#define R_X86_64_TPOFF64 18 /* Offset in static TLS block */ -#define R_X86_64_TLSGD 19 /* PC relative offset to GD GOT entry */ -#define R_X86_64_TLSLD 20 /* PC relative offset to LD GOT entry */ -#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ -#define R_X86_64_GOTTPOFF 22 /* PC relative offset to IE GOT entry */ -#define R_X86_64_TPOFF32 23 /* Offset in static TLS block */ - - -#endif /* !_SYS_ELF_COMMON_H_ */ +#define R_ARM_LDC_PC_G2 69 +#define R_ARM_GOT_PREL 96 +#define R_ARM_THM_JUMP11 102 +#define R_ARM_THM_JUMP8 103 +#define R_ARM_TLS_GD32 104 +#define R_ARM_TLS_LDM32 105 +#define R_ARM_TLS_IE32 107 + +#define R_ARM_THM_JUMP19 51 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS32 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 + + + +/* Name Value Field Calculation */ +#define R_IA_64_NONE 0 /* None */ +#define R_IA_64_IMM14 0x21 /* immediate14 S + A */ +#define R_IA_64_IMM22 0x22 /* immediate22 S + A */ +#define R_IA_64_IMM64 0x23 /* immediate64 S + A */ +#define R_IA_64_DIR32MSB 0x24 /* word32 MSB S + A */ +#define R_IA_64_DIR32LSB 0x25 /* word32 LSB S + A */ +#define R_IA_64_DIR64MSB 0x26 /* word64 MSB S + A */ +#define R_IA_64_DIR64LSB 0x27 /* word64 LSB S + A */ +#define R_IA_64_GPREL22 0x2a /* immediate22 @gprel(S + A) */ +#define R_IA_64_GPREL64I 0x2b /* immediate64 @gprel(S + A) */ +#define R_IA_64_GPREL32MSB 0x2c /* word32 MSB @gprel(S + A) */ +#define R_IA_64_GPREL32LSB 0x2d /* word32 LSB @gprel(S + A) */ +#define R_IA_64_GPREL64MSB 0x2e /* word64 MSB @gprel(S + A) */ +#define R_IA_64_GPREL64LSB 0x2f /* word64 LSB @gprel(S + A) */ +#define R_IA_64_LTOFF22 0x32 /* immediate22 @ltoff(S + A) */ +#define R_IA_64_LTOFF64I 0x33 /* immediate64 @ltoff(S + A) */ +#define R_IA_64_PLTOFF22 0x3a /* immediate22 @pltoff(S + A) */ +#define R_IA_64_PLTOFF64I 0x3b /* immediate64 @pltoff(S + A) */ +#define R_IA_64_PLTOFF64MSB 0x3e /* word64 MSB @pltoff(S + A) */ +#define R_IA_64_PLTOFF64LSB 0x3f /* word64 LSB @pltoff(S + A) */ +#define R_IA_64_FPTR64I 0x43 /* immediate64 @fptr(S + A) */ +#define R_IA_64_FPTR32MSB 0x44 /* word32 MSB @fptr(S + A) */ +#define R_IA_64_FPTR32LSB 0x45 /* word32 LSB @fptr(S + A) */ +#define R_IA_64_FPTR64MSB 0x46 /* word64 MSB @fptr(S + A) */ +#define R_IA_64_FPTR64LSB 0x47 /* word64 LSB @fptr(S + A) */ +#define R_IA_64_PCREL60B 0x48 /* immediate60 form1 S + A - P */ +#define R_IA_64_PCREL21B 0x49 /* immediate21 form1 S + A - P */ +#define R_IA_64_PCREL21M 0x4a /* immediate21 form2 S + A - P */ +#define R_IA_64_PCREL21F 0x4b /* immediate21 form3 S + A - P */ +#define R_IA_64_PCREL32MSB 0x4c /* word32 MSB S + A - P */ +#define R_IA_64_PCREL32LSB 0x4d /* word32 LSB S + A - P */ +#define R_IA_64_PCREL64MSB 0x4e /* word64 MSB S + A - P */ +#define R_IA_64_PCREL64LSB 0x4f /* word64 LSB S + A - P */ +#define R_IA_64_LTOFF_FPTR22 0x52 /* immediate22 @ltoff(@fptr(S + A)) */ +#define R_IA_64_LTOFF_FPTR64I 0x53 /* immediate64 @ltoff(@fptr(S + A)) */ +#define R_IA_64_LTOFF_FPTR32MSB 0x54 /* word32 MSB @ltoff(@fptr(S + A)) */ +#define R_IA_64_LTOFF_FPTR32LSB 0x55 /* word32 LSB @ltoff(@fptr(S + A)) */ +#define R_IA_64_LTOFF_FPTR64MSB 0x56 /* word64 MSB @ltoff(@fptr(S + A)) */ +#define R_IA_64_LTOFF_FPTR64LSB 0x57 /* word64 LSB @ltoff(@fptr(S + A)) */ +#define R_IA_64_SEGREL32MSB 0x5c /* word32 MSB @segrel(S + A) */ +#define R_IA_64_SEGREL32LSB 0x5d /* word32 LSB @segrel(S + A) */ +#define R_IA_64_SEGREL64MSB 0x5e /* word64 MSB @segrel(S + A) */ +#define R_IA_64_SEGREL64LSB 0x5f /* word64 LSB @segrel(S + A) */ +#define R_IA_64_SECREL32MSB 0x64 /* word32 MSB @secrel(S + A) */ +#define R_IA_64_SECREL32LSB 0x65 /* word32 LSB @secrel(S + A) */ +#define R_IA_64_SECREL64MSB 0x66 /* word64 MSB @secrel(S + A) */ +#define R_IA_64_SECREL64LSB 0x67 /* word64 LSB @secrel(S + A) */ +#define R_IA_64_REL32MSB 0x6c /* word32 MSB BD + A */ +#define R_IA_64_REL32LSB 0x6d /* word32 LSB BD + A */ +#define R_IA_64_REL64MSB 0x6e /* word64 MSB BD + A */ +#define R_IA_64_REL64LSB 0x6f /* word64 LSB BD + A */ +#define R_IA_64_LTV32MSB 0x74 /* word32 MSB S + A */ +#define R_IA_64_LTV32LSB 0x75 /* word32 LSB S + A */ +#define R_IA_64_LTV64MSB 0x76 /* word64 MSB S + A */ +#define R_IA_64_LTV64LSB 0x77 /* word64 LSB S + A */ +#define R_IA_64_PCREL21BI 0x79 /* immediate21 form1 S + A - P */ +#define R_IA_64_PCREL22 0x7a /* immediate22 S + A - P */ +#define R_IA_64_PCREL64I 0x7b /* immediate64 S + A - P */ +#define R_IA_64_IPLTMSB 0x80 /* function descriptor MSB special */ +#define R_IA_64_IPLTLSB 0x81 /* function descriptor LSB speciaal */ +#define R_IA_64_SUB 0x85 /* immediate64 A - S */ +#define R_IA_64_LTOFF22X 0x86 /* immediate22 special */ +#define R_IA_64_LDXMOV 0x87 /* immediate22 special */ +#define R_IA_64_TPREL14 0x91 /* imm14 @tprel(S + A) */ +#define R_IA_64_TPREL22 0x92 /* imm22 @tprel(S + A) */ +#define R_IA_64_TPREL64I 0x93 /* imm64 @tprel(S + A) */ +#define R_IA_64_TPREL64MSB 0x96 /* word64 MSB @tprel(S + A) */ +#define R_IA_64_TPREL64LSB 0x97 /* word64 LSB @tprel(S + A) */ +#define R_IA_64_LTOFF_TPREL22 0x9a /* imm22 @ltoff(@tprel(S+A)) */ +#define R_IA_64_DTPMOD64MSB 0xa6 /* word64 MSB @dtpmod(S + A) */ +#define R_IA_64_DTPMOD64LSB 0xa7 /* word64 LSB @dtpmod(S + A) */ +#define R_IA_64_LTOFF_DTPMOD22 0xaa /* imm22 @ltoff(@dtpmod(S+A)) */ +#define R_IA_64_DTPREL14 0xb1 /* imm14 @dtprel(S + A) */ +#define R_IA_64_DTPREL22 0xb2 /* imm22 @dtprel(S + A) */ +#define R_IA_64_DTPREL64I 0xb3 /* imm64 @dtprel(S + A) */ +#define R_IA_64_DTPREL32MSB 0xb4 /* word32 MSB @dtprel(S + A) */ +#define R_IA_64_DTPREL32LSB 0xb5 /* word32 LSB @dtprel(S + A) */ +#define R_IA_64_DTPREL64MSB 0xb6 /* word64 MSB @dtprel(S + A) */ +#define R_IA_64_DTPREL64LSB 0xb7 /* word64 LSB @dtprel(S + A) */ +#define R_IA_64_LTOFF_DTPREL22 0xba /* imm22 @ltoff(@dtprel(S+A)) */ + +#define R_PPC_NONE 0 /* No relocation. */ +#define R_PPC_ADDR32 1 +#define R_PPC_ADDR24 2 +#define R_PPC_ADDR16 3 +#define R_PPC_ADDR16_LO 4 +#define R_PPC_ADDR16_HI 5 +#define R_PPC_ADDR16_HA 6 +#define R_PPC_ADDR14 7 +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 +#define R_PPC_REL14 11 +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + +/* + * TLS relocations + */ +#define R_PPC_TLS 67 +#define R_PPC_DTPMOD32 68 +#define R_PPC_TPREL16 69 +#define R_PPC_TPREL16_LO 70 +#define R_PPC_TPREL16_HI 71 +#define R_PPC_TPREL16_HA 72 +#define R_PPC_TPREL32 73 +#define R_PPC_DTPREL16 74 +#define R_PPC_DTPREL16_LO 75 +#define R_PPC_DTPREL16_HI 76 +#define R_PPC_DTPREL16_HA 77 +#define R_PPC_DTPREL32 78 +#define R_PPC_GOT_TLSGD16 79 +#define R_PPC_GOT_TLSGD16_LO 80 +#define R_PPC_GOT_TLSGD16_HI 81 +#define R_PPC_GOT_TLSGD16_HA 82 +#define R_PPC_GOT_TLSLD16 83 +#define R_PPC_GOT_TLSLD16_LO 84 +#define R_PPC_GOT_TLSLD16_HI 85 +#define R_PPC_GOT_TLSLD16_HA 86 +#define R_PPC_GOT_TPREL16 87 +#define R_PPC_GOT_TPREL16_LO 88 +#define R_PPC_GOT_TPREL16_HI 89 +#define R_PPC_GOT_TPREL16_HA 90 + +/* + * The remaining relocs are from the Embedded ELF ABI, and are not in the + * SVR4 ELF ABI. + */ + +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 + +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_PC_HH22 37 +#define R_SPARC_PC_HM10 38 +#define R_SPARC_PC_LM22 39 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_GLOB_JMP 42 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 +#define R_SPARC_DISP64 46 +#define R_SPARC_PLT64 47 +#define R_SPARC_HIX22 48 +#define R_SPARC_LOX10 49 +#define R_SPARC_H44 50 +#define R_SPARC_M44 51 +#define R_SPARC_L44 52 +#define R_SPARC_REGISTER 53 +#define R_SPARC_UA64 54 +#define R_SPARC_UA16 55 +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 + +#define R_X86_64_NONE 0 /* No relocation. */ +#define R_X86_64_64 1 /* Add 64 bit symbol value. */ +#define R_X86_64_PC32 2 /* PC-relative 32 bit signed sym value. */ +#define R_X86_64_GOT32 3 /* PC-relative 32 bit GOT offset. */ +#define R_X86_64_PLT32 4 /* PC-relative 32 bit PLT offset. */ +#define R_X86_64_COPY 5 /* Copy data from shared object. */ +#define R_X86_64_GLOB_DAT 6 /* Set GOT entry to data address. */ +#define R_X86_64_JMP_SLOT 7 /* Set GOT entry to code address. */ +#define R_X86_64_RELATIVE 8 /* Add load address of shared object. */ +#define R_X86_64_GOTPCREL 9 /* Add 32 bit signed pcrel offset to GOT. */ +#define R_X86_64_32 10 /* Add 32 bit zero extended symbol value */ +#define R_X86_64_32S 11 /* Add 32 bit sign extended symbol value */ +#define R_X86_64_16 12 /* Add 16 bit zero extended symbol value */ +#define R_X86_64_PC16 13 /* Add 16 bit signed extended pc relative symbol value */ +#define R_X86_64_8 14 /* Add 8 bit zero extended symbol value */ +#define R_X86_64_PC8 15 /* Add 8 bit signed extended pc relative symbol value */ +#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ +#define R_X86_64_DTPOFF64 17 /* Offset in TLS block */ +#define R_X86_64_TPOFF64 18 /* Offset in static TLS block */ +#define R_X86_64_TLSGD 19 /* PC relative offset to GD GOT entry */ +#define R_X86_64_TLSLD 20 /* PC relative offset to LD GOT entry */ +#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ +#define R_X86_64_GOTTPOFF 22 /* PC relative offset to IE GOT entry */ +#define R_X86_64_TPOFF32 23 /* Offset in static TLS block */ + + +#endif /* !_SYS_ELF_COMMON_H_ */ diff --git a/BaseTools/Source/C/Include/Arm/ProcessorBind.h b/BaseTools/Source/C/Include/Arm/ProcessorBind.h index 1ca26ab6f3..d84f16e7ba 100644 --- a/BaseTools/Source/C/Include/Arm/ProcessorBind.h +++ b/BaseTools/Source/C/Include/Arm/ProcessorBind.h @@ -1,158 +1,158 @@ -/** @file - Processor or Compiler specific defines and types for ARM. - - Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
    - Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __PROCESSOR_BIND_H__ -#define __PROCESSOR_BIND_H__ - -/// -/// Define the processor type so other code can make processor based choices -/// -#define MDE_CPU_ARM - -// -// Make sure we are using the correct packing rules per EFI specification -// -#ifndef __GNUC__ -#pragma pack() -#endif - -#if _MSC_EXTENSIONS - // - // use Microsoft* C complier dependent integer width types - // - typedef unsigned __int64 UINT64; - typedef __int64 INT64; - typedef unsigned __int32 UINT32; - typedef __int32 INT32; - typedef unsigned short UINT16; - typedef unsigned short CHAR16; - typedef short INT16; - typedef unsigned char BOOLEAN; - typedef unsigned char UINT8; - typedef char CHAR8; - typedef signed char INT8; -#else - // - // Assume standard ARM alignment. - // - typedef unsigned long long UINT64; - typedef long long INT64; - typedef unsigned int UINT32; - typedef int INT32; - typedef unsigned short UINT16; - typedef unsigned short CHAR16; - typedef short INT16; - typedef unsigned char BOOLEAN; - typedef unsigned char UINT8; - typedef char CHAR8; - typedef signed char INT8; - - #define UINT8_MAX 0xff -#endif - -/// -/// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions, -/// 8 bytes on supported 64-bit processor instructions) -/// -typedef UINT32 UINTN; - -/// -/// Signed value of native width. (4 bytes on supported 32-bit processor instructions, -/// 8 bytes on supported 64-bit processor instructions) -/// -typedef INT32 INTN; - -// -// Processor specific defines -// - -/// -/// A value of native width with the highest bit set. -/// -#define MAX_BIT 0x80000000 - -/// -/// A value of native width with the two highest bits set. -/// -#define MAX_2_BITS 0xC0000000 - -/// -/// Maximum legal ARM address -/// -#define MAX_ADDRESS 0xFFFFFFFF - -/// -/// The stack alignment required for ARM -/// -#define CPU_STACK_ALIGNMENT sizeof(UINT64) - -// -// Modifier to ensure that all protocol member functions and EFI intrinsics -// use the correct C calling convention. All protocol member functions and -// EFI intrinsics are required to modify their member functions with EFIAPI. -// -#define EFIAPI - -#if defined(__GNUC__) - /// - /// For GNU assembly code, .global or .globl can declare global symbols. - /// Define this macro to unify the usage. - /// - #define ASM_GLOBAL .globl - - #if !defined(__APPLE__) - /// - /// ARM EABI defines that the linker should not manipulate call relocations - /// (do bl/blx conversion) unless the target symbol has function type. - /// CodeSourcery 2010.09 started requiring the .type to function properly - /// - #define INTERWORK_FUNC(func__) .type ASM_PFX(func__), %function - - #define GCC_ASM_EXPORT(func__) \ - .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ - .type ASM_PFX(func__), %function - - #define GCC_ASM_IMPORT(func__) \ - .extern _CONCATENATE (__USER_LABEL_PREFIX__, func__) - - #else - // - // .type not supported by Apple Xcode tools - // - #define INTERWORK_FUNC(func__) - - #define GCC_ASM_EXPORT(func__) \ - .globl _CONCATENATE (__USER_LABEL_PREFIX__, func__) \ - - #define GCC_ASM_IMPORT(name) - - #endif -#endif - -/** - Return the pointer to the first instruction of a function given a function pointer. - On ARM CPU architectures, these two pointer values are the same, - so the implementation of this macro is very simple. - - @param FunctionPointer A pointer to a function. - - @return The pointer to the first instruction of a function given a function pointer. - -**/ -#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer) - -#endif - - +/** @file + Processor or Compiler specific defines and types for ARM. + + Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
    + Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef __PROCESSOR_BIND_H__ +#define __PROCESSOR_BIND_H__ + +/// +/// Define the processor type so other code can make processor based choices +/// +#define MDE_CPU_ARM + +// +// Make sure we are using the correct packing rules per EFI specification +// +#ifndef __GNUC__ +#pragma pack() +#endif + +#if _MSC_EXTENSIONS + // + // use Microsoft* C complier dependent integer width types + // + typedef unsigned __int64 UINT64; + typedef __int64 INT64; + typedef unsigned __int32 UINT32; + typedef __int32 INT32; + typedef unsigned short UINT16; + typedef unsigned short CHAR16; + typedef short INT16; + typedef unsigned char BOOLEAN; + typedef unsigned char UINT8; + typedef char CHAR8; + typedef signed char INT8; +#else + // + // Assume standard ARM alignment. + // + typedef unsigned long long UINT64; + typedef long long INT64; + typedef unsigned int UINT32; + typedef int INT32; + typedef unsigned short UINT16; + typedef unsigned short CHAR16; + typedef short INT16; + typedef unsigned char BOOLEAN; + typedef unsigned char UINT8; + typedef char CHAR8; + typedef signed char INT8; + + #define UINT8_MAX 0xff +#endif + +/// +/// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions, +/// 8 bytes on supported 64-bit processor instructions) +/// +typedef UINT32 UINTN; + +/// +/// Signed value of native width. (4 bytes on supported 32-bit processor instructions, +/// 8 bytes on supported 64-bit processor instructions) +/// +typedef INT32 INTN; + +// +// Processor specific defines +// + +/// +/// A value of native width with the highest bit set. +/// +#define MAX_BIT 0x80000000 + +/// +/// A value of native width with the two highest bits set. +/// +#define MAX_2_BITS 0xC0000000 + +/// +/// Maximum legal ARM address +/// +#define MAX_ADDRESS 0xFFFFFFFF + +/// +/// The stack alignment required for ARM +/// +#define CPU_STACK_ALIGNMENT sizeof(UINT64) + +// +// Modifier to ensure that all protocol member functions and EFI intrinsics +// use the correct C calling convention. All protocol member functions and +// EFI intrinsics are required to modify their member functions with EFIAPI. +// +#define EFIAPI + +#if defined(__GNUC__) + /// + /// For GNU assembly code, .global or .globl can declare global symbols. + /// Define this macro to unify the usage. + /// + #define ASM_GLOBAL .globl + + #if !defined(__APPLE__) + /// + /// ARM EABI defines that the linker should not manipulate call relocations + /// (do bl/blx conversion) unless the target symbol has function type. + /// CodeSourcery 2010.09 started requiring the .type to function properly + /// + #define INTERWORK_FUNC(func__) .type ASM_PFX(func__), %function + + #define GCC_ASM_EXPORT(func__) \ + .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ + .type ASM_PFX(func__), %function + + #define GCC_ASM_IMPORT(func__) \ + .extern _CONCATENATE (__USER_LABEL_PREFIX__, func__) + + #else + // + // .type not supported by Apple Xcode tools + // + #define INTERWORK_FUNC(func__) + + #define GCC_ASM_EXPORT(func__) \ + .globl _CONCATENATE (__USER_LABEL_PREFIX__, func__) \ + + #define GCC_ASM_IMPORT(name) + + #endif +#endif + +/** + Return the pointer to the first instruction of a function given a function pointer. + On ARM CPU architectures, these two pointer values are the same, + so the implementation of this macro is very simple. + + @param FunctionPointer A pointer to a function. + + @return The pointer to the first instruction of a function given a function pointer. + +**/ +#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer) + +#endif + + diff --git a/BaseTools/Source/C/Include/Common/BuildVersion.h b/BaseTools/Source/C/Include/Common/BuildVersion.h index dd9852bad3..d3ad7c265b 100644 --- a/BaseTools/Source/C/Include/Common/BuildVersion.h +++ b/BaseTools/Source/C/Include/Common/BuildVersion.h @@ -14,4 +14,4 @@ **/ -#define __BUILD_VERSION "Build 2640" +#define __BUILD_VERSION "Build 2649" diff --git a/BaseTools/Source/C/Makefiles/NmakeSubdirs.bat b/BaseTools/Source/C/Makefiles/NmakeSubdirs.bat index 25b8790ac5..fac89bd9ee 100644 --- a/BaseTools/Source/C/Makefiles/NmakeSubdirs.bat +++ b/BaseTools/Source/C/Makefiles/NmakeSubdirs.bat @@ -7,7 +7,7 @@ @REM # http://opensource.org/licenses/bsd-license.php @REM # @REM # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -@REM # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +@REM # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. @echo off diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index ed2e2fba08..19269a13a9 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -1,27 +1,27 @@ -## @file -# -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -MAKEROOT ?= ../.. - -include $(MAKEROOT)/Makefiles/header.makefile - -APPLICATION = $(MAKEROOT)/bin/$(APPNAME) - -.PHONY:all -all: $(MAKEROOT)/bin $(APPLICATION) - -$(APPLICATION): $(OBJECTS) - $(LINKER) -o $(APPLICATION) $(LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) - -$(OBJECTS): ../Include/Common/BuildVersion.h - -include $(MAKEROOT)/Makefiles/footer.makefile +## @file +# +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +MAKEROOT ?= ../.. + +include $(MAKEROOT)/Makefiles/header.makefile + +APPLICATION = $(MAKEROOT)/bin/$(APPNAME) + +.PHONY:all +all: $(MAKEROOT)/bin $(APPLICATION) + +$(APPLICATION): $(OBJECTS) + $(LINKER) -o $(APPLICATION) $(LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) + +$(OBJECTS): ../Include/Common/BuildVersion.h + +include $(MAKEROOT)/Makefiles/footer.makefile diff --git a/BaseTools/Source/C/Makefiles/footer.makefile b/BaseTools/Source/C/Makefiles/footer.makefile index de7114257d..c10ad7aab4 100644 --- a/BaseTools/Source/C/Makefiles/footer.makefile +++ b/BaseTools/Source/C/Makefiles/footer.makefile @@ -7,28 +7,28 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -DEPFILES = $(OBJECTS:%.o=%.d) - -$(MAKEROOT)/libs-$(ARCH): - mkdir -p $(MAKEROOT)/libs-$(ARCH) - -.PHONY: install -install: $(MAKEROOT)/libs-$(ARCH) $(LIBRARY) - cp $(LIBRARY) $(MAKEROOT)/libs-$(ARCH) - -$(LIBRARY): $(OBJECTS) - $(AR) crs $@ $^ - -%.o : %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - -%.o : %.S - $(AS) -c $(ASFLAGS) $< -o $@ - -.PHONY: clean -clean: - @rm -f $(OBJECTS) $(LIBRARY) $(DEPFILES) - --include $(DEPFILES) +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +DEPFILES = $(OBJECTS:%.o=%.d) + +$(MAKEROOT)/libs-$(ARCH): + mkdir -p $(MAKEROOT)/libs-$(ARCH) + +.PHONY: install +install: $(MAKEROOT)/libs-$(ARCH) $(LIBRARY) + cp $(LIBRARY) $(MAKEROOT)/libs-$(ARCH) + +$(LIBRARY): $(OBJECTS) + $(AR) crs $@ $^ + +%.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + +%.o : %.S + $(AS) -c $(ASFLAGS) $< -o $@ + +.PHONY: clean +clean: + @rm -f $(OBJECTS) $(LIBRARY) $(DEPFILES) + +-include $(DEPFILES) diff --git a/BaseTools/Source/C/Makefiles/ms.app b/BaseTools/Source/C/Makefiles/ms.app index 7812175e7f..455549c121 100644 --- a/BaseTools/Source/C/Makefiles/ms.app +++ b/BaseTools/Source/C/Makefiles/ms.app @@ -7,28 +7,28 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -!INCLUDE ..\Makefiles\ms.common - -APPLICATION = $(BIN_PATH)\$(APPNAME).exe - -all: $(APPLICATION) - -$(APPLICATION) : $(OBJECTS) - -@if not exist $(BIN_PATH) mkdir $(BIN_PATH) - $(LD) /nologo /debug /incremental:no /nodefaultlib:libc.lib /out:$@ $(LIBS) $** - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +!INCLUDE ..\Makefiles\ms.common + +APPLICATION = $(BIN_PATH)\$(APPNAME).exe + +all: $(APPLICATION) + +$(APPLICATION) : $(OBJECTS) + -@if not exist $(BIN_PATH) mkdir $(BIN_PATH) + $(LD) /nologo /debug /incremental:no /nodefaultlib:libc.lib /out:$@ $(LIBS) $** + $(OBJECTS) : ..\Include\Common\BuildVersion.h -.PHONY:clean -.PHONY:cleanall - -clean: - del /f /q $(OBJECTS) *.pdb > nul - -cleanall: - del /f /q $(OBJECTS) $(APPLICATION) *.pdb $(BIN_PATH)\*.pdb > nul - -!INCLUDE ..\Makefiles\ms.rule - +.PHONY:clean +.PHONY:cleanall + +clean: + del /f /q $(OBJECTS) *.pdb > nul + +cleanall: + del /f /q $(OBJECTS) $(APPLICATION) *.pdb $(BIN_PATH)\*.pdb > nul + +!INCLUDE ..\Makefiles\ms.rule + diff --git a/BaseTools/Source/C/Makefiles/ms.common b/BaseTools/Source/C/Makefiles/ms.common index d2fbc453ee..fa9ffba563 100644 --- a/BaseTools/Source/C/Makefiles/ms.common +++ b/BaseTools/Source/C/Makefiles/ms.common @@ -7,54 +7,54 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -!IFNDEF EDK_TOOLS_PATH -!ERROR "Please set your EDK_TOOLS_PATH!" -!ENDIF - -!IFNDEF BASE_TOOLS_PATH -!ERROR "BASE_TOOLS_PATH is not set! Please run build_tools.bat at first!" -!ENDIF - -!IFNDEF ARCH -ARCH = IA32 -!ENDIF - -MAKE = nmake -nologo - -SOURCE_PATH = $(BASE_TOOLS_PATH)\Source\C -BIN_PATH = $(BASE_TOOLS_PATH)\Bin -LIB_PATH = $(BASE_TOOLS_PATH)\Lib - -SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin -SYS_LIB_PATH=$(EDK_TOOLS_PATH)\Lib - -!IF "$(ARCH)"=="IA32" -ARCH_INCLUDE = $(SOURCE_PATH)\Include\Ia32 -BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win32 -LIB_PATH = $(BASE_TOOLS_PATH)\Lib\Win32 -SYS_BIN_PATH = $(EDK_TOOLS_PATH)\Bin\Win32 -SYS_LIB_PATH = $(EDK_TOOLS_PATH)\Lib\Win32 -!ENDIF - -!IF "$(ARCH)"=="X64" -ARCH_INCLUDE = $(SOURCE_PATH)\Include\X64 -BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win64 -LIB_PATH = $(BASE_TOOLS_PATH)\Lib\Win64 -SYS_BIN_PATH = $(EDK_TOOLS_PATH)\Bin\Win64 -SYS_LIB_PATH = $(EDK_TOOLS_PATH)\Lib\Win64 -!ENDIF - -CC = cl.exe -CXX = cl.exe -AS = ml.exe -AR = lib.exe -LD = link.exe -LINKER = $(LD) - -INC = -I . -I $(SOURCE_PATH)\Include -I $(ARCH_INCLUDE) -I $(SOURCE_PATH)\Common $(INC) - -CFLAGS = $(CFLAGS) /nologo /c /Zi /Od /RTC1 /D _DEBUG /MTd /W4 /WX /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE -CPPFLAGS = $(CPPFLAGS) /EHsc /nologo /c /Zi /Od /RTC1 /D _DEBUG /MTd /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +!IFNDEF EDK_TOOLS_PATH +!ERROR "Please set your EDK_TOOLS_PATH!" +!ENDIF + +!IFNDEF BASE_TOOLS_PATH +!ERROR "BASE_TOOLS_PATH is not set! Please run build_tools.bat at first!" +!ENDIF + +!IFNDEF ARCH +ARCH = IA32 +!ENDIF + +MAKE = nmake -nologo + +SOURCE_PATH = $(BASE_TOOLS_PATH)\Source\C +BIN_PATH = $(BASE_TOOLS_PATH)\Bin +LIB_PATH = $(BASE_TOOLS_PATH)\Lib + +SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin +SYS_LIB_PATH=$(EDK_TOOLS_PATH)\Lib + +!IF "$(ARCH)"=="IA32" +ARCH_INCLUDE = $(SOURCE_PATH)\Include\Ia32 +BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win32 +LIB_PATH = $(BASE_TOOLS_PATH)\Lib\Win32 +SYS_BIN_PATH = $(EDK_TOOLS_PATH)\Bin\Win32 +SYS_LIB_PATH = $(EDK_TOOLS_PATH)\Lib\Win32 +!ENDIF + +!IF "$(ARCH)"=="X64" +ARCH_INCLUDE = $(SOURCE_PATH)\Include\X64 +BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win64 +LIB_PATH = $(BASE_TOOLS_PATH)\Lib\Win64 +SYS_BIN_PATH = $(EDK_TOOLS_PATH)\Bin\Win64 +SYS_LIB_PATH = $(EDK_TOOLS_PATH)\Lib\Win64 +!ENDIF + +CC = cl.exe +CXX = cl.exe +AS = ml.exe +AR = lib.exe +LD = link.exe +LINKER = $(LD) + +INC = -I . -I $(SOURCE_PATH)\Include -I $(ARCH_INCLUDE) -I $(SOURCE_PATH)\Common $(INC) + +CFLAGS = $(CFLAGS) /nologo /c /Zi /Od /RTC1 /D _DEBUG /MTd /W4 /WX /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE +CPPFLAGS = $(CPPFLAGS) /EHsc /nologo /c /Zi /Od /RTC1 /D _DEBUG /MTd /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE + diff --git a/BaseTools/Source/C/Makefiles/ms.lib b/BaseTools/Source/C/Makefiles/ms.lib index 0e418f3c8f..55f6a23118 100644 --- a/BaseTools/Source/C/Makefiles/ms.lib +++ b/BaseTools/Source/C/Makefiles/ms.lib @@ -7,25 +7,25 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -!INCLUDE ..\Makefiles\ms.common - -LIBRARY = $(LIB_PATH)\$(LIBNAME).lib - -all: $(LIBRARY) - -$(LIBRARY) : $(OBJECTS) - -@if not exist $(LIB_PATH) mkdir $(LIB_PATH) - $(AR) /nologo /out:$@ $** - -.PHONY:clean -clean: - del /f /q $(OBJECTS) *.pdb > nul - -.PHONY:cleanall -cleanall: - del /f /q $(OBJECTS) $(LIBRARY) *.pdb > nul - -!INCLUDE ..\Makefiles\ms.rule - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +!INCLUDE ..\Makefiles\ms.common + +LIBRARY = $(LIB_PATH)\$(LIBNAME).lib + +all: $(LIBRARY) + +$(LIBRARY) : $(OBJECTS) + -@if not exist $(LIB_PATH) mkdir $(LIB_PATH) + $(AR) /nologo /out:$@ $** + +.PHONY:clean +clean: + del /f /q $(OBJECTS) *.pdb > nul + +.PHONY:cleanall +cleanall: + del /f /q $(OBJECTS) $(LIBRARY) *.pdb > nul + +!INCLUDE ..\Makefiles\ms.rule + diff --git a/BaseTools/Source/C/Makefiles/ms.rule b/BaseTools/Source/C/Makefiles/ms.rule index afbd5dcc4b..b73e504b29 100644 --- a/BaseTools/Source/C/Makefiles/ms.rule +++ b/BaseTools/Source/C/Makefiles/ms.rule @@ -7,18 +7,18 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -#DEPFILES = $(OBJECTS:%.o=%.d) - -.c.obj : - $(CC) -c $(CFLAGS) $(INC) $< -Fo$@ - -.S.obj : - $(AS) -c $(ASFLAGS) $< -Fo$@ - -.cpp.obj : - $(CXX) -c $(CPPFLAGS) $(INC) $< -Fo$@ - -#-include $(DEPFILES) - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +#DEPFILES = $(OBJECTS:%.o=%.d) + +.c.obj : + $(CC) -c $(CFLAGS) $(INC) $< -Fo$@ + +.S.obj : + $(AS) -c $(ASFLAGS) $< -Fo$@ + +.cpp.obj : + $(CXX) -c $(CPPFLAGS) $(INC) $< -Fo$@ + +#-include $(DEPFILES) + diff --git a/BaseTools/Source/C/PyEfiCompressor/Makefile b/BaseTools/Source/C/PyEfiCompressor/Makefile index d52a3454b7..fdd2e391cb 100644 --- a/BaseTools/Source/C/PyEfiCompressor/Makefile +++ b/BaseTools/Source/C/PyEfiCompressor/Makefile @@ -7,17 +7,17 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -!INCLUDE ..\Makefiles\ms.common - -APPNAME = GenSec - -LIBS = $(LIB_PATH)\Common.lib - -OBJECTS = GenSec.obj - -#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib - -!INCLUDE ..\Makefiles\ms.app - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +!INCLUDE ..\Makefiles\ms.common + +APPNAME = GenSec + +LIBS = $(LIB_PATH)\Common.lib + +OBJECTS = GenSec.obj + +#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib + +!INCLUDE ..\Makefiles\ms.app + diff --git a/BaseTools/Source/C/PyUtility/Makefile b/BaseTools/Source/C/PyUtility/Makefile index 71d4d542bd..0cc9ad7987 100644 --- a/BaseTools/Source/C/PyUtility/Makefile +++ b/BaseTools/Source/C/PyUtility/Makefile @@ -7,17 +7,17 @@ # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -!INCLUDE ..\Makefiles\ms.common - -APPNAME = GenSec - -LIBS = $(LIB_PATH)\Common.lib - -OBJECTS = PyUtility.obj - -#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib - -!INCLUDE ..\Makefiles\ms.app - +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +!INCLUDE ..\Makefiles\ms.common + +APPNAME = GenSec + +LIBS = $(LIB_PATH)\Common.lib + +OBJECTS = PyUtility.obj + +#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib + +!INCLUDE ..\Makefiles\ms.app + diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp index addff24cf6..6dfc118eea 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp @@ -82,7 +82,7 @@ SPendingAssign::AssignValue ( IN UINT32 Len ) { - memcpy (mAddr, Addr, (mLen < Len ? mLen : Len)); + memmove (mAddr, Addr, (mLen < Len ? mLen : Len)); mFlag = ASSIGNED; } @@ -685,7 +685,7 @@ CFormPkg::AdjustDynamicInsertOpcode ( // // Override the restore buffer data. // - memcpy (LastFormEndAddr, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr); + memmove (LastFormEndAddr, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr); InsertOpcodeNode->mBufferFree -= NeedRestoreCodeLen; memset (InsertOpcodeNode->mBufferFree, 0, NeedRestoreCodeLen); } else { @@ -733,7 +733,7 @@ CFormPkg::AdjustDynamicInsertOpcode ( // // Override the restore buffer data. // - memcpy (InsertOpcodeNode->mBufferStart, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr); + memmove (InsertOpcodeNode->mBufferStart, InsertOpcodeAddr, InsertOpcodeNode->mBufferFree - InsertOpcodeAddr); InsertOpcodeNode->mBufferFree -= InsertOpcodeAddr - InsertOpcodeNode->mBufferStart; // @@ -1542,7 +1542,7 @@ CIfrObj::_EMIT_PENDING_OBJ ( // ObjBinBuf = gCFormPkg.IfrBinBufferGet (mObjBinLen); if (ObjBinBuf != NULL) { - memcpy (ObjBinBuf, mObjBinBuf, mObjBinLen); + memmove (ObjBinBuf, mObjBinBuf, mObjBinLen); } // diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h index 25280def9b..c69518af76 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h @@ -368,7 +368,7 @@ public: VOID VARSTORE_INFO (OUT EFI_VARSTORE_INFO *Info) { if (Info != NULL) { Info->mVarStoreId = mHeader->VarStoreId; - memcpy (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId)); + memmove (&Info->mVarStoreId, &mHeader->VarStoreInfo, sizeof (Info->mVarStoreId)); } } @@ -615,7 +615,7 @@ public: } VOID SetGuid (IN EFI_GUID *Guid) { - memcpy (&mFormSet->Guid, Guid, sizeof (EFI_GUID)); + memmove (&mFormSet->Guid, Guid, sizeof (EFI_GUID)); } VOID SetFormSetTitle (IN EFI_STRING_ID FormSetTitle) { @@ -627,7 +627,7 @@ public: } VOID SetClassGuid (IN EFI_GUID *Guid) { - memcpy (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID)); + memmove (&(mClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID)); } UINT8 GetFlags() { @@ -749,7 +749,7 @@ public: IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD)); mMethodMap->MethodTitle = MethodTitle; - memcpy (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID)); + memmove (&(mMethodMap->MethodIdentifier), MethodGuid, sizeof (EFI_GUID)); mMethodMap ++; } } @@ -769,7 +769,7 @@ public: } VOID SetGuid (IN EFI_GUID *Guid) { - memcpy (&mVarStore->Guid, Guid, sizeof (EFI_GUID)); + memmove (&mVarStore->Guid, Guid, sizeof (EFI_GUID)); } VOID SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId) { @@ -809,7 +809,7 @@ public: } VOID SetGuid (IN EFI_GUID *Guid) { - memcpy (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID)); + memmove (&mVarStoreEfi->Guid, Guid, sizeof (EFI_GUID)); } VOID SetVarStoreId (IN UINT16 VarStoreId) { @@ -863,7 +863,7 @@ public: } VOID SetGuid (IN EFI_GUID *Guid) { - memcpy (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID)); + memmove (&mVarStoreNameValue->Guid, Guid, sizeof (EFI_GUID)); } VOID SetVarStoreId (IN UINT16 VarStoreId) { @@ -938,7 +938,7 @@ public: CIfrOpHeader (EFI_IFR_DEFAULT_OP, &mDefault->Header, Size) { mDefault->Type = Type; mDefault->DefaultId = DefaultId; - memcpy (&(mDefault->Value), &Value, Size - OFFSET_OF (EFI_IFR_DEFAULT, Value)); + memmove (&(mDefault->Value), &Value, Size - OFFSET_OF (EFI_IFR_DEFAULT, Value)); } VOID SetDefaultId (IN UINT16 DefaultId) { @@ -950,7 +950,7 @@ public: } VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) { - memcpy (&mDefault->Value, &Value, mDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value)); + memmove (&mDefault->Value, &Value, mDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value)); } }; @@ -1673,7 +1673,7 @@ public: } VOID SetRefreshEventGroutId (IN EFI_GUID *RefreshEventGroupId) { - memcpy (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID)); + memmove (&mRefreshId->RefreshEventGroupId, RefreshEventGroupId, sizeof (EFI_GUID)); } }; @@ -1755,7 +1755,7 @@ public: } VOID SetValue (IN EFI_IFR_TYPE_VALUE Value) { - memcpy (&mOneOfOption->Value, &Value, mOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value)); + memmove (&mOneOfOption->Value, &Value, mOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value)); } UINT8 GetFlags (VOID) { @@ -1904,11 +1904,11 @@ public: } VOID SetGuid (IN EFI_GUID *Guid) { - memcpy (&mGuid->Guid, Guid, sizeof (EFI_GUID)); + memmove (&mGuid->Guid, Guid, sizeof (EFI_GUID)); } VOID SetData (IN UINT8* DataBuff, IN UINT8 Size) { - memcpy ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size); + memmove ((UINT8 *)mGuid + sizeof (EFI_IFR_GUID), DataBuff, Size); } }; @@ -2214,7 +2214,7 @@ public: } VOID SetPermissions (IN EFI_GUID *Permissions) { - memcpy (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID)); + memmove (&mSecurity->Permissions, Permissions, sizeof (EFI_GUID)); } }; diff --git a/BaseTools/Source/C/VolInfo/VolInfo.c b/BaseTools/Source/C/VolInfo/VolInfo.c index 7d127e1691..0f54c2a429 100644 --- a/BaseTools/Source/C/VolInfo/VolInfo.c +++ b/BaseTools/Source/C/VolInfo/VolInfo.c @@ -1,1826 +1,1826 @@ -/** @file - -Copyright (c) 1999 - 2011, Intel Corporation. All rights reserved.
    -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - VolInfo.c - -Abstract: - - The tool dumps the contents of a firmware volume - -**/ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Compress.h" -#include "Decompress.h" -#include "VolInfo.h" -#include "CommonLib.h" -#include "EfiUtilityMsgs.h" -#include "FirmwareVolumeBufferLib.h" -#include "OsPath.h" -#include "ParseGuidedSectionTools.h" -#include "StringFuncs.h" - -// -// Utility global variables -// - -EFI_GUID gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID; - -#define UTILITY_MAJOR_VERSION 0 -#define UTILITY_MINOR_VERSION 82 - -#define UTILITY_NAME "VolInfo" - -#define EFI_SECTION_ERROR EFIERR (100) - -#define MAX_BASENAME_LEN 60 // not good to hardcode, but let's be reasonable - -// -// Structure to keep a list of guid-to-basenames -// -typedef struct _GUID_TO_BASENAME { - struct _GUID_TO_BASENAME *Next; - INT8 Guid[PRINTED_GUID_BUFFER_SIZE]; - INT8 BaseName[MAX_BASENAME_LEN]; -} GUID_TO_BASENAME; - -static GUID_TO_BASENAME *mGuidBaseNameList = NULL; - -// -// Store GUIDed Section guid->tool mapping -// -EFI_HANDLE mParsedGuidedSectionTools = NULL; - -CHAR8* mUtilityFilename = NULL; - -EFI_STATUS -ParseGuidBaseNameFile ( - CHAR8 *FileName - ); - -EFI_STATUS -FreeGuidBaseNameList ( - VOID - ); - -EFI_STATUS -PrintGuidName ( - IN UINT8 *GuidStr - ); - -EFI_STATUS -ParseSection ( - IN UINT8 *SectionBuffer, - IN UINT32 BufferLength - ); - -EFI_STATUS -DumpDepexSection ( - IN UINT8 *Ptr, - IN UINT32 SectionLength - ); - -STATIC -EFI_STATUS -ReadHeader ( - IN FILE *InputFile, - OUT UINT32 *FvSize, - OUT BOOLEAN *ErasePolarity - ); - -STATIC -EFI_STATUS -PrintFileInfo ( - EFI_FIRMWARE_VOLUME_HEADER *FvImage, - EFI_FFS_FILE_HEADER *FileHeader, - BOOLEAN ErasePolarity - ); - -static -EFI_STATUS -PrintFvInfo ( - IN VOID *Fv, - IN BOOLEAN IsChildFv - ); - -static -VOID -LoadGuidedSectionToolsTxt ( - IN CHAR8* FirmwareVolumeFilename - ); - -void -Usage ( - VOID - ); - -int -main ( - int argc, - char *argv[] - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - argc - GC_TODO: add argument description - ] - GC_TODO: add argument description - -Returns: - - GC_TODO: add return values - ---*/ -{ - FILE *InputFile; - int BytesRead; - EFI_FIRMWARE_VOLUME_HEADER *FvImage; - UINT32 FvSize; - EFI_STATUS Status; - int Offset; - BOOLEAN ErasePolarity; - - SetUtilityName (UTILITY_NAME); - // - // Print utility header - // - printf ("%s Tiano Firmware Volume FFS image info. Version %d.%d %s, %s\n", - UTILITY_NAME, - UTILITY_MAJOR_VERSION, - UTILITY_MINOR_VERSION, - __BUILD_VERSION, - __DATE__ - ); - - // - // Save, and then skip filename arg - // - mUtilityFilename = argv[0]; - argc--; - argv++; - - Offset = 0; - - // - // If they specified -x xref guid/basename cross-reference files, process it. - // This will print the basename beside each file guid. To use it, specify - // -x xref_filename to processdsc, then use xref_filename as a parameter - // here. - // - while (argc > 2) { - if ((strcmp(argv[0], "-x") == 0) || (strcmp(argv[0], "--xref") == 0)) { - ParseGuidBaseNameFile (argv[1]); - printf("ParseGuidBaseNameFile: %s\n", argv[1]); - argc -= 2; - argv += 2; - } else if (strcmp(argv[0], "--offset") == 0) { - // - // Hex or decimal? - // - if ((argv[1][0] == '0') && (tolower ((int)argv[1][1]) == 'x')) { - if (sscanf (argv[1], "%x", &Offset) != 1) { - Error (NULL, 0, 1003, "Invalid option value", "Offset = %s", argv[1]); - return GetUtilityStatus (); - } - } else { - if (sscanf (argv[1], "%d", &Offset) != 1) { - Error (NULL, 0, 1003, "Invalid option value", "Offset = %s", argv[1]); - return GetUtilityStatus (); - } - // - // See if they said something like "64K" - // - if (tolower ((int)argv[1][strlen (argv[1]) - 1]) == 'k') { - Offset *= 1024; - } - } - - argc -= 2; - argv += 2; - } else { - Usage (); - return -1; - } - } - // - // Check for proper number of arguments - // - if (argc != 1) { - Usage (); - return -1; - } - // - // Look for help options - // - if ((strcmp(argv[0], "-h") == 0) || (strcmp(argv[0], "--help") == 0) || - (strcmp(argv[0], "-?") == 0) || (strcmp(argv[0], "/?") == 0)) { - Usage(); - return STATUS_ERROR; - } - - // - // Open the file containing the FV - // - InputFile = fopen (argv[0], "rb"); - if (InputFile == NULL) { - Error (NULL, 0, 0001, "Error opening the input file", argv[0]); - return GetUtilityStatus (); - } - // - // Skip over pad bytes if specified. This is used if they prepend 0xff - // data to the FV image binary. - // - if (Offset != 0) { - fseek (InputFile, Offset, SEEK_SET); - } - // - // Determine size of FV - // - Status = ReadHeader (InputFile, &FvSize, &ErasePolarity); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "error parsing FV image", "%s Header is invalid", argv[0]); - fclose (InputFile); - return GetUtilityStatus (); - } - // - // Allocate a buffer for the FV image - // - FvImage = malloc (FvSize); - if (FvImage == NULL) { - Error (NULL, 0, 4001, "Resource: Memory can't be allocated", NULL); - fclose (InputFile); - return GetUtilityStatus (); - } - // - // Seek to the start of the image, then read the entire FV to the buffer - // - fseek (InputFile, Offset, SEEK_SET); - BytesRead = fread (FvImage, 1, FvSize, InputFile); - fclose (InputFile); - if ((unsigned int) BytesRead != FvSize) { - Error (NULL, 0, 0004, "error reading FvImage from", argv[0]); - free (FvImage); - return GetUtilityStatus (); - } - - LoadGuidedSectionToolsTxt (argv[0]); - - PrintFvInfo (FvImage, FALSE); - - // - // Clean up - // - free (FvImage); - FreeGuidBaseNameList (); - return GetUtilityStatus (); -} - - -static -EFI_STATUS -PrintFvInfo ( - IN VOID *Fv, - IN BOOLEAN IsChildFv - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - Fv - Firmware Volume to print information about - IsChildFv - Flag specifies whether the input FV is a child FV. - -Returns: - - EFI_STATUS - ---*/ -{ - EFI_STATUS Status; - UINTN NumberOfFiles; - BOOLEAN ErasePolarity; - UINTN FvSize; - EFI_FFS_FILE_HEADER *CurrentFile; - UINTN Key; - - Status = FvBufGetSize (Fv, &FvSize); - - NumberOfFiles = 0; - ErasePolarity = - (((EFI_FIRMWARE_VOLUME_HEADER*)Fv)->Attributes & EFI_FVB2_ERASE_POLARITY) ? - TRUE : FALSE; - - // - // Get the first file - // - Key = 0; - Status = FvBufFindNextFile (Fv, &Key, (VOID **) &CurrentFile); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "error parsing FV image", "cannot find the first file in the FV image"); - return GetUtilityStatus (); - } - // - // Display information about files found - // - while (CurrentFile != NULL) { - // - // Increment the number of files counter - // - NumberOfFiles++; - - // - // Display info about this file - // - Status = PrintFileInfo (Fv, CurrentFile, ErasePolarity); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "error parsing FV image", "failed to parse a file in the FV"); - return GetUtilityStatus (); - } - // - // Get the next file - // - Status = FvBufFindNextFile (Fv, &Key, (VOID **) &CurrentFile); - if (Status == EFI_NOT_FOUND) { - CurrentFile = NULL; - } else if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "error parsing FV image", "cannot find the next file in the FV image"); - return GetUtilityStatus (); - } - } - - if (IsChildFv) { - printf ("There are a total of %d files in the child FV\n", (int) NumberOfFiles); - } else { - printf ("There are a total of %d files in this FV\n", (int) NumberOfFiles); - } - - return EFI_SUCCESS; -} - -UINT32 -GetOccupiedSize ( - IN UINT32 ActualSize, - IN UINT32 Alignment - ) -/*++ - -Routine Description: - - This function returns the next larger size that meets the alignment - requirement specified. - -Arguments: - - ActualSize The size. - Alignment The desired alignment. - -Returns: - - EFI_SUCCESS Function completed successfully. - EFI_ABORTED The function encountered an error. - ---*/ -{ - UINT32 OccupiedSize; - - OccupiedSize = ActualSize; - while ((OccupiedSize & (Alignment - 1)) != 0) { - OccupiedSize++; - } - - return OccupiedSize; -} - -static -CHAR8 * -SectionNameToStr ( - IN EFI_SECTION_TYPE Type - ) -/*++ - -Routine Description: - - Converts EFI Section names to Strings - -Arguments: - - Type - The EFI Section type - -Returns: - - CHAR8* - Pointer to the String containing the section name. - ---*/ -{ - CHAR8 *SectionStr; - CHAR8 *SectionTypeStringTable[] = { - // - // 0X00 - // - "EFI_SECTION_ALL", - // - // 0x01 - // - "EFI_SECTION_COMPRESSION", - // - // 0x02 - // - "EFI_SECTION_GUID_DEFINED", - // - // 0x03 - // - "Unknown section type - Reserved 0x03", - // - // 0x04 - // - "Unknown section type - Reserved 0x04", - // - // 0x05 - // - "Unknown section type - Reserved 0x05", - // - // 0x06 - // - "Unknown section type - Reserved 0x06", - // - // 0x07 - // - "Unknown section type - Reserved 0x07", - // - // 0x08 - // - "Unknown section type - Reserved 0x08", - // - // 0x09 - // - "Unknown section type - Reserved 0x09", - // - // 0x0A - // - "Unknown section type - Reserved 0x0A", - // - // 0x0B - // - "Unknown section type - Reserved 0x0B", - // - // 0x0C - // - "Unknown section type - Reserved 0x0C", - // - // 0x0D - // - "Unknown section type - Reserved 0x0D", - // - // 0x0E - // - "Unknown section type - Reserved 0x0E", - // - // 0x0F - // - "Unknown section type - Reserved 0x0E", - // - // 0x10 - // - "EFI_SECTION_PE32", - // - // 0x11 - // - "EFI_SECTION_PIC", - // - // 0x12 - // - "EFI_SECTION_TE", - // - // 0x13 - // - "EFI_SECTION_DXE_DEPEX", - // - // 0x14 - // - "EFI_SECTION_VERSION", - // - // 0x15 - // - "EFI_SECTION_USER_INTERFACE", - // - // 0x16 - // - "EFI_SECTION_COMPATIBILITY16", - // - // 0x17 - // - "EFI_SECTION_FIRMWARE_VOLUME_IMAGE ", - // - // 0x18 - // - "EFI_SECTION_FREEFORM_SUBTYPE_GUID ", - // - // 0x19 - // - "EFI_SECTION_RAW", - // - // 0x1A - // - "Unknown section type - 0x1A", - // - // 0x1B - // - "EFI_SECTION_PEI_DEPEX", - // - // 0x1C - // - "EFI_SECTION_SMM_DEPEX", - // - // 0x1C+ - // - "Unknown section type - Reserved - beyond last defined section" - }; - - if (Type > EFI_SECTION_LAST_SECTION_TYPE) { - Type = EFI_SECTION_LAST_SECTION_TYPE + 1; - } - - SectionStr = malloc (100); - if (SectionStr == NULL) { - printf ("Error: Out of memory resources.\n"); - return SectionStr; - } - strcpy (SectionStr, SectionTypeStringTable[Type]); - return SectionStr; -} - -STATIC -EFI_STATUS -ReadHeader ( - IN FILE *InputFile, - OUT UINT32 *FvSize, - OUT BOOLEAN *ErasePolarity - ) -/*++ - -Routine Description: - - This function determines the size of the FV and the erase polarity. The - erase polarity is the FALSE value for file state. - -Arguments: - - InputFile The file that contains the FV image. - FvSize The size of the FV. - ErasePolarity The FV erase polarity. - -Returns: - - EFI_SUCCESS Function completed successfully. - EFI_INVALID_PARAMETER A required parameter was NULL or is out of range. - EFI_ABORTED The function encountered an error. - ---*/ -{ - EFI_FIRMWARE_VOLUME_HEADER VolumeHeader; - EFI_FV_BLOCK_MAP_ENTRY BlockMap; - UINTN Signature[2]; - UINTN BytesRead; - UINT32 Size; - - BytesRead = 0; - Size = 0; - // - // Check input parameters - // - if (InputFile == NULL || FvSize == NULL || ErasePolarity == NULL) { - Error (__FILE__, __LINE__, 0, "application error", "invalid parameter to function"); - return EFI_INVALID_PARAMETER; - } - // - // Read the header - // - fread (&VolumeHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile); - BytesRead = sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY); - Signature[0] = VolumeHeader.Signature; - Signature[1] = 0; - - // - // Print FV header information - // - printf ("Signature: %s (%X)\n", (char *) Signature, (unsigned) VolumeHeader.Signature); - printf ("Attributes: %X\n", (unsigned) VolumeHeader.Attributes); - - if (VolumeHeader.Attributes & EFI_FVB2_READ_DISABLED_CAP) { - printf (" EFI_FVB2_READ_DISABLED_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_READ_ENABLED_CAP) { - printf (" EFI_FVB2_READ_ENABLED_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_READ_STATUS) { - printf (" EFI_FVB2_READ_STATUS\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_WRITE_DISABLED_CAP) { - printf (" EFI_FVB2_WRITE_DISABLED_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_WRITE_ENABLED_CAP) { - printf (" EFI_FVB2_WRITE_ENABLED_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_WRITE_STATUS) { - printf (" EFI_FVB2_WRITE_STATUS\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_LOCK_CAP) { - printf (" EFI_FVB2_LOCK_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_LOCK_STATUS) { - printf (" EFI_FVB2_LOCK_STATUS\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_STICKY_WRITE) { - printf (" EFI_FVB2_STICKY_WRITE\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_MEMORY_MAPPED) { - printf (" EFI_FVB2_MEMORY_MAPPED\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ERASE_POLARITY) { - printf (" EFI_FVB2_ERASE_POLARITY\n"); - *ErasePolarity = TRUE; - } - -#if (PI_SPECIFICATION_VERSION < 0x00010000) - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT) { - printf (" EFI_FVB2_ALIGNMENT\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2) { - printf (" EFI_FVB2_ALIGNMENT_2\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4) { - printf (" EFI_FVB2_ALIGNMENT_4\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8) { - printf (" EFI_FVB2_ALIGNMENT_8\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16) { - printf (" EFI_FVB2_ALIGNMENT_16\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32) { - printf (" EFI_FVB2_ALIGNMENT_32\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64) { - printf (" EFI_FVB2_ALIGNMENT_64\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128) { - printf (" EFI_FVB2_ALIGNMENT_128\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256) { - printf (" EFI_FVB2_ALIGNMENT_256\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512) { - printf (" EFI_FVB2_ALIGNMENT_512\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1K) { - printf (" EFI_FVB2_ALIGNMENT_1K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2K) { - printf (" EFI_FVB2_ALIGNMENT_2K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4K) { - printf (" EFI_FVB2_ALIGNMENT_4K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8K) { - printf (" EFI_FVB2_ALIGNMENT_8K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16K) { - printf (" EFI_FVB2_ALIGNMENT_16K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32K) { - printf (" EFI_FVB2_ALIGNMENT_32K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) { - printf (" EFI_FVB2_ALIGNMENT_64K\n"); - } - -#else - - if (VolumeHeader.Attributes & EFI_FVB2_READ_LOCK_CAP) { - printf (" EFI_FVB2_READ_LOCK_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_READ_LOCK_STATUS) { - printf (" EFI_FVB2_READ_LOCK_STATUS\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_WRITE_LOCK_CAP) { - printf (" EFI_FVB2_WRITE_LOCK_CAP\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_WRITE_LOCK_STATUS) { - printf (" EFI_FVB2_WRITE_LOCK_STATUS\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1) { - printf (" EFI_FVB2_ALIGNMENT_1\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2) { - printf (" EFI_FVB2_ALIGNMENT_2\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4) { - printf (" EFI_FVB2_ALIGNMENT_4\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8) { - printf (" EFI_FVB2_ALIGNMENT_8\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16) { - printf (" EFI_FVB2_ALIGNMENT_16\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32) { - printf (" EFI_FVB2_ALIGNMENT_32\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64) { - printf (" EFI_FVB2_ALIGNMENT_64\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128) { - printf (" EFI_FVB2_ALIGNMENT_128\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256) { - printf (" EFI_FVB2_ALIGNMENT_256\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512) { - printf (" EFI_FVB2_ALIGNMENT_512\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1K) { - printf (" EFI_FVB2_ALIGNMENT_1K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2K) { - printf (" EFI_FVB2_ALIGNMENT_2K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4K) { - printf (" EFI_FVB2_ALIGNMENT_4K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8K) { - printf (" EFI_FVB2_ALIGNMENT_8K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16K) { - printf (" EFI_FVB2_ALIGNMENT_16K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32K) { - printf (" EFI_FVB2_ALIGNMENT_32K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) { - printf (" EFI_FVB2_ALIGNMENT_64K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128K) { - printf (" EFI_FVB2_ALIGNMENT_128K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256K) { - printf (" EFI_FVB2_ALIGNMENT_256K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512K) { - printf (" EFI_FVB2_ALIGNMENT_512K\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1M) { - printf (" EFI_FVB2_ALIGNMENT_1M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2M) { - printf (" EFI_FVB2_ALIGNMENT_2M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4M) { - printf (" EFI_FVB2_ALIGNMENT_4M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8M) { - printf (" EFI_FVB2_ALIGNMENT_8M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16M) { - printf (" EFI_FVB2_ALIGNMENT_16M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32M) { - printf (" EFI_FVB2_ALIGNMENT_32M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) { - printf (" EFI_FVB2_ALIGNMENT_64M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) { - printf (" EFI_FVB2_ALIGNMENT_128M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) { - printf (" EFI_FVB2_ALIGNMENT_64M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) { - printf (" EFI_FVB2_ALIGNMENT_128M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256M) { - printf (" EFI_FVB2_ALIGNMENT_256M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512M) { - printf (" EFI_FVB2_ALIGNMENT_512M\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1G) { - printf (" EFI_FVB2_ALIGNMENT_1G\n"); - } - - if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2G) { - printf (" EFI_FVB2_ALIGNMENT_2G\n"); - } - -#endif - printf ("Header Length: 0x%08X\n", VolumeHeader.HeaderLength); - printf ("File System ID: "); - PrintGuid (&VolumeHeader.FileSystemGuid); - // - // printf ("\n"); - // - printf ("Revision: 0x%04X\n", VolumeHeader.Revision); - - do { - fread (&BlockMap, sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile); - BytesRead += sizeof (EFI_FV_BLOCK_MAP_ENTRY); - - if (BlockMap.NumBlocks != 0) { - printf ("Number of Blocks: 0x%08X\n", (unsigned) BlockMap.NumBlocks); - printf ("Block Length: 0x%08X\n", (unsigned) BlockMap.Length); - Size += BlockMap.NumBlocks * BlockMap.Length; - } - - } while (!(BlockMap.NumBlocks == 0 && BlockMap.Length == 0)); - - if (BytesRead != VolumeHeader.HeaderLength) { - printf ("ERROR: Header length not consistent with Block Maps!\n"); - return EFI_ABORTED; - } - - if (VolumeHeader.FvLength != Size) { - printf ("ERROR: Volume Size not consistant with Block Maps!\n"); - return EFI_ABORTED; - } - - printf ("Total Volume Size: 0x%08X\n", (unsigned) Size); - - *FvSize = Size; - - // - // rewind (InputFile); - // - return EFI_SUCCESS; -} - -STATIC -EFI_STATUS -PrintFileInfo ( - EFI_FIRMWARE_VOLUME_HEADER *FvImage, - EFI_FFS_FILE_HEADER *FileHeader, - BOOLEAN ErasePolarity - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - FvImage - GC_TODO: add argument description - FileHeader - GC_TODO: add argument description - ErasePolarity - GC_TODO: add argument description - -Returns: - - EFI_SUCCESS - GC_TODO: Add description for return value - EFI_ABORTED - GC_TODO: Add description for return value - ---*/ -{ - UINT32 FileLength; - UINT8 FileState; - UINT8 Checksum; - EFI_FFS_FILE_HEADER BlankHeader; - EFI_STATUS Status; - UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; -#if (PI_SPECIFICATION_VERSION < 0x00010000) - UINT16 *Tail; -#endif - // - // Check if we have free space - // - if (ErasePolarity) { - memset (&BlankHeader, -1, sizeof (EFI_FFS_FILE_HEADER)); - } else { - memset (&BlankHeader, 0, sizeof (EFI_FFS_FILE_HEADER)); - } - - if (memcmp (&BlankHeader, FileHeader, sizeof (EFI_FFS_FILE_HEADER)) == 0) { - return EFI_SUCCESS; - } - // - // Print file information. - // - printf ("============================================================\n"); - - printf ("File Name: "); - PrintGuidToBuffer (&FileHeader->Name, GuidBuffer, sizeof (GuidBuffer), TRUE); - printf ("%s ", GuidBuffer); - PrintGuidName (GuidBuffer); - printf ("\n"); - - // - // PrintGuid (&FileHeader->Name); - // printf ("\n"); - // - FileLength = GetLength (FileHeader->Size); - printf ("File Offset: 0x%08X\n", (unsigned) ((UINTN) FileHeader - (UINTN) FvImage)); - printf ("File Length: 0x%08X\n", (unsigned) FileLength); - printf ("File Attributes: 0x%02X\n", FileHeader->Attributes); - printf ("File State: 0x%02X\n", FileHeader->State); - - // - // Print file state - // - FileState = GetFileState (ErasePolarity, FileHeader); - - switch (FileState) { - - case EFI_FILE_HEADER_CONSTRUCTION: - printf (" EFI_FILE_HEADER_CONSTRUCTION\n"); - return EFI_SUCCESS; - - case EFI_FILE_HEADER_INVALID: - printf (" EFI_FILE_HEADER_INVALID\n"); - return EFI_SUCCESS; - - case EFI_FILE_HEADER_VALID: - printf (" EFI_FILE_HEADER_VALID\n"); - Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER)); - Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File); - Checksum = (UINT8) (Checksum - FileHeader->State); - if (Checksum != 0) { - printf ("ERROR: Header checksum invalid.\n"); - return EFI_ABORTED; - } - - return EFI_SUCCESS; - - case EFI_FILE_DELETED: - printf (" EFI_FILE_DELETED\n"); - - case EFI_FILE_MARKED_FOR_UPDATE: - printf (" EFI_FILE_MARKED_FOR_UPDATE\n"); - - case EFI_FILE_DATA_VALID: - printf (" EFI_FILE_DATA_VALID\n"); - - // - // Calculate header checksum - // - Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER)); - Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File); - Checksum = (UINT8) (Checksum - FileHeader->State); - if (Checksum != 0) { - Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid header checksum", GuidBuffer); - return EFI_ABORTED; - } - - FileLength = GetLength (FileHeader->Size); - - if (FileHeader->Attributes & FFS_ATTRIB_CHECKSUM) { - // - // Calculate file checksum - // - Checksum = CalculateSum8 ((UINT8 *) (FileHeader + 1), FileLength - sizeof (EFI_FFS_FILE_HEADER)); - Checksum = Checksum + FileHeader->IntegrityCheck.Checksum.File; - if (Checksum != 0) { - Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid file checksum", GuidBuffer); - return EFI_ABORTED; - } - } else { - if (FileHeader->IntegrityCheck.Checksum.File != FFS_FIXED_CHECKSUM) { - Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid header checksum -- not set to fixed value of 0xAA", GuidBuffer); - return EFI_ABORTED; - } - } -#if (PI_SPECIFICATION_VERSION < 0x00010000) - // - // Verify tail if present - // - if (FileHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) { - // - // Verify tail is complement of integrity check field in the header. - // - Tail = (UINT16 *) ((UINTN) FileHeader + GetLength (FileHeader->Size) - sizeof (EFI_FFS_INTEGRITY_CHECK)); - if (FileHeader->IntegrityCheck.TailReference != (UINT16)~(*Tail)) { - Error (NULL, 0, 0003, "error parsing FFS file", \ - "FFS file with Guid %s failed in the integrity check, tail is not the complement of the header field", GuidBuffer); - return EFI_ABORTED; - } - } - #endif - break; - - default: - Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has the invalid/unrecognized file state bits", GuidBuffer); - return EFI_ABORTED; - } - - printf ("File Type: 0x%02X ", FileHeader->Type); - - switch (FileHeader->Type) { - - case EFI_FV_FILETYPE_RAW: - printf ("EFI_FV_FILETYPE_RAW\n"); - break; - - case EFI_FV_FILETYPE_FREEFORM: - printf ("EFI_FV_FILETYPE_FREEFORM\n"); - break; - - case EFI_FV_FILETYPE_SECURITY_CORE: - printf ("EFI_FV_FILETYPE_SECURITY_CORE\n"); - break; - - case EFI_FV_FILETYPE_PEI_CORE: - printf ("EFI_FV_FILETYPE_PEI_CORE\n"); - break; - - case EFI_FV_FILETYPE_DXE_CORE: - printf ("EFI_FV_FILETYPE_DXE_CORE\n"); - break; - - case EFI_FV_FILETYPE_PEIM: - printf ("EFI_FV_FILETYPE_PEIM\n"); - break; - - case EFI_FV_FILETYPE_DRIVER: - printf ("EFI_FV_FILETYPE_DRIVER\n"); - break; - - case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER: - printf ("EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER\n"); - break; - - case EFI_FV_FILETYPE_APPLICATION: - printf ("EFI_FV_FILETYPE_APPLICATION\n"); - break; - - case EFI_FV_FILETYPE_SMM: - printf ("EFI_FV_FILETYPE_SMM\n"); - break; - - case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE: - printf ("EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\n"); - break; - - case EFI_FV_FILETYPE_COMBINED_SMM_DXE: - printf ("EFI_FV_FILETYPE_COMBINED_SMM_DXE\n"); - break; - - case EFI_FV_FILETYPE_SMM_CORE: - printf ("EFI_FV_FILETYPE_SMM_CORE\n"); - break; - - case EFI_FV_FILETYPE_FFS_PAD: - printf ("EFI_FV_FILETYPE_FFS_PAD\n"); - break; - - default: - printf ("\nERROR: Unrecognized file type %X.\n", FileHeader->Type); - return EFI_ABORTED; - break; - } - - switch (FileHeader->Type) { - - case EFI_FV_FILETYPE_ALL: - case EFI_FV_FILETYPE_RAW: - case EFI_FV_FILETYPE_FFS_PAD: - break; - - default: - // - // All other files have sections - // - Status = ParseSection ( - (UINT8 *) ((UINTN) FileHeader + sizeof (EFI_FFS_FILE_HEADER)), - GetLength (FileHeader->Size) - sizeof (EFI_FFS_FILE_HEADER) - ); - if (EFI_ERROR (Status)) { - // - // printf ("ERROR: Parsing the FFS file.\n"); - // - return EFI_ABORTED; - } - break; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -ParseSection ( - IN UINT8 *SectionBuffer, - IN UINT32 BufferLength - ) -/*++ - -Routine Description: - - Parses EFI Sections - -Arguments: - - SectionBuffer - Buffer containing the section to parse. - BufferLength - Length of SectionBuffer - -Returns: - - EFI_SECTION_ERROR - Problem with section parsing. - (a) compression errors - (b) unrecognized section - EFI_UNSUPPORTED - Do not know how to parse the section. - EFI_SUCCESS - Section successfully parsed. - EFI_OUT_OF_RESOURCES - Memory allocation failed. - ---*/ -{ - EFI_SECTION_TYPE Type; - UINT8 *Ptr; - UINT32 SectionLength; - CHAR8 *SectionName; - EFI_STATUS Status; - UINT32 ParsedLength; - UINT8 *CompressedBuffer; - UINT32 CompressedLength; - UINT8 *UncompressedBuffer; - UINT32 UncompressedLength; - UINT8 *ToolOutputBuffer; - UINT32 ToolOutputLength; - UINT8 CompressionType; - UINT32 DstSize; - UINT32 ScratchSize; - UINT8 *ScratchBuffer; - DECOMPRESS_FUNCTION DecompressFunction; - GETINFO_FUNCTION GetInfoFunction; - // CHAR16 *name; - CHAR8 *ExtractionTool; - CHAR8 *ToolInputFile; - CHAR8 *ToolOutputFile; - CHAR8 *SystemCommandFormatString; - CHAR8 *SystemCommand; - - ParsedLength = 0; - while (ParsedLength < BufferLength) { - Ptr = SectionBuffer + ParsedLength; - - SectionLength = GetLength (((EFI_COMMON_SECTION_HEADER *) Ptr)->Size); - Type = ((EFI_COMMON_SECTION_HEADER *) Ptr)->Type; - - // - // This is sort of an odd check, but is necessary because FFS files are - // padded to a QWORD boundary, meaning there is potentially a whole section - // header worth of 0xFF bytes. - // - if (SectionLength == 0xffffff && Type == 0xff) { - ParsedLength += 4; - continue; - } - - SectionName = SectionNameToStr (Type); - printf ("------------------------------------------------------------\n"); - printf (" Type: %s\n Size: 0x%08X\n", SectionName, (unsigned) SectionLength); - free (SectionName); - - switch (Type) { - case EFI_SECTION_RAW: - case EFI_SECTION_PE32: - case EFI_SECTION_PIC: - case EFI_SECTION_TE: - // default is no more information - break; - - case EFI_SECTION_USER_INTERFACE: - // name = &((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString; - // printf (" String: %s\n", &name); - break; - - case EFI_SECTION_FIRMWARE_VOLUME_IMAGE: - Status = PrintFvInfo (((EFI_FIRMWARE_VOLUME_IMAGE_SECTION*)Ptr) + 1, TRUE); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "printing of FV section contents failed", NULL); - return EFI_SECTION_ERROR; - } - break; - - case EFI_SECTION_COMPATIBILITY16: - case EFI_SECTION_FREEFORM_SUBTYPE_GUID: - // - // Section does not contain any further header information. - // - break; - - case EFI_SECTION_PEI_DEPEX: - case EFI_SECTION_DXE_DEPEX: - case EFI_SECTION_SMM_DEPEX: - DumpDepexSection (Ptr, SectionLength); - break; - - case EFI_SECTION_VERSION: - printf (" Build Number: 0x%02X\n", ((EFI_VERSION_SECTION *) Ptr)->BuildNumber); - printf (" Version Strg: %s\n", (char*) ((EFI_VERSION_SECTION *) Ptr)->VersionString); - break; - - case EFI_SECTION_COMPRESSION: - UncompressedBuffer = NULL; - CompressedLength = SectionLength - sizeof (EFI_COMPRESSION_SECTION); - UncompressedLength = ((EFI_COMPRESSION_SECTION *) Ptr)->UncompressedLength; - CompressionType = ((EFI_COMPRESSION_SECTION *) Ptr)->CompressionType; - printf (" Uncompressed Length: 0x%08X\n", (unsigned) UncompressedLength); - - if (CompressionType == EFI_NOT_COMPRESSED) { - printf (" Compression Type: EFI_NOT_COMPRESSED\n"); - if (CompressedLength != UncompressedLength) { - Error ( - NULL, - 0, - 0, - "file is not compressed, but the compressed length does not match the uncompressed length", - NULL - ); - return EFI_SECTION_ERROR; - } - - UncompressedBuffer = Ptr + sizeof (EFI_COMPRESSION_SECTION); - } else if (CompressionType == EFI_STANDARD_COMPRESSION) { - GetInfoFunction = EfiGetInfo; - DecompressFunction = EfiDecompress; - printf (" Compression Type: EFI_STANDARD_COMPRESSION\n"); - - CompressedBuffer = Ptr + sizeof (EFI_COMPRESSION_SECTION); - - Status = GetInfoFunction (CompressedBuffer, CompressedLength, &DstSize, &ScratchSize); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "error getting compression info from compression section", NULL); - return EFI_SECTION_ERROR; - } - - if (DstSize != UncompressedLength) { - Error (NULL, 0, 0003, "compression error in the compression section", NULL); - return EFI_SECTION_ERROR; - } - - ScratchBuffer = malloc (ScratchSize); - UncompressedBuffer = malloc (UncompressedLength); - if ((ScratchBuffer == NULL) || (UncompressedBuffer == NULL)) { - return EFI_OUT_OF_RESOURCES; - } - Status = DecompressFunction ( - CompressedBuffer, - CompressedLength, - UncompressedBuffer, - UncompressedLength, - ScratchBuffer, - ScratchSize - ); - free (ScratchBuffer); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "decompress failed", NULL); - free (UncompressedBuffer); - return EFI_SECTION_ERROR; - } - } else { - Error (NULL, 0, 0003, "unrecognized compression type", "type 0x%X", CompressionType); - return EFI_SECTION_ERROR; - } - - Status = ParseSection (UncompressedBuffer, UncompressedLength); - - if (CompressionType == EFI_STANDARD_COMPRESSION) { - // - // We need to deallocate Buffer - // - free (UncompressedBuffer); - } - - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "failed to parse section", NULL); - return EFI_SECTION_ERROR; - } - break; - - case EFI_SECTION_GUID_DEFINED: - printf (" SectionDefinitionGuid: "); - PrintGuid (&((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid); - printf ("\n"); - printf (" DataOffset: 0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset); - printf (" Attributes: 0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->Attributes); - - ExtractionTool = - LookupGuidedSectionToolPath ( - mParsedGuidedSectionTools, - &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid - ); - - if (ExtractionTool != NULL) { - - ToolInputFile = CloneString (tmpnam (NULL)); - ToolOutputFile = CloneString (tmpnam (NULL)); - - // - // Construction 'system' command string - // - SystemCommandFormatString = "%s -d -o %s %s"; - SystemCommand = malloc ( - strlen (SystemCommandFormatString) + - strlen (ExtractionTool) + - strlen (ToolInputFile) + - strlen (ToolOutputFile) + - 1 - ); - sprintf ( - SystemCommand, - SystemCommandFormatString, - ExtractionTool, - ToolOutputFile, - ToolInputFile - ); - free (ExtractionTool); - - Status = - PutFileImage ( - ToolInputFile, - (CHAR8*) SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset, - BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset - ); - - system (SystemCommand); - remove (ToolInputFile); - free (ToolInputFile); - - Status = - GetFileImage ( - ToolOutputFile, - (CHAR8 **)&ToolOutputBuffer, - &ToolOutputLength - ); - remove (ToolOutputFile); - free (ToolOutputFile); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0004, "unable to read decoded GUIDED section", NULL); - return EFI_SECTION_ERROR; - } - - Status = ParseSection ( - ToolOutputBuffer, - ToolOutputLength - ); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "parse of decoded GUIDED section failed", NULL); - return EFI_SECTION_ERROR; - } - - // - // Check for CRC32 sections which we can handle internally if needed. - // - } else if (!CompareGuid ( - &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid, - &gEfiCrc32GuidedSectionExtractionProtocolGuid - ) - ) { - // - // CRC32 guided section - // - Status = ParseSection ( - SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset, - BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset - ); - if (EFI_ERROR (Status)) { - Error (NULL, 0, 0003, "parse of CRC32 GUIDED section failed", NULL); - return EFI_SECTION_ERROR; - } - } else { - // - // We don't know how to parse it now. - // - Error (NULL, 0, 0003, "Error parsing section", \ - "EFI_SECTION_GUID_DEFINED cannot be parsed at this time. Tool to decode this section should have been defined in GuidedSectionTools.txt (built in the FV directory)."); - return EFI_UNSUPPORTED; - } - break; - - default: - // - // Unknown section, return error - // - Error (NULL, 0, 0003, "unrecognized section type found", "section type = 0x%X", Type); - return EFI_SECTION_ERROR; - } - - ParsedLength += SectionLength; - // - // We make then next section begin on a 4-byte boundary - // - ParsedLength = GetOccupiedSize (ParsedLength, 4); - } - - if (ParsedLength < BufferLength) { - Error (NULL, 0, 0003, "sections do not completely fill the sectioned buffer being parsed", NULL); - return EFI_SECTION_ERROR; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -DumpDepexSection ( - IN UINT8 *Ptr, - IN UINT32 SectionLength - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - Ptr - GC_TODO: add argument description - SectionLength - GC_TODO: add argument description - -Returns: - - EFI_SUCCESS - GC_TODO: Add description for return value - ---*/ -{ - UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; - - // - // Need at least a section header + data - // - if (SectionLength <= sizeof (EFI_COMMON_SECTION_HEADER)) { - return EFI_SUCCESS; - } - - Ptr += sizeof (EFI_COMMON_SECTION_HEADER); - SectionLength -= sizeof (EFI_COMMON_SECTION_HEADER); - while (SectionLength > 0) { - printf (" "); - switch (*Ptr) { - case EFI_DEP_BEFORE: - printf ("BEFORE\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_AFTER: - printf ("AFTER\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_PUSH: - printf ("PUSH\n "); - PrintGuidToBuffer ((EFI_GUID *) (Ptr + 1), GuidBuffer, sizeof (GuidBuffer), TRUE); - printf ("%s ", GuidBuffer); - PrintGuidName (GuidBuffer); - printf ("\n"); - // - // PrintGuid ((EFI_GUID *)(Ptr + 1)); - // - Ptr += 17; - SectionLength -= 17; - break; - - case EFI_DEP_AND: - printf ("AND\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_OR: - printf ("OR\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_NOT: - printf ("NOT\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_TRUE: - printf ("TRUE\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_FALSE: - printf ("FALSE\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_END: - printf ("END DEPEX\n"); - Ptr++; - SectionLength--; - break; - - case EFI_DEP_SOR: - printf ("SOR\n"); - Ptr++; - SectionLength--; - break; - - default: - printf ("Unrecognized byte in depex: 0x%X\n", *Ptr); - return EFI_SUCCESS; - } - } - - return EFI_SUCCESS; -} - -EFI_STATUS -PrintGuidName ( - IN UINT8 *GuidStr - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - GuidStr - GC_TODO: add argument description - -Returns: - - EFI_SUCCESS - GC_TODO: Add description for return value - EFI_INVALID_PARAMETER - GC_TODO: Add description for return value - ---*/ -{ - GUID_TO_BASENAME *GPtr; - // - // If we have a list of guid-to-basenames, then go through the list to - // look for a guid string match. If found, print the basename to stdout, - // otherwise return a failure. - // - GPtr = mGuidBaseNameList; - while (GPtr != NULL) { - if (_stricmp ((CHAR8*) GuidStr, (CHAR8*) GPtr->Guid) == 0) { - printf ("%s", GPtr->BaseName); - return EFI_SUCCESS; - } - - GPtr = GPtr->Next; - } - - return EFI_INVALID_PARAMETER; -} - -EFI_STATUS -ParseGuidBaseNameFile ( - CHAR8 *FileName - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - FileName - GC_TODO: add argument description - -Returns: - - EFI_DEVICE_ERROR - GC_TODO: Add description for return value - EFI_OUT_OF_RESOURCES - GC_TODO: Add description for return value - EFI_SUCCESS - GC_TODO: Add description for return value - ---*/ -{ - FILE *Fptr; - CHAR8 Line[MAX_LINE_LEN]; - GUID_TO_BASENAME *GPtr; - - if ((Fptr = fopen (FileName, "r")) == NULL) { - printf ("ERROR: Failed to open input cross-reference file '%s'\n", FileName); - return EFI_DEVICE_ERROR; - } - - while (fgets (Line, sizeof (Line), Fptr) != NULL) { - // - // Allocate space for another guid/basename element - // - GPtr = malloc (sizeof (GUID_TO_BASENAME)); - if (GPtr == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - memset ((char *) GPtr, 0, sizeof (GUID_TO_BASENAME)); - if (sscanf (Line, "%s %s", GPtr->Guid, GPtr->BaseName) == 2) { - GPtr->Next = mGuidBaseNameList; - mGuidBaseNameList = GPtr; - } else { - // - // Some sort of error. Just continue. - // - free (GPtr); - } - } - - fclose (Fptr); - return EFI_SUCCESS; -} - -EFI_STATUS -FreeGuidBaseNameList ( - VOID - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - None - -Returns: - - EFI_SUCCESS - GC_TODO: Add description for return value - ---*/ -{ - GUID_TO_BASENAME *Next; - - while (mGuidBaseNameList != NULL) { - Next = mGuidBaseNameList->Next; - free (mGuidBaseNameList); - mGuidBaseNameList = Next; - } - - return EFI_SUCCESS; -} - - -static -VOID -LoadGuidedSectionToolsTxt ( - IN CHAR8* FirmwareVolumeFilename - ) -{ - CHAR8* PeerFilename; - CHAR8* Places[] = { - NULL, - //NULL, - }; - UINTN Index; - - Places[0] = FirmwareVolumeFilename; - //Places[1] = mUtilityFilename; - - mParsedGuidedSectionTools = NULL; - - for (Index = 0; Index < (sizeof(Places)/sizeof(Places[0])); Index++) { - PeerFilename = OsPathPeerFilePath (Places[Index], "GuidedSectionTools.txt"); - //printf("Loading %s...\n", PeerFilename); - if (OsPathExists (PeerFilename)) { - mParsedGuidedSectionTools = ParseGuidedSectionToolsFile (PeerFilename); - } - free (PeerFilename); - if (mParsedGuidedSectionTools != NULL) { - return; - } - } -} - - -void -Usage ( - VOID - ) -/*++ - -Routine Description: - - GC_TODO: Add function description - -Arguments: - - None - -Returns: - - GC_TODO: add return values - ---*/ -{ - // - // Summary usage - // - fprintf (stdout, "Usage: %s [options] \n\n", UTILITY_NAME); - - // - // Copyright declaration - // - fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n"); - - // - // Details Option - // - fprintf (stdout, "Options:\n"); - fprintf (stdout, " -x xref, --xref xref\n\ - Parse basename to file-guid cross reference file(s).\n"); - fprintf (stdout, " --offset offset\n\ - Offset of file to start processing FV at.\n"); - fprintf (stdout, " -h, --help\n\ - Show this help message and exit.\n"); - -} - +/** @file + +Copyright (c) 1999 - 2011, Intel Corporation. All rights reserved.
    +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + VolInfo.c + +Abstract: + + The tool dumps the contents of a firmware volume + +**/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Compress.h" +#include "Decompress.h" +#include "VolInfo.h" +#include "CommonLib.h" +#include "EfiUtilityMsgs.h" +#include "FirmwareVolumeBufferLib.h" +#include "OsPath.h" +#include "ParseGuidedSectionTools.h" +#include "StringFuncs.h" + +// +// Utility global variables +// + +EFI_GUID gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID; + +#define UTILITY_MAJOR_VERSION 0 +#define UTILITY_MINOR_VERSION 82 + +#define UTILITY_NAME "VolInfo" + +#define EFI_SECTION_ERROR EFIERR (100) + +#define MAX_BASENAME_LEN 60 // not good to hardcode, but let's be reasonable + +// +// Structure to keep a list of guid-to-basenames +// +typedef struct _GUID_TO_BASENAME { + struct _GUID_TO_BASENAME *Next; + INT8 Guid[PRINTED_GUID_BUFFER_SIZE]; + INT8 BaseName[MAX_BASENAME_LEN]; +} GUID_TO_BASENAME; + +static GUID_TO_BASENAME *mGuidBaseNameList = NULL; + +// +// Store GUIDed Section guid->tool mapping +// +EFI_HANDLE mParsedGuidedSectionTools = NULL; + +CHAR8* mUtilityFilename = NULL; + +EFI_STATUS +ParseGuidBaseNameFile ( + CHAR8 *FileName + ); + +EFI_STATUS +FreeGuidBaseNameList ( + VOID + ); + +EFI_STATUS +PrintGuidName ( + IN UINT8 *GuidStr + ); + +EFI_STATUS +ParseSection ( + IN UINT8 *SectionBuffer, + IN UINT32 BufferLength + ); + +EFI_STATUS +DumpDepexSection ( + IN UINT8 *Ptr, + IN UINT32 SectionLength + ); + +STATIC +EFI_STATUS +ReadHeader ( + IN FILE *InputFile, + OUT UINT32 *FvSize, + OUT BOOLEAN *ErasePolarity + ); + +STATIC +EFI_STATUS +PrintFileInfo ( + EFI_FIRMWARE_VOLUME_HEADER *FvImage, + EFI_FFS_FILE_HEADER *FileHeader, + BOOLEAN ErasePolarity + ); + +static +EFI_STATUS +PrintFvInfo ( + IN VOID *Fv, + IN BOOLEAN IsChildFv + ); + +static +VOID +LoadGuidedSectionToolsTxt ( + IN CHAR8* FirmwareVolumeFilename + ); + +void +Usage ( + VOID + ); + +int +main ( + int argc, + char *argv[] + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + argc - GC_TODO: add argument description + ] - GC_TODO: add argument description + +Returns: + + GC_TODO: add return values + +--*/ +{ + FILE *InputFile; + int BytesRead; + EFI_FIRMWARE_VOLUME_HEADER *FvImage; + UINT32 FvSize; + EFI_STATUS Status; + int Offset; + BOOLEAN ErasePolarity; + + SetUtilityName (UTILITY_NAME); + // + // Print utility header + // + printf ("%s Tiano Firmware Volume FFS image info. Version %d.%d %s, %s\n", + UTILITY_NAME, + UTILITY_MAJOR_VERSION, + UTILITY_MINOR_VERSION, + __BUILD_VERSION, + __DATE__ + ); + + // + // Save, and then skip filename arg + // + mUtilityFilename = argv[0]; + argc--; + argv++; + + Offset = 0; + + // + // If they specified -x xref guid/basename cross-reference files, process it. + // This will print the basename beside each file guid. To use it, specify + // -x xref_filename to processdsc, then use xref_filename as a parameter + // here. + // + while (argc > 2) { + if ((strcmp(argv[0], "-x") == 0) || (strcmp(argv[0], "--xref") == 0)) { + ParseGuidBaseNameFile (argv[1]); + printf("ParseGuidBaseNameFile: %s\n", argv[1]); + argc -= 2; + argv += 2; + } else if (strcmp(argv[0], "--offset") == 0) { + // + // Hex or decimal? + // + if ((argv[1][0] == '0') && (tolower ((int)argv[1][1]) == 'x')) { + if (sscanf (argv[1], "%x", &Offset) != 1) { + Error (NULL, 0, 1003, "Invalid option value", "Offset = %s", argv[1]); + return GetUtilityStatus (); + } + } else { + if (sscanf (argv[1], "%d", &Offset) != 1) { + Error (NULL, 0, 1003, "Invalid option value", "Offset = %s", argv[1]); + return GetUtilityStatus (); + } + // + // See if they said something like "64K" + // + if (tolower ((int)argv[1][strlen (argv[1]) - 1]) == 'k') { + Offset *= 1024; + } + } + + argc -= 2; + argv += 2; + } else { + Usage (); + return -1; + } + } + // + // Check for proper number of arguments + // + if (argc != 1) { + Usage (); + return -1; + } + // + // Look for help options + // + if ((strcmp(argv[0], "-h") == 0) || (strcmp(argv[0], "--help") == 0) || + (strcmp(argv[0], "-?") == 0) || (strcmp(argv[0], "/?") == 0)) { + Usage(); + return STATUS_ERROR; + } + + // + // Open the file containing the FV + // + InputFile = fopen (argv[0], "rb"); + if (InputFile == NULL) { + Error (NULL, 0, 0001, "Error opening the input file", argv[0]); + return GetUtilityStatus (); + } + // + // Skip over pad bytes if specified. This is used if they prepend 0xff + // data to the FV image binary. + // + if (Offset != 0) { + fseek (InputFile, Offset, SEEK_SET); + } + // + // Determine size of FV + // + Status = ReadHeader (InputFile, &FvSize, &ErasePolarity); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "error parsing FV image", "%s Header is invalid", argv[0]); + fclose (InputFile); + return GetUtilityStatus (); + } + // + // Allocate a buffer for the FV image + // + FvImage = malloc (FvSize); + if (FvImage == NULL) { + Error (NULL, 0, 4001, "Resource: Memory can't be allocated", NULL); + fclose (InputFile); + return GetUtilityStatus (); + } + // + // Seek to the start of the image, then read the entire FV to the buffer + // + fseek (InputFile, Offset, SEEK_SET); + BytesRead = fread (FvImage, 1, FvSize, InputFile); + fclose (InputFile); + if ((unsigned int) BytesRead != FvSize) { + Error (NULL, 0, 0004, "error reading FvImage from", argv[0]); + free (FvImage); + return GetUtilityStatus (); + } + + LoadGuidedSectionToolsTxt (argv[0]); + + PrintFvInfo (FvImage, FALSE); + + // + // Clean up + // + free (FvImage); + FreeGuidBaseNameList (); + return GetUtilityStatus (); +} + + +static +EFI_STATUS +PrintFvInfo ( + IN VOID *Fv, + IN BOOLEAN IsChildFv + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Fv - Firmware Volume to print information about + IsChildFv - Flag specifies whether the input FV is a child FV. + +Returns: + + EFI_STATUS + +--*/ +{ + EFI_STATUS Status; + UINTN NumberOfFiles; + BOOLEAN ErasePolarity; + UINTN FvSize; + EFI_FFS_FILE_HEADER *CurrentFile; + UINTN Key; + + Status = FvBufGetSize (Fv, &FvSize); + + NumberOfFiles = 0; + ErasePolarity = + (((EFI_FIRMWARE_VOLUME_HEADER*)Fv)->Attributes & EFI_FVB2_ERASE_POLARITY) ? + TRUE : FALSE; + + // + // Get the first file + // + Key = 0; + Status = FvBufFindNextFile (Fv, &Key, (VOID **) &CurrentFile); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "error parsing FV image", "cannot find the first file in the FV image"); + return GetUtilityStatus (); + } + // + // Display information about files found + // + while (CurrentFile != NULL) { + // + // Increment the number of files counter + // + NumberOfFiles++; + + // + // Display info about this file + // + Status = PrintFileInfo (Fv, CurrentFile, ErasePolarity); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "error parsing FV image", "failed to parse a file in the FV"); + return GetUtilityStatus (); + } + // + // Get the next file + // + Status = FvBufFindNextFile (Fv, &Key, (VOID **) &CurrentFile); + if (Status == EFI_NOT_FOUND) { + CurrentFile = NULL; + } else if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "error parsing FV image", "cannot find the next file in the FV image"); + return GetUtilityStatus (); + } + } + + if (IsChildFv) { + printf ("There are a total of %d files in the child FV\n", (int) NumberOfFiles); + } else { + printf ("There are a total of %d files in this FV\n", (int) NumberOfFiles); + } + + return EFI_SUCCESS; +} + +UINT32 +GetOccupiedSize ( + IN UINT32 ActualSize, + IN UINT32 Alignment + ) +/*++ + +Routine Description: + + This function returns the next larger size that meets the alignment + requirement specified. + +Arguments: + + ActualSize The size. + Alignment The desired alignment. + +Returns: + + EFI_SUCCESS Function completed successfully. + EFI_ABORTED The function encountered an error. + +--*/ +{ + UINT32 OccupiedSize; + + OccupiedSize = ActualSize; + while ((OccupiedSize & (Alignment - 1)) != 0) { + OccupiedSize++; + } + + return OccupiedSize; +} + +static +CHAR8 * +SectionNameToStr ( + IN EFI_SECTION_TYPE Type + ) +/*++ + +Routine Description: + + Converts EFI Section names to Strings + +Arguments: + + Type - The EFI Section type + +Returns: + + CHAR8* - Pointer to the String containing the section name. + +--*/ +{ + CHAR8 *SectionStr; + CHAR8 *SectionTypeStringTable[] = { + // + // 0X00 + // + "EFI_SECTION_ALL", + // + // 0x01 + // + "EFI_SECTION_COMPRESSION", + // + // 0x02 + // + "EFI_SECTION_GUID_DEFINED", + // + // 0x03 + // + "Unknown section type - Reserved 0x03", + // + // 0x04 + // + "Unknown section type - Reserved 0x04", + // + // 0x05 + // + "Unknown section type - Reserved 0x05", + // + // 0x06 + // + "Unknown section type - Reserved 0x06", + // + // 0x07 + // + "Unknown section type - Reserved 0x07", + // + // 0x08 + // + "Unknown section type - Reserved 0x08", + // + // 0x09 + // + "Unknown section type - Reserved 0x09", + // + // 0x0A + // + "Unknown section type - Reserved 0x0A", + // + // 0x0B + // + "Unknown section type - Reserved 0x0B", + // + // 0x0C + // + "Unknown section type - Reserved 0x0C", + // + // 0x0D + // + "Unknown section type - Reserved 0x0D", + // + // 0x0E + // + "Unknown section type - Reserved 0x0E", + // + // 0x0F + // + "Unknown section type - Reserved 0x0E", + // + // 0x10 + // + "EFI_SECTION_PE32", + // + // 0x11 + // + "EFI_SECTION_PIC", + // + // 0x12 + // + "EFI_SECTION_TE", + // + // 0x13 + // + "EFI_SECTION_DXE_DEPEX", + // + // 0x14 + // + "EFI_SECTION_VERSION", + // + // 0x15 + // + "EFI_SECTION_USER_INTERFACE", + // + // 0x16 + // + "EFI_SECTION_COMPATIBILITY16", + // + // 0x17 + // + "EFI_SECTION_FIRMWARE_VOLUME_IMAGE ", + // + // 0x18 + // + "EFI_SECTION_FREEFORM_SUBTYPE_GUID ", + // + // 0x19 + // + "EFI_SECTION_RAW", + // + // 0x1A + // + "Unknown section type - 0x1A", + // + // 0x1B + // + "EFI_SECTION_PEI_DEPEX", + // + // 0x1C + // + "EFI_SECTION_SMM_DEPEX", + // + // 0x1C+ + // + "Unknown section type - Reserved - beyond last defined section" + }; + + if (Type > EFI_SECTION_LAST_SECTION_TYPE) { + Type = EFI_SECTION_LAST_SECTION_TYPE + 1; + } + + SectionStr = malloc (100); + if (SectionStr == NULL) { + printf ("Error: Out of memory resources.\n"); + return SectionStr; + } + strcpy (SectionStr, SectionTypeStringTable[Type]); + return SectionStr; +} + +STATIC +EFI_STATUS +ReadHeader ( + IN FILE *InputFile, + OUT UINT32 *FvSize, + OUT BOOLEAN *ErasePolarity + ) +/*++ + +Routine Description: + + This function determines the size of the FV and the erase polarity. The + erase polarity is the FALSE value for file state. + +Arguments: + + InputFile The file that contains the FV image. + FvSize The size of the FV. + ErasePolarity The FV erase polarity. + +Returns: + + EFI_SUCCESS Function completed successfully. + EFI_INVALID_PARAMETER A required parameter was NULL or is out of range. + EFI_ABORTED The function encountered an error. + +--*/ +{ + EFI_FIRMWARE_VOLUME_HEADER VolumeHeader; + EFI_FV_BLOCK_MAP_ENTRY BlockMap; + UINTN Signature[2]; + UINTN BytesRead; + UINT32 Size; + + BytesRead = 0; + Size = 0; + // + // Check input parameters + // + if (InputFile == NULL || FvSize == NULL || ErasePolarity == NULL) { + Error (__FILE__, __LINE__, 0, "application error", "invalid parameter to function"); + return EFI_INVALID_PARAMETER; + } + // + // Read the header + // + fread (&VolumeHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile); + BytesRead = sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY); + Signature[0] = VolumeHeader.Signature; + Signature[1] = 0; + + // + // Print FV header information + // + printf ("Signature: %s (%X)\n", (char *) Signature, (unsigned) VolumeHeader.Signature); + printf ("Attributes: %X\n", (unsigned) VolumeHeader.Attributes); + + if (VolumeHeader.Attributes & EFI_FVB2_READ_DISABLED_CAP) { + printf (" EFI_FVB2_READ_DISABLED_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_READ_ENABLED_CAP) { + printf (" EFI_FVB2_READ_ENABLED_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_READ_STATUS) { + printf (" EFI_FVB2_READ_STATUS\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_WRITE_DISABLED_CAP) { + printf (" EFI_FVB2_WRITE_DISABLED_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_WRITE_ENABLED_CAP) { + printf (" EFI_FVB2_WRITE_ENABLED_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_WRITE_STATUS) { + printf (" EFI_FVB2_WRITE_STATUS\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_LOCK_CAP) { + printf (" EFI_FVB2_LOCK_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_LOCK_STATUS) { + printf (" EFI_FVB2_LOCK_STATUS\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_STICKY_WRITE) { + printf (" EFI_FVB2_STICKY_WRITE\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_MEMORY_MAPPED) { + printf (" EFI_FVB2_MEMORY_MAPPED\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ERASE_POLARITY) { + printf (" EFI_FVB2_ERASE_POLARITY\n"); + *ErasePolarity = TRUE; + } + +#if (PI_SPECIFICATION_VERSION < 0x00010000) + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT) { + printf (" EFI_FVB2_ALIGNMENT\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2) { + printf (" EFI_FVB2_ALIGNMENT_2\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4) { + printf (" EFI_FVB2_ALIGNMENT_4\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8) { + printf (" EFI_FVB2_ALIGNMENT_8\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16) { + printf (" EFI_FVB2_ALIGNMENT_16\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32) { + printf (" EFI_FVB2_ALIGNMENT_32\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64) { + printf (" EFI_FVB2_ALIGNMENT_64\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128) { + printf (" EFI_FVB2_ALIGNMENT_128\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256) { + printf (" EFI_FVB2_ALIGNMENT_256\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512) { + printf (" EFI_FVB2_ALIGNMENT_512\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1K) { + printf (" EFI_FVB2_ALIGNMENT_1K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2K) { + printf (" EFI_FVB2_ALIGNMENT_2K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4K) { + printf (" EFI_FVB2_ALIGNMENT_4K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8K) { + printf (" EFI_FVB2_ALIGNMENT_8K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16K) { + printf (" EFI_FVB2_ALIGNMENT_16K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32K) { + printf (" EFI_FVB2_ALIGNMENT_32K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) { + printf (" EFI_FVB2_ALIGNMENT_64K\n"); + } + +#else + + if (VolumeHeader.Attributes & EFI_FVB2_READ_LOCK_CAP) { + printf (" EFI_FVB2_READ_LOCK_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_READ_LOCK_STATUS) { + printf (" EFI_FVB2_READ_LOCK_STATUS\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_WRITE_LOCK_CAP) { + printf (" EFI_FVB2_WRITE_LOCK_CAP\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_WRITE_LOCK_STATUS) { + printf (" EFI_FVB2_WRITE_LOCK_STATUS\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1) { + printf (" EFI_FVB2_ALIGNMENT_1\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2) { + printf (" EFI_FVB2_ALIGNMENT_2\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4) { + printf (" EFI_FVB2_ALIGNMENT_4\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8) { + printf (" EFI_FVB2_ALIGNMENT_8\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16) { + printf (" EFI_FVB2_ALIGNMENT_16\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32) { + printf (" EFI_FVB2_ALIGNMENT_32\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64) { + printf (" EFI_FVB2_ALIGNMENT_64\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128) { + printf (" EFI_FVB2_ALIGNMENT_128\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256) { + printf (" EFI_FVB2_ALIGNMENT_256\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512) { + printf (" EFI_FVB2_ALIGNMENT_512\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1K) { + printf (" EFI_FVB2_ALIGNMENT_1K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2K) { + printf (" EFI_FVB2_ALIGNMENT_2K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4K) { + printf (" EFI_FVB2_ALIGNMENT_4K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8K) { + printf (" EFI_FVB2_ALIGNMENT_8K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16K) { + printf (" EFI_FVB2_ALIGNMENT_16K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32K) { + printf (" EFI_FVB2_ALIGNMENT_32K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) { + printf (" EFI_FVB2_ALIGNMENT_64K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128K) { + printf (" EFI_FVB2_ALIGNMENT_128K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256K) { + printf (" EFI_FVB2_ALIGNMENT_256K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512K) { + printf (" EFI_FVB2_ALIGNMENT_512K\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1M) { + printf (" EFI_FVB2_ALIGNMENT_1M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2M) { + printf (" EFI_FVB2_ALIGNMENT_2M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4M) { + printf (" EFI_FVB2_ALIGNMENT_4M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8M) { + printf (" EFI_FVB2_ALIGNMENT_8M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16M) { + printf (" EFI_FVB2_ALIGNMENT_16M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32M) { + printf (" EFI_FVB2_ALIGNMENT_32M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) { + printf (" EFI_FVB2_ALIGNMENT_64M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) { + printf (" EFI_FVB2_ALIGNMENT_128M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) { + printf (" EFI_FVB2_ALIGNMENT_64M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) { + printf (" EFI_FVB2_ALIGNMENT_128M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256M) { + printf (" EFI_FVB2_ALIGNMENT_256M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512M) { + printf (" EFI_FVB2_ALIGNMENT_512M\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1G) { + printf (" EFI_FVB2_ALIGNMENT_1G\n"); + } + + if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2G) { + printf (" EFI_FVB2_ALIGNMENT_2G\n"); + } + +#endif + printf ("Header Length: 0x%08X\n", VolumeHeader.HeaderLength); + printf ("File System ID: "); + PrintGuid (&VolumeHeader.FileSystemGuid); + // + // printf ("\n"); + // + printf ("Revision: 0x%04X\n", VolumeHeader.Revision); + + do { + fread (&BlockMap, sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile); + BytesRead += sizeof (EFI_FV_BLOCK_MAP_ENTRY); + + if (BlockMap.NumBlocks != 0) { + printf ("Number of Blocks: 0x%08X\n", (unsigned) BlockMap.NumBlocks); + printf ("Block Length: 0x%08X\n", (unsigned) BlockMap.Length); + Size += BlockMap.NumBlocks * BlockMap.Length; + } + + } while (!(BlockMap.NumBlocks == 0 && BlockMap.Length == 0)); + + if (BytesRead != VolumeHeader.HeaderLength) { + printf ("ERROR: Header length not consistent with Block Maps!\n"); + return EFI_ABORTED; + } + + if (VolumeHeader.FvLength != Size) { + printf ("ERROR: Volume Size not consistant with Block Maps!\n"); + return EFI_ABORTED; + } + + printf ("Total Volume Size: 0x%08X\n", (unsigned) Size); + + *FvSize = Size; + + // + // rewind (InputFile); + // + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +PrintFileInfo ( + EFI_FIRMWARE_VOLUME_HEADER *FvImage, + EFI_FFS_FILE_HEADER *FileHeader, + BOOLEAN ErasePolarity + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + FvImage - GC_TODO: add argument description + FileHeader - GC_TODO: add argument description + ErasePolarity - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + EFI_ABORTED - GC_TODO: Add description for return value + +--*/ +{ + UINT32 FileLength; + UINT8 FileState; + UINT8 Checksum; + EFI_FFS_FILE_HEADER BlankHeader; + EFI_STATUS Status; + UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; +#if (PI_SPECIFICATION_VERSION < 0x00010000) + UINT16 *Tail; +#endif + // + // Check if we have free space + // + if (ErasePolarity) { + memset (&BlankHeader, -1, sizeof (EFI_FFS_FILE_HEADER)); + } else { + memset (&BlankHeader, 0, sizeof (EFI_FFS_FILE_HEADER)); + } + + if (memcmp (&BlankHeader, FileHeader, sizeof (EFI_FFS_FILE_HEADER)) == 0) { + return EFI_SUCCESS; + } + // + // Print file information. + // + printf ("============================================================\n"); + + printf ("File Name: "); + PrintGuidToBuffer (&FileHeader->Name, GuidBuffer, sizeof (GuidBuffer), TRUE); + printf ("%s ", GuidBuffer); + PrintGuidName (GuidBuffer); + printf ("\n"); + + // + // PrintGuid (&FileHeader->Name); + // printf ("\n"); + // + FileLength = GetLength (FileHeader->Size); + printf ("File Offset: 0x%08X\n", (unsigned) ((UINTN) FileHeader - (UINTN) FvImage)); + printf ("File Length: 0x%08X\n", (unsigned) FileLength); + printf ("File Attributes: 0x%02X\n", FileHeader->Attributes); + printf ("File State: 0x%02X\n", FileHeader->State); + + // + // Print file state + // + FileState = GetFileState (ErasePolarity, FileHeader); + + switch (FileState) { + + case EFI_FILE_HEADER_CONSTRUCTION: + printf (" EFI_FILE_HEADER_CONSTRUCTION\n"); + return EFI_SUCCESS; + + case EFI_FILE_HEADER_INVALID: + printf (" EFI_FILE_HEADER_INVALID\n"); + return EFI_SUCCESS; + + case EFI_FILE_HEADER_VALID: + printf (" EFI_FILE_HEADER_VALID\n"); + Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER)); + Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File); + Checksum = (UINT8) (Checksum - FileHeader->State); + if (Checksum != 0) { + printf ("ERROR: Header checksum invalid.\n"); + return EFI_ABORTED; + } + + return EFI_SUCCESS; + + case EFI_FILE_DELETED: + printf (" EFI_FILE_DELETED\n"); + + case EFI_FILE_MARKED_FOR_UPDATE: + printf (" EFI_FILE_MARKED_FOR_UPDATE\n"); + + case EFI_FILE_DATA_VALID: + printf (" EFI_FILE_DATA_VALID\n"); + + // + // Calculate header checksum + // + Checksum = CalculateSum8 ((UINT8 *) FileHeader, sizeof (EFI_FFS_FILE_HEADER)); + Checksum = (UINT8) (Checksum - FileHeader->IntegrityCheck.Checksum.File); + Checksum = (UINT8) (Checksum - FileHeader->State); + if (Checksum != 0) { + Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid header checksum", GuidBuffer); + return EFI_ABORTED; + } + + FileLength = GetLength (FileHeader->Size); + + if (FileHeader->Attributes & FFS_ATTRIB_CHECKSUM) { + // + // Calculate file checksum + // + Checksum = CalculateSum8 ((UINT8 *) (FileHeader + 1), FileLength - sizeof (EFI_FFS_FILE_HEADER)); + Checksum = Checksum + FileHeader->IntegrityCheck.Checksum.File; + if (Checksum != 0) { + Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid file checksum", GuidBuffer); + return EFI_ABORTED; + } + } else { + if (FileHeader->IntegrityCheck.Checksum.File != FFS_FIXED_CHECKSUM) { + Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has invalid header checksum -- not set to fixed value of 0xAA", GuidBuffer); + return EFI_ABORTED; + } + } +#if (PI_SPECIFICATION_VERSION < 0x00010000) + // + // Verify tail if present + // + if (FileHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) { + // + // Verify tail is complement of integrity check field in the header. + // + Tail = (UINT16 *) ((UINTN) FileHeader + GetLength (FileHeader->Size) - sizeof (EFI_FFS_INTEGRITY_CHECK)); + if (FileHeader->IntegrityCheck.TailReference != (UINT16)~(*Tail)) { + Error (NULL, 0, 0003, "error parsing FFS file", \ + "FFS file with Guid %s failed in the integrity check, tail is not the complement of the header field", GuidBuffer); + return EFI_ABORTED; + } + } + #endif + break; + + default: + Error (NULL, 0, 0003, "error parsing FFS file", "FFS file with Guid %s has the invalid/unrecognized file state bits", GuidBuffer); + return EFI_ABORTED; + } + + printf ("File Type: 0x%02X ", FileHeader->Type); + + switch (FileHeader->Type) { + + case EFI_FV_FILETYPE_RAW: + printf ("EFI_FV_FILETYPE_RAW\n"); + break; + + case EFI_FV_FILETYPE_FREEFORM: + printf ("EFI_FV_FILETYPE_FREEFORM\n"); + break; + + case EFI_FV_FILETYPE_SECURITY_CORE: + printf ("EFI_FV_FILETYPE_SECURITY_CORE\n"); + break; + + case EFI_FV_FILETYPE_PEI_CORE: + printf ("EFI_FV_FILETYPE_PEI_CORE\n"); + break; + + case EFI_FV_FILETYPE_DXE_CORE: + printf ("EFI_FV_FILETYPE_DXE_CORE\n"); + break; + + case EFI_FV_FILETYPE_PEIM: + printf ("EFI_FV_FILETYPE_PEIM\n"); + break; + + case EFI_FV_FILETYPE_DRIVER: + printf ("EFI_FV_FILETYPE_DRIVER\n"); + break; + + case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER: + printf ("EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER\n"); + break; + + case EFI_FV_FILETYPE_APPLICATION: + printf ("EFI_FV_FILETYPE_APPLICATION\n"); + break; + + case EFI_FV_FILETYPE_SMM: + printf ("EFI_FV_FILETYPE_SMM\n"); + break; + + case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE: + printf ("EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE\n"); + break; + + case EFI_FV_FILETYPE_COMBINED_SMM_DXE: + printf ("EFI_FV_FILETYPE_COMBINED_SMM_DXE\n"); + break; + + case EFI_FV_FILETYPE_SMM_CORE: + printf ("EFI_FV_FILETYPE_SMM_CORE\n"); + break; + + case EFI_FV_FILETYPE_FFS_PAD: + printf ("EFI_FV_FILETYPE_FFS_PAD\n"); + break; + + default: + printf ("\nERROR: Unrecognized file type %X.\n", FileHeader->Type); + return EFI_ABORTED; + break; + } + + switch (FileHeader->Type) { + + case EFI_FV_FILETYPE_ALL: + case EFI_FV_FILETYPE_RAW: + case EFI_FV_FILETYPE_FFS_PAD: + break; + + default: + // + // All other files have sections + // + Status = ParseSection ( + (UINT8 *) ((UINTN) FileHeader + sizeof (EFI_FFS_FILE_HEADER)), + GetLength (FileHeader->Size) - sizeof (EFI_FFS_FILE_HEADER) + ); + if (EFI_ERROR (Status)) { + // + // printf ("ERROR: Parsing the FFS file.\n"); + // + return EFI_ABORTED; + } + break; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +ParseSection ( + IN UINT8 *SectionBuffer, + IN UINT32 BufferLength + ) +/*++ + +Routine Description: + + Parses EFI Sections + +Arguments: + + SectionBuffer - Buffer containing the section to parse. + BufferLength - Length of SectionBuffer + +Returns: + + EFI_SECTION_ERROR - Problem with section parsing. + (a) compression errors + (b) unrecognized section + EFI_UNSUPPORTED - Do not know how to parse the section. + EFI_SUCCESS - Section successfully parsed. + EFI_OUT_OF_RESOURCES - Memory allocation failed. + +--*/ +{ + EFI_SECTION_TYPE Type; + UINT8 *Ptr; + UINT32 SectionLength; + CHAR8 *SectionName; + EFI_STATUS Status; + UINT32 ParsedLength; + UINT8 *CompressedBuffer; + UINT32 CompressedLength; + UINT8 *UncompressedBuffer; + UINT32 UncompressedLength; + UINT8 *ToolOutputBuffer; + UINT32 ToolOutputLength; + UINT8 CompressionType; + UINT32 DstSize; + UINT32 ScratchSize; + UINT8 *ScratchBuffer; + DECOMPRESS_FUNCTION DecompressFunction; + GETINFO_FUNCTION GetInfoFunction; + // CHAR16 *name; + CHAR8 *ExtractionTool; + CHAR8 *ToolInputFile; + CHAR8 *ToolOutputFile; + CHAR8 *SystemCommandFormatString; + CHAR8 *SystemCommand; + + ParsedLength = 0; + while (ParsedLength < BufferLength) { + Ptr = SectionBuffer + ParsedLength; + + SectionLength = GetLength (((EFI_COMMON_SECTION_HEADER *) Ptr)->Size); + Type = ((EFI_COMMON_SECTION_HEADER *) Ptr)->Type; + + // + // This is sort of an odd check, but is necessary because FFS files are + // padded to a QWORD boundary, meaning there is potentially a whole section + // header worth of 0xFF bytes. + // + if (SectionLength == 0xffffff && Type == 0xff) { + ParsedLength += 4; + continue; + } + + SectionName = SectionNameToStr (Type); + printf ("------------------------------------------------------------\n"); + printf (" Type: %s\n Size: 0x%08X\n", SectionName, (unsigned) SectionLength); + free (SectionName); + + switch (Type) { + case EFI_SECTION_RAW: + case EFI_SECTION_PE32: + case EFI_SECTION_PIC: + case EFI_SECTION_TE: + // default is no more information + break; + + case EFI_SECTION_USER_INTERFACE: + // name = &((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString; + // printf (" String: %s\n", &name); + break; + + case EFI_SECTION_FIRMWARE_VOLUME_IMAGE: + Status = PrintFvInfo (((EFI_FIRMWARE_VOLUME_IMAGE_SECTION*)Ptr) + 1, TRUE); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "printing of FV section contents failed", NULL); + return EFI_SECTION_ERROR; + } + break; + + case EFI_SECTION_COMPATIBILITY16: + case EFI_SECTION_FREEFORM_SUBTYPE_GUID: + // + // Section does not contain any further header information. + // + break; + + case EFI_SECTION_PEI_DEPEX: + case EFI_SECTION_DXE_DEPEX: + case EFI_SECTION_SMM_DEPEX: + DumpDepexSection (Ptr, SectionLength); + break; + + case EFI_SECTION_VERSION: + printf (" Build Number: 0x%02X\n", ((EFI_VERSION_SECTION *) Ptr)->BuildNumber); + printf (" Version Strg: %s\n", (char*) ((EFI_VERSION_SECTION *) Ptr)->VersionString); + break; + + case EFI_SECTION_COMPRESSION: + UncompressedBuffer = NULL; + CompressedLength = SectionLength - sizeof (EFI_COMPRESSION_SECTION); + UncompressedLength = ((EFI_COMPRESSION_SECTION *) Ptr)->UncompressedLength; + CompressionType = ((EFI_COMPRESSION_SECTION *) Ptr)->CompressionType; + printf (" Uncompressed Length: 0x%08X\n", (unsigned) UncompressedLength); + + if (CompressionType == EFI_NOT_COMPRESSED) { + printf (" Compression Type: EFI_NOT_COMPRESSED\n"); + if (CompressedLength != UncompressedLength) { + Error ( + NULL, + 0, + 0, + "file is not compressed, but the compressed length does not match the uncompressed length", + NULL + ); + return EFI_SECTION_ERROR; + } + + UncompressedBuffer = Ptr + sizeof (EFI_COMPRESSION_SECTION); + } else if (CompressionType == EFI_STANDARD_COMPRESSION) { + GetInfoFunction = EfiGetInfo; + DecompressFunction = EfiDecompress; + printf (" Compression Type: EFI_STANDARD_COMPRESSION\n"); + + CompressedBuffer = Ptr + sizeof (EFI_COMPRESSION_SECTION); + + Status = GetInfoFunction (CompressedBuffer, CompressedLength, &DstSize, &ScratchSize); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "error getting compression info from compression section", NULL); + return EFI_SECTION_ERROR; + } + + if (DstSize != UncompressedLength) { + Error (NULL, 0, 0003, "compression error in the compression section", NULL); + return EFI_SECTION_ERROR; + } + + ScratchBuffer = malloc (ScratchSize); + UncompressedBuffer = malloc (UncompressedLength); + if ((ScratchBuffer == NULL) || (UncompressedBuffer == NULL)) { + return EFI_OUT_OF_RESOURCES; + } + Status = DecompressFunction ( + CompressedBuffer, + CompressedLength, + UncompressedBuffer, + UncompressedLength, + ScratchBuffer, + ScratchSize + ); + free (ScratchBuffer); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "decompress failed", NULL); + free (UncompressedBuffer); + return EFI_SECTION_ERROR; + } + } else { + Error (NULL, 0, 0003, "unrecognized compression type", "type 0x%X", CompressionType); + return EFI_SECTION_ERROR; + } + + Status = ParseSection (UncompressedBuffer, UncompressedLength); + + if (CompressionType == EFI_STANDARD_COMPRESSION) { + // + // We need to deallocate Buffer + // + free (UncompressedBuffer); + } + + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "failed to parse section", NULL); + return EFI_SECTION_ERROR; + } + break; + + case EFI_SECTION_GUID_DEFINED: + printf (" SectionDefinitionGuid: "); + PrintGuid (&((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid); + printf ("\n"); + printf (" DataOffset: 0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset); + printf (" Attributes: 0x%04X\n", (unsigned) ((EFI_GUID_DEFINED_SECTION *) Ptr)->Attributes); + + ExtractionTool = + LookupGuidedSectionToolPath ( + mParsedGuidedSectionTools, + &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid + ); + + if (ExtractionTool != NULL) { + + ToolInputFile = CloneString (tmpnam (NULL)); + ToolOutputFile = CloneString (tmpnam (NULL)); + + // + // Construction 'system' command string + // + SystemCommandFormatString = "%s -d -o %s %s"; + SystemCommand = malloc ( + strlen (SystemCommandFormatString) + + strlen (ExtractionTool) + + strlen (ToolInputFile) + + strlen (ToolOutputFile) + + 1 + ); + sprintf ( + SystemCommand, + SystemCommandFormatString, + ExtractionTool, + ToolOutputFile, + ToolInputFile + ); + free (ExtractionTool); + + Status = + PutFileImage ( + ToolInputFile, + (CHAR8*) SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset, + BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset + ); + + system (SystemCommand); + remove (ToolInputFile); + free (ToolInputFile); + + Status = + GetFileImage ( + ToolOutputFile, + (CHAR8 **)&ToolOutputBuffer, + &ToolOutputLength + ); + remove (ToolOutputFile); + free (ToolOutputFile); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0004, "unable to read decoded GUIDED section", NULL); + return EFI_SECTION_ERROR; + } + + Status = ParseSection ( + ToolOutputBuffer, + ToolOutputLength + ); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "parse of decoded GUIDED section failed", NULL); + return EFI_SECTION_ERROR; + } + + // + // Check for CRC32 sections which we can handle internally if needed. + // + } else if (!CompareGuid ( + &((EFI_GUID_DEFINED_SECTION *) Ptr)->SectionDefinitionGuid, + &gEfiCrc32GuidedSectionExtractionProtocolGuid + ) + ) { + // + // CRC32 guided section + // + Status = ParseSection ( + SectionBuffer + ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset, + BufferLength - ((EFI_GUID_DEFINED_SECTION *) Ptr)->DataOffset + ); + if (EFI_ERROR (Status)) { + Error (NULL, 0, 0003, "parse of CRC32 GUIDED section failed", NULL); + return EFI_SECTION_ERROR; + } + } else { + // + // We don't know how to parse it now. + // + Error (NULL, 0, 0003, "Error parsing section", \ + "EFI_SECTION_GUID_DEFINED cannot be parsed at this time. Tool to decode this section should have been defined in GuidedSectionTools.txt (built in the FV directory)."); + return EFI_UNSUPPORTED; + } + break; + + default: + // + // Unknown section, return error + // + Error (NULL, 0, 0003, "unrecognized section type found", "section type = 0x%X", Type); + return EFI_SECTION_ERROR; + } + + ParsedLength += SectionLength; + // + // We make then next section begin on a 4-byte boundary + // + ParsedLength = GetOccupiedSize (ParsedLength, 4); + } + + if (ParsedLength < BufferLength) { + Error (NULL, 0, 0003, "sections do not completely fill the sectioned buffer being parsed", NULL); + return EFI_SECTION_ERROR; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +DumpDepexSection ( + IN UINT8 *Ptr, + IN UINT32 SectionLength + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + Ptr - GC_TODO: add argument description + SectionLength - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; + + // + // Need at least a section header + data + // + if (SectionLength <= sizeof (EFI_COMMON_SECTION_HEADER)) { + return EFI_SUCCESS; + } + + Ptr += sizeof (EFI_COMMON_SECTION_HEADER); + SectionLength -= sizeof (EFI_COMMON_SECTION_HEADER); + while (SectionLength > 0) { + printf (" "); + switch (*Ptr) { + case EFI_DEP_BEFORE: + printf ("BEFORE\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_AFTER: + printf ("AFTER\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_PUSH: + printf ("PUSH\n "); + PrintGuidToBuffer ((EFI_GUID *) (Ptr + 1), GuidBuffer, sizeof (GuidBuffer), TRUE); + printf ("%s ", GuidBuffer); + PrintGuidName (GuidBuffer); + printf ("\n"); + // + // PrintGuid ((EFI_GUID *)(Ptr + 1)); + // + Ptr += 17; + SectionLength -= 17; + break; + + case EFI_DEP_AND: + printf ("AND\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_OR: + printf ("OR\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_NOT: + printf ("NOT\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_TRUE: + printf ("TRUE\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_FALSE: + printf ("FALSE\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_END: + printf ("END DEPEX\n"); + Ptr++; + SectionLength--; + break; + + case EFI_DEP_SOR: + printf ("SOR\n"); + Ptr++; + SectionLength--; + break; + + default: + printf ("Unrecognized byte in depex: 0x%X\n", *Ptr); + return EFI_SUCCESS; + } + } + + return EFI_SUCCESS; +} + +EFI_STATUS +PrintGuidName ( + IN UINT8 *GuidStr + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + GuidStr - GC_TODO: add argument description + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + EFI_INVALID_PARAMETER - GC_TODO: Add description for return value + +--*/ +{ + GUID_TO_BASENAME *GPtr; + // + // If we have a list of guid-to-basenames, then go through the list to + // look for a guid string match. If found, print the basename to stdout, + // otherwise return a failure. + // + GPtr = mGuidBaseNameList; + while (GPtr != NULL) { + if (_stricmp ((CHAR8*) GuidStr, (CHAR8*) GPtr->Guid) == 0) { + printf ("%s", GPtr->BaseName); + return EFI_SUCCESS; + } + + GPtr = GPtr->Next; + } + + return EFI_INVALID_PARAMETER; +} + +EFI_STATUS +ParseGuidBaseNameFile ( + CHAR8 *FileName + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + FileName - GC_TODO: add argument description + +Returns: + + EFI_DEVICE_ERROR - GC_TODO: Add description for return value + EFI_OUT_OF_RESOURCES - GC_TODO: Add description for return value + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + FILE *Fptr; + CHAR8 Line[MAX_LINE_LEN]; + GUID_TO_BASENAME *GPtr; + + if ((Fptr = fopen (FileName, "r")) == NULL) { + printf ("ERROR: Failed to open input cross-reference file '%s'\n", FileName); + return EFI_DEVICE_ERROR; + } + + while (fgets (Line, sizeof (Line), Fptr) != NULL) { + // + // Allocate space for another guid/basename element + // + GPtr = malloc (sizeof (GUID_TO_BASENAME)); + if (GPtr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + memset ((char *) GPtr, 0, sizeof (GUID_TO_BASENAME)); + if (sscanf (Line, "%s %s", GPtr->Guid, GPtr->BaseName) == 2) { + GPtr->Next = mGuidBaseNameList; + mGuidBaseNameList = GPtr; + } else { + // + // Some sort of error. Just continue. + // + free (GPtr); + } + } + + fclose (Fptr); + return EFI_SUCCESS; +} + +EFI_STATUS +FreeGuidBaseNameList ( + VOID + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + None + +Returns: + + EFI_SUCCESS - GC_TODO: Add description for return value + +--*/ +{ + GUID_TO_BASENAME *Next; + + while (mGuidBaseNameList != NULL) { + Next = mGuidBaseNameList->Next; + free (mGuidBaseNameList); + mGuidBaseNameList = Next; + } + + return EFI_SUCCESS; +} + + +static +VOID +LoadGuidedSectionToolsTxt ( + IN CHAR8* FirmwareVolumeFilename + ) +{ + CHAR8* PeerFilename; + CHAR8* Places[] = { + NULL, + //NULL, + }; + UINTN Index; + + Places[0] = FirmwareVolumeFilename; + //Places[1] = mUtilityFilename; + + mParsedGuidedSectionTools = NULL; + + for (Index = 0; Index < (sizeof(Places)/sizeof(Places[0])); Index++) { + PeerFilename = OsPathPeerFilePath (Places[Index], "GuidedSectionTools.txt"); + //printf("Loading %s...\n", PeerFilename); + if (OsPathExists (PeerFilename)) { + mParsedGuidedSectionTools = ParseGuidedSectionToolsFile (PeerFilename); + } + free (PeerFilename); + if (mParsedGuidedSectionTools != NULL) { + return; + } + } +} + + +void +Usage ( + VOID + ) +/*++ + +Routine Description: + + GC_TODO: Add function description + +Arguments: + + None + +Returns: + + GC_TODO: add return values + +--*/ +{ + // + // Summary usage + // + fprintf (stdout, "Usage: %s [options] \n\n", UTILITY_NAME); + + // + // Copyright declaration + // + fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n"); + + // + // Details Option + // + fprintf (stdout, "Options:\n"); + fprintf (stdout, " -x xref, --xref xref\n\ + Parse basename to file-guid cross reference file(s).\n"); + fprintf (stdout, " --offset offset\n\ + Offset of file to start processing FV at.\n"); + fprintf (stdout, " -h, --help\n\ + Show this help message and exit.\n"); + +} + diff --git a/BaseTools/Source/C/VolInfo/VolInfo.h b/BaseTools/Source/C/VolInfo/VolInfo.h index c2831293ba..0e2d181911 100644 --- a/BaseTools/Source/C/VolInfo/VolInfo.h +++ b/BaseTools/Source/C/VolInfo/VolInfo.h @@ -1,41 +1,41 @@ -/** @file - -Copyright (c) 1999 - 2008, Intel Corporation. All rights reserved.
    -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - VolInfo.c - -Abstract: - - Local Definitions for the VolInfo utility - -**/ - -#ifndef _VOLINFO_H_ -#define _VOLINFO_H_ 1 - -#define PI_SPECIFICATION_VERSION 0x00010000 - -#define EFI_DEP_BEFORE 0x00 -#define EFI_DEP_AFTER 0x01 -#define EFI_DEP_PUSH 0x02 -#define EFI_DEP_AND 0x03 -#define EFI_DEP_OR 0x04 -#define EFI_DEP_NOT 0x05 -#define EFI_DEP_TRUE 0x06 -#define EFI_DEP_FALSE 0x07 -#define EFI_DEP_END 0x08 -#define EFI_DEP_SOR 0x09 - -#define EFI_SECTION_LAST_LEAF_SECTION_TYPE 0x1B -#define EFI_SECTION_LAST_SECTION_TYPE 0x1B - -#endif +/** @file + +Copyright (c) 1999 - 2008, Intel Corporation. All rights reserved.
    +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + VolInfo.c + +Abstract: + + Local Definitions for the VolInfo utility + +**/ + +#ifndef _VOLINFO_H_ +#define _VOLINFO_H_ 1 + +#define PI_SPECIFICATION_VERSION 0x00010000 + +#define EFI_DEP_BEFORE 0x00 +#define EFI_DEP_AFTER 0x01 +#define EFI_DEP_PUSH 0x02 +#define EFI_DEP_AND 0x03 +#define EFI_DEP_OR 0x04 +#define EFI_DEP_NOT 0x05 +#define EFI_DEP_TRUE 0x06 +#define EFI_DEP_FALSE 0x07 +#define EFI_DEP_END 0x08 +#define EFI_DEP_SOR 0x09 + +#define EFI_SECTION_LAST_LEAF_SECTION_TYPE 0x1B +#define EFI_SECTION_LAST_SECTION_TYPE 0x1B + +#endif diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py index 5a7527ef4b..b3083d0395 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -1,627 +1,627 @@ -## @file -# The engine for building files -# -# Copyright (c) 2007, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import re -import copy -import string - -from Common.GlobalData import * -from Common.BuildToolError import * -from Common.Misc import tdict, PathClass -from Common.String import NormPath -from Common.DataType import * - -import Common.EdkLogger as EdkLogger - -## Convert file type to file list macro name -# -# @param FileType The name of file type -# -# @retval string The name of macro -# -def FileListMacro(FileType): - return "%sS" % FileType.replace("-", "_").upper() - -## Convert file type to list file macro name -# -# @param FileType The name of file type -# -# @retval string The name of macro -# -def ListFileMacro(FileType): - return "%s_LIST" % FileListMacro(FileType) - -class TargetDescBlock(object): - _Cache_ = {} # {TargetFile : TargetDescBlock object} - - # Factory method - def __new__(Class, Inputs, Outputs, Commands, Dependencies): - if Outputs[0] in Class._Cache_: - Tdb = Class._Cache_[Outputs[0]] - for File in Inputs: - Tdb.AddInput(File) - else: - Tdb = super(TargetDescBlock, Class).__new__(Class) - Tdb._Init(Inputs, Outputs, Commands, Dependencies) - #Class._Cache_[Outputs[0]] = Tdb - return Tdb - - def _Init(self, Inputs, Outputs, Commands, Dependencies): - self.Inputs = Inputs - self.Outputs = Outputs - self.Commands = Commands - self.Dependencies = Dependencies - if self.Outputs: - self.Target = self.Outputs[0] - else: - self.Target = None - - def __str__(self): - return self.Target.Path - - def __hash__(self): - return hash(self.Target.Path) - - def __eq__(self, Other): - if type(Other) == type(self): - return Other.Target.Path == self.Target.Path - else: - return str(Other) == self.Target.Path - - def AddInput(self, Input): - if Input not in self.Inputs: - self.Inputs.append(Input) - - def IsMultipleInput(self): - return len(self.Inputs) > 1 - - @staticmethod - def Renew(): - TargetDescBlock._Cache_ = {} - -## Class for one build rule -# -# This represents a build rule which can give out corresponding command list for -# building the given source file(s). The result can be used for generating the -# target for makefile. -# -class FileBuildRule: - INC_LIST_MACRO = "INC_LIST" - INC_MACRO = "INC" - - ## constructor - # - # @param Input The dictionary represeting input file(s) for a rule - # @param Output The list represeting output file(s) for a rule - # @param Command The list containing commands to generate the output from input - # - def __init__(self, Type, Input, Output, Command, ExtraDependency=None): - # The Input should not be empty - if not Input: - Input = [] - if not Output: - Output = [] - if not Command: - Command = [] - - self.FileListMacro = FileListMacro(Type) - self.ListFileMacro = ListFileMacro(Type) - self.IncListFileMacro = self.INC_LIST_MACRO - - self.SourceFileType = Type - # source files listed not in "*" or "?" pattern format - if not ExtraDependency: - self.ExtraSourceFileList = [] - else: - self.ExtraSourceFileList = ExtraDependency - - # - # Search macros used in command lines for _LIST and INC_LIST. - # If found, generate a file to keep the input files used to get over the - # limitation of command line length - # - self.MacroList = [] - self.CommandList = [] - for CmdLine in Command: - self.MacroList.extend(gMacroRefPattern.findall(CmdLine)) - # replace path separator with native one - self.CommandList.append(CmdLine) - - # Indicate what should be generated - if self.FileListMacro in self.MacroList: - self.GenFileListMacro = True - else: - self.GenFileListMacro = False - - if self.ListFileMacro in self.MacroList: - self.GenListFile = True - self.GenFileListMacro = True - else: - self.GenListFile = False - - if self.INC_LIST_MACRO in self.MacroList: - self.GenIncListFile = True - else: - self.GenIncListFile = False - - # Check input files - self.IsMultipleInput = False - self.SourceFileExtList = [] - for File in Input: - Base, Ext = os.path.splitext(File) - if Base.find("*") >= 0: - # There's "*" in the file name - self.IsMultipleInput = True - self.GenFileListMacro = True - elif Base.find("?") < 0: - # There's no "*" and "?" in file name - self.ExtraSourceFileList.append(File) - continue - if Ext not in self.SourceFileExtList: - self.SourceFileExtList.append(Ext) - - # Check output files - self.DestFileList = [] - for File in Output: - self.DestFileList.append(File) - - # All build targets generated by this rule for a module - self.BuildTargets = {} - - ## str() function support - # - # @retval string - # - def __str__(self): - SourceString = "" - SourceString += " %s %s %s" % (self.SourceFileType, " ".join(self.SourceFileExtList), self.ExtraSourceFileList) - DestString = ", ".join(self.DestFileList) - CommandString = "\n\t".join(self.CommandList) - return "%s : %s\n\t%s" % (DestString, SourceString, CommandString) - - ## Check if given file extension is supported by this rule - # - # @param FileExt The extension of a file - # - # @retval True If the extension is supported - # @retval False If the extension is not supported - # - def IsSupported(self, FileExt): - return FileExt in self.SourceFileExtList - - def Instantiate(self, Macros={}): - NewRuleObject = copy.copy(self) - NewRuleObject.BuildTargets = {} - NewRuleObject.DestFileList = [] - for File in self.DestFileList: - NewRuleObject.DestFileList.append(PathClass(NormPath(File, Macros))) - return NewRuleObject - - ## Apply the rule to given source file(s) - # - # @param SourceFile One file or a list of files to be built - # @param RelativeToDir The relative path of the source file - # @param PathSeparator Path separator - # - # @retval tuple (Source file in full path, List of individual sourcefiles, Destionation file, List of build commands) - # - def Apply(self, SourceFile): - if not self.CommandList or not self.DestFileList: - return None - - # source file - if self.IsMultipleInput: - SrcFileName = "" - SrcFileBase = "" - SrcFileExt = "" - SrcFileDir = "" - SrcPath = "" - # SourceFile must be a list - SrcFile = "$(%s)" % self.FileListMacro - else: - SrcFileName, SrcFileBase, SrcFileExt = SourceFile.Name, SourceFile.BaseName, SourceFile.Ext - if SourceFile.Root: - SrcFileDir = SourceFile.SubDir - if SrcFileDir == "": - SrcFileDir = "." - else: - SrcFileDir = "." - SrcFile = SourceFile.Path - SrcPath = SourceFile.Dir - - # destination file (the first one) - if self.DestFileList: - DestFile = self.DestFileList[0].Path - DestPath = self.DestFileList[0].Dir - DestFileName = self.DestFileList[0].Name - DestFileBase, DestFileExt = self.DestFileList[0].BaseName, self.DestFileList[0].Ext - else: - DestFile = "" - DestPath = "" - DestFileName = "" - DestFileBase = "" - DestFileExt = "" - - BuildRulePlaceholderDict = { - # source file - "src" : SrcFile, - "s_path" : SrcPath, - "s_dir" : SrcFileDir, - "s_name" : SrcFileName, - "s_base" : SrcFileBase, - "s_ext" : SrcFileExt, - # destination file - "dst" : DestFile, - "d_path" : DestPath, - "d_name" : DestFileName, - "d_base" : DestFileBase, - "d_ext" : DestFileExt, - } - - DstFile = [] - for File in self.DestFileList: - File = string.Template(str(File)).safe_substitute(BuildRulePlaceholderDict) - File = string.Template(str(File)).safe_substitute(BuildRulePlaceholderDict) - DstFile.append(PathClass(File, IsBinary=True)) - - if DstFile[0] in self.BuildTargets: - TargetDesc = self.BuildTargets[DstFile[0]] - TargetDesc.AddInput(SourceFile) - else: - CommandList = [] - for CommandString in self.CommandList: - CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) - CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) - CommandList.append(CommandString) - TargetDesc = TargetDescBlock([SourceFile], DstFile, CommandList, self.ExtraSourceFileList) - TargetDesc.ListFileMacro = self.ListFileMacro - TargetDesc.FileListMacro = self.FileListMacro - TargetDesc.IncListFileMacro = self.IncListFileMacro - TargetDesc.GenFileListMacro = self.GenFileListMacro - TargetDesc.GenListFile = self.GenListFile - TargetDesc.GenIncListFile = self.GenIncListFile - self.BuildTargets[DstFile[0]] = TargetDesc - return TargetDesc - -## Class for build rules -# -# BuildRule class parses rules defined in a file or passed by caller, and converts -# the rule into FileBuildRule object. -# -class BuildRule: - _SectionHeader = "SECTIONHEADER" - _Section = "SECTION" - _SubSectionHeader = "SUBSECTIONHEADER" - _SubSection = "SUBSECTION" - _InputFile = "INPUTFILE" - _OutputFile = "OUTPUTFILE" - _ExtraDependency = "EXTRADEPENDENCY" - _Command = "COMMAND" - _UnknownSection = "UNKNOWNSECTION" - - _SubSectionList = [_InputFile, _OutputFile, _Command] - - _PATH_SEP = "(+)" - _FileTypePattern = re.compile("^[_a-zA-Z][_\-0-9a-zA-Z]*$") - _BinaryFileRule = FileBuildRule(TAB_DEFAULT_BINARY_FILE, [], [os.path.join("$(OUTPUT_DIR)", "${s_name}")], - ["$(CP) ${src} ${dst}"], []) - - ## Constructor - # - # @param File The file containing build rules in a well defined format - # @param Content The string list of build rules in a well defined format - # @param LineIndex The line number from which the parsing will begin - # @param SupportedFamily The list of supported tool chain families - # - def __init__(self, File=None, Content=None, LineIndex=0, SupportedFamily=["MSFT", "INTEL", "GCC", "RVCT"]): - self.RuleFile = File - # Read build rules from file if it's not none - if File != None: - try: - self.RuleContent = open(File, 'r').readlines() - except: - EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File) - elif Content != None: - self.RuleContent = Content - else: - EdkLogger.error("build", PARAMETER_MISSING, ExtraData="No rule file or string given") - - self.SupportedToolChainFamilyList = SupportedFamily - self.RuleDatabase = tdict(True, 4) # {FileExt, ModuleType, Arch, Family : FileBuildRule object} - self.Ext2FileType = {} # {ext : file-type} - self.FileTypeList = set() - - self._LineIndex = LineIndex - self._State = "" - self._RuleInfo = tdict(True, 2) # {toolchain family : {"InputFile": {}, "OutputFile" : [], "Command" : []}} - self._FileType = '' - self._BuildTypeList = [] - self._ArchList = [] - self._FamilyList = [] - self._TotalToolChainFamilySet = set() - self._RuleObjectList = [] # FileBuildRule object list - self._FileVersion = "" - - self.Parse() - - # some intrinsic rules - self.RuleDatabase[TAB_DEFAULT_BINARY_FILE, "COMMON", "COMMON", "COMMON"] = self._BinaryFileRule - self.FileTypeList.add(TAB_DEFAULT_BINARY_FILE) - - ## Parse the build rule strings - def Parse(self): - self._State = self._Section - for Index in range(self._LineIndex, len(self.RuleContent)): - # Clean up the line and replace path separator with native one - Line = self.RuleContent[Index].strip().replace(self._PATH_SEP, os.path.sep) - self.RuleContent[Index] = Line - - # find the build_rule_version - if Line and Line[0] == "#" and Line.find(TAB_BUILD_RULE_VERSION) <> -1: - if Line.find("=") <> -1 and Line.find("=") < (len(Line)-1) and (Line[(Line.find("=") + 1):]).split(): - self._FileVersion = (Line[(Line.find("=") + 1):]).split()[0] - # skip empty or comment line - if Line == "" or Line[0] == "#": - continue - - # find out section header, enclosed by [] - if Line[0] == '[' and Line[-1] == ']': - # merge last section information into rule database - self.EndOfSection() - self._State = self._SectionHeader - # find out sub-section header, enclosed by <> - elif Line[0] == '<' and Line[-1] == '>': - if self._State != self._UnknownSection: - self._State = self._SubSectionHeader - - # call section handler to parse each (sub)section - self._StateHandler[self._State](self, Index) - # merge last section information into rule database - self.EndOfSection() - - ## Parse definitions under a section - # - # @param LineIndex The line index of build rule text - # - def ParseSection(self, LineIndex): - pass - - ## Parse definitions under a subsection - # - # @param LineIndex The line index of build rule text - # - def ParseSubSection(self, LineIndex): - # currenly nothing here - pass - - ## Placeholder for not supported sections - # - # @param LineIndex The line index of build rule text - # - def SkipSection(self, LineIndex): - pass - - ## Merge section information just got into rule database - def EndOfSection(self): - Database = self.RuleDatabase - # if there's specific toochain family, 'COMMON' doesn't make sense any more - if len(self._TotalToolChainFamilySet) > 1 and 'COMMON' in self._TotalToolChainFamilySet: - self._TotalToolChainFamilySet.remove('COMMON') - for Family in self._TotalToolChainFamilySet: - Input = self._RuleInfo[Family, self._InputFile] - Output = self._RuleInfo[Family, self._OutputFile] - Command = self._RuleInfo[Family, self._Command] - ExtraDependency = self._RuleInfo[Family, self._ExtraDependency] - - BuildRule = FileBuildRule(self._FileType, Input, Output, Command, ExtraDependency) - for BuildType in self._BuildTypeList: - for Arch in self._ArchList: - Database[self._FileType, BuildType, Arch, Family] = BuildRule - for FileExt in BuildRule.SourceFileExtList: - self.Ext2FileType[FileExt] = self._FileType - - ## Parse section header - # - # @param LineIndex The line index of build rule text - # - def ParseSectionHeader(self, LineIndex): - self._RuleInfo = tdict(True, 2) - self._BuildTypeList = [] - self._ArchList = [] - self._FamilyList = [] - self._TotalToolChainFamilySet = set() - FileType = '' - RuleNameList = self.RuleContent[LineIndex][1:-1].split(',') - for RuleName in RuleNameList: - Arch = 'COMMON' - BuildType = 'COMMON' - TokenList = [Token.strip().upper() for Token in RuleName.split('.')] - # old format: Build.File-Type - if TokenList[0] == "BUILD": - if len(TokenList) == 1: - EdkLogger.error("build", FORMAT_INVALID, "Invalid rule section", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - - FileType = TokenList[1] - if FileType == '': - EdkLogger.error("build", FORMAT_INVALID, "No file type given", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - if self._FileTypePattern.match(FileType) == None: - EdkLogger.error("build", FORMAT_INVALID, File=self.RuleFile, Line=LineIndex+1, - ExtraData="Only character, number (non-first character), '_' and '-' are allowed in file type") - # new format: File-Type.Build-Type.Arch - else: - if FileType == '': - FileType = TokenList[0] - elif FileType != TokenList[0]: - EdkLogger.error("build", FORMAT_INVALID, - "Different file types are not allowed in the same rule section", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - if len(TokenList) > 1: - BuildType = TokenList[1] - if len(TokenList) > 2: - Arch = TokenList[2] - if BuildType not in self._BuildTypeList: - self._BuildTypeList.append(BuildType) - if Arch not in self._ArchList: - self._ArchList.append(Arch) - - if 'COMMON' in self._BuildTypeList and len(self._BuildTypeList) > 1: - EdkLogger.error("build", FORMAT_INVALID, - "Specific build types must not be mixed with common one", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - if 'COMMON' in self._ArchList and len(self._ArchList) > 1: - EdkLogger.error("build", FORMAT_INVALID, - "Specific ARCH must not be mixed with common one", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - - self._FileType = FileType - self._State = self._Section - self.FileTypeList.add(FileType) - - ## Parse sub-section header - # - # @param LineIndex The line index of build rule text - # - def ParseSubSectionHeader(self, LineIndex): - SectionType = "" - List = self.RuleContent[LineIndex][1:-1].split(',') - FamilyList = [] - for Section in List: - TokenList = Section.split('.') - Type = TokenList[0].strip().upper() - - if SectionType == "": - SectionType = Type - elif SectionType != Type: - EdkLogger.error("build", FORMAT_INVALID, - "Two different section types are not allowed in the same sub-section", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - - if len(TokenList) > 1: - Family = TokenList[1].strip().upper() - else: - Family = "COMMON" - - if Family not in FamilyList: - FamilyList.append(Family) - - self._FamilyList = FamilyList - self._TotalToolChainFamilySet.update(FamilyList) - self._State = SectionType.upper() - if 'COMMON' in FamilyList and len(FamilyList) > 1: - EdkLogger.error("build", FORMAT_INVALID, - "Specific tool chain family should not be mixed with general one", - File=self.RuleFile, Line=LineIndex+1, - ExtraData=self.RuleContent[LineIndex]) - if self._State not in self._StateHandler: - EdkLogger.error("build", FORMAT_INVALID, File=self.RuleFile, Line=LineIndex+1, - ExtraData="Unknown subsection: %s" % self.RuleContent[LineIndex]) - ## Parse sub-section - # - # @param LineIndex The line index of build rule text - # - def ParseInputFile(self, LineIndex): - FileList = [File.strip() for File in self.RuleContent[LineIndex].split(",")] - for ToolChainFamily in self._FamilyList: - InputFiles = self._RuleInfo[ToolChainFamily, self._State] - if InputFiles == None: - InputFiles = [] - self._RuleInfo[ToolChainFamily, self._State] = InputFiles - InputFiles.extend(FileList) - - ## Parse sub-section - # - # @param LineIndex The line index of build rule text - # - def ParseCommon(self, LineIndex): - for ToolChainFamily in self._FamilyList: - Items = self._RuleInfo[ToolChainFamily, self._State] - if Items == None: - Items = [] - self._RuleInfo[ToolChainFamily, self._State] = Items - Items.append(self.RuleContent[LineIndex]) - - ## Get a build rule via [] operator - # - # @param FileExt The extension of a file - # @param ToolChainFamily The tool chain family name - # @param BuildVersion The build version number. "*" means any rule - # is applicalbe. - # - # @retval FileType The file type string - # @retval FileBuildRule The object of FileBuildRule - # - # Key = (FileExt, ModuleType, Arch, ToolChainFamily) - def __getitem__(self, Key): - if not Key: - return None - - if Key[0] in self.Ext2FileType: - Type = self.Ext2FileType[Key[0]] - elif Key[0].upper() in self.FileTypeList: - Type = Key[0].upper() - else: - return None - - if len(Key) > 1: - Key = (Type,) + Key[1:] - else: - Key = (Type,) - return self.RuleDatabase[Key] - - _StateHandler = { - _SectionHeader : ParseSectionHeader, - _Section : ParseSection, - _SubSectionHeader : ParseSubSectionHeader, - _SubSection : ParseSubSection, - _InputFile : ParseInputFile, - _OutputFile : ParseCommon, - _ExtraDependency : ParseCommon, - _Command : ParseCommon, - _UnknownSection : SkipSection, - } - -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -if __name__ == '__main__': - import sys - EdkLogger.Initialize() - if len(sys.argv) > 1: - Br = BuildRule(sys.argv[1]) - print str(Br[".c", "DXE_DRIVER", "IA32", "MSFT"][1]) - print - print str(Br[".c", "DXE_DRIVER", "IA32", "INTEL"][1]) - print - print str(Br[".c", "DXE_DRIVER", "IA32", "GCC"][1]) - print - print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]) - print - print str(Br[".h", "ACPI_TABLE", "IA32", "INTEL"][1]) - print - print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]) - print - print str(Br[".s", "SEC", "IPF", "COMMON"][1]) - print - print str(Br[".s", "SEC"][1]) - +## @file +# The engine for building files +# +# Copyright (c) 2007, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import re +import copy +import string + +from Common.GlobalData import * +from Common.BuildToolError import * +from Common.Misc import tdict, PathClass +from Common.String import NormPath +from Common.DataType import * + +import Common.EdkLogger as EdkLogger + +## Convert file type to file list macro name +# +# @param FileType The name of file type +# +# @retval string The name of macro +# +def FileListMacro(FileType): + return "%sS" % FileType.replace("-", "_").upper() + +## Convert file type to list file macro name +# +# @param FileType The name of file type +# +# @retval string The name of macro +# +def ListFileMacro(FileType): + return "%s_LIST" % FileListMacro(FileType) + +class TargetDescBlock(object): + _Cache_ = {} # {TargetFile : TargetDescBlock object} + + # Factory method + def __new__(Class, Inputs, Outputs, Commands, Dependencies): + if Outputs[0] in Class._Cache_: + Tdb = Class._Cache_[Outputs[0]] + for File in Inputs: + Tdb.AddInput(File) + else: + Tdb = super(TargetDescBlock, Class).__new__(Class) + Tdb._Init(Inputs, Outputs, Commands, Dependencies) + #Class._Cache_[Outputs[0]] = Tdb + return Tdb + + def _Init(self, Inputs, Outputs, Commands, Dependencies): + self.Inputs = Inputs + self.Outputs = Outputs + self.Commands = Commands + self.Dependencies = Dependencies + if self.Outputs: + self.Target = self.Outputs[0] + else: + self.Target = None + + def __str__(self): + return self.Target.Path + + def __hash__(self): + return hash(self.Target.Path) + + def __eq__(self, Other): + if type(Other) == type(self): + return Other.Target.Path == self.Target.Path + else: + return str(Other) == self.Target.Path + + def AddInput(self, Input): + if Input not in self.Inputs: + self.Inputs.append(Input) + + def IsMultipleInput(self): + return len(self.Inputs) > 1 + + @staticmethod + def Renew(): + TargetDescBlock._Cache_ = {} + +## Class for one build rule +# +# This represents a build rule which can give out corresponding command list for +# building the given source file(s). The result can be used for generating the +# target for makefile. +# +class FileBuildRule: + INC_LIST_MACRO = "INC_LIST" + INC_MACRO = "INC" + + ## constructor + # + # @param Input The dictionary represeting input file(s) for a rule + # @param Output The list represeting output file(s) for a rule + # @param Command The list containing commands to generate the output from input + # + def __init__(self, Type, Input, Output, Command, ExtraDependency=None): + # The Input should not be empty + if not Input: + Input = [] + if not Output: + Output = [] + if not Command: + Command = [] + + self.FileListMacro = FileListMacro(Type) + self.ListFileMacro = ListFileMacro(Type) + self.IncListFileMacro = self.INC_LIST_MACRO + + self.SourceFileType = Type + # source files listed not in "*" or "?" pattern format + if not ExtraDependency: + self.ExtraSourceFileList = [] + else: + self.ExtraSourceFileList = ExtraDependency + + # + # Search macros used in command lines for _LIST and INC_LIST. + # If found, generate a file to keep the input files used to get over the + # limitation of command line length + # + self.MacroList = [] + self.CommandList = [] + for CmdLine in Command: + self.MacroList.extend(gMacroRefPattern.findall(CmdLine)) + # replace path separator with native one + self.CommandList.append(CmdLine) + + # Indicate what should be generated + if self.FileListMacro in self.MacroList: + self.GenFileListMacro = True + else: + self.GenFileListMacro = False + + if self.ListFileMacro in self.MacroList: + self.GenListFile = True + self.GenFileListMacro = True + else: + self.GenListFile = False + + if self.INC_LIST_MACRO in self.MacroList: + self.GenIncListFile = True + else: + self.GenIncListFile = False + + # Check input files + self.IsMultipleInput = False + self.SourceFileExtList = [] + for File in Input: + Base, Ext = os.path.splitext(File) + if Base.find("*") >= 0: + # There's "*" in the file name + self.IsMultipleInput = True + self.GenFileListMacro = True + elif Base.find("?") < 0: + # There's no "*" and "?" in file name + self.ExtraSourceFileList.append(File) + continue + if Ext not in self.SourceFileExtList: + self.SourceFileExtList.append(Ext) + + # Check output files + self.DestFileList = [] + for File in Output: + self.DestFileList.append(File) + + # All build targets generated by this rule for a module + self.BuildTargets = {} + + ## str() function support + # + # @retval string + # + def __str__(self): + SourceString = "" + SourceString += " %s %s %s" % (self.SourceFileType, " ".join(self.SourceFileExtList), self.ExtraSourceFileList) + DestString = ", ".join(self.DestFileList) + CommandString = "\n\t".join(self.CommandList) + return "%s : %s\n\t%s" % (DestString, SourceString, CommandString) + + ## Check if given file extension is supported by this rule + # + # @param FileExt The extension of a file + # + # @retval True If the extension is supported + # @retval False If the extension is not supported + # + def IsSupported(self, FileExt): + return FileExt in self.SourceFileExtList + + def Instantiate(self, Macros={}): + NewRuleObject = copy.copy(self) + NewRuleObject.BuildTargets = {} + NewRuleObject.DestFileList = [] + for File in self.DestFileList: + NewRuleObject.DestFileList.append(PathClass(NormPath(File, Macros))) + return NewRuleObject + + ## Apply the rule to given source file(s) + # + # @param SourceFile One file or a list of files to be built + # @param RelativeToDir The relative path of the source file + # @param PathSeparator Path separator + # + # @retval tuple (Source file in full path, List of individual sourcefiles, Destionation file, List of build commands) + # + def Apply(self, SourceFile): + if not self.CommandList or not self.DestFileList: + return None + + # source file + if self.IsMultipleInput: + SrcFileName = "" + SrcFileBase = "" + SrcFileExt = "" + SrcFileDir = "" + SrcPath = "" + # SourceFile must be a list + SrcFile = "$(%s)" % self.FileListMacro + else: + SrcFileName, SrcFileBase, SrcFileExt = SourceFile.Name, SourceFile.BaseName, SourceFile.Ext + if SourceFile.Root: + SrcFileDir = SourceFile.SubDir + if SrcFileDir == "": + SrcFileDir = "." + else: + SrcFileDir = "." + SrcFile = SourceFile.Path + SrcPath = SourceFile.Dir + + # destination file (the first one) + if self.DestFileList: + DestFile = self.DestFileList[0].Path + DestPath = self.DestFileList[0].Dir + DestFileName = self.DestFileList[0].Name + DestFileBase, DestFileExt = self.DestFileList[0].BaseName, self.DestFileList[0].Ext + else: + DestFile = "" + DestPath = "" + DestFileName = "" + DestFileBase = "" + DestFileExt = "" + + BuildRulePlaceholderDict = { + # source file + "src" : SrcFile, + "s_path" : SrcPath, + "s_dir" : SrcFileDir, + "s_name" : SrcFileName, + "s_base" : SrcFileBase, + "s_ext" : SrcFileExt, + # destination file + "dst" : DestFile, + "d_path" : DestPath, + "d_name" : DestFileName, + "d_base" : DestFileBase, + "d_ext" : DestFileExt, + } + + DstFile = [] + for File in self.DestFileList: + File = string.Template(str(File)).safe_substitute(BuildRulePlaceholderDict) + File = string.Template(str(File)).safe_substitute(BuildRulePlaceholderDict) + DstFile.append(PathClass(File, IsBinary=True)) + + if DstFile[0] in self.BuildTargets: + TargetDesc = self.BuildTargets[DstFile[0]] + TargetDesc.AddInput(SourceFile) + else: + CommandList = [] + for CommandString in self.CommandList: + CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) + CommandString = string.Template(CommandString).safe_substitute(BuildRulePlaceholderDict) + CommandList.append(CommandString) + TargetDesc = TargetDescBlock([SourceFile], DstFile, CommandList, self.ExtraSourceFileList) + TargetDesc.ListFileMacro = self.ListFileMacro + TargetDesc.FileListMacro = self.FileListMacro + TargetDesc.IncListFileMacro = self.IncListFileMacro + TargetDesc.GenFileListMacro = self.GenFileListMacro + TargetDesc.GenListFile = self.GenListFile + TargetDesc.GenIncListFile = self.GenIncListFile + self.BuildTargets[DstFile[0]] = TargetDesc + return TargetDesc + +## Class for build rules +# +# BuildRule class parses rules defined in a file or passed by caller, and converts +# the rule into FileBuildRule object. +# +class BuildRule: + _SectionHeader = "SECTIONHEADER" + _Section = "SECTION" + _SubSectionHeader = "SUBSECTIONHEADER" + _SubSection = "SUBSECTION" + _InputFile = "INPUTFILE" + _OutputFile = "OUTPUTFILE" + _ExtraDependency = "EXTRADEPENDENCY" + _Command = "COMMAND" + _UnknownSection = "UNKNOWNSECTION" + + _SubSectionList = [_InputFile, _OutputFile, _Command] + + _PATH_SEP = "(+)" + _FileTypePattern = re.compile("^[_a-zA-Z][_\-0-9a-zA-Z]*$") + _BinaryFileRule = FileBuildRule(TAB_DEFAULT_BINARY_FILE, [], [os.path.join("$(OUTPUT_DIR)", "${s_name}")], + ["$(CP) ${src} ${dst}"], []) + + ## Constructor + # + # @param File The file containing build rules in a well defined format + # @param Content The string list of build rules in a well defined format + # @param LineIndex The line number from which the parsing will begin + # @param SupportedFamily The list of supported tool chain families + # + def __init__(self, File=None, Content=None, LineIndex=0, SupportedFamily=["MSFT", "INTEL", "GCC", "RVCT"]): + self.RuleFile = File + # Read build rules from file if it's not none + if File != None: + try: + self.RuleContent = open(File, 'r').readlines() + except: + EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File) + elif Content != None: + self.RuleContent = Content + else: + EdkLogger.error("build", PARAMETER_MISSING, ExtraData="No rule file or string given") + + self.SupportedToolChainFamilyList = SupportedFamily + self.RuleDatabase = tdict(True, 4) # {FileExt, ModuleType, Arch, Family : FileBuildRule object} + self.Ext2FileType = {} # {ext : file-type} + self.FileTypeList = set() + + self._LineIndex = LineIndex + self._State = "" + self._RuleInfo = tdict(True, 2) # {toolchain family : {"InputFile": {}, "OutputFile" : [], "Command" : []}} + self._FileType = '' + self._BuildTypeList = [] + self._ArchList = [] + self._FamilyList = [] + self._TotalToolChainFamilySet = set() + self._RuleObjectList = [] # FileBuildRule object list + self._FileVersion = "" + + self.Parse() + + # some intrinsic rules + self.RuleDatabase[TAB_DEFAULT_BINARY_FILE, "COMMON", "COMMON", "COMMON"] = self._BinaryFileRule + self.FileTypeList.add(TAB_DEFAULT_BINARY_FILE) + + ## Parse the build rule strings + def Parse(self): + self._State = self._Section + for Index in range(self._LineIndex, len(self.RuleContent)): + # Clean up the line and replace path separator with native one + Line = self.RuleContent[Index].strip().replace(self._PATH_SEP, os.path.sep) + self.RuleContent[Index] = Line + + # find the build_rule_version + if Line and Line[0] == "#" and Line.find(TAB_BUILD_RULE_VERSION) <> -1: + if Line.find("=") <> -1 and Line.find("=") < (len(Line)-1) and (Line[(Line.find("=") + 1):]).split(): + self._FileVersion = (Line[(Line.find("=") + 1):]).split()[0] + # skip empty or comment line + if Line == "" or Line[0] == "#": + continue + + # find out section header, enclosed by [] + if Line[0] == '[' and Line[-1] == ']': + # merge last section information into rule database + self.EndOfSection() + self._State = self._SectionHeader + # find out sub-section header, enclosed by <> + elif Line[0] == '<' and Line[-1] == '>': + if self._State != self._UnknownSection: + self._State = self._SubSectionHeader + + # call section handler to parse each (sub)section + self._StateHandler[self._State](self, Index) + # merge last section information into rule database + self.EndOfSection() + + ## Parse definitions under a section + # + # @param LineIndex The line index of build rule text + # + def ParseSection(self, LineIndex): + pass + + ## Parse definitions under a subsection + # + # @param LineIndex The line index of build rule text + # + def ParseSubSection(self, LineIndex): + # currenly nothing here + pass + + ## Placeholder for not supported sections + # + # @param LineIndex The line index of build rule text + # + def SkipSection(self, LineIndex): + pass + + ## Merge section information just got into rule database + def EndOfSection(self): + Database = self.RuleDatabase + # if there's specific toochain family, 'COMMON' doesn't make sense any more + if len(self._TotalToolChainFamilySet) > 1 and 'COMMON' in self._TotalToolChainFamilySet: + self._TotalToolChainFamilySet.remove('COMMON') + for Family in self._TotalToolChainFamilySet: + Input = self._RuleInfo[Family, self._InputFile] + Output = self._RuleInfo[Family, self._OutputFile] + Command = self._RuleInfo[Family, self._Command] + ExtraDependency = self._RuleInfo[Family, self._ExtraDependency] + + BuildRule = FileBuildRule(self._FileType, Input, Output, Command, ExtraDependency) + for BuildType in self._BuildTypeList: + for Arch in self._ArchList: + Database[self._FileType, BuildType, Arch, Family] = BuildRule + for FileExt in BuildRule.SourceFileExtList: + self.Ext2FileType[FileExt] = self._FileType + + ## Parse section header + # + # @param LineIndex The line index of build rule text + # + def ParseSectionHeader(self, LineIndex): + self._RuleInfo = tdict(True, 2) + self._BuildTypeList = [] + self._ArchList = [] + self._FamilyList = [] + self._TotalToolChainFamilySet = set() + FileType = '' + RuleNameList = self.RuleContent[LineIndex][1:-1].split(',') + for RuleName in RuleNameList: + Arch = 'COMMON' + BuildType = 'COMMON' + TokenList = [Token.strip().upper() for Token in RuleName.split('.')] + # old format: Build.File-Type + if TokenList[0] == "BUILD": + if len(TokenList) == 1: + EdkLogger.error("build", FORMAT_INVALID, "Invalid rule section", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + + FileType = TokenList[1] + if FileType == '': + EdkLogger.error("build", FORMAT_INVALID, "No file type given", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + if self._FileTypePattern.match(FileType) == None: + EdkLogger.error("build", FORMAT_INVALID, File=self.RuleFile, Line=LineIndex+1, + ExtraData="Only character, number (non-first character), '_' and '-' are allowed in file type") + # new format: File-Type.Build-Type.Arch + else: + if FileType == '': + FileType = TokenList[0] + elif FileType != TokenList[0]: + EdkLogger.error("build", FORMAT_INVALID, + "Different file types are not allowed in the same rule section", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + if len(TokenList) > 1: + BuildType = TokenList[1] + if len(TokenList) > 2: + Arch = TokenList[2] + if BuildType not in self._BuildTypeList: + self._BuildTypeList.append(BuildType) + if Arch not in self._ArchList: + self._ArchList.append(Arch) + + if 'COMMON' in self._BuildTypeList and len(self._BuildTypeList) > 1: + EdkLogger.error("build", FORMAT_INVALID, + "Specific build types must not be mixed with common one", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + if 'COMMON' in self._ArchList and len(self._ArchList) > 1: + EdkLogger.error("build", FORMAT_INVALID, + "Specific ARCH must not be mixed with common one", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + + self._FileType = FileType + self._State = self._Section + self.FileTypeList.add(FileType) + + ## Parse sub-section header + # + # @param LineIndex The line index of build rule text + # + def ParseSubSectionHeader(self, LineIndex): + SectionType = "" + List = self.RuleContent[LineIndex][1:-1].split(',') + FamilyList = [] + for Section in List: + TokenList = Section.split('.') + Type = TokenList[0].strip().upper() + + if SectionType == "": + SectionType = Type + elif SectionType != Type: + EdkLogger.error("build", FORMAT_INVALID, + "Two different section types are not allowed in the same sub-section", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + + if len(TokenList) > 1: + Family = TokenList[1].strip().upper() + else: + Family = "COMMON" + + if Family not in FamilyList: + FamilyList.append(Family) + + self._FamilyList = FamilyList + self._TotalToolChainFamilySet.update(FamilyList) + self._State = SectionType.upper() + if 'COMMON' in FamilyList and len(FamilyList) > 1: + EdkLogger.error("build", FORMAT_INVALID, + "Specific tool chain family should not be mixed with general one", + File=self.RuleFile, Line=LineIndex+1, + ExtraData=self.RuleContent[LineIndex]) + if self._State not in self._StateHandler: + EdkLogger.error("build", FORMAT_INVALID, File=self.RuleFile, Line=LineIndex+1, + ExtraData="Unknown subsection: %s" % self.RuleContent[LineIndex]) + ## Parse sub-section + # + # @param LineIndex The line index of build rule text + # + def ParseInputFile(self, LineIndex): + FileList = [File.strip() for File in self.RuleContent[LineIndex].split(",")] + for ToolChainFamily in self._FamilyList: + InputFiles = self._RuleInfo[ToolChainFamily, self._State] + if InputFiles == None: + InputFiles = [] + self._RuleInfo[ToolChainFamily, self._State] = InputFiles + InputFiles.extend(FileList) + + ## Parse sub-section + # + # @param LineIndex The line index of build rule text + # + def ParseCommon(self, LineIndex): + for ToolChainFamily in self._FamilyList: + Items = self._RuleInfo[ToolChainFamily, self._State] + if Items == None: + Items = [] + self._RuleInfo[ToolChainFamily, self._State] = Items + Items.append(self.RuleContent[LineIndex]) + + ## Get a build rule via [] operator + # + # @param FileExt The extension of a file + # @param ToolChainFamily The tool chain family name + # @param BuildVersion The build version number. "*" means any rule + # is applicalbe. + # + # @retval FileType The file type string + # @retval FileBuildRule The object of FileBuildRule + # + # Key = (FileExt, ModuleType, Arch, ToolChainFamily) + def __getitem__(self, Key): + if not Key: + return None + + if Key[0] in self.Ext2FileType: + Type = self.Ext2FileType[Key[0]] + elif Key[0].upper() in self.FileTypeList: + Type = Key[0].upper() + else: + return None + + if len(Key) > 1: + Key = (Type,) + Key[1:] + else: + Key = (Type,) + return self.RuleDatabase[Key] + + _StateHandler = { + _SectionHeader : ParseSectionHeader, + _Section : ParseSection, + _SubSectionHeader : ParseSubSectionHeader, + _SubSection : ParseSubSection, + _InputFile : ParseInputFile, + _OutputFile : ParseCommon, + _ExtraDependency : ParseCommon, + _Command : ParseCommon, + _UnknownSection : SkipSection, + } + +# This acts like the main() function for the script, unless it is 'import'ed into another +# script. +if __name__ == '__main__': + import sys + EdkLogger.Initialize() + if len(sys.argv) > 1: + Br = BuildRule(sys.argv[1]) + print str(Br[".c", "DXE_DRIVER", "IA32", "MSFT"][1]) + print + print str(Br[".c", "DXE_DRIVER", "IA32", "INTEL"][1]) + print + print str(Br[".c", "DXE_DRIVER", "IA32", "GCC"][1]) + print + print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]) + print + print str(Br[".h", "ACPI_TABLE", "IA32", "INTEL"][1]) + print + print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]) + print + print str(Br[".s", "SEC", "IPF", "COMMON"][1]) + print + print str(Br[".s", "SEC"][1]) + diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 621b57282d..2646b29697 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -1,1573 +1,1573 @@ -## @file -# Routines for generating AutoGen.h and AutoGen.c -# -# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## Import Modules -# -import string - -from Common import EdkLogger - -from Common.BuildToolError import * -from Common.DataType import * -from Common.Misc import * -from Common.String import StringToArray -from StrGather import * -from GenPcdDb import CreatePcdDatabaseCode - -## PCD type string -gItemTypeStringDatabase = { - TAB_PCDS_FEATURE_FLAG : 'FixedAtBuild', - TAB_PCDS_FIXED_AT_BUILD : 'FixedAtBuild', - TAB_PCDS_PATCHABLE_IN_MODULE: 'BinaryPatch', - TAB_PCDS_DYNAMIC : '', - TAB_PCDS_DYNAMIC_DEFAULT : '', - TAB_PCDS_DYNAMIC_VPD : '', - TAB_PCDS_DYNAMIC_HII : '', - TAB_PCDS_DYNAMIC_EX : '', - TAB_PCDS_DYNAMIC_EX_DEFAULT : '', - TAB_PCDS_DYNAMIC_EX_VPD : '', - TAB_PCDS_DYNAMIC_EX_HII : '', -} - -## Dynamic PCD types -gDynamicPcd = [TAB_PCDS_DYNAMIC, TAB_PCDS_DYNAMIC_DEFAULT, TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_HII] - -## Dynamic-ex PCD types -gDynamicExPcd = [TAB_PCDS_DYNAMIC_EX, TAB_PCDS_DYNAMIC_EX_DEFAULT, TAB_PCDS_DYNAMIC_EX_VPD, TAB_PCDS_DYNAMIC_EX_HII] - -## Datum size -gDatumSizeStringDatabase = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOLEAN','VOID*':'8'} -gDatumSizeStringDatabaseH = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOL','VOID*':'PTR'} -gDatumSizeStringDatabaseLib = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'Bool','VOID*':'Ptr'} - -## AutoGen File Header Templates -gAutoGenHeaderString = TemplateString("""\ -/** - DO NOT EDIT - FILE auto-generated - Module name: - ${FileName} - Abstract: Auto-generated ${FileName} for building module or library. -**/ -""") - -gAutoGenHPrologueString = TemplateString(""" -#ifndef _${File}_${Guid} -#define _${File}_${Guid} - -""") - -gAutoGenHCppPrologueString = """\ -#ifdef __cplusplus -extern "C" { -#endif - -""" - -gAutoGenHEpilogueString = """ - -#ifdef __cplusplus -} -#endif - -#endif -""" - -## PEI Core Entry Point Templates -gPeiCoreEntryPointPrototype = TemplateString(""" -${BEGIN} -VOID -EFIAPI -${Function} ( - IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, - IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, - IN VOID *Context - ); -${END} -""") - -gPeiCoreEntryPointString = TemplateString(""" -${BEGIN} -VOID -EFIAPI -ProcessModuleEntryPointList ( - IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, - IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, - IN VOID *Context - ) - -{ - ${Function} (SecCoreData, PpiList, Context); -} -${END} -""") - - -## DXE Core Entry Point Templates -gDxeCoreEntryPointPrototype = TemplateString(""" -${BEGIN} -VOID -EFIAPI -${Function} ( - IN VOID *HobStart - ); -${END} -""") - -gDxeCoreEntryPointString = TemplateString(""" -${BEGIN} -VOID -EFIAPI -ProcessModuleEntryPointList ( - IN VOID *HobStart - ) - -{ - ${Function} (HobStart); -} -${END} -""") - -## PEIM Entry Point Templates -gPeimEntryPointPrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ); -${END} -""") - -gPeimEntryPointString = [ -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) - -{ - return EFI_SUCCESS; -} -"""), -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; -${BEGIN} -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) - -{ - return ${Function} (FileHandle, PeiServices); -} -${END} -"""), -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) - -{ - EFI_STATUS Status; - EFI_STATUS CombinedStatus; - - CombinedStatus = EFI_LOAD_ERROR; -${BEGIN} - Status = ${Function} (FileHandle, PeiServices); - if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) { - CombinedStatus = Status; - } -${END} - return CombinedStatus; -} -""") -] - -## SMM_CORE Entry Point Templates -gSmmCoreEntryPointPrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); -${END} -""") - -gSmmCoreEntryPointString = TemplateString(""" -${BEGIN} -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return ${Function} (ImageHandle, SystemTable); -} -${END} -""") - -## DXE SMM Entry Point Templates -gDxeSmmEntryPointPrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); -${END} -""") - -gDxeSmmEntryPointString = [ -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) - -{ - return EFI_SUCCESS; -} -"""), -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -static BASE_LIBRARY_JUMP_BUFFER mJumpContext; -static EFI_STATUS mDriverEntryPointStatus; - -VOID -EFIAPI -ExitDriver ( - IN EFI_STATUS Status - ) -{ - if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { - mDriverEntryPointStatus = Status; - } - LongJump (&mJumpContext, (UINTN)-1); - ASSERT (FALSE); -} - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - mDriverEntryPointStatus = EFI_LOAD_ERROR; - -${BEGIN} - if (SetJump (&mJumpContext) == 0) { - ExitDriver (${Function} (ImageHandle, SystemTable)); - ASSERT (FALSE); - } -${END} - - return mDriverEntryPointStatus; -} -""") -] - -## UEFI Driver Entry Point Templates -gUefiDriverEntryPointPrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); -${END} -""") - -gUefiDriverEntryPointString = [ -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return EFI_SUCCESS; -} -"""), -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -${BEGIN} -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) - -{ - return ${Function} (ImageHandle, SystemTable); -} -${END} -VOID -EFIAPI -ExitDriver ( - IN EFI_STATUS Status - ) -{ - if (EFI_ERROR (Status)) { - ProcessLibraryDestructorList (gImageHandle, gST); - } - gBS->Exit (gImageHandle, Status, 0, NULL); -} -"""), -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; -const UINT32 _gDxeRevision = ${PiSpecVersion}; - -static BASE_LIBRARY_JUMP_BUFFER mJumpContext; -static EFI_STATUS mDriverEntryPointStatus; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - mDriverEntryPointStatus = EFI_LOAD_ERROR; - ${BEGIN} - if (SetJump (&mJumpContext) == 0) { - ExitDriver (${Function} (ImageHandle, SystemTable)); - ASSERT (FALSE); - } - ${END} - return mDriverEntryPointStatus; -} - -VOID -EFIAPI -ExitDriver ( - IN EFI_STATUS Status - ) -{ - if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { - mDriverEntryPointStatus = Status; - } - LongJump (&mJumpContext, (UINTN)-1); - ASSERT (FALSE); -} -""") -] - - -## UEFI Application Entry Point Templates -gUefiApplicationEntryPointPrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); -${END} -""") - -gUefiApplicationEntryPointString = [ -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return EFI_SUCCESS; -} -"""), -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; - -${BEGIN} -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) - -{ - return ${Function} (ImageHandle, SystemTable); -} -${END} -VOID -EFIAPI -ExitDriver ( - IN EFI_STATUS Status - ) -{ - if (EFI_ERROR (Status)) { - ProcessLibraryDestructorList (gImageHandle, gST); - } - gBS->Exit (gImageHandle, Status, 0, NULL); -} -"""), -TemplateString(""" -const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; - -EFI_STATUS -EFIAPI -ProcessModuleEntryPointList ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) - -{ - ${BEGIN} - if (SetJump (&mJumpContext) == 0) { - ExitDriver (${Function} (ImageHandle, SystemTable)); - ASSERT (FALSE); - } - ${END} - return mDriverEntryPointStatus; -} - -static BASE_LIBRARY_JUMP_BUFFER mJumpContext; -static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR; - -VOID -EFIAPI -ExitDriver ( - IN EFI_STATUS Status - ) -{ - if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { - mDriverEntryPointStatus = Status; - } - LongJump (&mJumpContext, (UINTN)-1); - ASSERT (FALSE); -} -""") -] - -## UEFI Unload Image Templates -gUefiUnloadImagePrototype = TemplateString(""" -${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle - ); -${END} -""") - -gUefiUnloadImageString = [ -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; - -EFI_STATUS -EFIAPI -ProcessModuleUnloadList ( - IN EFI_HANDLE ImageHandle - ) -{ - return EFI_SUCCESS; -} -"""), -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; - -${BEGIN} -EFI_STATUS -EFIAPI -ProcessModuleUnloadList ( - IN EFI_HANDLE ImageHandle - ) -{ - return ${Function} (ImageHandle); -} -${END} -"""), -TemplateString(""" -GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; - -EFI_STATUS -EFIAPI -ProcessModuleUnloadList ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; -${BEGIN} - if (EFI_ERROR (Status)) { - ${Function} (ImageHandle); - } else { - Status = ${Function} (ImageHandle); - } -${END} - return Status; -} -""") -] - -gLibraryStructorPrototype = { -'BASE' : TemplateString("""${BEGIN} -RETURN_STATUS -EFIAPI -${Function} ( - VOID - );${END} -"""), - -'PEI' : TemplateString("""${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - );${END} -"""), - -'DXE' : TemplateString("""${BEGIN} -EFI_STATUS -EFIAPI -${Function} ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - );${END} -"""), -} - -gLibraryStructorCall = { -'BASE' : TemplateString("""${BEGIN} - Status = ${Function} (); - ASSERT_EFI_ERROR (Status);${END} -"""), - -'PEI' : TemplateString("""${BEGIN} - Status = ${Function} (FileHandle, PeiServices); - ASSERT_EFI_ERROR (Status);${END} -"""), - -'DXE' : TemplateString("""${BEGIN} - Status = ${Function} (ImageHandle, SystemTable); - ASSERT_EFI_ERROR (Status);${END} -"""), -} - -## Library Constructor and Destructor Templates -gLibraryString = { -'BASE' : TemplateString(""" -${BEGIN}${FunctionPrototype}${END} - -VOID -EFIAPI -ProcessLibrary${Type}List ( - VOID - ) -{ -${BEGIN} EFI_STATUS Status; -${FunctionCall}${END} -} -"""), - -'PEI' : TemplateString(""" -${BEGIN}${FunctionPrototype}${END} - -VOID -EFIAPI -ProcessLibrary${Type}List ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) -{ -${BEGIN} EFI_STATUS Status; -${FunctionCall}${END} -} -"""), - -'DXE' : TemplateString(""" -${BEGIN}${FunctionPrototype}${END} - -VOID -EFIAPI -ProcessLibrary${Type}List ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ -${BEGIN} EFI_STATUS Status; -${FunctionCall}${END} -} -"""), -} - -gBasicHeaderFile = "Base.h" - -gModuleTypeHeaderFile = { - "BASE" : [gBasicHeaderFile], - "SEC" : ["PiPei.h", "Library/DebugLib.h"], - "PEI_CORE" : ["PiPei.h", "Library/DebugLib.h", "Library/PeiCoreEntryPoint.h"], - "PEIM" : ["PiPei.h", "Library/DebugLib.h", "Library/PeimEntryPoint.h"], - "DXE_CORE" : ["PiDxe.h", "Library/DebugLib.h", "Library/DxeCoreEntryPoint.h"], - "DXE_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - "DXE_SMM_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - "DXE_RUNTIME_DRIVER": ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - "DXE_SAL_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - "UEFI_DRIVER" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - "UEFI_APPLICATION" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"], - "SMM_CORE" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"], - "USER_DEFINED" : [gBasicHeaderFile] -} - -## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName -# the TokenName and Guid comparison to avoid define name collisions. -# -# @param Info The ModuleAutoGen object -# @param AutoGenH The TemplateString object for header file -# -# -def DynExPcdTokenNumberMapping(Info, AutoGenH): - ExTokenCNameList = [] - PcdExList = [] - if Info.IsLibrary: - PcdList = Info.LibraryPcdList - else: - PcdList = Info.ModulePcdList - for Pcd in PcdList: - if Pcd.Type in gDynamicExPcd: - ExTokenCNameList.append(Pcd.TokenCName) - PcdExList.append(Pcd) - if len(ExTokenCNameList) == 0: - return - AutoGenH.Append('\n#define COMPAREGUID(Guid1, Guid2) (BOOLEAN)(*(CONST UINT64*)Guid1 == *(CONST UINT64*)Guid2 && *((CONST UINT64*)Guid1 + 1) == *((CONST UINT64*)Guid2 + 1))\n') - # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file. - # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter. - # Use the Guid pointer to see if it matches any of the token space GUIDs. - TokenCNameList = [] - for TokenCName in ExTokenCNameList: - if TokenCName in TokenCNameList: - continue - Index = 0 - Count = ExTokenCNameList.count(TokenCName) - for Pcd in PcdExList: - if Pcd.TokenCName == TokenCName: - Index = Index + 1 - if Index == 1: - AutoGenH.Append('\n#define __PCD_%s_ADDR_CMP(GuidPtr) (' % (Pcd.TokenCName)) - AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' - % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) - else: - AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' - % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) - if Index == Count: - AutoGenH.Append('0 \\\n )\n') - TokenCNameList.append(TokenCName) - - TokenCNameList = [] - for TokenCName in ExTokenCNameList: - if TokenCName in TokenCNameList: - continue - Index = 0 - Count = ExTokenCNameList.count(TokenCName) - for Pcd in PcdExList: - if Pcd.Type in gDynamicExPcd and Pcd.TokenCName == TokenCName: - Index = Index + 1 - if Index == 1: - AutoGenH.Append('\n#define __PCD_%s_VAL_CMP(GuidPtr) (' % (Pcd.TokenCName)) - AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' - % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) - else: - AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' - % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) - if Index == Count: - AutoGenH.Append('0 \\\n )\n') - # Autogen internal worker macro to compare GUIDs. Guid1 is a pointer to a GUID. - # Guid2 is a C name for a GUID. Compare pointers first because optimizing compiler - # can do this at build time on CONST GUID pointers and optimize away call to COMPAREGUID(). - # COMPAREGUID() will only be used if the Guid passed in is local to the module. - AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr) __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr) \n' - % (Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName)) - TokenCNameList.append(TokenCName) - -## Create code for module PCDs -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# @param Pcd The PCD object -# -def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): - TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName] - PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber - # - # Write PCDs - # - PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName - if Pcd.Type in gDynamicExPcd: - TokenNumber = int(Pcd.TokenValue, 0) - # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with - # different Guids but same TokenCName - PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + Pcd.TokenCName - AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) - else: - if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: - # If one of the Source built modules listed in the DSC is not listed in FDF modules, - # and the INF lists a PCD can only use the PcdsDynamic access method (it is only - # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will - # report warning message notify the PI that they are attempting to build a module - # that must be included in a flash image in order to be functional. These Dynamic PCD - # will not be added into the Database unless it is used by other modules that are - # included in the FDF file. - # In this case, just assign an invalid token number to make it pass build. - if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: - TokenNumber = 0 - else: - EdkLogger.error("build", AUTOGEN_ERROR, - "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - else: - TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] - AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber)) - - EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName) - if Pcd.Type not in gItemTypeStringDatabase: - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if Pcd.DatumType not in gDatumSizeStringDatabase: - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - - DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] - DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] - GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName - SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName - - PcdExCNameList = [] - if Pcd.Type in gDynamicExPcd: - if Info.IsLibrary: - PcdList = Info.LibraryPcdList - else: - PcdList = Info.ModulePcdList - for PcdModule in PcdList: - if PcdModule.Type in gDynamicExPcd: - PcdExCNameList.append(PcdModule.TokenCName) - # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd. - # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build. - # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. - if PcdExCNameList.count(Pcd.TokenCName) > 1: - AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') - AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) - AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) - AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - elif Pcd.Type in gDynamicPcd: - AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName)) - else: - AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName)) - else: - PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + Pcd.TokenCName - Const = 'const' - if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: - Const = '' - Type = '' - Array = '' - Value = Pcd.DefaultValue - Unicode = False - ValueNumber = 0 - - if Pcd.DatumType == 'BOOLEAN': - BoolValue = Value.upper() - if BoolValue == 'TRUE' or BoolValue == '1': - Value = '1U' - elif BoolValue == 'FALSE' or BoolValue == '0': - Value = '0U' - - if Pcd.DatumType in ['UINT64', 'UINT32', 'UINT16', 'UINT8']: - try: - if Value.upper().startswith('0X'): - ValueNumber = int (Value, 16) - else: - ValueNumber = int (Value) - except: - EdkLogger.error("build", AUTOGEN_ERROR, - "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if Pcd.DatumType == 'UINT64': - if ValueNumber < 0: - EdkLogger.error("build", AUTOGEN_ERROR, - "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - elif ValueNumber >= 0x10000000000000000: - EdkLogger.error("build", AUTOGEN_ERROR, - "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if not Value.endswith('ULL'): - Value += 'ULL' - elif Pcd.DatumType == 'UINT32': - if ValueNumber < 0: - EdkLogger.error("build", AUTOGEN_ERROR, - "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - elif ValueNumber >= 0x100000000: - EdkLogger.error("build", AUTOGEN_ERROR, - "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if not Value.endswith('U'): - Value += 'U' - elif Pcd.DatumType == 'UINT16': - if ValueNumber < 0: - EdkLogger.error("build", AUTOGEN_ERROR, - "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - elif ValueNumber >= 0x10000: - EdkLogger.error("build", AUTOGEN_ERROR, - "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if not Value.endswith('U'): - Value += 'U' - elif Pcd.DatumType == 'UINT8': - if ValueNumber < 0: - EdkLogger.error("build", AUTOGEN_ERROR, - "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - elif ValueNumber >= 0x100: - EdkLogger.error("build", AUTOGEN_ERROR, - "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if not Value.endswith('U'): - Value += 'U' - if Pcd.DatumType == 'VOID*': - if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '': - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - - ArraySize = int(Pcd.MaxDatumSize, 0) - if Value[0] == '{': - Type = '(VOID *)' - else: - if Value[0] == 'L': - Unicode = True - Value = Value.lstrip('L') #.strip('"') - Value = eval(Value) # translate escape character - NewValue = '{' - for Index in range(0,len(Value)): - if Unicode: - NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', ' - else: - NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', ' - if Unicode: - ArraySize = ArraySize / 2; - - if ArraySize < (len(Value) + 1): - EdkLogger.error("build", AUTOGEN_ERROR, - "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - Value = NewValue + '0 }' - Array = '[%d]' % ArraySize - # - # skip casting for fixed at build since it breaks ARM assembly. - # Long term we need PCD macros that work in assembly - # - elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD: - Value = "((%s)%s)" % (Pcd.DatumType, Value) - - if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: - PcdValueName = '_PCD_PATCHABLE_VALUE_' + Pcd.TokenCName - else: - PcdValueName = '_PCD_VALUE_' + Pcd.TokenCName - - if Pcd.DatumType == 'VOID*': - # - # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed. - # - if Unicode: - AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize)) - AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName)) - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value)) - AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array)) - AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName)) - else: - AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize)) - AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName)) - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value)) - AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array)) - AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName)) - elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: - AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value)) - AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName)) - AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array)) - AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName)) - else: - AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value)) - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName)) - AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array)) - AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName)) - - if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtr(_gPcd_BinaryPatch_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, Pcd.TokenCName, Pcd.TokenCName)) - else: - AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName)) - else: - AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName) - -## Create code for library module PCDs -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# @param Pcd The PCD object -# -def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): - PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber - TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName - TokenCName = Pcd.TokenCName - PcdTokenName = '_PCD_TOKEN_' + TokenCName - # - # Write PCDs - # - if Pcd.Type in gDynamicExPcd: - TokenNumber = int(Pcd.TokenValue, 0) - else: - if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: - # If one of the Source built modules listed in the DSC is not listed in FDF modules, - # and the INF lists a PCD can only use the PcdsDynamic access method (it is only - # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will - # report warning message notify the PI that they are attempting to build a module - # that must be included in a flash image in order to be functional. These Dynamic PCD - # will not be added into the Database unless it is used by other modules that are - # included in the FDF file. - # In this case, just assign an invalid token number to make it pass build. - if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: - TokenNumber = 0 - else: - EdkLogger.error("build", AUTOGEN_ERROR, - "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - else: - TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] - - if Pcd.Type not in gItemTypeStringDatabase: - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - if Pcd.DatumType not in gDatumSizeStringDatabase: - EdkLogger.error("build", AUTOGEN_ERROR, - "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), - ExtraData="[%s]" % str(Info)) - - DatumType = Pcd.DatumType - DatumSize = gDatumSizeStringDatabaseH[DatumType] - DatumSizeLib= gDatumSizeStringDatabaseLib[DatumType] - GetModeName = '_PCD_GET_MODE_' + DatumSize + '_' + TokenCName - SetModeName = '_PCD_SET_MODE_' + DatumSize + '_' + TokenCName - - Type = '' - Array = '' - if Pcd.DatumType == 'VOID*': - Type = '(VOID *)' - Array = '[]' - PcdItemType = Pcd.Type - PcdExCNameList = [] - if PcdItemType in gDynamicExPcd: - PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + Pcd.TokenCName - AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) - - if Info.IsLibrary: - PcdList = Info.LibraryPcdList - else: - PcdList = Info.ModulePcdList - for PcdModule in PcdList: - if PcdModule.Type in gDynamicExPcd: - PcdExCNameList.append(PcdModule.TokenCName) - # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd. - # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build. - # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. - if PcdExCNameList.count(Pcd.TokenCName) > 1: - AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') - AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) - AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) - AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - if Pcd.DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) - else: - AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber)) - if PcdItemType in gDynamicPcd: - AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) - if DatumType == 'VOID*': - AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName)) - else: - AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName)) - if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE: - PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName - AutoGenH.Append('extern volatile %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) ) - AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName)) - AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName)) - if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG: - key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName)) - - AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array)) - AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName)) - AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName) - - if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and key in Info.ConstPcd: - AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue)) - - - -## Create code for library constructor -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): - # - # Library Constructors - # - ConstructorPrototypeString = TemplateString() - ConstructorCallingString = TemplateString() - if Info.IsLibrary: - DependentLibraryList = [Info.Module] - else: - DependentLibraryList = Info.DependentLibraryList - for Lib in DependentLibraryList: - if len(Lib.ConstructorList) <= 0: - continue - Dict = {'Function':Lib.ConstructorList} - if Lib.ModuleType in ['BASE', 'SEC']: - ConstructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict)) - ConstructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict)) - elif Lib.ModuleType in ['PEI_CORE','PEIM']: - ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) - ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) - elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', - 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: - ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) - ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) - - if str(ConstructorPrototypeString) == '': - ConstructorPrototypeList = [] - else: - ConstructorPrototypeList = [str(ConstructorPrototypeString)] - if str(ConstructorCallingString) == '': - ConstructorCallingList = [] - else: - ConstructorCallingList = [str(ConstructorCallingString)] - - Dict = { - 'Type' : 'Constructor', - 'FunctionPrototype' : ConstructorPrototypeList, - 'FunctionCall' : ConstructorCallingList - } - if Info.IsLibrary: - AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict) - else: - if Info.ModuleType in ['BASE', 'SEC']: - AutoGenC.Append(gLibraryString['BASE'].Replace(Dict)) - elif Info.ModuleType in ['PEI_CORE','PEIM']: - AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) - elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', - 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: - AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) - -## Create code for library destructor -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): - # - # Library Destructors - # - DestructorPrototypeString = TemplateString() - DestructorCallingString = TemplateString() - if Info.IsLibrary: - DependentLibraryList = [Info.Module] - else: - DependentLibraryList = Info.DependentLibraryList - for Index in range(len(DependentLibraryList)-1, -1, -1): - Lib = DependentLibraryList[Index] - if len(Lib.DestructorList) <= 0: - continue - Dict = {'Function':Lib.DestructorList} - if Lib.ModuleType in ['BASE', 'SEC']: - DestructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict)) - DestructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict)) - elif Lib.ModuleType in ['PEI_CORE','PEIM']: - DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) - DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) - elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', - 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_CORE']: - DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) - DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) - - if str(DestructorPrototypeString) == '': - DestructorPrototypeList = [] - else: - DestructorPrototypeList = [str(DestructorPrototypeString)] - if str(DestructorCallingString) == '': - DestructorCallingList = [] - else: - DestructorCallingList = [str(DestructorCallingString)] - - Dict = { - 'Type' : 'Destructor', - 'FunctionPrototype' : DestructorPrototypeList, - 'FunctionCall' : DestructorCallingList - } - if Info.IsLibrary: - AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict) - else: - if Info.ModuleType in ['BASE', 'SEC']: - AutoGenC.Append(gLibraryString['BASE'].Replace(Dict)) - elif Info.ModuleType in ['PEI_CORE','PEIM']: - AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) - elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', - 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: - AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) - - -## Create code for ModuleEntryPoint -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): - if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']: - return - # - # Module Entry Points - # - NumEntryPoints = len(Info.Module.ModuleEntryPointList) - if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification: - PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION'] - else: - PiSpecVersion = '0x00000000' - if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification: - UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION'] - else: - UefiSpecVersion = '0x00000000' - Dict = { - 'Function' : Info.Module.ModuleEntryPointList, - 'PiSpecVersion' : PiSpecVersion + 'U', - 'UefiSpecVersion': UefiSpecVersion + 'U' - } - - if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']: - if Info.SourceFileList <> None and Info.SourceFileList <> []: - if NumEntryPoints != 1: - EdkLogger.error( - "build", - AUTOGEN_ERROR, - '%s must have exactly one entry point' % Info.ModuleType, - File=str(Info), - ExtraData= ", ".join(Info.Module.ModuleEntryPointList) - ) - if Info.ModuleType == 'PEI_CORE': - AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict)) - AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType == 'DXE_CORE': - AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict)) - AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType == 'SMM_CORE': - AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict)) - AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType == 'PEIM': - if NumEntryPoints < 2: - AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict)) - else: - AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict)) - AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SAL_DRIVER','UEFI_DRIVER']: - if NumEntryPoints < 2: - AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict)) - else: - AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict)) - AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType == 'DXE_SMM_DRIVER': - if NumEntryPoints == 0: - AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict)) - else: - AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict)) - AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType == 'UEFI_APPLICATION': - if NumEntryPoints < 2: - AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict)) - else: - AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict)) - AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict)) - -## Create code for ModuleUnloadImage -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH): - if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']: - return - # - # Unload Image Handlers - # - NumUnloadImage = len(Info.Module.ModuleUnloadImageList) - Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':Info.Module.ModuleUnloadImageList} - if NumUnloadImage < 2: - AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict)) - else: - AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict)) - AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict)) - -## Create code for GUID -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH): - if Info.IsLibrary: - return - - if Info.ModuleType in ["USER_DEFINED", "BASE"]: - GuidType = "GUID" - else: - GuidType = "EFI_GUID" - - if Info.GuidList: - AutoGenC.Append("\n// Guids\n") - # - # GUIDs - # - for Key in Info.GuidList: - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key])) - -## Create code for protocol -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH): - if Info.IsLibrary: - return - - if Info.ModuleType in ["USER_DEFINED", "BASE"]: - GuidType = "GUID" - else: - GuidType = "EFI_GUID" - - if Info.ProtocolList: - AutoGenC.Append("\n// Protocols\n") - # - # Protocol GUIDs - # - for Key in Info.ProtocolList: - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key])) - -## Create code for PPI -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH): - if Info.IsLibrary: - return - - if Info.ModuleType in ["USER_DEFINED", "BASE"]: - GuidType = "GUID" - else: - GuidType = "EFI_GUID" - - if Info.PpiList: - AutoGenC.Append("\n// PPIs\n") - # - # PPI GUIDs - # - for Key in Info.PpiList: - AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key])) - -## Create code for PCD -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreatePcdCode(Info, AutoGenC, AutoGenH): - - # Collect Token Space GUIDs used by DynamicEc PCDs - TokenSpaceList = [] - for Pcd in Info.ModulePcdList: - if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList: - TokenSpaceList += [Pcd.TokenSpaceGuidCName] - - # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found - if TokenSpaceList <> []: - AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n") - if Info.ModuleType in ["USER_DEFINED", "BASE"]: - GuidType = "GUID" - else: - GuidType = "EFI_GUID" - for Item in TokenSpaceList: - AutoGenH.Append('extern %s %s;\n' % (GuidType, Item)) - - if Info.IsLibrary: - if Info.ModulePcdList: - AutoGenH.Append("\n// PCD definitions\n") - for Pcd in Info.ModulePcdList: - CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd) - DynExPcdTokenNumberMapping (Info, AutoGenH) - else: - if Info.ModulePcdList: - AutoGenH.Append("\n// Definition of PCDs used in this module\n") - AutoGenC.Append("\n// Definition of PCDs used in this module\n") - for Pcd in Info.ModulePcdList: - CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd) - DynExPcdTokenNumberMapping (Info, AutoGenH) - if Info.LibraryPcdList: - AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n") - AutoGenC.Append("\n// Definition of PCDs used in libraries\n") - for Pcd in Info.LibraryPcdList: - CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd) - CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH) - -## Create code for unicode string definition -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True -# @param UniGenBinBuffer Buffer to store uni string package data -# -def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer): - WorkingDir = os.getcwd() - os.chdir(Info.WorkspaceDir) - - IncList = [Info.MetaFile.Dir] - # Get all files under [Sources] section in inf file for EDK-II module - EDK2Module = True - SrcList = [F for F in Info.SourceFileList] - if Info.AutoGenVersion < 0x00010005: - EDK2Module = False - # Get all files under the module directory for EDK-I module - Cwd = os.getcwd() - os.chdir(Info.MetaFile.Dir) - for Root, Dirs, Files in os.walk("."): - if 'CVS' in Dirs: - Dirs.remove('CVS') - if '.svn' in Dirs: - Dirs.remove('.svn') - for File in Files: - File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir) - if File in SrcList: - continue - SrcList.append(File) - os.chdir(Cwd) - - if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1: - CompatibleMode = True - else: - CompatibleMode = False - - # - # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2 - # - if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1: - if CompatibleMode: - EdkLogger.error("build", AUTOGEN_ERROR, - "-c and -s build options should be used exclusively", - ExtraData="[%s]" % str(Info)) - ShellMode = True - else: - ShellMode = False - - #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules - if EDK2Module: - FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages] - else: - FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages] - Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo) - if CompatibleMode or UniGenCFlag: - AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n") - AutoGenC.Append(Code) - AutoGenC.Append("\n") - AutoGenH.Append("\n//\n//Unicode String ID\n//\n") - AutoGenH.Append(Header) - if CompatibleMode or UniGenCFlag: - AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name) - os.chdir(WorkingDir) - -## Create common code -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateHeaderCode(Info, AutoGenC, AutoGenH): - # file header - AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'})) - # header file Prologue - AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')})) - AutoGenH.Append(gAutoGenHCppPrologueString) - if Info.AutoGenVersion >= 0x00010005: - # header files includes - AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile) - if Info.ModuleType in gModuleTypeHeaderFile \ - and gModuleTypeHeaderFile[Info.ModuleType][0] != gBasicHeaderFile: - AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0]) - # - # if either PcdLib in [LibraryClasses] sections or there exist Pcd section, add PcdLib.h - # As if modules only uses FixedPcd, then PcdLib is not needed in [LibraryClasses] section. - # - if 'PcdLib' in Info.Module.LibraryClasses or Info.Module.Pcds: - AutoGenH.Append("#include \n") - - AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;') - AutoGenH.Append('\nextern CHAR8 *gEfiCallerBaseName;\n\n') - - if Info.IsLibrary: - return - - AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid)) - - if Info.IsLibrary: - return - # C file header - AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'})) - if Info.AutoGenVersion >= 0x00010005: - # C file header files includes - if Info.ModuleType in gModuleTypeHeaderFile: - for Inc in gModuleTypeHeaderFile[Info.ModuleType]: - AutoGenC.Append("#include <%s>\n" % Inc) - else: - AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile) - - # - # Publish the CallerId Guid - # - AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid)) - AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gEfiCallerBaseName = "%s";\n' % Info.Name) - -## Create common code for header file -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# -def CreateFooterCode(Info, AutoGenC, AutoGenH): - AutoGenH.Append(gAutoGenHEpilogueString) - -## Create code for a module -# -# @param Info The ModuleAutoGen object -# @param AutoGenC The TemplateString object for C code -# @param AutoGenH The TemplateString object for header file -# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True -# @param UniGenBinBuffer Buffer to store uni string package data -# -def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer): - CreateHeaderCode(Info, AutoGenC, AutoGenH) - - if Info.AutoGenVersion >= 0x00010005: - CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH) - CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH) - CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH) - CreatePcdCode(Info, AutoGenC, AutoGenH) - CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH) - CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH) - CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH) - CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH) - - if Info.UnicodeFileList: - FileName = "%sStrDefs.h" % Info.Name - StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName})) - StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')})) - CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer) - StringH.Append("\n#endif\n") - AutoGenH.Append('#include "%s"\n' % FileName) - - CreateFooterCode(Info, AutoGenC, AutoGenH) - - # no generation of AutoGen.c for Edk modules without unicode file - if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0: - AutoGenC.String = '' - -## Create the code file -# -# @param FilePath The path of code file -# @param Content The content of code file -# @param IsBinaryFile The flag indicating if the file is binary file or not -# -# @retval True If file content is changed or file doesn't exist -# @retval False If the file exists and the content is not changed -# -def Generate(FilePath, Content, IsBinaryFile): - return SaveFileOnChange(FilePath, Content, IsBinaryFile) - +## @file +# Routines for generating AutoGen.h and AutoGen.c +# +# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## Import Modules +# +import string + +from Common import EdkLogger + +from Common.BuildToolError import * +from Common.DataType import * +from Common.Misc import * +from Common.String import StringToArray +from StrGather import * +from GenPcdDb import CreatePcdDatabaseCode + +## PCD type string +gItemTypeStringDatabase = { + TAB_PCDS_FEATURE_FLAG : 'FixedAtBuild', + TAB_PCDS_FIXED_AT_BUILD : 'FixedAtBuild', + TAB_PCDS_PATCHABLE_IN_MODULE: 'BinaryPatch', + TAB_PCDS_DYNAMIC : '', + TAB_PCDS_DYNAMIC_DEFAULT : '', + TAB_PCDS_DYNAMIC_VPD : '', + TAB_PCDS_DYNAMIC_HII : '', + TAB_PCDS_DYNAMIC_EX : '', + TAB_PCDS_DYNAMIC_EX_DEFAULT : '', + TAB_PCDS_DYNAMIC_EX_VPD : '', + TAB_PCDS_DYNAMIC_EX_HII : '', +} + +## Dynamic PCD types +gDynamicPcd = [TAB_PCDS_DYNAMIC, TAB_PCDS_DYNAMIC_DEFAULT, TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_HII] + +## Dynamic-ex PCD types +gDynamicExPcd = [TAB_PCDS_DYNAMIC_EX, TAB_PCDS_DYNAMIC_EX_DEFAULT, TAB_PCDS_DYNAMIC_EX_VPD, TAB_PCDS_DYNAMIC_EX_HII] + +## Datum size +gDatumSizeStringDatabase = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOLEAN','VOID*':'8'} +gDatumSizeStringDatabaseH = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOL','VOID*':'PTR'} +gDatumSizeStringDatabaseLib = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'Bool','VOID*':'Ptr'} + +## AutoGen File Header Templates +gAutoGenHeaderString = TemplateString("""\ +/** + DO NOT EDIT + FILE auto-generated + Module name: + ${FileName} + Abstract: Auto-generated ${FileName} for building module or library. +**/ +""") + +gAutoGenHPrologueString = TemplateString(""" +#ifndef _${File}_${Guid} +#define _${File}_${Guid} + +""") + +gAutoGenHCppPrologueString = """\ +#ifdef __cplusplus +extern "C" { +#endif + +""" + +gAutoGenHEpilogueString = """ + +#ifdef __cplusplus +} +#endif + +#endif +""" + +## PEI Core Entry Point Templates +gPeiCoreEntryPointPrototype = TemplateString(""" +${BEGIN} +VOID +EFIAPI +${Function} ( + IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, + IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, + IN VOID *Context + ); +${END} +""") + +gPeiCoreEntryPointString = TemplateString(""" +${BEGIN} +VOID +EFIAPI +ProcessModuleEntryPointList ( + IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData, + IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList, + IN VOID *Context + ) + +{ + ${Function} (SecCoreData, PpiList, Context); +} +${END} +""") + + +## DXE Core Entry Point Templates +gDxeCoreEntryPointPrototype = TemplateString(""" +${BEGIN} +VOID +EFIAPI +${Function} ( + IN VOID *HobStart + ); +${END} +""") + +gDxeCoreEntryPointString = TemplateString(""" +${BEGIN} +VOID +EFIAPI +ProcessModuleEntryPointList ( + IN VOID *HobStart + ) + +{ + ${Function} (HobStart); +} +${END} +""") + +## PEIM Entry Point Templates +gPeimEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ); +${END} +""") + +gPeimEntryPointString = [ +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) + +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; +${BEGIN} +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) + +{ + return ${Function} (FileHandle, PeiServices); +} +${END} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gPeimRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) + +{ + EFI_STATUS Status; + EFI_STATUS CombinedStatus; + + CombinedStatus = EFI_LOAD_ERROR; +${BEGIN} + Status = ${Function} (FileHandle, PeiServices); + if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) { + CombinedStatus = Status; + } +${END} + return CombinedStatus; +} +""") +] + +## SMM_CORE Entry Point Templates +gSmmCoreEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); +${END} +""") + +gSmmCoreEntryPointString = TemplateString(""" +${BEGIN} +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return ${Function} (ImageHandle, SystemTable); +} +${END} +""") + +## DXE SMM Entry Point Templates +gDxeSmmEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); +${END} +""") + +gDxeSmmEntryPointString = [ +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) + +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +static BASE_LIBRARY_JUMP_BUFFER mJumpContext; +static EFI_STATUS mDriverEntryPointStatus; + +VOID +EFIAPI +ExitDriver ( + IN EFI_STATUS Status + ) +{ + if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { + mDriverEntryPointStatus = Status; + } + LongJump (&mJumpContext, (UINTN)-1); + ASSERT (FALSE); +} + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + mDriverEntryPointStatus = EFI_LOAD_ERROR; + +${BEGIN} + if (SetJump (&mJumpContext) == 0) { + ExitDriver (${Function} (ImageHandle, SystemTable)); + ASSERT (FALSE); + } +${END} + + return mDriverEntryPointStatus; +} +""") +] + +## UEFI Driver Entry Point Templates +gUefiDriverEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); +${END} +""") + +gUefiDriverEntryPointString = [ +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +${BEGIN} +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) + +{ + return ${Function} (ImageHandle, SystemTable); +} +${END} +VOID +EFIAPI +ExitDriver ( + IN EFI_STATUS Status + ) +{ + if (EFI_ERROR (Status)) { + ProcessLibraryDestructorList (gImageHandle, gST); + } + gBS->Exit (gImageHandle, Status, 0, NULL); +} +"""), +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; +const UINT32 _gDxeRevision = ${PiSpecVersion}; + +static BASE_LIBRARY_JUMP_BUFFER mJumpContext; +static EFI_STATUS mDriverEntryPointStatus; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + mDriverEntryPointStatus = EFI_LOAD_ERROR; + ${BEGIN} + if (SetJump (&mJumpContext) == 0) { + ExitDriver (${Function} (ImageHandle, SystemTable)); + ASSERT (FALSE); + } + ${END} + return mDriverEntryPointStatus; +} + +VOID +EFIAPI +ExitDriver ( + IN EFI_STATUS Status + ) +{ + if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { + mDriverEntryPointStatus = Status; + } + LongJump (&mJumpContext, (UINTN)-1); + ASSERT (FALSE); +} +""") +] + + +## UEFI Application Entry Point Templates +gUefiApplicationEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); +${END} +""") + +gUefiApplicationEntryPointString = [ +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; + +${BEGIN} +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) + +{ + return ${Function} (ImageHandle, SystemTable); +} +${END} +VOID +EFIAPI +ExitDriver ( + IN EFI_STATUS Status + ) +{ + if (EFI_ERROR (Status)) { + ProcessLibraryDestructorList (gImageHandle, gST); + } + gBS->Exit (gImageHandle, Status, 0, NULL); +} +"""), +TemplateString(""" +const UINT32 _gUefiDriverRevision = ${UefiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) + +{ + ${BEGIN} + if (SetJump (&mJumpContext) == 0) { + ExitDriver (${Function} (ImageHandle, SystemTable)); + ASSERT (FALSE); + } + ${END} + return mDriverEntryPointStatus; +} + +static BASE_LIBRARY_JUMP_BUFFER mJumpContext; +static EFI_STATUS mDriverEntryPointStatus = EFI_LOAD_ERROR; + +VOID +EFIAPI +ExitDriver ( + IN EFI_STATUS Status + ) +{ + if (!EFI_ERROR (Status) || EFI_ERROR (mDriverEntryPointStatus)) { + mDriverEntryPointStatus = Status; + } + LongJump (&mJumpContext, (UINTN)-1); + ASSERT (FALSE); +} +""") +] + +## UEFI Unload Image Templates +gUefiUnloadImagePrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle + ); +${END} +""") + +gUefiUnloadImageString = [ +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; + +EFI_STATUS +EFIAPI +ProcessModuleUnloadList ( + IN EFI_HANDLE ImageHandle + ) +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; + +${BEGIN} +EFI_STATUS +EFIAPI +ProcessModuleUnloadList ( + IN EFI_HANDLE ImageHandle + ) +{ + return ${Function} (ImageHandle); +} +${END} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 _gDriverUnloadImageCount = ${Count}; + +EFI_STATUS +EFIAPI +ProcessModuleUnloadList ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + + Status = EFI_SUCCESS; +${BEGIN} + if (EFI_ERROR (Status)) { + ${Function} (ImageHandle); + } else { + Status = ${Function} (ImageHandle); + } +${END} + return Status; +} +""") +] + +gLibraryStructorPrototype = { +'BASE' : TemplateString("""${BEGIN} +RETURN_STATUS +EFIAPI +${Function} ( + VOID + );${END} +"""), + +'PEI' : TemplateString("""${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + );${END} +"""), + +'DXE' : TemplateString("""${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + );${END} +"""), +} + +gLibraryStructorCall = { +'BASE' : TemplateString("""${BEGIN} + Status = ${Function} (); + ASSERT_EFI_ERROR (Status);${END} +"""), + +'PEI' : TemplateString("""${BEGIN} + Status = ${Function} (FileHandle, PeiServices); + ASSERT_EFI_ERROR (Status);${END} +"""), + +'DXE' : TemplateString("""${BEGIN} + Status = ${Function} (ImageHandle, SystemTable); + ASSERT_EFI_ERROR (Status);${END} +"""), +} + +## Library Constructor and Destructor Templates +gLibraryString = { +'BASE' : TemplateString(""" +${BEGIN}${FunctionPrototype}${END} + +VOID +EFIAPI +ProcessLibrary${Type}List ( + VOID + ) +{ +${BEGIN} EFI_STATUS Status; +${FunctionCall}${END} +} +"""), + +'PEI' : TemplateString(""" +${BEGIN}${FunctionPrototype}${END} + +VOID +EFIAPI +ProcessLibrary${Type}List ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ +${BEGIN} EFI_STATUS Status; +${FunctionCall}${END} +} +"""), + +'DXE' : TemplateString(""" +${BEGIN}${FunctionPrototype}${END} + +VOID +EFIAPI +ProcessLibrary${Type}List ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ +${BEGIN} EFI_STATUS Status; +${FunctionCall}${END} +} +"""), +} + +gBasicHeaderFile = "Base.h" + +gModuleTypeHeaderFile = { + "BASE" : [gBasicHeaderFile], + "SEC" : ["PiPei.h", "Library/DebugLib.h"], + "PEI_CORE" : ["PiPei.h", "Library/DebugLib.h", "Library/PeiCoreEntryPoint.h"], + "PEIM" : ["PiPei.h", "Library/DebugLib.h", "Library/PeimEntryPoint.h"], + "DXE_CORE" : ["PiDxe.h", "Library/DebugLib.h", "Library/DxeCoreEntryPoint.h"], + "DXE_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], + "DXE_SMM_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], + "DXE_RUNTIME_DRIVER": ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], + "DXE_SAL_DRIVER" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], + "UEFI_DRIVER" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], + "UEFI_APPLICATION" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"], + "SMM_CORE" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"], + "USER_DEFINED" : [gBasicHeaderFile] +} + +## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName +# the TokenName and Guid comparison to avoid define name collisions. +# +# @param Info The ModuleAutoGen object +# @param AutoGenH The TemplateString object for header file +# +# +def DynExPcdTokenNumberMapping(Info, AutoGenH): + ExTokenCNameList = [] + PcdExList = [] + if Info.IsLibrary: + PcdList = Info.LibraryPcdList + else: + PcdList = Info.ModulePcdList + for Pcd in PcdList: + if Pcd.Type in gDynamicExPcd: + ExTokenCNameList.append(Pcd.TokenCName) + PcdExList.append(Pcd) + if len(ExTokenCNameList) == 0: + return + AutoGenH.Append('\n#define COMPAREGUID(Guid1, Guid2) (BOOLEAN)(*(CONST UINT64*)Guid1 == *(CONST UINT64*)Guid2 && *((CONST UINT64*)Guid1 + 1) == *((CONST UINT64*)Guid2 + 1))\n') + # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file. + # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter. + # Use the Guid pointer to see if it matches any of the token space GUIDs. + TokenCNameList = [] + for TokenCName in ExTokenCNameList: + if TokenCName in TokenCNameList: + continue + Index = 0 + Count = ExTokenCNameList.count(TokenCName) + for Pcd in PcdExList: + if Pcd.TokenCName == TokenCName: + Index = Index + 1 + if Index == 1: + AutoGenH.Append('\n#define __PCD_%s_ADDR_CMP(GuidPtr) (' % (Pcd.TokenCName)) + AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + else: + AutoGenH.Append('\\\n (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + if Index == Count: + AutoGenH.Append('0 \\\n )\n') + TokenCNameList.append(TokenCName) + + TokenCNameList = [] + for TokenCName in ExTokenCNameList: + if TokenCName in TokenCNameList: + continue + Index = 0 + Count = ExTokenCNameList.count(TokenCName) + for Pcd in PcdExList: + if Pcd.Type in gDynamicExPcd and Pcd.TokenCName == TokenCName: + Index = Index + 1 + if Index == 1: + AutoGenH.Append('\n#define __PCD_%s_VAL_CMP(GuidPtr) (' % (Pcd.TokenCName)) + AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + else: + AutoGenH.Append('\\\n COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' + % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) + if Index == Count: + AutoGenH.Append('0 \\\n )\n') + # Autogen internal worker macro to compare GUIDs. Guid1 is a pointer to a GUID. + # Guid2 is a C name for a GUID. Compare pointers first because optimizing compiler + # can do this at build time on CONST GUID pointers and optimize away call to COMPAREGUID(). + # COMPAREGUID() will only be used if the Guid passed in is local to the module. + AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr) __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr) \n' + % (Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName)) + TokenCNameList.append(TokenCName) + +## Create code for module PCDs +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# @param Pcd The PCD object +# +def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): + TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue #Info.GuidList[Pcd.TokenSpaceGuidCName] + PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber + # + # Write PCDs + # + PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName + if Pcd.Type in gDynamicExPcd: + TokenNumber = int(Pcd.TokenValue, 0) + # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with + # different Guids but same TokenCName + PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + Pcd.TokenCName + AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) + else: + if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: + # If one of the Source built modules listed in the DSC is not listed in FDF modules, + # and the INF lists a PCD can only use the PcdsDynamic access method (it is only + # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will + # report warning message notify the PI that they are attempting to build a module + # that must be included in a flash image in order to be functional. These Dynamic PCD + # will not be added into the Database unless it is used by other modules that are + # included in the FDF file. + # In this case, just assign an invalid token number to make it pass build. + if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: + TokenNumber = 0 + else: + EdkLogger.error("build", AUTOGEN_ERROR, + "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + else: + TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] + AutoGenH.Append('\n#define %s %dU\n' % (PcdTokenName, TokenNumber)) + + EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName) + if Pcd.Type not in gItemTypeStringDatabase: + EdkLogger.error("build", AUTOGEN_ERROR, + "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if Pcd.DatumType not in gDatumSizeStringDatabase: + EdkLogger.error("build", AUTOGEN_ERROR, + "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + + DatumSize = gDatumSizeStringDatabase[Pcd.DatumType] + DatumSizeLib = gDatumSizeStringDatabaseLib[Pcd.DatumType] + GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName + SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName + + PcdExCNameList = [] + if Pcd.Type in gDynamicExPcd: + if Info.IsLibrary: + PcdList = Info.LibraryPcdList + else: + PcdList = Info.ModulePcdList + for PcdModule in PcdList: + if PcdModule.Type in gDynamicExPcd: + PcdExCNameList.append(PcdModule.TokenCName) + # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd. + # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build. + # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. + if PcdExCNameList.count(Pcd.TokenCName) > 1: + AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') + AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + elif Pcd.Type in gDynamicPcd: + AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName)) + else: + PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[Pcd.Type] + '_' + Pcd.TokenCName + Const = 'const' + if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: + Const = '' + Type = '' + Array = '' + Value = Pcd.DefaultValue + Unicode = False + ValueNumber = 0 + + if Pcd.DatumType == 'BOOLEAN': + BoolValue = Value.upper() + if BoolValue == 'TRUE' or BoolValue == '1': + Value = '1U' + elif BoolValue == 'FALSE' or BoolValue == '0': + Value = '0U' + + if Pcd.DatumType in ['UINT64', 'UINT32', 'UINT16', 'UINT8']: + try: + if Value.upper().startswith('0X'): + ValueNumber = int (Value, 16) + else: + ValueNumber = int (Value) + except: + EdkLogger.error("build", AUTOGEN_ERROR, + "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if Pcd.DatumType == 'UINT64': + if ValueNumber < 0: + EdkLogger.error("build", AUTOGEN_ERROR, + "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + elif ValueNumber >= 0x10000000000000000: + EdkLogger.error("build", AUTOGEN_ERROR, + "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if not Value.endswith('ULL'): + Value += 'ULL' + elif Pcd.DatumType == 'UINT32': + if ValueNumber < 0: + EdkLogger.error("build", AUTOGEN_ERROR, + "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + elif ValueNumber >= 0x100000000: + EdkLogger.error("build", AUTOGEN_ERROR, + "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if not Value.endswith('U'): + Value += 'U' + elif Pcd.DatumType == 'UINT16': + if ValueNumber < 0: + EdkLogger.error("build", AUTOGEN_ERROR, + "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + elif ValueNumber >= 0x10000: + EdkLogger.error("build", AUTOGEN_ERROR, + "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if not Value.endswith('U'): + Value += 'U' + elif Pcd.DatumType == 'UINT8': + if ValueNumber < 0: + EdkLogger.error("build", AUTOGEN_ERROR, + "PCD can't be set to negative value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + elif ValueNumber >= 0x100: + EdkLogger.error("build", AUTOGEN_ERROR, + "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if not Value.endswith('U'): + Value += 'U' + if Pcd.DatumType == 'VOID*': + if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '': + EdkLogger.error("build", AUTOGEN_ERROR, + "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + + ArraySize = int(Pcd.MaxDatumSize, 0) + if Value[0] == '{': + Type = '(VOID *)' + else: + if Value[0] == 'L': + Unicode = True + Value = Value.lstrip('L') #.strip('"') + Value = eval(Value) # translate escape character + NewValue = '{' + for Index in range(0,len(Value)): + if Unicode: + NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ', ' + else: + NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', ' + if Unicode: + ArraySize = ArraySize / 2; + + if ArraySize < (len(Value) + 1): + EdkLogger.error("build", AUTOGEN_ERROR, + "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + Value = NewValue + '0 }' + Array = '[%d]' % ArraySize + # + # skip casting for fixed at build since it breaks ARM assembly. + # Long term we need PCD macros that work in assembly + # + elif Pcd.Type != TAB_PCDS_FIXED_AT_BUILD: + Value = "((%s)%s)" % (Pcd.DatumType, Value) + + if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: + PcdValueName = '_PCD_PATCHABLE_VALUE_' + Pcd.TokenCName + else: + PcdValueName = '_PCD_VALUE_' + Pcd.TokenCName + + if Pcd.DatumType == 'VOID*': + # + # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed. + # + if Unicode: + AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize)) + AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName)) + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value)) + AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array)) + AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName)) + else: + AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize)) + AutoGenH.Append('#define %s %s%s\n' %(PcdValueName, Type, PcdVariableName)) + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value)) + AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array)) + AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName)) + elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: + AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value)) + AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName)) + AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array)) + AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName)) + else: + AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value)) + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName)) + AutoGenH.Append('extern %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array)) + AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName)) + + if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE: + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPatchPcdSetPtr(_gPcd_BinaryPatch_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, Pcd.TokenCName, Pcd.TokenCName)) + else: + AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName)) + else: + AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName) + +## Create code for library module PCDs +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# @param Pcd The PCD object +# +def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): + PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber + TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName + TokenCName = Pcd.TokenCName + PcdTokenName = '_PCD_TOKEN_' + TokenCName + # + # Write PCDs + # + if Pcd.Type in gDynamicExPcd: + TokenNumber = int(Pcd.TokenValue, 0) + else: + if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber: + # If one of the Source built modules listed in the DSC is not listed in FDF modules, + # and the INF lists a PCD can only use the PcdsDynamic access method (it is only + # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will + # report warning message notify the PI that they are attempting to build a module + # that must be included in a flash image in order to be functional. These Dynamic PCD + # will not be added into the Database unless it is used by other modules that are + # included in the FDF file. + # In this case, just assign an invalid token number to make it pass build. + if Pcd.Type in PCD_DYNAMIC_TYPE_LIST: + TokenNumber = 0 + else: + EdkLogger.error("build", AUTOGEN_ERROR, + "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + else: + TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] + + if Pcd.Type not in gItemTypeStringDatabase: + EdkLogger.error("build", AUTOGEN_ERROR, + "Unknown PCD type [%s] of PCD %s.%s" % (Pcd.Type, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + if Pcd.DatumType not in gDatumSizeStringDatabase: + EdkLogger.error("build", AUTOGEN_ERROR, + "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName), + ExtraData="[%s]" % str(Info)) + + DatumType = Pcd.DatumType + DatumSize = gDatumSizeStringDatabaseH[DatumType] + DatumSizeLib= gDatumSizeStringDatabaseLib[DatumType] + GetModeName = '_PCD_GET_MODE_' + DatumSize + '_' + TokenCName + SetModeName = '_PCD_SET_MODE_' + DatumSize + '_' + TokenCName + + Type = '' + Array = '' + if Pcd.DatumType == 'VOID*': + Type = '(VOID *)' + Array = '[]' + PcdItemType = Pcd.Type + PcdExCNameList = [] + if PcdItemType in gDynamicExPcd: + PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + Pcd.TokenCName + AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) + + if Info.IsLibrary: + PcdList = Info.LibraryPcdList + else: + PcdList = Info.ModulePcdList + for PcdModule in PcdList: + if PcdModule.Type in gDynamicExPcd: + PcdExCNameList.append(PcdModule.TokenCName) + # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd. + # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build. + # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. + if PcdExCNameList.count(Pcd.TokenCName) > 1: + AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') + AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('// #define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s %s\n' % (PcdTokenName, PcdExTokenName)) + AutoGenH.Append('#define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + if Pcd.DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) + else: + AutoGenH.Append('#define _PCD_TOKEN_%s %dU\n' % (TokenCName, TokenNumber)) + if PcdItemType in gDynamicPcd: + AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) + if DatumType == 'VOID*': + AutoGenH.Append('#define %s(SizeOfBuffer, Buffer) LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName)) + else: + AutoGenH.Append('#define %s(Value) LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName)) + if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE: + PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName + AutoGenH.Append('extern volatile %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) ) + AutoGenH.Append('#define %s %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName)) + AutoGenH.Append('#define %s(Value) (%s = (Value))\n' % (SetModeName, PcdVariableName)) + if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG: + key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName)) + + AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array)) + AutoGenH.Append('#define %s %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName)) + AutoGenH.Append('//#define %s ASSERT(FALSE) // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName) + + if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and key in Info.ConstPcd: + AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue)) + + + +## Create code for library constructor +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): + # + # Library Constructors + # + ConstructorPrototypeString = TemplateString() + ConstructorCallingString = TemplateString() + if Info.IsLibrary: + DependentLibraryList = [Info.Module] + else: + DependentLibraryList = Info.DependentLibraryList + for Lib in DependentLibraryList: + if len(Lib.ConstructorList) <= 0: + continue + Dict = {'Function':Lib.ConstructorList} + if Lib.ModuleType in ['BASE', 'SEC']: + ConstructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict)) + ConstructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict)) + elif Lib.ModuleType in ['PEI_CORE','PEIM']: + ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) + ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) + elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', + 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: + ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) + ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) + + if str(ConstructorPrototypeString) == '': + ConstructorPrototypeList = [] + else: + ConstructorPrototypeList = [str(ConstructorPrototypeString)] + if str(ConstructorCallingString) == '': + ConstructorCallingList = [] + else: + ConstructorCallingList = [str(ConstructorCallingString)] + + Dict = { + 'Type' : 'Constructor', + 'FunctionPrototype' : ConstructorPrototypeList, + 'FunctionCall' : ConstructorCallingList + } + if Info.IsLibrary: + AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict) + else: + if Info.ModuleType in ['BASE', 'SEC']: + AutoGenC.Append(gLibraryString['BASE'].Replace(Dict)) + elif Info.ModuleType in ['PEI_CORE','PEIM']: + AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) + elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', + 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: + AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) + +## Create code for library destructor +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): + # + # Library Destructors + # + DestructorPrototypeString = TemplateString() + DestructorCallingString = TemplateString() + if Info.IsLibrary: + DependentLibraryList = [Info.Module] + else: + DependentLibraryList = Info.DependentLibraryList + for Index in range(len(DependentLibraryList)-1, -1, -1): + Lib = DependentLibraryList[Index] + if len(Lib.DestructorList) <= 0: + continue + Dict = {'Function':Lib.DestructorList} + if Lib.ModuleType in ['BASE', 'SEC']: + DestructorPrototypeString.Append(gLibraryStructorPrototype['BASE'].Replace(Dict)) + DestructorCallingString.Append(gLibraryStructorCall['BASE'].Replace(Dict)) + elif Lib.ModuleType in ['PEI_CORE','PEIM']: + DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) + DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) + elif Lib.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', + 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_CORE']: + DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) + DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) + + if str(DestructorPrototypeString) == '': + DestructorPrototypeList = [] + else: + DestructorPrototypeList = [str(DestructorPrototypeString)] + if str(DestructorCallingString) == '': + DestructorCallingList = [] + else: + DestructorCallingList = [str(DestructorCallingString)] + + Dict = { + 'Type' : 'Destructor', + 'FunctionPrototype' : DestructorPrototypeList, + 'FunctionCall' : DestructorCallingList + } + if Info.IsLibrary: + AutoGenH.Append("${BEGIN}${FunctionPrototype}${END}", Dict) + else: + if Info.ModuleType in ['BASE', 'SEC']: + AutoGenC.Append(gLibraryString['BASE'].Replace(Dict)) + elif Info.ModuleType in ['PEI_CORE','PEIM']: + AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) + elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', + 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: + AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) + + +## Create code for ModuleEntryPoint +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): + if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']: + return + # + # Module Entry Points + # + NumEntryPoints = len(Info.Module.ModuleEntryPointList) + if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification: + PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION'] + else: + PiSpecVersion = '0x00000000' + if 'UEFI_SPECIFICATION_VERSION' in Info.Module.Specification: + UefiSpecVersion = Info.Module.Specification['UEFI_SPECIFICATION_VERSION'] + else: + UefiSpecVersion = '0x00000000' + Dict = { + 'Function' : Info.Module.ModuleEntryPointList, + 'PiSpecVersion' : PiSpecVersion + 'U', + 'UefiSpecVersion': UefiSpecVersion + 'U' + } + + if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']: + if Info.SourceFileList <> None and Info.SourceFileList <> []: + if NumEntryPoints != 1: + EdkLogger.error( + "build", + AUTOGEN_ERROR, + '%s must have exactly one entry point' % Info.ModuleType, + File=str(Info), + ExtraData= ", ".join(Info.Module.ModuleEntryPointList) + ) + if Info.ModuleType == 'PEI_CORE': + AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict)) + AutoGenH.Append(gPeiCoreEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'DXE_CORE': + AutoGenC.Append(gDxeCoreEntryPointString.Replace(Dict)) + AutoGenH.Append(gDxeCoreEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'SMM_CORE': + AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict)) + AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'PEIM': + if NumEntryPoints < 2: + AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict)) + else: + AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict)) + AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType in ['DXE_RUNTIME_DRIVER','DXE_DRIVER','DXE_SAL_DRIVER','UEFI_DRIVER']: + if NumEntryPoints < 2: + AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict)) + else: + AutoGenC.Append(gUefiDriverEntryPointString[2].Replace(Dict)) + AutoGenH.Append(gUefiDriverEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'DXE_SMM_DRIVER': + if NumEntryPoints == 0: + AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict)) + else: + AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict)) + AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'UEFI_APPLICATION': + if NumEntryPoints < 2: + AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict)) + else: + AutoGenC.Append(gUefiApplicationEntryPointString[2].Replace(Dict)) + AutoGenH.Append(gUefiApplicationEntryPointPrototype.Replace(Dict)) + +## Create code for ModuleUnloadImage +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH): + if Info.IsLibrary or Info.ModuleType in ['USER_DEFINED', 'SEC']: + return + # + # Unload Image Handlers + # + NumUnloadImage = len(Info.Module.ModuleUnloadImageList) + Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':Info.Module.ModuleUnloadImageList} + if NumUnloadImage < 2: + AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict)) + else: + AutoGenC.Append(gUefiUnloadImageString[2].Replace(Dict)) + AutoGenH.Append(gUefiUnloadImagePrototype.Replace(Dict)) + +## Create code for GUID +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH): + if Info.IsLibrary: + return + + if Info.ModuleType in ["USER_DEFINED", "BASE"]: + GuidType = "GUID" + else: + GuidType = "EFI_GUID" + + if Info.GuidList: + AutoGenC.Append("\n// Guids\n") + # + # GUIDs + # + for Key in Info.GuidList: + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.GuidList[Key])) + +## Create code for protocol +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH): + if Info.IsLibrary: + return + + if Info.ModuleType in ["USER_DEFINED", "BASE"]: + GuidType = "GUID" + else: + GuidType = "EFI_GUID" + + if Info.ProtocolList: + AutoGenC.Append("\n// Protocols\n") + # + # Protocol GUIDs + # + for Key in Info.ProtocolList: + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.ProtocolList[Key])) + +## Create code for PPI +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH): + if Info.IsLibrary: + return + + if Info.ModuleType in ["USER_DEFINED", "BASE"]: + GuidType = "GUID" + else: + GuidType = "EFI_GUID" + + if Info.PpiList: + AutoGenC.Append("\n// PPIs\n") + # + # PPI GUIDs + # + for Key in Info.PpiList: + AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s = %s;\n' % (GuidType, Key, Info.PpiList[Key])) + +## Create code for PCD +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreatePcdCode(Info, AutoGenC, AutoGenH): + + # Collect Token Space GUIDs used by DynamicEc PCDs + TokenSpaceList = [] + for Pcd in Info.ModulePcdList: + if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList: + TokenSpaceList += [Pcd.TokenSpaceGuidCName] + + # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found + if TokenSpaceList <> []: + AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n") + if Info.ModuleType in ["USER_DEFINED", "BASE"]: + GuidType = "GUID" + else: + GuidType = "EFI_GUID" + for Item in TokenSpaceList: + AutoGenH.Append('extern %s %s;\n' % (GuidType, Item)) + + if Info.IsLibrary: + if Info.ModulePcdList: + AutoGenH.Append("\n// PCD definitions\n") + for Pcd in Info.ModulePcdList: + CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd) + DynExPcdTokenNumberMapping (Info, AutoGenH) + else: + if Info.ModulePcdList: + AutoGenH.Append("\n// Definition of PCDs used in this module\n") + AutoGenC.Append("\n// Definition of PCDs used in this module\n") + for Pcd in Info.ModulePcdList: + CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd) + DynExPcdTokenNumberMapping (Info, AutoGenH) + if Info.LibraryPcdList: + AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n") + AutoGenC.Append("\n// Definition of PCDs used in libraries\n") + for Pcd in Info.LibraryPcdList: + CreateModulePcdCode(Info, AutoGenC, AutoGenC, Pcd) + CreatePcdDatabaseCode(Info, AutoGenC, AutoGenH) + +## Create code for unicode string definition +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True +# @param UniGenBinBuffer Buffer to store uni string package data +# +def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuffer): + WorkingDir = os.getcwd() + os.chdir(Info.WorkspaceDir) + + IncList = [Info.MetaFile.Dir] + # Get all files under [Sources] section in inf file for EDK-II module + EDK2Module = True + SrcList = [F for F in Info.SourceFileList] + if Info.AutoGenVersion < 0x00010005: + EDK2Module = False + # Get all files under the module directory for EDK-I module + Cwd = os.getcwd() + os.chdir(Info.MetaFile.Dir) + for Root, Dirs, Files in os.walk("."): + if 'CVS' in Dirs: + Dirs.remove('CVS') + if '.svn' in Dirs: + Dirs.remove('.svn') + for File in Files: + File = PathClass(os.path.join(Root, File), Info.MetaFile.Dir) + if File in SrcList: + continue + SrcList.append(File) + os.chdir(Cwd) + + if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-c') > -1: + CompatibleMode = True + else: + CompatibleMode = False + + # + # -s is a temporary option dedicated for building .UNI files with ISO 639-2 language codes of EDK Shell in EDK2 + # + if 'BUILD' in Info.BuildOption and Info.BuildOption['BUILD']['FLAGS'].find('-s') > -1: + if CompatibleMode: + EdkLogger.error("build", AUTOGEN_ERROR, + "-c and -s build options should be used exclusively", + ExtraData="[%s]" % str(Info)) + ShellMode = True + else: + ShellMode = False + + #RFC4646 is only for EDKII modules and ISO639-2 for EDK modules + if EDK2Module: + FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.RFCLanguages] + else: + FilterInfo = [EDK2Module] + [Info.PlatformInfo.Platform.ISOLanguages] + Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer, FilterInfo) + if CompatibleMode or UniGenCFlag: + AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n") + AutoGenC.Append(Code) + AutoGenC.Append("\n") + AutoGenH.Append("\n//\n//Unicode String ID\n//\n") + AutoGenH.Append(Header) + if CompatibleMode or UniGenCFlag: + AutoGenH.Append("\n#define STRING_ARRAY_NAME %sStrings\n" % Info.Name) + os.chdir(WorkingDir) + +## Create common code +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateHeaderCode(Info, AutoGenC, AutoGenH): + # file header + AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'})) + # header file Prologue + AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')})) + AutoGenH.Append(gAutoGenHCppPrologueString) + if Info.AutoGenVersion >= 0x00010005: + # header files includes + AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile) + if Info.ModuleType in gModuleTypeHeaderFile \ + and gModuleTypeHeaderFile[Info.ModuleType][0] != gBasicHeaderFile: + AutoGenH.Append("#include <%s>\n" % gModuleTypeHeaderFile[Info.ModuleType][0]) + # + # if either PcdLib in [LibraryClasses] sections or there exist Pcd section, add PcdLib.h + # As if modules only uses FixedPcd, then PcdLib is not needed in [LibraryClasses] section. + # + if 'PcdLib' in Info.Module.LibraryClasses or Info.Module.Pcds: + AutoGenH.Append("#include \n") + + AutoGenH.Append('\nextern GUID gEfiCallerIdGuid;') + AutoGenH.Append('\nextern CHAR8 *gEfiCallerBaseName;\n\n') + + if Info.IsLibrary: + return + + AutoGenH.Append("#define EFI_CALLER_ID_GUID \\\n %s\n" % GuidStringToGuidStructureString(Info.Guid)) + + if Info.IsLibrary: + return + # C file header + AutoGenC.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.c'})) + if Info.AutoGenVersion >= 0x00010005: + # C file header files includes + if Info.ModuleType in gModuleTypeHeaderFile: + for Inc in gModuleTypeHeaderFile[Info.ModuleType]: + AutoGenC.Append("#include <%s>\n" % Inc) + else: + AutoGenC.Append("#include <%s>\n" % gBasicHeaderFile) + + # + # Publish the CallerId Guid + # + AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid)) + AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gEfiCallerBaseName = "%s";\n' % Info.Name) + +## Create common code for header file +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# +def CreateFooterCode(Info, AutoGenC, AutoGenH): + AutoGenH.Append(gAutoGenHEpilogueString) + +## Create code for a module +# +# @param Info The ModuleAutoGen object +# @param AutoGenC The TemplateString object for C code +# @param AutoGenH The TemplateString object for header file +# @param UniGenCFlag UniString is generated into AutoGen C file when it is set to True +# @param UniGenBinBuffer Buffer to store uni string package data +# +def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer): + CreateHeaderCode(Info, AutoGenC, AutoGenH) + + if Info.AutoGenVersion >= 0x00010005: + CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH) + CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH) + CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH) + CreatePcdCode(Info, AutoGenC, AutoGenH) + CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH) + CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH) + CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH) + CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH) + + if Info.UnicodeFileList: + FileName = "%sStrDefs.h" % Info.Name + StringH.Append(gAutoGenHeaderString.Replace({'FileName':FileName})) + StringH.Append(gAutoGenHPrologueString.Replace({'File':'STRDEFS', 'Guid':Info.Guid.replace('-','_')})) + CreateUnicodeStringCode(Info, AutoGenC, StringH, UniGenCFlag, UniGenBinBuffer) + StringH.Append("\n#endif\n") + AutoGenH.Append('#include "%s"\n' % FileName) + + CreateFooterCode(Info, AutoGenC, AutoGenH) + + # no generation of AutoGen.c for Edk modules without unicode file + if Info.AutoGenVersion < 0x00010005 and len(Info.UnicodeFileList) == 0: + AutoGenC.String = '' + +## Create the code file +# +# @param FilePath The path of code file +# @param Content The content of code file +# @param IsBinaryFile The flag indicating if the file is binary file or not +# +# @retval True If file content is changed or file doesn't exist +# @retval False If the file exists and the content is not changed +# +def Generate(FilePath, Content, IsBinaryFile): + return SaveFileOnChange(FilePath, Content, IsBinaryFile) + diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index b2ebff324d..00d0af0cb7 100644 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -1,1411 +1,1411 @@ -## @file -# Create makefile for MS nmake and GNU make -# -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## Import Modules -# -import os -import sys -import string -import re -import os.path as path - -from Common.BuildToolError import * -from Common.Misc import * -from Common.String import * -from BuildEngine import * -import Common.GlobalData as GlobalData - -## Regular expression for finding header file inclusions -gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:\(?[\"<]?[ \t]*)([-\w.\\/() \t]+)(?:[ \t]*[\">]?\)?)", re.MULTILINE|re.UNICODE|re.IGNORECASE) - -## Regular expression for matching macro used in header file inclusion -gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE) - -gIsFileMap = {} - -## pattern for include style in Edk.x code -gProtocolDefinition = "Protocol/%(HeaderKey)s/%(HeaderKey)s.h" -gGuidDefinition = "Guid/%(HeaderKey)s/%(HeaderKey)s.h" -gArchProtocolDefinition = "ArchProtocol/%(HeaderKey)s/%(HeaderKey)s.h" -gPpiDefinition = "Ppi/%(HeaderKey)s/%(HeaderKey)s.h" -gIncludeMacroConversion = { - "EFI_PROTOCOL_DEFINITION" : gProtocolDefinition, - "EFI_GUID_DEFINITION" : gGuidDefinition, - "EFI_ARCH_PROTOCOL_DEFINITION" : gArchProtocolDefinition, - "EFI_PROTOCOL_PRODUCER" : gProtocolDefinition, - "EFI_PROTOCOL_CONSUMER" : gProtocolDefinition, - "EFI_PROTOCOL_DEPENDENCY" : gProtocolDefinition, - "EFI_ARCH_PROTOCOL_PRODUCER" : gArchProtocolDefinition, - "EFI_ARCH_PROTOCOL_CONSUMER" : gArchProtocolDefinition, - "EFI_ARCH_PROTOCOL_DEPENDENCY" : gArchProtocolDefinition, - "EFI_PPI_DEFINITION" : gPpiDefinition, - "EFI_PPI_PRODUCER" : gPpiDefinition, - "EFI_PPI_CONSUMER" : gPpiDefinition, - "EFI_PPI_DEPENDENCY" : gPpiDefinition, -} - -## default makefile type -gMakeType = "" -if sys.platform == "win32": - gMakeType = "nmake" -else: - gMakeType = "gmake" - - -## BuildFile class -# -# This base class encapsules build file and its generation. It uses template to generate -# the content of build file. The content of build file will be got from AutoGen objects. -# -class BuildFile(object): - ## template used to generate the build file (i.e. makefile if using make) - _TEMPLATE_ = TemplateString('') - - _DEFAULT_FILE_NAME_ = "Makefile" - - ## default file name for each type of build file - _FILE_NAME_ = { - "nmake" : "Makefile", - "gmake" : "GNUmakefile" - } - - ## Fixed header string for makefile - _MAKEFILE_HEADER = '''# -# DO NOT EDIT -# This file is auto-generated by build utility -# -# Module Name: -# -# %s -# -# Abstract: -# -# Auto-generated makefile for building modules, libraries or platform -# - ''' - - ## Header string for each type of build file - _FILE_HEADER_ = { - "nmake" : _MAKEFILE_HEADER % _FILE_NAME_["nmake"], - "gmake" : _MAKEFILE_HEADER % _FILE_NAME_["gmake"] - } - - ## shell commands which can be used in build file in the form of macro - # $(CP) copy file command - # $(MV) move file command - # $(RM) remove file command - # $(MD) create dir command - # $(RD) remove dir command - # - _SHELL_CMD_ = { - "nmake" : { - "CP" : "copy /y", - "MV" : "move /y", - "RM" : "del /f /q", - "MD" : "mkdir", - "RD" : "rmdir /s /q", - }, - - "gmake" : { - "CP" : "cp -f", - "MV" : "mv -f", - "RM" : "rm -f", - "MD" : "mkdir -p", - "RD" : "rm -r -f", - } - } - - ## directory separator - _SEP_ = { - "nmake" : "\\", - "gmake" : "/" - } - - ## directory creation template - _MD_TEMPLATE_ = { - "nmake" : 'if not exist %(dir)s $(MD) %(dir)s', - "gmake" : "$(MD) %(dir)s" - } - - ## directory removal template - _RD_TEMPLATE_ = { - "nmake" : 'if exist %(dir)s $(RD) %(dir)s', - "gmake" : "$(RD) %(dir)s" - } - - _CD_TEMPLATE_ = { - "nmake" : 'if exist %(dir)s cd %(dir)s', - "gmake" : "test -e %(dir)s && cd %(dir)s" - } - - _MAKE_TEMPLATE_ = { - "nmake" : 'if exist %(file)s "$(MAKE)" $(MAKE_FLAGS) -f %(file)s', - "gmake" : 'test -e %(file)s && "$(MAKE)" $(MAKE_FLAGS) -f %(file)s' - } - - _INCLUDE_CMD_ = { - "nmake" : '!INCLUDE', - "gmake" : "include" - } - - _INC_FLAG_ = {"MSFT" : "/I", "GCC" : "-I", "INTEL" : "-I", "RVCT" : "-I"} - - ## Constructor of BuildFile - # - # @param AutoGenObject Object of AutoGen class - # - def __init__(self, AutoGenObject): - self._AutoGenObject = AutoGenObject - self._FileType = gMakeType - - ## Create build file - # - # @param FileType Type of build file. Only nmake and gmake are supported now. - # - # @retval TRUE The build file is created or re-created successfully - # @retval FALSE The build file exists and is the same as the one to be generated - # - def Generate(self, FileType=gMakeType): - if FileType not in self._FILE_NAME_: - EdkLogger.error("build", PARAMETER_INVALID, "Invalid build type [%s]" % FileType, - ExtraData="[%s]" % str(self._AutoGenObject)) - self._FileType = FileType - FileContent = self._TEMPLATE_.Replace(self._TemplateDict) - FileName = self._FILE_NAME_[FileType] - return SaveFileOnChange(os.path.join(self._AutoGenObject.MakeFileDir, FileName), FileContent, False) - - ## Return a list of directory creation command string - # - # @param DirList The list of directory to be created - # - # @retval list The directory creation command list - # - def GetCreateDirectoryCommand(self, DirList): - return [self._MD_TEMPLATE_[self._FileType] % {'dir':Dir} for Dir in DirList] - - ## Return a list of directory removal command string - # - # @param DirList The list of directory to be removed - # - # @retval list The directory removal command list - # - def GetRemoveDirectoryCommand(self, DirList): - return [self._RD_TEMPLATE_[self._FileType] % {'dir':Dir} for Dir in DirList] - - def PlaceMacro(self, Path, MacroDefinitions={}): - if Path.startswith("$("): - return Path - else: - PathLength = len(Path) - for MacroName in MacroDefinitions: - MacroValue = MacroDefinitions[MacroName] - MacroValueLength = len(MacroValue) - if MacroValueLength <= PathLength and Path.startswith(MacroValue): - Path = "$(%s)%s" % (MacroName, Path[MacroValueLength:]) - break - return Path - -## ModuleMakefile class -# -# This class encapsules makefie and its generation for module. It uses template to generate -# the content of makefile. The content of makefile will be got from ModuleAutoGen object. -# -class ModuleMakefile(BuildFile): - ## template used to generate the makefile for module - _TEMPLATE_ = TemplateString('''\ -${makefile_header} - -# -# Platform Macro Definition -# -PLATFORM_NAME = ${platform_name} -PLATFORM_GUID = ${platform_guid} -PLATFORM_VERSION = ${platform_version} -PLATFORM_RELATIVE_DIR = ${platform_relative_directory} -PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} -PLATFORM_OUTPUT_DIR = ${platform_output_directory} - -# -# Module Macro Definition -# -MODULE_NAME = ${module_name} -MODULE_GUID = ${module_guid} -MODULE_VERSION = ${module_version} -MODULE_TYPE = ${module_type} -MODULE_FILE = ${module_file} -MODULE_FILE_BASE_NAME = ${module_file_base_name} -BASE_NAME = $(MODULE_NAME) -MODULE_RELATIVE_DIR = ${module_relative_directory} -MODULE_DIR = $(WORKSPACE)${separator}${module_relative_directory} - -MODULE_ENTRY_POINT = ${module_entry_point} -ARCH_ENTRY_POINT = ${arch_entry_point} -IMAGE_ENTRY_POINT = ${image_entry_point} - -${BEGIN}${module_extra_defines} -${END} -# -# Build Configuration Macro Definition -# -ARCH = ${architecture} -TOOLCHAIN = ${toolchain_tag} -TOOLCHAIN_TAG = ${toolchain_tag} -TARGET = ${build_target} - -# -# Build Directory Macro Definition -# -# PLATFORM_BUILD_DIR = ${platform_build_directory} -BUILD_DIR = ${platform_build_directory} -BIN_DIR = $(BUILD_DIR)${separator}${architecture} -LIB_DIR = $(BIN_DIR) -MODULE_BUILD_DIR = ${module_build_directory} -OUTPUT_DIR = ${module_output_directory} -DEBUG_DIR = ${module_debug_directory} -DEST_DIR_OUTPUT = $(OUTPUT_DIR) -DEST_DIR_DEBUG = $(DEBUG_DIR) - -# -# Shell Command Macro -# -${BEGIN}${shell_command_code} = ${shell_command} -${END} - -# -# Tools definitions specific to this module -# -${BEGIN}${module_tool_definitions} -${END} -MAKE_FILE = ${makefile_path} - -# -# Build Macro -# -${BEGIN}${file_macro} -${END} - -COMMON_DEPS = ${BEGIN}${common_dependency_file} \\ - ${END} - -# -# Overridable Target Macro Definitions -# -FORCE_REBUILD = force_build -INIT_TARGET = init -PCH_TARGET = -BC_TARGET = ${BEGIN}${backward_compatible_target} ${END} -CODA_TARGET = ${BEGIN}${remaining_build_target} \\ - ${END} - -# -# Default target, which will build dependent libraries in addition to source files -# - -all: mbuild - - -# -# Target used when called from platform makefile, which will bypass the build of dependent libraries -# - -pbuild: $(INIT_TARGET) $(BC_TARGET) $(PCH_TARGET) $(CODA_TARGET) - -# -# ModuleTarget -# - -mbuild: $(INIT_TARGET) $(BC_TARGET) gen_libs $(PCH_TARGET) $(CODA_TARGET) - -# -# Build Target used in multi-thread build mode, which will bypass the init and gen_libs targets -# - -tbuild: $(BC_TARGET) $(PCH_TARGET) $(CODA_TARGET) - -# -# Phony target which is used to force executing commands for a target -# -force_build: -\t-@ - -# -# Target to update the FD -# - -fds: mbuild gen_fds - -# -# Initialization target: print build information and create necessary directories -# -init: info dirs - -info: -\t-@echo Building ... $(MODULE_DIR)${separator}$(MODULE_FILE) [$(ARCH)] - -dirs: -${BEGIN}\t-@${create_directory_command}\n${END} - -strdefs: -\t-@$(CP) $(DEBUG_DIR)${separator}AutoGen.h $(DEBUG_DIR)${separator}$(MODULE_NAME)StrDefs.h - -# -# GenLibsTarget -# -gen_libs: -\t${BEGIN}@"$(MAKE)" $(MAKE_FLAGS) -f ${dependent_library_build_directory}${separator}${makefile_name} -\t${END}@cd $(MODULE_BUILD_DIR) - -# -# Build Flash Device Image -# -gen_fds: -\t@"$(MAKE)" $(MAKE_FLAGS) -f $(BUILD_DIR)${separator}${makefile_name} fds -\t@cd $(MODULE_BUILD_DIR) - -# -# Individual Object Build Targets -# -${BEGIN}${file_build_target} -${END} - -# -# clean all intermediate files -# -clean: -\t${BEGIN}${clean_command} -\t${END} - -# -# clean all generated files -# -cleanall: -${BEGIN}\t${cleanall_command} -${END}\t$(RM) *.pdb *.idb > NUL 2>&1 -\t$(RM) $(BIN_DIR)${separator}$(MODULE_NAME).efi - -# -# clean all dependent libraries built -# -cleanlib: -\t${BEGIN}-@${library_build_command} cleanall -\t${END}@cd $(MODULE_BUILD_DIR)\n\n''') - - _FILE_MACRO_TEMPLATE = TemplateString("${macro_name} = ${BEGIN} \\\n ${source_file}${END}\n") - _BUILD_TARGET_TEMPLATE = TemplateString("${BEGIN}${target} : ${deps}\n${END}\t${cmd}\n") - - ## Constructor of ModuleMakefile - # - # @param ModuleAutoGen Object of ModuleAutoGen class - # - def __init__(self, ModuleAutoGen): - BuildFile.__init__(self, ModuleAutoGen) - self.PlatformInfo = self._AutoGenObject.PlatformInfo - - self.ResultFileList = [] - self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"] - - self.SourceFileDatabase = {} # {file type : file path} - self.DestFileDatabase = {} # {file type : file path} - self.FileBuildTargetList = [] # [(src, target string)] - self.BuildTargetList = [] # [target string] - self.PendingBuildTargetList = [] # [FileBuildRule objects] - self.CommonFileDependency = [] - self.FileListMacros = {} - self.ListFileMacros = {} - - self.FileCache = {} - self.FileDependency = [] - self.LibraryBuildCommandList = [] - self.LibraryFileList = [] - self.LibraryMakefileList = [] - self.LibraryBuildDirectoryList = [] - self.SystemLibraryList = [] - self.Macros = sdict() - self.Macros["OUTPUT_DIR" ] = self._AutoGenObject.Macros["OUTPUT_DIR"] - self.Macros["DEBUG_DIR" ] = self._AutoGenObject.Macros["DEBUG_DIR"] - self.Macros["MODULE_BUILD_DIR"] = self._AutoGenObject.Macros["MODULE_BUILD_DIR"] - self.Macros["BIN_DIR" ] = self._AutoGenObject.Macros["BIN_DIR"] - self.Macros["BUILD_DIR" ] = self._AutoGenObject.Macros["BUILD_DIR"] - self.Macros["WORKSPACE" ] = self._AutoGenObject.Macros["WORKSPACE"] - - # Compose a dict object containing information used to do replacement in template - def _CreateTemplateDict(self): - if self._FileType not in self._SEP_: - EdkLogger.error("build", PARAMETER_INVALID, "Invalid Makefile type [%s]" % self._FileType, - ExtraData="[%s]" % str(self._AutoGenObject)) - Separator = self._SEP_[self._FileType] - - # break build if no source files and binary files are found - if len(self._AutoGenObject.SourceFileList) == 0 and len(self._AutoGenObject.BinaryFileList) == 0: - EdkLogger.error("build", AUTOGEN_ERROR, "No files to be built in module [%s, %s, %s]" - % (self._AutoGenObject.BuildTarget, self._AutoGenObject.ToolChain, self._AutoGenObject.Arch), - ExtraData="[%s]" % str(self._AutoGenObject)) - - # convert dependent libraries to build command - self.ProcessDependentLibrary() - if len(self._AutoGenObject.Module.ModuleEntryPointList) > 0: - ModuleEntryPoint = self._AutoGenObject.Module.ModuleEntryPointList[0] - else: - ModuleEntryPoint = "_ModuleEntryPoint" - - # Intel EBC compiler enforces EfiMain - if self._AutoGenObject.AutoGenVersion < 0x00010005 and self._AutoGenObject.Arch == "EBC": - ArchEntryPoint = "EfiMain" - else: - ArchEntryPoint = ModuleEntryPoint - - if self._AutoGenObject.Arch == "EBC": - # EBC compiler always use "EfiStart" as entry point. Only applies to EdkII modules - ImageEntryPoint = "EfiStart" - elif self._AutoGenObject.AutoGenVersion < 0x00010005: - # Edk modules use entry point specified in INF file - ImageEntryPoint = ModuleEntryPoint - else: - # EdkII modules always use "_ModuleEntryPoint" as entry point - ImageEntryPoint = "_ModuleEntryPoint" - - # tools definitions - ToolsDef = [] - IncPrefix = self._INC_FLAG_[self._AutoGenObject.ToolChainFamily] - for Tool in self._AutoGenObject.BuildOption: - for Attr in self._AutoGenObject.BuildOption[Tool]: - Value = self._AutoGenObject.BuildOption[Tool][Attr] - if Attr == "FAMILY": - continue - elif Attr == "PATH": - ToolsDef.append("%s = %s" % (Tool, Value)) - else: - # Don't generate MAKE_FLAGS in makefile. It's put in environment variable. - if Tool == "MAKE": - continue - # Remove duplicated include path, if any - if Attr == "FLAGS": - Value = RemoveDupOption(Value, IncPrefix, self._AutoGenObject.IncludePathList) - ToolsDef.append("%s_%s = %s" % (Tool, Attr, Value)) - ToolsDef.append("") - - # convert source files and binary files to build targets - self.ResultFileList = [str(T.Target) for T in self._AutoGenObject.CodaTargetList] - if len(self.ResultFileList) == 0 and len(self._AutoGenObject.SourceFileList) <> 0: - EdkLogger.error("build", AUTOGEN_ERROR, "Nothing to build", - ExtraData="[%s]" % str(self._AutoGenObject)) - - self.ProcessBuildTargetList() - - # Generate macros used to represent input files - FileMacroList = [] # macro name = file list - for FileListMacro in self.FileListMacros: - FileMacro = self._FILE_MACRO_TEMPLATE.Replace( - { - "macro_name" : FileListMacro, - "source_file" : self.FileListMacros[FileListMacro] - } - ) - FileMacroList.append(FileMacro) - - # INC_LIST is special - FileMacro = "" - IncludePathList = [] - for P in self._AutoGenObject.IncludePathList: - IncludePathList.append(IncPrefix+self.PlaceMacro(P, self.Macros)) - if FileBuildRule.INC_LIST_MACRO in self.ListFileMacros: - self.ListFileMacros[FileBuildRule.INC_LIST_MACRO].append(IncPrefix+P) - FileMacro += self._FILE_MACRO_TEMPLATE.Replace( - { - "macro_name" : "INC", - "source_file" : IncludePathList - } - ) - FileMacroList.append(FileMacro) - - # Generate macros used to represent files containing list of input files - for ListFileMacro in self.ListFileMacros: - ListFileName = os.path.join(self._AutoGenObject.OutputDir, "%s.lst" % ListFileMacro.lower()[:len(ListFileMacro)-5]) - FileMacroList.append("%s = %s" % (ListFileMacro, ListFileName)) - SaveFileOnChange( - ListFileName, - "\n".join(self.ListFileMacros[ListFileMacro]), - False - ) - - # Edk modules need StrDefs.h for string ID - #if self._AutoGenObject.AutoGenVersion < 0x00010005 and len(self._AutoGenObject.UnicodeFileList) > 0: - # BcTargetList = ['strdefs'] - #else: - # BcTargetList = [] - BcTargetList = [] - - MakefileName = self._FILE_NAME_[self._FileType] - LibraryMakeCommandList = [] - for D in self.LibraryBuildDirectoryList: - Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":os.path.join(D, MakefileName)} - LibraryMakeCommandList.append(Command) - - MakefileTemplateDict = { - "makefile_header" : self._FILE_HEADER_[self._FileType], - "makefile_path" : os.path.join("$(MODULE_BUILD_DIR)", MakefileName), - "makefile_name" : MakefileName, - "platform_name" : self.PlatformInfo.Name, - "platform_guid" : self.PlatformInfo.Guid, - "platform_version" : self.PlatformInfo.Version, - "platform_relative_directory": self.PlatformInfo.SourceDir, - "platform_output_directory" : self.PlatformInfo.OutputDir, - - "module_name" : self._AutoGenObject.Name, - "module_guid" : self._AutoGenObject.Guid, - "module_version" : self._AutoGenObject.Version, - "module_type" : self._AutoGenObject.ModuleType, - "module_file" : self._AutoGenObject.MetaFile.Name, - "module_file_base_name" : self._AutoGenObject.MetaFile.BaseName, - "module_relative_directory" : self._AutoGenObject.SourceDir, - "module_extra_defines" : ["%s = %s" % (k, v) for k,v in self._AutoGenObject.Module.Defines.iteritems()], - - "architecture" : self._AutoGenObject.Arch, - "toolchain_tag" : self._AutoGenObject.ToolChain, - "build_target" : self._AutoGenObject.BuildTarget, - - "platform_build_directory" : self.PlatformInfo.BuildDir, - "module_build_directory" : self._AutoGenObject.BuildDir, - "module_output_directory" : self._AutoGenObject.OutputDir, - "module_debug_directory" : self._AutoGenObject.DebugDir, - - "separator" : Separator, - "module_tool_definitions" : ToolsDef, - - "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), - "shell_command" : self._SHELL_CMD_[self._FileType].values(), - - "module_entry_point" : ModuleEntryPoint, - "image_entry_point" : ImageEntryPoint, - "arch_entry_point" : ArchEntryPoint, - "remaining_build_target" : self.ResultFileList, - "common_dependency_file" : self.CommonFileDependency, - "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), - "clean_command" : self.GetRemoveDirectoryCommand(["$(OUTPUT_DIR)"]), - "cleanall_command" : self.GetRemoveDirectoryCommand(["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]), - "dependent_library_build_directory" : self.LibraryBuildDirectoryList, - "library_build_command" : LibraryMakeCommandList, - "file_macro" : FileMacroList, - "file_build_target" : self.BuildTargetList, - "backward_compatible_target": BcTargetList, - } - - return MakefileTemplateDict - - def ProcessBuildTargetList(self): - # - # Search dependency file list for each source file - # - ForceIncludedFile = [] - for File in self._AutoGenObject.AutoGenFileList: - if File.Ext == '.h': - ForceIncludedFile.append(File) - SourceFileList = [] - for Target in self._AutoGenObject.IntroTargetList: - SourceFileList.extend(Target.Inputs) - - self.FileDependency = self.GetFileDependency( - SourceFileList, - ForceIncludedFile, - self._AutoGenObject.IncludePathList + self._AutoGenObject.BuildOptionIncPathList - ) - DepSet = None - for File in self.FileDependency: - if not self.FileDependency[File]: - self.FileDependency[File] = ['$(FORCE_REBUILD)'] - continue - # skip non-C files - if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c": - continue - elif DepSet == None: - DepSet = set(self.FileDependency[File]) - else: - DepSet &= set(self.FileDependency[File]) - # in case nothing in SourceFileList - if DepSet == None: - DepSet = set() - # - # Extract common files list in the dependency files - # - for File in DepSet: - self.CommonFileDependency.append(self.PlaceMacro(File.Path, self.Macros)) - - for File in self.FileDependency: - # skip non-C files - if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c": - continue - NewDepSet = set(self.FileDependency[File]) - NewDepSet -= DepSet - self.FileDependency[File] = ["$(COMMON_DEPS)"] + list(NewDepSet) - - # Convert target description object to target string in makefile - for Type in self._AutoGenObject.Targets: - for T in self._AutoGenObject.Targets[Type]: - # Generate related macros if needed - if T.GenFileListMacro and T.FileListMacro not in self.FileListMacros: - self.FileListMacros[T.FileListMacro] = [] - if T.GenListFile and T.ListFileMacro not in self.ListFileMacros: - self.ListFileMacros[T.ListFileMacro] = [] - if T.GenIncListFile and T.IncListFileMacro not in self.ListFileMacros: - self.ListFileMacros[T.IncListFileMacro] = [] - - Deps = [] - # Add force-dependencies - for Dep in T.Dependencies: - Deps.append(self.PlaceMacro(str(Dep), self.Macros)) - # Add inclusion-dependencies - if len(T.Inputs) == 1 and T.Inputs[0] in self.FileDependency: - for F in self.FileDependency[T.Inputs[0]]: - Deps.append(self.PlaceMacro(str(F), self.Macros)) - # Add source-dependencies - for F in T.Inputs: - NewFile = self.PlaceMacro(str(F), self.Macros) - # In order to use file list macro as dependency - if T.GenListFile: - self.ListFileMacros[T.ListFileMacro].append(str(F)) - self.FileListMacros[T.FileListMacro].append(NewFile) - elif T.GenFileListMacro: - self.FileListMacros[T.FileListMacro].append(NewFile) - else: - Deps.append(NewFile) - - # Use file list macro as dependency - if T.GenFileListMacro: - Deps.append("$(%s)" % T.FileListMacro) - - TargetDict = { - "target" : self.PlaceMacro(T.Target.Path, self.Macros), - "cmd" : "\n\t".join(T.Commands), - "deps" : Deps - } - self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict)) - - ## For creating makefile targets for dependent libraries - def ProcessDependentLibrary(self): - for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: - self.LibraryBuildDirectoryList.append(self.PlaceMacro(LibraryAutoGen.BuildDir, self.Macros)) - - ## Return a list containing source file's dependencies - # - # @param FileList The list of source files - # @param ForceInculeList The list of files which will be included forcely - # @param SearchPathList The list of search path - # - # @retval dict The mapping between source file path and its dependencies - # - def GetFileDependency(self, FileList, ForceInculeList, SearchPathList): - Dependency = {} - for F in FileList: - Dependency[F] = self.GetDependencyList(F, ForceInculeList, SearchPathList) - return Dependency - - ## Find dependencies for one source file - # - # By searching recursively "#include" directive in file, find out all the - # files needed by given source file. The dependecies will be only searched - # in given search path list. - # - # @param File The source file - # @param ForceInculeList The list of files which will be included forcely - # @param SearchPathList The list of search path - # - # @retval list The list of files the given source file depends on - # - def GetDependencyList(self, File, ForceList, SearchPathList): - EdkLogger.debug(EdkLogger.DEBUG_1, "Try to get dependency files for %s" % File) - FileStack = [File] + ForceList - DependencySet = set() - - if self._AutoGenObject.Arch not in gDependencyDatabase: - gDependencyDatabase[self._AutoGenObject.Arch] = {} - DepDb = gDependencyDatabase[self._AutoGenObject.Arch] - - while len(FileStack) > 0: - F = FileStack.pop() - - FullPathDependList = [] - if F in self.FileCache: - for CacheFile in self.FileCache[F]: - FullPathDependList.append(CacheFile) - if CacheFile not in DependencySet: - FileStack.append(CacheFile) - DependencySet.update(FullPathDependList) - continue - - CurrentFileDependencyList = [] - if F in DepDb: - CurrentFileDependencyList = DepDb[F] - else: - try: - Fd = open(F.Path, 'r') - except BaseException, X: - EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=F.Path+"\n\t"+str(X)) - - FileContent = Fd.read() - Fd.close() - if len(FileContent) == 0: - continue - - if FileContent[0] == 0xff or FileContent[0] == 0xfe: - FileContent = unicode(FileContent, "utf-16") - IncludedFileList = gIncludePattern.findall(FileContent) - - for Inc in IncludedFileList: - Inc = Inc.strip() - # if there's macro used to reference header file, expand it - HeaderList = gMacroPattern.findall(Inc) - if len(HeaderList) == 1 and len(HeaderList[0]) == 2: - HeaderType = HeaderList[0][0] - HeaderKey = HeaderList[0][1] - if HeaderType in gIncludeMacroConversion: - Inc = gIncludeMacroConversion[HeaderType] % {"HeaderKey" : HeaderKey} - else: - # not known macro used in #include, always build the file by - # returning a empty dependency - self.FileCache[File] = [] - return [] - Inc = os.path.normpath(Inc) - CurrentFileDependencyList.append(Inc) - DepDb[F] = CurrentFileDependencyList - - CurrentFilePath = F.Dir - PathList = [CurrentFilePath] + SearchPathList - for Inc in CurrentFileDependencyList: - for SearchPath in PathList: - FilePath = os.path.join(SearchPath, Inc) - if FilePath in gIsFileMap: - if not gIsFileMap[FilePath]: - continue - # If isfile is called too many times, the performance is slow down. - elif not os.path.isfile(FilePath): - gIsFileMap[FilePath] = False - continue - else: - gIsFileMap[FilePath] = True - FilePath = PathClass(FilePath) - FullPathDependList.append(FilePath) - if FilePath not in DependencySet: - FileStack.append(FilePath) - break - else: - EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\ - "in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList))) - - self.FileCache[F] = FullPathDependList - DependencySet.update(FullPathDependList) - - DependencySet.update(ForceList) - if File in DependencySet: - DependencySet.remove(File) - DependencyList = list(DependencySet) # remove duplicate ones - - return DependencyList - - _TemplateDict = property(_CreateTemplateDict) - -## CustomMakefile class -# -# This class encapsules makefie and its generation for module. It uses template to generate -# the content of makefile. The content of makefile will be got from ModuleAutoGen object. -# -class CustomMakefile(BuildFile): - ## template used to generate the makefile for module with custom makefile - _TEMPLATE_ = TemplateString('''\ -${makefile_header} - -# -# Platform Macro Definition -# -PLATFORM_NAME = ${platform_name} -PLATFORM_GUID = ${platform_guid} -PLATFORM_VERSION = ${platform_version} -PLATFORM_RELATIVE_DIR = ${platform_relative_directory} -PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} -PLATFORM_OUTPUT_DIR = ${platform_output_directory} - -# -# Module Macro Definition -# -MODULE_NAME = ${module_name} -MODULE_GUID = ${module_guid} -MODULE_VERSION = ${module_version} -MODULE_TYPE = ${module_type} -MODULE_FILE = ${module_file} -MODULE_FILE_BASE_NAME = ${module_file_base_name} -BASE_NAME = $(MODULE_NAME) -MODULE_RELATIVE_DIR = ${module_relative_directory} -MODULE_DIR = $(WORKSPACE)${separator}${module_relative_directory} - -# -# Build Configuration Macro Definition -# -ARCH = ${architecture} -TOOLCHAIN = ${toolchain_tag} -TOOLCHAIN_TAG = ${toolchain_tag} -TARGET = ${build_target} - -# -# Build Directory Macro Definition -# -# PLATFORM_BUILD_DIR = ${platform_build_directory} -BUILD_DIR = ${platform_build_directory} -BIN_DIR = $(BUILD_DIR)${separator}${architecture} -LIB_DIR = $(BIN_DIR) -MODULE_BUILD_DIR = ${module_build_directory} -OUTPUT_DIR = ${module_output_directory} -DEBUG_DIR = ${module_debug_directory} -DEST_DIR_OUTPUT = $(OUTPUT_DIR) -DEST_DIR_DEBUG = $(DEBUG_DIR) - -# -# Tools definitions specific to this module -# -${BEGIN}${module_tool_definitions} -${END} -MAKE_FILE = ${makefile_path} - -# -# Shell Command Macro -# -${BEGIN}${shell_command_code} = ${shell_command} -${END} - -${custom_makefile_content} - -# -# Target used when called from platform makefile, which will bypass the build of dependent libraries -# - -pbuild: init all - - -# -# ModuleTarget -# - -mbuild: init all - -# -# Build Target used in multi-thread build mode, which no init target is needed -# - -tbuild: all - -# -# Initialization target: print build information and create necessary directories -# -init: -\t-@echo Building ... $(MODULE_DIR)${separator}$(MODULE_FILE) [$(ARCH)] -${BEGIN}\t-@${create_directory_command}\n${END}\ - -''') - - ## Constructor of CustomMakefile - # - # @param ModuleAutoGen Object of ModuleAutoGen class - # - def __init__(self, ModuleAutoGen): - BuildFile.__init__(self, ModuleAutoGen) - self.PlatformInfo = self._AutoGenObject.PlatformInfo - self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"] - - # Compose a dict object containing information used to do replacement in template - def _CreateTemplateDict(self): - Separator = self._SEP_[self._FileType] - if self._FileType not in self._AutoGenObject.CustomMakefile: - EdkLogger.error('build', OPTION_NOT_SUPPORTED, "No custom makefile for %s" % self._FileType, - ExtraData="[%s]" % str(self._AutoGenObject)) - MakefilePath = os.path.join( - self._AutoGenObject.WorkspaceDir, - self._AutoGenObject.CustomMakefile[self._FileType] - ) - try: - CustomMakefile = open(MakefilePath, 'r').read() - except: - EdkLogger.error('build', FILE_OPEN_FAILURE, File=str(self._AutoGenObject), - ExtraData=self._AutoGenObject.CustomMakefile[self._FileType]) - - # tools definitions - ToolsDef = [] - for Tool in self._AutoGenObject.BuildOption: - # Don't generate MAKE_FLAGS in makefile. It's put in environment variable. - if Tool == "MAKE": - continue - for Attr in self._AutoGenObject.BuildOption[Tool]: - if Attr == "FAMILY": - continue - elif Attr == "PATH": - ToolsDef.append("%s = %s" % (Tool, self._AutoGenObject.BuildOption[Tool][Attr])) - else: - ToolsDef.append("%s_%s = %s" % (Tool, Attr, self._AutoGenObject.BuildOption[Tool][Attr])) - ToolsDef.append("") - - MakefileName = self._FILE_NAME_[self._FileType] - MakefileTemplateDict = { - "makefile_header" : self._FILE_HEADER_[self._FileType], - "makefile_path" : os.path.join("$(MODULE_BUILD_DIR)", MakefileName), - "platform_name" : self.PlatformInfo.Name, - "platform_guid" : self.PlatformInfo.Guid, - "platform_version" : self.PlatformInfo.Version, - "platform_relative_directory": self.PlatformInfo.SourceDir, - "platform_output_directory" : self.PlatformInfo.OutputDir, - - "module_name" : self._AutoGenObject.Name, - "module_guid" : self._AutoGenObject.Guid, - "module_version" : self._AutoGenObject.Version, - "module_type" : self._AutoGenObject.ModuleType, - "module_file" : self._AutoGenObject.MetaFile, - "module_file_base_name" : self._AutoGenObject.MetaFile.BaseName, - "module_relative_directory" : self._AutoGenObject.SourceDir, - - "architecture" : self._AutoGenObject.Arch, - "toolchain_tag" : self._AutoGenObject.ToolChain, - "build_target" : self._AutoGenObject.BuildTarget, - - "platform_build_directory" : self.PlatformInfo.BuildDir, - "module_build_directory" : self._AutoGenObject.BuildDir, - "module_output_directory" : self._AutoGenObject.OutputDir, - "module_debug_directory" : self._AutoGenObject.DebugDir, - - "separator" : Separator, - "module_tool_definitions" : ToolsDef, - - "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), - "shell_command" : self._SHELL_CMD_[self._FileType].values(), - - "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), - "custom_makefile_content" : CustomMakefile - } - - return MakefileTemplateDict - - _TemplateDict = property(_CreateTemplateDict) - -## PlatformMakefile class -# -# This class encapsules makefie and its generation for platform. It uses -# template to generate the content of makefile. The content of makefile will be -# got from PlatformAutoGen object. -# -class PlatformMakefile(BuildFile): - ## template used to generate the makefile for platform - _TEMPLATE_ = TemplateString('''\ -${makefile_header} - -# -# Platform Macro Definition -# -PLATFORM_NAME = ${platform_name} -PLATFORM_GUID = ${platform_guid} -PLATFORM_VERSION = ${platform_version} -PLATFORM_FILE = ${platform_file} -PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} -PLATFORM_OUTPUT_DIR = ${platform_output_directory} - -# -# Build Configuration Macro Definition -# -TOOLCHAIN = ${toolchain_tag} -TOOLCHAIN_TAG = ${toolchain_tag} -TARGET = ${build_target} - -# -# Build Directory Macro Definition -# -BUILD_DIR = ${platform_build_directory} -FV_DIR = ${platform_build_directory}${separator}FV - -# -# Shell Command Macro -# -${BEGIN}${shell_command_code} = ${shell_command} -${END} - -MAKE = ${make_path} -MAKE_FILE = ${makefile_path} - -# -# Default target -# -all: init build_libraries build_modules - -# -# Initialization target: print build information and create necessary directories -# -init: -\t-@echo Building ... $(PLATFORM_FILE) [${build_architecture_list}] -\t${BEGIN}-@${create_directory_command} -\t${END} -# -# library build target -# -libraries: init build_libraries - -# -# module build target -# -modules: init build_libraries build_modules - -# -# Build all libraries: -# -build_libraries: -${BEGIN}\t@"$(MAKE)" $(MAKE_FLAGS) -f ${library_makefile_list} pbuild -${END}\t@cd $(BUILD_DIR) - -# -# Build all modules: -# -build_modules: -${BEGIN}\t@"$(MAKE)" $(MAKE_FLAGS) -f ${module_makefile_list} pbuild -${END}\t@cd $(BUILD_DIR) - -# -# Clean intermediate files -# -clean: -\t${BEGIN}-@${library_build_command} clean -\t${END}${BEGIN}-@${module_build_command} clean -\t${END}@cd $(BUILD_DIR) - -# -# Clean all generated files except to makefile -# -cleanall: -${BEGIN}\t${cleanall_command} -${END} - -# -# Clean all library files -# -cleanlib: -\t${BEGIN}-@${library_build_command} cleanall -\t${END}@cd $(BUILD_DIR)\n -''') - - ## Constructor of PlatformMakefile - # - # @param ModuleAutoGen Object of PlatformAutoGen class - # - def __init__(self, PlatformAutoGen): - BuildFile.__init__(self, PlatformAutoGen) - self.ModuleBuildCommandList = [] - self.ModuleMakefileList = [] - self.IntermediateDirectoryList = [] - self.ModuleBuildDirectoryList = [] - self.LibraryBuildDirectoryList = [] - - # Compose a dict object containing information used to do replacement in template - def _CreateTemplateDict(self): - Separator = self._SEP_[self._FileType] - - PlatformInfo = self._AutoGenObject - if "MAKE" not in PlatformInfo.ToolDefinition or "PATH" not in PlatformInfo.ToolDefinition["MAKE"]: - EdkLogger.error("build", OPTION_MISSING, "No MAKE command defined. Please check your tools_def.txt!", - ExtraData="[%s]" % str(self._AutoGenObject)) - - self.IntermediateDirectoryList = ["$(BUILD_DIR)"] - self.ModuleBuildDirectoryList = self.GetModuleBuildDirectoryList() - self.LibraryBuildDirectoryList = self.GetLibraryBuildDirectoryList() - - MakefileName = self._FILE_NAME_[self._FileType] - LibraryMakefileList = [] - LibraryMakeCommandList = [] - for D in self.LibraryBuildDirectoryList: - D = self.PlaceMacro(D, {"BUILD_DIR":PlatformInfo.BuildDir}) - Makefile = os.path.join(D, MakefileName) - Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":Makefile} - LibraryMakefileList.append(Makefile) - LibraryMakeCommandList.append(Command) - - ModuleMakefileList = [] - ModuleMakeCommandList = [] - for D in self.ModuleBuildDirectoryList: - D = self.PlaceMacro(D, {"BUILD_DIR":PlatformInfo.BuildDir}) - Makefile = os.path.join(D, MakefileName) - Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":Makefile} - ModuleMakefileList.append(Makefile) - ModuleMakeCommandList.append(Command) - - MakefileTemplateDict = { - "makefile_header" : self._FILE_HEADER_[self._FileType], - "makefile_path" : os.path.join("$(BUILD_DIR)", MakefileName), - "make_path" : PlatformInfo.ToolDefinition["MAKE"]["PATH"], - "makefile_name" : MakefileName, - "platform_name" : PlatformInfo.Name, - "platform_guid" : PlatformInfo.Guid, - "platform_version" : PlatformInfo.Version, - "platform_file" : self._AutoGenObject.MetaFile, - "platform_relative_directory": PlatformInfo.SourceDir, - "platform_output_directory" : PlatformInfo.OutputDir, - "platform_build_directory" : PlatformInfo.BuildDir, - - "toolchain_tag" : PlatformInfo.ToolChain, - "build_target" : PlatformInfo.BuildTarget, - "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), - "shell_command" : self._SHELL_CMD_[self._FileType].values(), - "build_architecture_list" : self._AutoGenObject.Arch, - "architecture" : self._AutoGenObject.Arch, - "separator" : Separator, - "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), - "cleanall_command" : self.GetRemoveDirectoryCommand(self.IntermediateDirectoryList), - "library_makefile_list" : LibraryMakefileList, - "module_makefile_list" : ModuleMakefileList, - "library_build_command" : LibraryMakeCommandList, - "module_build_command" : ModuleMakeCommandList, - } - - return MakefileTemplateDict - - ## Get the root directory list for intermediate files of all modules build - # - # @retval list The list of directory - # - def GetModuleBuildDirectoryList(self): - DirList = [] - for ModuleAutoGen in self._AutoGenObject.ModuleAutoGenList: - DirList.append(os.path.join(self._AutoGenObject.BuildDir, ModuleAutoGen.BuildDir)) - return DirList - - ## Get the root directory list for intermediate files of all libraries build - # - # @retval list The list of directory - # - def GetLibraryBuildDirectoryList(self): - DirList = [] - for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: - DirList.append(os.path.join(self._AutoGenObject.BuildDir, LibraryAutoGen.BuildDir)) - return DirList - - _TemplateDict = property(_CreateTemplateDict) - -## TopLevelMakefile class -# -# This class encapsules makefie and its generation for entrance makefile. It -# uses template to generate the content of makefile. The content of makefile -# will be got from WorkspaceAutoGen object. -# -class TopLevelMakefile(BuildFile): - ## template used to generate toplevel makefile - _TEMPLATE_ = TemplateString('''\ -${makefile_header} - -# -# Platform Macro Definition -# -PLATFORM_NAME = ${platform_name} -PLATFORM_GUID = ${platform_guid} -PLATFORM_VERSION = ${platform_version} - -# -# Build Configuration Macro Definition -# -TOOLCHAIN = ${toolchain_tag} -TOOLCHAIN_TAG = ${toolchain_tag} -TARGET = ${build_target} - -# -# Build Directory Macro Definition -# -BUILD_DIR = ${platform_build_directory} -FV_DIR = ${platform_build_directory}${separator}FV - -# -# Shell Command Macro -# -${BEGIN}${shell_command_code} = ${shell_command} -${END} - -MAKE = ${make_path} -MAKE_FILE = ${makefile_path} - -# -# Default target -# -all: modules fds - -# -# Initialization target: print build information and create necessary directories -# -init: -\t-@ -\t${BEGIN}-@${create_directory_command} -\t${END} -# -# library build target -# -libraries: init -${BEGIN}\t@cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" $(MAKE_FLAGS) libraries -${END}\t@cd $(BUILD_DIR) - -# -# module build target -# -modules: init -${BEGIN}\t@cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" $(MAKE_FLAGS) modules -${END}\t@cd $(BUILD_DIR) - -# -# Flash Device Image Target -# -fds: init -\t-@cd $(FV_DIR) -${BEGIN}\tGenFds -f ${fdf_file} -o $(BUILD_DIR) -t $(TOOLCHAIN) -b $(TARGET) -p ${active_platform} -a ${build_architecture_list} ${extra_options}${END}${BEGIN} -r ${fd} ${END}${BEGIN} -i ${fv} ${END}${BEGIN} -C ${cap} ${END}${BEGIN} -D ${macro} ${END} - -# -# run command for emulator platform only -# -run: -\tcd $(BUILD_DIR)${separator}IA32 && ".${separator}SecMain" -\tcd $(BUILD_DIR) - -# -# Clean intermediate files -# -clean: -${BEGIN}\t-@${sub_build_command} clean -${END}\t@cd $(BUILD_DIR) - -# -# Clean all generated files except to makefile -# -cleanall: -${BEGIN}\t${cleanall_command} -${END} - -# -# Clean all library files -# -cleanlib: -${BEGIN}\t-@${sub_build_command} cleanlib -${END}\t@cd $(BUILD_DIR)\n -''') - - ## Constructor of TopLevelMakefile - # - # @param Workspace Object of WorkspaceAutoGen class - # - def __init__(self, Workspace): - BuildFile.__init__(self, Workspace) - self.IntermediateDirectoryList = [] - - # Compose a dict object containing information used to do replacement in template - def _CreateTemplateDict(self): - Separator = self._SEP_[self._FileType] - - # any platform autogen object is ok because we just need common information - PlatformInfo = self._AutoGenObject - - if "MAKE" not in PlatformInfo.ToolDefinition or "PATH" not in PlatformInfo.ToolDefinition["MAKE"]: - EdkLogger.error("build", OPTION_MISSING, "No MAKE command defined. Please check your tools_def.txt!", - ExtraData="[%s]" % str(self._AutoGenObject)) - - for Arch in PlatformInfo.ArchList: - self.IntermediateDirectoryList.append(Separator.join(["$(BUILD_DIR)", Arch])) - self.IntermediateDirectoryList.append("$(FV_DIR)") - - # TRICK: for not generating GenFds call in makefile if no FDF file - MacroList = [] - if PlatformInfo.FdfFile != None and PlatformInfo.FdfFile != "": - FdfFileList = [PlatformInfo.FdfFile] - # macros passed to GenFds - MacroList.append('"%s=%s"' % ("EFI_SOURCE", GlobalData.gEfiSource.replace('\\', '\\\\'))) - MacroList.append('"%s=%s"' % ("EDK_SOURCE", GlobalData.gEdkSource.replace('\\', '\\\\'))) - MacroDict = {} - MacroDict.update(GlobalData.gGlobalDefines) - MacroDict.update(GlobalData.gCommandLineDefines) - MacroDict.pop("EFI_SOURCE", "dummy") - MacroDict.pop("EDK_SOURCE", "dummy") - for MacroName in MacroDict: - if MacroDict[MacroName] != "": - MacroList.append('"%s=%s"' % (MacroName, MacroDict[MacroName].replace('\\', '\\\\'))) - else: - MacroList.append('"%s"' % MacroName) - else: - FdfFileList = [] - - # pass extra common options to external program called in makefile, currently GenFds.exe - ExtraOption = '' - LogLevel = EdkLogger.GetLevel() - if LogLevel == EdkLogger.VERBOSE: - ExtraOption += " -v" - elif LogLevel <= EdkLogger.DEBUG_9: - ExtraOption += " -d %d" % (LogLevel - 1) - elif LogLevel == EdkLogger.QUIET: - ExtraOption += " -q" - - if GlobalData.gCaseInsensitive: - ExtraOption += " -c" - - MakefileName = self._FILE_NAME_[self._FileType] - SubBuildCommandList = [] - for A in PlatformInfo.ArchList: - Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":os.path.join("$(BUILD_DIR)", A, MakefileName)} - SubBuildCommandList.append(Command) - - MakefileTemplateDict = { - "makefile_header" : self._FILE_HEADER_[self._FileType], - "makefile_path" : os.path.join("$(BUILD_DIR)", MakefileName), - "make_path" : PlatformInfo.ToolDefinition["MAKE"]["PATH"], - "platform_name" : PlatformInfo.Name, - "platform_guid" : PlatformInfo.Guid, - "platform_version" : PlatformInfo.Version, - "platform_build_directory" : PlatformInfo.BuildDir, - - "toolchain_tag" : PlatformInfo.ToolChain, - "build_target" : PlatformInfo.BuildTarget, - "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), - "shell_command" : self._SHELL_CMD_[self._FileType].values(), - 'arch' : list(PlatformInfo.ArchList), - "build_architecture_list" : ','.join(PlatformInfo.ArchList), - "separator" : Separator, - "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), - "cleanall_command" : self.GetRemoveDirectoryCommand(self.IntermediateDirectoryList), - "sub_build_command" : SubBuildCommandList, - "fdf_file" : FdfFileList, - "active_platform" : str(PlatformInfo), - "fd" : PlatformInfo.FdTargetList, - "fv" : PlatformInfo.FvTargetList, - "cap" : PlatformInfo.CapTargetList, - "extra_options" : ExtraOption, - "macro" : MacroList, - } - - return MakefileTemplateDict - - ## Get the root directory list for intermediate files of all modules build - # - # @retval list The list of directory - # - def GetModuleBuildDirectoryList(self): - DirList = [] - for ModuleAutoGen in self._AutoGenObject.ModuleAutoGenList: - DirList.append(os.path.join(self._AutoGenObject.BuildDir, ModuleAutoGen.BuildDir)) - return DirList - - ## Get the root directory list for intermediate files of all libraries build - # - # @retval list The list of directory - # - def GetLibraryBuildDirectoryList(self): - DirList = [] - for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: - DirList.append(os.path.join(self._AutoGenObject.BuildDir, LibraryAutoGen.BuildDir)) - return DirList - - _TemplateDict = property(_CreateTemplateDict) - -# This acts like the main() function for the script, unless it is 'import'ed into another script. -if __name__ == '__main__': - pass - +## @file +# Create makefile for MS nmake and GNU make +# +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## Import Modules +# +import os +import sys +import string +import re +import os.path as path + +from Common.BuildToolError import * +from Common.Misc import * +from Common.String import * +from BuildEngine import * +import Common.GlobalData as GlobalData + +## Regular expression for finding header file inclusions +gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:\(?[\"<]?[ \t]*)([-\w.\\/() \t]+)(?:[ \t]*[\">]?\)?)", re.MULTILINE|re.UNICODE|re.IGNORECASE) + +## Regular expression for matching macro used in header file inclusion +gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE) + +gIsFileMap = {} + +## pattern for include style in Edk.x code +gProtocolDefinition = "Protocol/%(HeaderKey)s/%(HeaderKey)s.h" +gGuidDefinition = "Guid/%(HeaderKey)s/%(HeaderKey)s.h" +gArchProtocolDefinition = "ArchProtocol/%(HeaderKey)s/%(HeaderKey)s.h" +gPpiDefinition = "Ppi/%(HeaderKey)s/%(HeaderKey)s.h" +gIncludeMacroConversion = { + "EFI_PROTOCOL_DEFINITION" : gProtocolDefinition, + "EFI_GUID_DEFINITION" : gGuidDefinition, + "EFI_ARCH_PROTOCOL_DEFINITION" : gArchProtocolDefinition, + "EFI_PROTOCOL_PRODUCER" : gProtocolDefinition, + "EFI_PROTOCOL_CONSUMER" : gProtocolDefinition, + "EFI_PROTOCOL_DEPENDENCY" : gProtocolDefinition, + "EFI_ARCH_PROTOCOL_PRODUCER" : gArchProtocolDefinition, + "EFI_ARCH_PROTOCOL_CONSUMER" : gArchProtocolDefinition, + "EFI_ARCH_PROTOCOL_DEPENDENCY" : gArchProtocolDefinition, + "EFI_PPI_DEFINITION" : gPpiDefinition, + "EFI_PPI_PRODUCER" : gPpiDefinition, + "EFI_PPI_CONSUMER" : gPpiDefinition, + "EFI_PPI_DEPENDENCY" : gPpiDefinition, +} + +## default makefile type +gMakeType = "" +if sys.platform == "win32": + gMakeType = "nmake" +else: + gMakeType = "gmake" + + +## BuildFile class +# +# This base class encapsules build file and its generation. It uses template to generate +# the content of build file. The content of build file will be got from AutoGen objects. +# +class BuildFile(object): + ## template used to generate the build file (i.e. makefile if using make) + _TEMPLATE_ = TemplateString('') + + _DEFAULT_FILE_NAME_ = "Makefile" + + ## default file name for each type of build file + _FILE_NAME_ = { + "nmake" : "Makefile", + "gmake" : "GNUmakefile" + } + + ## Fixed header string for makefile + _MAKEFILE_HEADER = '''# +# DO NOT EDIT +# This file is auto-generated by build utility +# +# Module Name: +# +# %s +# +# Abstract: +# +# Auto-generated makefile for building modules, libraries or platform +# + ''' + + ## Header string for each type of build file + _FILE_HEADER_ = { + "nmake" : _MAKEFILE_HEADER % _FILE_NAME_["nmake"], + "gmake" : _MAKEFILE_HEADER % _FILE_NAME_["gmake"] + } + + ## shell commands which can be used in build file in the form of macro + # $(CP) copy file command + # $(MV) move file command + # $(RM) remove file command + # $(MD) create dir command + # $(RD) remove dir command + # + _SHELL_CMD_ = { + "nmake" : { + "CP" : "copy /y", + "MV" : "move /y", + "RM" : "del /f /q", + "MD" : "mkdir", + "RD" : "rmdir /s /q", + }, + + "gmake" : { + "CP" : "cp -f", + "MV" : "mv -f", + "RM" : "rm -f", + "MD" : "mkdir -p", + "RD" : "rm -r -f", + } + } + + ## directory separator + _SEP_ = { + "nmake" : "\\", + "gmake" : "/" + } + + ## directory creation template + _MD_TEMPLATE_ = { + "nmake" : 'if not exist %(dir)s $(MD) %(dir)s', + "gmake" : "$(MD) %(dir)s" + } + + ## directory removal template + _RD_TEMPLATE_ = { + "nmake" : 'if exist %(dir)s $(RD) %(dir)s', + "gmake" : "$(RD) %(dir)s" + } + + _CD_TEMPLATE_ = { + "nmake" : 'if exist %(dir)s cd %(dir)s', + "gmake" : "test -e %(dir)s && cd %(dir)s" + } + + _MAKE_TEMPLATE_ = { + "nmake" : 'if exist %(file)s "$(MAKE)" $(MAKE_FLAGS) -f %(file)s', + "gmake" : 'test -e %(file)s && "$(MAKE)" $(MAKE_FLAGS) -f %(file)s' + } + + _INCLUDE_CMD_ = { + "nmake" : '!INCLUDE', + "gmake" : "include" + } + + _INC_FLAG_ = {"MSFT" : "/I", "GCC" : "-I", "INTEL" : "-I", "RVCT" : "-I"} + + ## Constructor of BuildFile + # + # @param AutoGenObject Object of AutoGen class + # + def __init__(self, AutoGenObject): + self._AutoGenObject = AutoGenObject + self._FileType = gMakeType + + ## Create build file + # + # @param FileType Type of build file. Only nmake and gmake are supported now. + # + # @retval TRUE The build file is created or re-created successfully + # @retval FALSE The build file exists and is the same as the one to be generated + # + def Generate(self, FileType=gMakeType): + if FileType not in self._FILE_NAME_: + EdkLogger.error("build", PARAMETER_INVALID, "Invalid build type [%s]" % FileType, + ExtraData="[%s]" % str(self._AutoGenObject)) + self._FileType = FileType + FileContent = self._TEMPLATE_.Replace(self._TemplateDict) + FileName = self._FILE_NAME_[FileType] + return SaveFileOnChange(os.path.join(self._AutoGenObject.MakeFileDir, FileName), FileContent, False) + + ## Return a list of directory creation command string + # + # @param DirList The list of directory to be created + # + # @retval list The directory creation command list + # + def GetCreateDirectoryCommand(self, DirList): + return [self._MD_TEMPLATE_[self._FileType] % {'dir':Dir} for Dir in DirList] + + ## Return a list of directory removal command string + # + # @param DirList The list of directory to be removed + # + # @retval list The directory removal command list + # + def GetRemoveDirectoryCommand(self, DirList): + return [self._RD_TEMPLATE_[self._FileType] % {'dir':Dir} for Dir in DirList] + + def PlaceMacro(self, Path, MacroDefinitions={}): + if Path.startswith("$("): + return Path + else: + PathLength = len(Path) + for MacroName in MacroDefinitions: + MacroValue = MacroDefinitions[MacroName] + MacroValueLength = len(MacroValue) + if MacroValueLength <= PathLength and Path.startswith(MacroValue): + Path = "$(%s)%s" % (MacroName, Path[MacroValueLength:]) + break + return Path + +## ModuleMakefile class +# +# This class encapsules makefie and its generation for module. It uses template to generate +# the content of makefile. The content of makefile will be got from ModuleAutoGen object. +# +class ModuleMakefile(BuildFile): + ## template used to generate the makefile for module + _TEMPLATE_ = TemplateString('''\ +${makefile_header} + +# +# Platform Macro Definition +# +PLATFORM_NAME = ${platform_name} +PLATFORM_GUID = ${platform_guid} +PLATFORM_VERSION = ${platform_version} +PLATFORM_RELATIVE_DIR = ${platform_relative_directory} +PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} +PLATFORM_OUTPUT_DIR = ${platform_output_directory} + +# +# Module Macro Definition +# +MODULE_NAME = ${module_name} +MODULE_GUID = ${module_guid} +MODULE_VERSION = ${module_version} +MODULE_TYPE = ${module_type} +MODULE_FILE = ${module_file} +MODULE_FILE_BASE_NAME = ${module_file_base_name} +BASE_NAME = $(MODULE_NAME) +MODULE_RELATIVE_DIR = ${module_relative_directory} +MODULE_DIR = $(WORKSPACE)${separator}${module_relative_directory} + +MODULE_ENTRY_POINT = ${module_entry_point} +ARCH_ENTRY_POINT = ${arch_entry_point} +IMAGE_ENTRY_POINT = ${image_entry_point} + +${BEGIN}${module_extra_defines} +${END} +# +# Build Configuration Macro Definition +# +ARCH = ${architecture} +TOOLCHAIN = ${toolchain_tag} +TOOLCHAIN_TAG = ${toolchain_tag} +TARGET = ${build_target} + +# +# Build Directory Macro Definition +# +# PLATFORM_BUILD_DIR = ${platform_build_directory} +BUILD_DIR = ${platform_build_directory} +BIN_DIR = $(BUILD_DIR)${separator}${architecture} +LIB_DIR = $(BIN_DIR) +MODULE_BUILD_DIR = ${module_build_directory} +OUTPUT_DIR = ${module_output_directory} +DEBUG_DIR = ${module_debug_directory} +DEST_DIR_OUTPUT = $(OUTPUT_DIR) +DEST_DIR_DEBUG = $(DEBUG_DIR) + +# +# Shell Command Macro +# +${BEGIN}${shell_command_code} = ${shell_command} +${END} + +# +# Tools definitions specific to this module +# +${BEGIN}${module_tool_definitions} +${END} +MAKE_FILE = ${makefile_path} + +# +# Build Macro +# +${BEGIN}${file_macro} +${END} + +COMMON_DEPS = ${BEGIN}${common_dependency_file} \\ + ${END} + +# +# Overridable Target Macro Definitions +# +FORCE_REBUILD = force_build +INIT_TARGET = init +PCH_TARGET = +BC_TARGET = ${BEGIN}${backward_compatible_target} ${END} +CODA_TARGET = ${BEGIN}${remaining_build_target} \\ + ${END} + +# +# Default target, which will build dependent libraries in addition to source files +# + +all: mbuild + + +# +# Target used when called from platform makefile, which will bypass the build of dependent libraries +# + +pbuild: $(INIT_TARGET) $(BC_TARGET) $(PCH_TARGET) $(CODA_TARGET) + +# +# ModuleTarget +# + +mbuild: $(INIT_TARGET) $(BC_TARGET) gen_libs $(PCH_TARGET) $(CODA_TARGET) + +# +# Build Target used in multi-thread build mode, which will bypass the init and gen_libs targets +# + +tbuild: $(BC_TARGET) $(PCH_TARGET) $(CODA_TARGET) + +# +# Phony target which is used to force executing commands for a target +# +force_build: +\t-@ + +# +# Target to update the FD +# + +fds: mbuild gen_fds + +# +# Initialization target: print build information and create necessary directories +# +init: info dirs + +info: +\t-@echo Building ... $(MODULE_DIR)${separator}$(MODULE_FILE) [$(ARCH)] + +dirs: +${BEGIN}\t-@${create_directory_command}\n${END} + +strdefs: +\t-@$(CP) $(DEBUG_DIR)${separator}AutoGen.h $(DEBUG_DIR)${separator}$(MODULE_NAME)StrDefs.h + +# +# GenLibsTarget +# +gen_libs: +\t${BEGIN}@"$(MAKE)" $(MAKE_FLAGS) -f ${dependent_library_build_directory}${separator}${makefile_name} +\t${END}@cd $(MODULE_BUILD_DIR) + +# +# Build Flash Device Image +# +gen_fds: +\t@"$(MAKE)" $(MAKE_FLAGS) -f $(BUILD_DIR)${separator}${makefile_name} fds +\t@cd $(MODULE_BUILD_DIR) + +# +# Individual Object Build Targets +# +${BEGIN}${file_build_target} +${END} + +# +# clean all intermediate files +# +clean: +\t${BEGIN}${clean_command} +\t${END} + +# +# clean all generated files +# +cleanall: +${BEGIN}\t${cleanall_command} +${END}\t$(RM) *.pdb *.idb > NUL 2>&1 +\t$(RM) $(BIN_DIR)${separator}$(MODULE_NAME).efi + +# +# clean all dependent libraries built +# +cleanlib: +\t${BEGIN}-@${library_build_command} cleanall +\t${END}@cd $(MODULE_BUILD_DIR)\n\n''') + + _FILE_MACRO_TEMPLATE = TemplateString("${macro_name} = ${BEGIN} \\\n ${source_file}${END}\n") + _BUILD_TARGET_TEMPLATE = TemplateString("${BEGIN}${target} : ${deps}\n${END}\t${cmd}\n") + + ## Constructor of ModuleMakefile + # + # @param ModuleAutoGen Object of ModuleAutoGen class + # + def __init__(self, ModuleAutoGen): + BuildFile.__init__(self, ModuleAutoGen) + self.PlatformInfo = self._AutoGenObject.PlatformInfo + + self.ResultFileList = [] + self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"] + + self.SourceFileDatabase = {} # {file type : file path} + self.DestFileDatabase = {} # {file type : file path} + self.FileBuildTargetList = [] # [(src, target string)] + self.BuildTargetList = [] # [target string] + self.PendingBuildTargetList = [] # [FileBuildRule objects] + self.CommonFileDependency = [] + self.FileListMacros = {} + self.ListFileMacros = {} + + self.FileCache = {} + self.FileDependency = [] + self.LibraryBuildCommandList = [] + self.LibraryFileList = [] + self.LibraryMakefileList = [] + self.LibraryBuildDirectoryList = [] + self.SystemLibraryList = [] + self.Macros = sdict() + self.Macros["OUTPUT_DIR" ] = self._AutoGenObject.Macros["OUTPUT_DIR"] + self.Macros["DEBUG_DIR" ] = self._AutoGenObject.Macros["DEBUG_DIR"] + self.Macros["MODULE_BUILD_DIR"] = self._AutoGenObject.Macros["MODULE_BUILD_DIR"] + self.Macros["BIN_DIR" ] = self._AutoGenObject.Macros["BIN_DIR"] + self.Macros["BUILD_DIR" ] = self._AutoGenObject.Macros["BUILD_DIR"] + self.Macros["WORKSPACE" ] = self._AutoGenObject.Macros["WORKSPACE"] + + # Compose a dict object containing information used to do replacement in template + def _CreateTemplateDict(self): + if self._FileType not in self._SEP_: + EdkLogger.error("build", PARAMETER_INVALID, "Invalid Makefile type [%s]" % self._FileType, + ExtraData="[%s]" % str(self._AutoGenObject)) + Separator = self._SEP_[self._FileType] + + # break build if no source files and binary files are found + if len(self._AutoGenObject.SourceFileList) == 0 and len(self._AutoGenObject.BinaryFileList) == 0: + EdkLogger.error("build", AUTOGEN_ERROR, "No files to be built in module [%s, %s, %s]" + % (self._AutoGenObject.BuildTarget, self._AutoGenObject.ToolChain, self._AutoGenObject.Arch), + ExtraData="[%s]" % str(self._AutoGenObject)) + + # convert dependent libraries to build command + self.ProcessDependentLibrary() + if len(self._AutoGenObject.Module.ModuleEntryPointList) > 0: + ModuleEntryPoint = self._AutoGenObject.Module.ModuleEntryPointList[0] + else: + ModuleEntryPoint = "_ModuleEntryPoint" + + # Intel EBC compiler enforces EfiMain + if self._AutoGenObject.AutoGenVersion < 0x00010005 and self._AutoGenObject.Arch == "EBC": + ArchEntryPoint = "EfiMain" + else: + ArchEntryPoint = ModuleEntryPoint + + if self._AutoGenObject.Arch == "EBC": + # EBC compiler always use "EfiStart" as entry point. Only applies to EdkII modules + ImageEntryPoint = "EfiStart" + elif self._AutoGenObject.AutoGenVersion < 0x00010005: + # Edk modules use entry point specified in INF file + ImageEntryPoint = ModuleEntryPoint + else: + # EdkII modules always use "_ModuleEntryPoint" as entry point + ImageEntryPoint = "_ModuleEntryPoint" + + # tools definitions + ToolsDef = [] + IncPrefix = self._INC_FLAG_[self._AutoGenObject.ToolChainFamily] + for Tool in self._AutoGenObject.BuildOption: + for Attr in self._AutoGenObject.BuildOption[Tool]: + Value = self._AutoGenObject.BuildOption[Tool][Attr] + if Attr == "FAMILY": + continue + elif Attr == "PATH": + ToolsDef.append("%s = %s" % (Tool, Value)) + else: + # Don't generate MAKE_FLAGS in makefile. It's put in environment variable. + if Tool == "MAKE": + continue + # Remove duplicated include path, if any + if Attr == "FLAGS": + Value = RemoveDupOption(Value, IncPrefix, self._AutoGenObject.IncludePathList) + ToolsDef.append("%s_%s = %s" % (Tool, Attr, Value)) + ToolsDef.append("") + + # convert source files and binary files to build targets + self.ResultFileList = [str(T.Target) for T in self._AutoGenObject.CodaTargetList] + if len(self.ResultFileList) == 0 and len(self._AutoGenObject.SourceFileList) <> 0: + EdkLogger.error("build", AUTOGEN_ERROR, "Nothing to build", + ExtraData="[%s]" % str(self._AutoGenObject)) + + self.ProcessBuildTargetList() + + # Generate macros used to represent input files + FileMacroList = [] # macro name = file list + for FileListMacro in self.FileListMacros: + FileMacro = self._FILE_MACRO_TEMPLATE.Replace( + { + "macro_name" : FileListMacro, + "source_file" : self.FileListMacros[FileListMacro] + } + ) + FileMacroList.append(FileMacro) + + # INC_LIST is special + FileMacro = "" + IncludePathList = [] + for P in self._AutoGenObject.IncludePathList: + IncludePathList.append(IncPrefix+self.PlaceMacro(P, self.Macros)) + if FileBuildRule.INC_LIST_MACRO in self.ListFileMacros: + self.ListFileMacros[FileBuildRule.INC_LIST_MACRO].append(IncPrefix+P) + FileMacro += self._FILE_MACRO_TEMPLATE.Replace( + { + "macro_name" : "INC", + "source_file" : IncludePathList + } + ) + FileMacroList.append(FileMacro) + + # Generate macros used to represent files containing list of input files + for ListFileMacro in self.ListFileMacros: + ListFileName = os.path.join(self._AutoGenObject.OutputDir, "%s.lst" % ListFileMacro.lower()[:len(ListFileMacro)-5]) + FileMacroList.append("%s = %s" % (ListFileMacro, ListFileName)) + SaveFileOnChange( + ListFileName, + "\n".join(self.ListFileMacros[ListFileMacro]), + False + ) + + # Edk modules need StrDefs.h for string ID + #if self._AutoGenObject.AutoGenVersion < 0x00010005 and len(self._AutoGenObject.UnicodeFileList) > 0: + # BcTargetList = ['strdefs'] + #else: + # BcTargetList = [] + BcTargetList = [] + + MakefileName = self._FILE_NAME_[self._FileType] + LibraryMakeCommandList = [] + for D in self.LibraryBuildDirectoryList: + Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":os.path.join(D, MakefileName)} + LibraryMakeCommandList.append(Command) + + MakefileTemplateDict = { + "makefile_header" : self._FILE_HEADER_[self._FileType], + "makefile_path" : os.path.join("$(MODULE_BUILD_DIR)", MakefileName), + "makefile_name" : MakefileName, + "platform_name" : self.PlatformInfo.Name, + "platform_guid" : self.PlatformInfo.Guid, + "platform_version" : self.PlatformInfo.Version, + "platform_relative_directory": self.PlatformInfo.SourceDir, + "platform_output_directory" : self.PlatformInfo.OutputDir, + + "module_name" : self._AutoGenObject.Name, + "module_guid" : self._AutoGenObject.Guid, + "module_version" : self._AutoGenObject.Version, + "module_type" : self._AutoGenObject.ModuleType, + "module_file" : self._AutoGenObject.MetaFile.Name, + "module_file_base_name" : self._AutoGenObject.MetaFile.BaseName, + "module_relative_directory" : self._AutoGenObject.SourceDir, + "module_extra_defines" : ["%s = %s" % (k, v) for k,v in self._AutoGenObject.Module.Defines.iteritems()], + + "architecture" : self._AutoGenObject.Arch, + "toolchain_tag" : self._AutoGenObject.ToolChain, + "build_target" : self._AutoGenObject.BuildTarget, + + "platform_build_directory" : self.PlatformInfo.BuildDir, + "module_build_directory" : self._AutoGenObject.BuildDir, + "module_output_directory" : self._AutoGenObject.OutputDir, + "module_debug_directory" : self._AutoGenObject.DebugDir, + + "separator" : Separator, + "module_tool_definitions" : ToolsDef, + + "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), + "shell_command" : self._SHELL_CMD_[self._FileType].values(), + + "module_entry_point" : ModuleEntryPoint, + "image_entry_point" : ImageEntryPoint, + "arch_entry_point" : ArchEntryPoint, + "remaining_build_target" : self.ResultFileList, + "common_dependency_file" : self.CommonFileDependency, + "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), + "clean_command" : self.GetRemoveDirectoryCommand(["$(OUTPUT_DIR)"]), + "cleanall_command" : self.GetRemoveDirectoryCommand(["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]), + "dependent_library_build_directory" : self.LibraryBuildDirectoryList, + "library_build_command" : LibraryMakeCommandList, + "file_macro" : FileMacroList, + "file_build_target" : self.BuildTargetList, + "backward_compatible_target": BcTargetList, + } + + return MakefileTemplateDict + + def ProcessBuildTargetList(self): + # + # Search dependency file list for each source file + # + ForceIncludedFile = [] + for File in self._AutoGenObject.AutoGenFileList: + if File.Ext == '.h': + ForceIncludedFile.append(File) + SourceFileList = [] + for Target in self._AutoGenObject.IntroTargetList: + SourceFileList.extend(Target.Inputs) + + self.FileDependency = self.GetFileDependency( + SourceFileList, + ForceIncludedFile, + self._AutoGenObject.IncludePathList + self._AutoGenObject.BuildOptionIncPathList + ) + DepSet = None + for File in self.FileDependency: + if not self.FileDependency[File]: + self.FileDependency[File] = ['$(FORCE_REBUILD)'] + continue + # skip non-C files + if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c": + continue + elif DepSet == None: + DepSet = set(self.FileDependency[File]) + else: + DepSet &= set(self.FileDependency[File]) + # in case nothing in SourceFileList + if DepSet == None: + DepSet = set() + # + # Extract common files list in the dependency files + # + for File in DepSet: + self.CommonFileDependency.append(self.PlaceMacro(File.Path, self.Macros)) + + for File in self.FileDependency: + # skip non-C files + if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c": + continue + NewDepSet = set(self.FileDependency[File]) + NewDepSet -= DepSet + self.FileDependency[File] = ["$(COMMON_DEPS)"] + list(NewDepSet) + + # Convert target description object to target string in makefile + for Type in self._AutoGenObject.Targets: + for T in self._AutoGenObject.Targets[Type]: + # Generate related macros if needed + if T.GenFileListMacro and T.FileListMacro not in self.FileListMacros: + self.FileListMacros[T.FileListMacro] = [] + if T.GenListFile and T.ListFileMacro not in self.ListFileMacros: + self.ListFileMacros[T.ListFileMacro] = [] + if T.GenIncListFile and T.IncListFileMacro not in self.ListFileMacros: + self.ListFileMacros[T.IncListFileMacro] = [] + + Deps = [] + # Add force-dependencies + for Dep in T.Dependencies: + Deps.append(self.PlaceMacro(str(Dep), self.Macros)) + # Add inclusion-dependencies + if len(T.Inputs) == 1 and T.Inputs[0] in self.FileDependency: + for F in self.FileDependency[T.Inputs[0]]: + Deps.append(self.PlaceMacro(str(F), self.Macros)) + # Add source-dependencies + for F in T.Inputs: + NewFile = self.PlaceMacro(str(F), self.Macros) + # In order to use file list macro as dependency + if T.GenListFile: + self.ListFileMacros[T.ListFileMacro].append(str(F)) + self.FileListMacros[T.FileListMacro].append(NewFile) + elif T.GenFileListMacro: + self.FileListMacros[T.FileListMacro].append(NewFile) + else: + Deps.append(NewFile) + + # Use file list macro as dependency + if T.GenFileListMacro: + Deps.append("$(%s)" % T.FileListMacro) + + TargetDict = { + "target" : self.PlaceMacro(T.Target.Path, self.Macros), + "cmd" : "\n\t".join(T.Commands), + "deps" : Deps + } + self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict)) + + ## For creating makefile targets for dependent libraries + def ProcessDependentLibrary(self): + for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: + self.LibraryBuildDirectoryList.append(self.PlaceMacro(LibraryAutoGen.BuildDir, self.Macros)) + + ## Return a list containing source file's dependencies + # + # @param FileList The list of source files + # @param ForceInculeList The list of files which will be included forcely + # @param SearchPathList The list of search path + # + # @retval dict The mapping between source file path and its dependencies + # + def GetFileDependency(self, FileList, ForceInculeList, SearchPathList): + Dependency = {} + for F in FileList: + Dependency[F] = self.GetDependencyList(F, ForceInculeList, SearchPathList) + return Dependency + + ## Find dependencies for one source file + # + # By searching recursively "#include" directive in file, find out all the + # files needed by given source file. The dependecies will be only searched + # in given search path list. + # + # @param File The source file + # @param ForceInculeList The list of files which will be included forcely + # @param SearchPathList The list of search path + # + # @retval list The list of files the given source file depends on + # + def GetDependencyList(self, File, ForceList, SearchPathList): + EdkLogger.debug(EdkLogger.DEBUG_1, "Try to get dependency files for %s" % File) + FileStack = [File] + ForceList + DependencySet = set() + + if self._AutoGenObject.Arch not in gDependencyDatabase: + gDependencyDatabase[self._AutoGenObject.Arch] = {} + DepDb = gDependencyDatabase[self._AutoGenObject.Arch] + + while len(FileStack) > 0: + F = FileStack.pop() + + FullPathDependList = [] + if F in self.FileCache: + for CacheFile in self.FileCache[F]: + FullPathDependList.append(CacheFile) + if CacheFile not in DependencySet: + FileStack.append(CacheFile) + DependencySet.update(FullPathDependList) + continue + + CurrentFileDependencyList = [] + if F in DepDb: + CurrentFileDependencyList = DepDb[F] + else: + try: + Fd = open(F.Path, 'r') + except BaseException, X: + EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=F.Path+"\n\t"+str(X)) + + FileContent = Fd.read() + Fd.close() + if len(FileContent) == 0: + continue + + if FileContent[0] == 0xff or FileContent[0] == 0xfe: + FileContent = unicode(FileContent, "utf-16") + IncludedFileList = gIncludePattern.findall(FileContent) + + for Inc in IncludedFileList: + Inc = Inc.strip() + # if there's macro used to reference header file, expand it + HeaderList = gMacroPattern.findall(Inc) + if len(HeaderList) == 1 and len(HeaderList[0]) == 2: + HeaderType = HeaderList[0][0] + HeaderKey = HeaderList[0][1] + if HeaderType in gIncludeMacroConversion: + Inc = gIncludeMacroConversion[HeaderType] % {"HeaderKey" : HeaderKey} + else: + # not known macro used in #include, always build the file by + # returning a empty dependency + self.FileCache[File] = [] + return [] + Inc = os.path.normpath(Inc) + CurrentFileDependencyList.append(Inc) + DepDb[F] = CurrentFileDependencyList + + CurrentFilePath = F.Dir + PathList = [CurrentFilePath] + SearchPathList + for Inc in CurrentFileDependencyList: + for SearchPath in PathList: + FilePath = os.path.join(SearchPath, Inc) + if FilePath in gIsFileMap: + if not gIsFileMap[FilePath]: + continue + # If isfile is called too many times, the performance is slow down. + elif not os.path.isfile(FilePath): + gIsFileMap[FilePath] = False + continue + else: + gIsFileMap[FilePath] = True + FilePath = PathClass(FilePath) + FullPathDependList.append(FilePath) + if FilePath not in DependencySet: + FileStack.append(FilePath) + break + else: + EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\ + "in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList))) + + self.FileCache[F] = FullPathDependList + DependencySet.update(FullPathDependList) + + DependencySet.update(ForceList) + if File in DependencySet: + DependencySet.remove(File) + DependencyList = list(DependencySet) # remove duplicate ones + + return DependencyList + + _TemplateDict = property(_CreateTemplateDict) + +## CustomMakefile class +# +# This class encapsules makefie and its generation for module. It uses template to generate +# the content of makefile. The content of makefile will be got from ModuleAutoGen object. +# +class CustomMakefile(BuildFile): + ## template used to generate the makefile for module with custom makefile + _TEMPLATE_ = TemplateString('''\ +${makefile_header} + +# +# Platform Macro Definition +# +PLATFORM_NAME = ${platform_name} +PLATFORM_GUID = ${platform_guid} +PLATFORM_VERSION = ${platform_version} +PLATFORM_RELATIVE_DIR = ${platform_relative_directory} +PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} +PLATFORM_OUTPUT_DIR = ${platform_output_directory} + +# +# Module Macro Definition +# +MODULE_NAME = ${module_name} +MODULE_GUID = ${module_guid} +MODULE_VERSION = ${module_version} +MODULE_TYPE = ${module_type} +MODULE_FILE = ${module_file} +MODULE_FILE_BASE_NAME = ${module_file_base_name} +BASE_NAME = $(MODULE_NAME) +MODULE_RELATIVE_DIR = ${module_relative_directory} +MODULE_DIR = $(WORKSPACE)${separator}${module_relative_directory} + +# +# Build Configuration Macro Definition +# +ARCH = ${architecture} +TOOLCHAIN = ${toolchain_tag} +TOOLCHAIN_TAG = ${toolchain_tag} +TARGET = ${build_target} + +# +# Build Directory Macro Definition +# +# PLATFORM_BUILD_DIR = ${platform_build_directory} +BUILD_DIR = ${platform_build_directory} +BIN_DIR = $(BUILD_DIR)${separator}${architecture} +LIB_DIR = $(BIN_DIR) +MODULE_BUILD_DIR = ${module_build_directory} +OUTPUT_DIR = ${module_output_directory} +DEBUG_DIR = ${module_debug_directory} +DEST_DIR_OUTPUT = $(OUTPUT_DIR) +DEST_DIR_DEBUG = $(DEBUG_DIR) + +# +# Tools definitions specific to this module +# +${BEGIN}${module_tool_definitions} +${END} +MAKE_FILE = ${makefile_path} + +# +# Shell Command Macro +# +${BEGIN}${shell_command_code} = ${shell_command} +${END} + +${custom_makefile_content} + +# +# Target used when called from platform makefile, which will bypass the build of dependent libraries +# + +pbuild: init all + + +# +# ModuleTarget +# + +mbuild: init all + +# +# Build Target used in multi-thread build mode, which no init target is needed +# + +tbuild: all + +# +# Initialization target: print build information and create necessary directories +# +init: +\t-@echo Building ... $(MODULE_DIR)${separator}$(MODULE_FILE) [$(ARCH)] +${BEGIN}\t-@${create_directory_command}\n${END}\ + +''') + + ## Constructor of CustomMakefile + # + # @param ModuleAutoGen Object of ModuleAutoGen class + # + def __init__(self, ModuleAutoGen): + BuildFile.__init__(self, ModuleAutoGen) + self.PlatformInfo = self._AutoGenObject.PlatformInfo + self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"] + + # Compose a dict object containing information used to do replacement in template + def _CreateTemplateDict(self): + Separator = self._SEP_[self._FileType] + if self._FileType not in self._AutoGenObject.CustomMakefile: + EdkLogger.error('build', OPTION_NOT_SUPPORTED, "No custom makefile for %s" % self._FileType, + ExtraData="[%s]" % str(self._AutoGenObject)) + MakefilePath = os.path.join( + self._AutoGenObject.WorkspaceDir, + self._AutoGenObject.CustomMakefile[self._FileType] + ) + try: + CustomMakefile = open(MakefilePath, 'r').read() + except: + EdkLogger.error('build', FILE_OPEN_FAILURE, File=str(self._AutoGenObject), + ExtraData=self._AutoGenObject.CustomMakefile[self._FileType]) + + # tools definitions + ToolsDef = [] + for Tool in self._AutoGenObject.BuildOption: + # Don't generate MAKE_FLAGS in makefile. It's put in environment variable. + if Tool == "MAKE": + continue + for Attr in self._AutoGenObject.BuildOption[Tool]: + if Attr == "FAMILY": + continue + elif Attr == "PATH": + ToolsDef.append("%s = %s" % (Tool, self._AutoGenObject.BuildOption[Tool][Attr])) + else: + ToolsDef.append("%s_%s = %s" % (Tool, Attr, self._AutoGenObject.BuildOption[Tool][Attr])) + ToolsDef.append("") + + MakefileName = self._FILE_NAME_[self._FileType] + MakefileTemplateDict = { + "makefile_header" : self._FILE_HEADER_[self._FileType], + "makefile_path" : os.path.join("$(MODULE_BUILD_DIR)", MakefileName), + "platform_name" : self.PlatformInfo.Name, + "platform_guid" : self.PlatformInfo.Guid, + "platform_version" : self.PlatformInfo.Version, + "platform_relative_directory": self.PlatformInfo.SourceDir, + "platform_output_directory" : self.PlatformInfo.OutputDir, + + "module_name" : self._AutoGenObject.Name, + "module_guid" : self._AutoGenObject.Guid, + "module_version" : self._AutoGenObject.Version, + "module_type" : self._AutoGenObject.ModuleType, + "module_file" : self._AutoGenObject.MetaFile, + "module_file_base_name" : self._AutoGenObject.MetaFile.BaseName, + "module_relative_directory" : self._AutoGenObject.SourceDir, + + "architecture" : self._AutoGenObject.Arch, + "toolchain_tag" : self._AutoGenObject.ToolChain, + "build_target" : self._AutoGenObject.BuildTarget, + + "platform_build_directory" : self.PlatformInfo.BuildDir, + "module_build_directory" : self._AutoGenObject.BuildDir, + "module_output_directory" : self._AutoGenObject.OutputDir, + "module_debug_directory" : self._AutoGenObject.DebugDir, + + "separator" : Separator, + "module_tool_definitions" : ToolsDef, + + "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), + "shell_command" : self._SHELL_CMD_[self._FileType].values(), + + "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), + "custom_makefile_content" : CustomMakefile + } + + return MakefileTemplateDict + + _TemplateDict = property(_CreateTemplateDict) + +## PlatformMakefile class +# +# This class encapsules makefie and its generation for platform. It uses +# template to generate the content of makefile. The content of makefile will be +# got from PlatformAutoGen object. +# +class PlatformMakefile(BuildFile): + ## template used to generate the makefile for platform + _TEMPLATE_ = TemplateString('''\ +${makefile_header} + +# +# Platform Macro Definition +# +PLATFORM_NAME = ${platform_name} +PLATFORM_GUID = ${platform_guid} +PLATFORM_VERSION = ${platform_version} +PLATFORM_FILE = ${platform_file} +PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory} +PLATFORM_OUTPUT_DIR = ${platform_output_directory} + +# +# Build Configuration Macro Definition +# +TOOLCHAIN = ${toolchain_tag} +TOOLCHAIN_TAG = ${toolchain_tag} +TARGET = ${build_target} + +# +# Build Directory Macro Definition +# +BUILD_DIR = ${platform_build_directory} +FV_DIR = ${platform_build_directory}${separator}FV + +# +# Shell Command Macro +# +${BEGIN}${shell_command_code} = ${shell_command} +${END} + +MAKE = ${make_path} +MAKE_FILE = ${makefile_path} + +# +# Default target +# +all: init build_libraries build_modules + +# +# Initialization target: print build information and create necessary directories +# +init: +\t-@echo Building ... $(PLATFORM_FILE) [${build_architecture_list}] +\t${BEGIN}-@${create_directory_command} +\t${END} +# +# library build target +# +libraries: init build_libraries + +# +# module build target +# +modules: init build_libraries build_modules + +# +# Build all libraries: +# +build_libraries: +${BEGIN}\t@"$(MAKE)" $(MAKE_FLAGS) -f ${library_makefile_list} pbuild +${END}\t@cd $(BUILD_DIR) + +# +# Build all modules: +# +build_modules: +${BEGIN}\t@"$(MAKE)" $(MAKE_FLAGS) -f ${module_makefile_list} pbuild +${END}\t@cd $(BUILD_DIR) + +# +# Clean intermediate files +# +clean: +\t${BEGIN}-@${library_build_command} clean +\t${END}${BEGIN}-@${module_build_command} clean +\t${END}@cd $(BUILD_DIR) + +# +# Clean all generated files except to makefile +# +cleanall: +${BEGIN}\t${cleanall_command} +${END} + +# +# Clean all library files +# +cleanlib: +\t${BEGIN}-@${library_build_command} cleanall +\t${END}@cd $(BUILD_DIR)\n +''') + + ## Constructor of PlatformMakefile + # + # @param ModuleAutoGen Object of PlatformAutoGen class + # + def __init__(self, PlatformAutoGen): + BuildFile.__init__(self, PlatformAutoGen) + self.ModuleBuildCommandList = [] + self.ModuleMakefileList = [] + self.IntermediateDirectoryList = [] + self.ModuleBuildDirectoryList = [] + self.LibraryBuildDirectoryList = [] + + # Compose a dict object containing information used to do replacement in template + def _CreateTemplateDict(self): + Separator = self._SEP_[self._FileType] + + PlatformInfo = self._AutoGenObject + if "MAKE" not in PlatformInfo.ToolDefinition or "PATH" not in PlatformInfo.ToolDefinition["MAKE"]: + EdkLogger.error("build", OPTION_MISSING, "No MAKE command defined. Please check your tools_def.txt!", + ExtraData="[%s]" % str(self._AutoGenObject)) + + self.IntermediateDirectoryList = ["$(BUILD_DIR)"] + self.ModuleBuildDirectoryList = self.GetModuleBuildDirectoryList() + self.LibraryBuildDirectoryList = self.GetLibraryBuildDirectoryList() + + MakefileName = self._FILE_NAME_[self._FileType] + LibraryMakefileList = [] + LibraryMakeCommandList = [] + for D in self.LibraryBuildDirectoryList: + D = self.PlaceMacro(D, {"BUILD_DIR":PlatformInfo.BuildDir}) + Makefile = os.path.join(D, MakefileName) + Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":Makefile} + LibraryMakefileList.append(Makefile) + LibraryMakeCommandList.append(Command) + + ModuleMakefileList = [] + ModuleMakeCommandList = [] + for D in self.ModuleBuildDirectoryList: + D = self.PlaceMacro(D, {"BUILD_DIR":PlatformInfo.BuildDir}) + Makefile = os.path.join(D, MakefileName) + Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":Makefile} + ModuleMakefileList.append(Makefile) + ModuleMakeCommandList.append(Command) + + MakefileTemplateDict = { + "makefile_header" : self._FILE_HEADER_[self._FileType], + "makefile_path" : os.path.join("$(BUILD_DIR)", MakefileName), + "make_path" : PlatformInfo.ToolDefinition["MAKE"]["PATH"], + "makefile_name" : MakefileName, + "platform_name" : PlatformInfo.Name, + "platform_guid" : PlatformInfo.Guid, + "platform_version" : PlatformInfo.Version, + "platform_file" : self._AutoGenObject.MetaFile, + "platform_relative_directory": PlatformInfo.SourceDir, + "platform_output_directory" : PlatformInfo.OutputDir, + "platform_build_directory" : PlatformInfo.BuildDir, + + "toolchain_tag" : PlatformInfo.ToolChain, + "build_target" : PlatformInfo.BuildTarget, + "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), + "shell_command" : self._SHELL_CMD_[self._FileType].values(), + "build_architecture_list" : self._AutoGenObject.Arch, + "architecture" : self._AutoGenObject.Arch, + "separator" : Separator, + "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), + "cleanall_command" : self.GetRemoveDirectoryCommand(self.IntermediateDirectoryList), + "library_makefile_list" : LibraryMakefileList, + "module_makefile_list" : ModuleMakefileList, + "library_build_command" : LibraryMakeCommandList, + "module_build_command" : ModuleMakeCommandList, + } + + return MakefileTemplateDict + + ## Get the root directory list for intermediate files of all modules build + # + # @retval list The list of directory + # + def GetModuleBuildDirectoryList(self): + DirList = [] + for ModuleAutoGen in self._AutoGenObject.ModuleAutoGenList: + DirList.append(os.path.join(self._AutoGenObject.BuildDir, ModuleAutoGen.BuildDir)) + return DirList + + ## Get the root directory list for intermediate files of all libraries build + # + # @retval list The list of directory + # + def GetLibraryBuildDirectoryList(self): + DirList = [] + for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: + DirList.append(os.path.join(self._AutoGenObject.BuildDir, LibraryAutoGen.BuildDir)) + return DirList + + _TemplateDict = property(_CreateTemplateDict) + +## TopLevelMakefile class +# +# This class encapsules makefie and its generation for entrance makefile. It +# uses template to generate the content of makefile. The content of makefile +# will be got from WorkspaceAutoGen object. +# +class TopLevelMakefile(BuildFile): + ## template used to generate toplevel makefile + _TEMPLATE_ = TemplateString('''\ +${makefile_header} + +# +# Platform Macro Definition +# +PLATFORM_NAME = ${platform_name} +PLATFORM_GUID = ${platform_guid} +PLATFORM_VERSION = ${platform_version} + +# +# Build Configuration Macro Definition +# +TOOLCHAIN = ${toolchain_tag} +TOOLCHAIN_TAG = ${toolchain_tag} +TARGET = ${build_target} + +# +# Build Directory Macro Definition +# +BUILD_DIR = ${platform_build_directory} +FV_DIR = ${platform_build_directory}${separator}FV + +# +# Shell Command Macro +# +${BEGIN}${shell_command_code} = ${shell_command} +${END} + +MAKE = ${make_path} +MAKE_FILE = ${makefile_path} + +# +# Default target +# +all: modules fds + +# +# Initialization target: print build information and create necessary directories +# +init: +\t-@ +\t${BEGIN}-@${create_directory_command} +\t${END} +# +# library build target +# +libraries: init +${BEGIN}\t@cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" $(MAKE_FLAGS) libraries +${END}\t@cd $(BUILD_DIR) + +# +# module build target +# +modules: init +${BEGIN}\t@cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" $(MAKE_FLAGS) modules +${END}\t@cd $(BUILD_DIR) + +# +# Flash Device Image Target +# +fds: init +\t-@cd $(FV_DIR) +${BEGIN}\tGenFds -f ${fdf_file} -o $(BUILD_DIR) -t $(TOOLCHAIN) -b $(TARGET) -p ${active_platform} -a ${build_architecture_list} ${extra_options}${END}${BEGIN} -r ${fd} ${END}${BEGIN} -i ${fv} ${END}${BEGIN} -C ${cap} ${END}${BEGIN} -D ${macro} ${END} + +# +# run command for emulator platform only +# +run: +\tcd $(BUILD_DIR)${separator}IA32 && ".${separator}SecMain" +\tcd $(BUILD_DIR) + +# +# Clean intermediate files +# +clean: +${BEGIN}\t-@${sub_build_command} clean +${END}\t@cd $(BUILD_DIR) + +# +# Clean all generated files except to makefile +# +cleanall: +${BEGIN}\t${cleanall_command} +${END} + +# +# Clean all library files +# +cleanlib: +${BEGIN}\t-@${sub_build_command} cleanlib +${END}\t@cd $(BUILD_DIR)\n +''') + + ## Constructor of TopLevelMakefile + # + # @param Workspace Object of WorkspaceAutoGen class + # + def __init__(self, Workspace): + BuildFile.__init__(self, Workspace) + self.IntermediateDirectoryList = [] + + # Compose a dict object containing information used to do replacement in template + def _CreateTemplateDict(self): + Separator = self._SEP_[self._FileType] + + # any platform autogen object is ok because we just need common information + PlatformInfo = self._AutoGenObject + + if "MAKE" not in PlatformInfo.ToolDefinition or "PATH" not in PlatformInfo.ToolDefinition["MAKE"]: + EdkLogger.error("build", OPTION_MISSING, "No MAKE command defined. Please check your tools_def.txt!", + ExtraData="[%s]" % str(self._AutoGenObject)) + + for Arch in PlatformInfo.ArchList: + self.IntermediateDirectoryList.append(Separator.join(["$(BUILD_DIR)", Arch])) + self.IntermediateDirectoryList.append("$(FV_DIR)") + + # TRICK: for not generating GenFds call in makefile if no FDF file + MacroList = [] + if PlatformInfo.FdfFile != None and PlatformInfo.FdfFile != "": + FdfFileList = [PlatformInfo.FdfFile] + # macros passed to GenFds + MacroList.append('"%s=%s"' % ("EFI_SOURCE", GlobalData.gEfiSource.replace('\\', '\\\\'))) + MacroList.append('"%s=%s"' % ("EDK_SOURCE", GlobalData.gEdkSource.replace('\\', '\\\\'))) + MacroDict = {} + MacroDict.update(GlobalData.gGlobalDefines) + MacroDict.update(GlobalData.gCommandLineDefines) + MacroDict.pop("EFI_SOURCE", "dummy") + MacroDict.pop("EDK_SOURCE", "dummy") + for MacroName in MacroDict: + if MacroDict[MacroName] != "": + MacroList.append('"%s=%s"' % (MacroName, MacroDict[MacroName].replace('\\', '\\\\'))) + else: + MacroList.append('"%s"' % MacroName) + else: + FdfFileList = [] + + # pass extra common options to external program called in makefile, currently GenFds.exe + ExtraOption = '' + LogLevel = EdkLogger.GetLevel() + if LogLevel == EdkLogger.VERBOSE: + ExtraOption += " -v" + elif LogLevel <= EdkLogger.DEBUG_9: + ExtraOption += " -d %d" % (LogLevel - 1) + elif LogLevel == EdkLogger.QUIET: + ExtraOption += " -q" + + if GlobalData.gCaseInsensitive: + ExtraOption += " -c" + + MakefileName = self._FILE_NAME_[self._FileType] + SubBuildCommandList = [] + for A in PlatformInfo.ArchList: + Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":os.path.join("$(BUILD_DIR)", A, MakefileName)} + SubBuildCommandList.append(Command) + + MakefileTemplateDict = { + "makefile_header" : self._FILE_HEADER_[self._FileType], + "makefile_path" : os.path.join("$(BUILD_DIR)", MakefileName), + "make_path" : PlatformInfo.ToolDefinition["MAKE"]["PATH"], + "platform_name" : PlatformInfo.Name, + "platform_guid" : PlatformInfo.Guid, + "platform_version" : PlatformInfo.Version, + "platform_build_directory" : PlatformInfo.BuildDir, + + "toolchain_tag" : PlatformInfo.ToolChain, + "build_target" : PlatformInfo.BuildTarget, + "shell_command_code" : self._SHELL_CMD_[self._FileType].keys(), + "shell_command" : self._SHELL_CMD_[self._FileType].values(), + 'arch' : list(PlatformInfo.ArchList), + "build_architecture_list" : ','.join(PlatformInfo.ArchList), + "separator" : Separator, + "create_directory_command" : self.GetCreateDirectoryCommand(self.IntermediateDirectoryList), + "cleanall_command" : self.GetRemoveDirectoryCommand(self.IntermediateDirectoryList), + "sub_build_command" : SubBuildCommandList, + "fdf_file" : FdfFileList, + "active_platform" : str(PlatformInfo), + "fd" : PlatformInfo.FdTargetList, + "fv" : PlatformInfo.FvTargetList, + "cap" : PlatformInfo.CapTargetList, + "extra_options" : ExtraOption, + "macro" : MacroList, + } + + return MakefileTemplateDict + + ## Get the root directory list for intermediate files of all modules build + # + # @retval list The list of directory + # + def GetModuleBuildDirectoryList(self): + DirList = [] + for ModuleAutoGen in self._AutoGenObject.ModuleAutoGenList: + DirList.append(os.path.join(self._AutoGenObject.BuildDir, ModuleAutoGen.BuildDir)) + return DirList + + ## Get the root directory list for intermediate files of all libraries build + # + # @retval list The list of directory + # + def GetLibraryBuildDirectoryList(self): + DirList = [] + for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList: + DirList.append(os.path.join(self._AutoGenObject.BuildDir, LibraryAutoGen.BuildDir)) + return DirList + + _TemplateDict = property(_CreateTemplateDict) + +# This acts like the main() function for the script, unless it is 'import'ed into another script. +if __name__ == '__main__': + pass + diff --git a/BaseTools/Source/Python/Common/BuildToolError.py b/BaseTools/Source/Python/Common/BuildToolError.py index 4d4e07bd70..b9512a1b4d 100644 --- a/BaseTools/Source/Python/Common/BuildToolError.py +++ b/BaseTools/Source/Python/Common/BuildToolError.py @@ -1,154 +1,154 @@ -## @file -# Standardized Error Hanlding infrastructures. -# -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -FILE_OPEN_FAILURE = 1 -FILE_WRITE_FAILURE = 2 -FILE_PARSE_FAILURE = 3 -FILE_READ_FAILURE = 4 -FILE_CREATE_FAILURE = 5 -FILE_CHECKSUM_FAILURE = 6 -FILE_COMPRESS_FAILURE = 7 -FILE_DECOMPRESS_FAILURE = 8 -FILE_MOVE_FAILURE = 9 -FILE_DELETE_FAILURE = 10 -FILE_COPY_FAILURE = 11 -FILE_POSITIONING_FAILURE = 12 -FILE_ALREADY_EXIST = 13 -FILE_NOT_FOUND = 14 -FILE_TYPE_MISMATCH = 15 -FILE_CASE_MISMATCH = 16 -FILE_DUPLICATED = 17 -FILE_UNKNOWN_ERROR = 0x0FFF - -OPTION_UNKNOWN = 0x1000 -OPTION_MISSING = 0x1001 -OPTION_CONFLICT = 0x1002 -OPTION_VALUE_INVALID = 0x1003 -OPTION_DEPRECATED = 0x1004 -OPTION_NOT_SUPPORTED = 0x1005 -OPTION_UNKNOWN_ERROR = 0x1FFF - -PARAMETER_INVALID = 0x2000 -PARAMETER_MISSING = 0x2001 -PARAMETER_UNKNOWN_ERROR =0x2FFF - -FORMAT_INVALID = 0x3000 -FORMAT_NOT_SUPPORTED = 0x3001 -FORMAT_UNKNOWN = 0x3002 -FORMAT_UNKNOWN_ERROR = 0x3FFF - -RESOURCE_NOT_AVAILABLE = 0x4000 -RESOURCE_ALLOCATE_FAILURE = 0x4001 -RESOURCE_FULL = 0x4002 -RESOURCE_OVERFLOW = 0x4003 -RESOURCE_UNDERRUN = 0x4004 -RESOURCE_UNKNOWN_ERROR = 0x4FFF - -ATTRIBUTE_NOT_AVAILABLE = 0x5000 -ATTRIBUTE_GET_FAILURE = 0x5001 -ATTRIBUTE_SET_FAILURE = 0x5002 -ATTRIBUTE_UPDATE_FAILURE = 0x5003 -ATTRIBUTE_ACCESS_DENIED = 0x5004 -ATTRIBUTE_UNKNOWN_ERROR = 0x5FFF - -IO_NOT_READY = 0x6000 -IO_BUSY = 0x6001 -IO_TIMEOUT = 0x6002 -IO_UNKNOWN_ERROR = 0x6FFF - -COMMAND_FAILURE = 0x7000 - -PERMISSION_FAILURE = 0x8000 - -CODE_ERROR = 0xC0DE - -AUTOGEN_ERROR = 0xF000 -PARSER_ERROR = 0xF001 -BUILD_ERROR = 0xF002 -GENFDS_ERROR = 0xF003 -ECC_ERROR = 0xF004 -EOT_ERROR = 0xF005 -DDC_ERROR = 0xF009 -WARNING_AS_ERROR = 0xF006 -MIGRATION_ERROR = 0xF010 -ABORT_ERROR = 0xFFFE -UNKNOWN_ERROR = 0xFFFF - -## Error message of each error code -gErrorMessage = { - FILE_NOT_FOUND : "File/directory not found in workspace", - FILE_OPEN_FAILURE : "File open failure", - FILE_WRITE_FAILURE : "File write failure", - FILE_PARSE_FAILURE : "File parse failure", - FILE_READ_FAILURE : "File read failure", - FILE_CREATE_FAILURE : "File create failure", - FILE_CHECKSUM_FAILURE : "Invalid checksum of file", - FILE_COMPRESS_FAILURE : "File compress failure", - FILE_DECOMPRESS_FAILURE : "File decompress failure", - FILE_MOVE_FAILURE : "File move failure", - FILE_DELETE_FAILURE : "File delete failure", - FILE_COPY_FAILURE : "File copy failure", - FILE_POSITIONING_FAILURE: "Failed to seeking position", - FILE_ALREADY_EXIST : "File or directory already exists", - FILE_TYPE_MISMATCH : "Incorrect file type", - FILE_CASE_MISMATCH : "File name case mismatch", - FILE_DUPLICATED : "Duplicated file found", - FILE_UNKNOWN_ERROR : "Unknown error encountered on file", - - OPTION_UNKNOWN : "Unknown option", - OPTION_MISSING : "Missing option", - OPTION_CONFLICT : "Conflict options", - OPTION_VALUE_INVALID : "Invalid value of option", - OPTION_DEPRECATED : "Deprecated option", - OPTION_NOT_SUPPORTED : "Unsupported option", - OPTION_UNKNOWN_ERROR : "Unknown error when processing options", - - PARAMETER_INVALID : "Invalid parameter", - PARAMETER_MISSING : "Missing parameter", - PARAMETER_UNKNOWN_ERROR : "Unknown error in parameters", - - FORMAT_INVALID : "Invalid syntax/format", - FORMAT_NOT_SUPPORTED : "Not supported syntax/format", - FORMAT_UNKNOWN : "Unknown format", - FORMAT_UNKNOWN_ERROR : "Unknown error in syntax/format ", - - RESOURCE_NOT_AVAILABLE : "Not available", - RESOURCE_ALLOCATE_FAILURE : "Allocate failure", - RESOURCE_FULL : "Full", - RESOURCE_OVERFLOW : "Overflow", - RESOURCE_UNDERRUN : "Underrun", - RESOURCE_UNKNOWN_ERROR : "Unknown error", - - ATTRIBUTE_NOT_AVAILABLE : "Not available", - ATTRIBUTE_GET_FAILURE : "Failed to retrieve", - ATTRIBUTE_SET_FAILURE : "Failed to set", - ATTRIBUTE_UPDATE_FAILURE: "Failed to update", - ATTRIBUTE_ACCESS_DENIED : "Access denied", - ATTRIBUTE_UNKNOWN_ERROR : "Unknown error when accessing", - - COMMAND_FAILURE : "Failed to execute command", - - IO_NOT_READY : "Not ready", - IO_BUSY : "Busy", - IO_TIMEOUT : "Timeout", - IO_UNKNOWN_ERROR : "Unknown error in IO operation", - - UNKNOWN_ERROR : "Unknown error", -} - -## Exception indicating a fatal error -class FatalError(Exception): - pass - -if __name__ == "__main__": - pass +## @file +# Standardized Error Hanlding infrastructures. +# +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +FILE_OPEN_FAILURE = 1 +FILE_WRITE_FAILURE = 2 +FILE_PARSE_FAILURE = 3 +FILE_READ_FAILURE = 4 +FILE_CREATE_FAILURE = 5 +FILE_CHECKSUM_FAILURE = 6 +FILE_COMPRESS_FAILURE = 7 +FILE_DECOMPRESS_FAILURE = 8 +FILE_MOVE_FAILURE = 9 +FILE_DELETE_FAILURE = 10 +FILE_COPY_FAILURE = 11 +FILE_POSITIONING_FAILURE = 12 +FILE_ALREADY_EXIST = 13 +FILE_NOT_FOUND = 14 +FILE_TYPE_MISMATCH = 15 +FILE_CASE_MISMATCH = 16 +FILE_DUPLICATED = 17 +FILE_UNKNOWN_ERROR = 0x0FFF + +OPTION_UNKNOWN = 0x1000 +OPTION_MISSING = 0x1001 +OPTION_CONFLICT = 0x1002 +OPTION_VALUE_INVALID = 0x1003 +OPTION_DEPRECATED = 0x1004 +OPTION_NOT_SUPPORTED = 0x1005 +OPTION_UNKNOWN_ERROR = 0x1FFF + +PARAMETER_INVALID = 0x2000 +PARAMETER_MISSING = 0x2001 +PARAMETER_UNKNOWN_ERROR =0x2FFF + +FORMAT_INVALID = 0x3000 +FORMAT_NOT_SUPPORTED = 0x3001 +FORMAT_UNKNOWN = 0x3002 +FORMAT_UNKNOWN_ERROR = 0x3FFF + +RESOURCE_NOT_AVAILABLE = 0x4000 +RESOURCE_ALLOCATE_FAILURE = 0x4001 +RESOURCE_FULL = 0x4002 +RESOURCE_OVERFLOW = 0x4003 +RESOURCE_UNDERRUN = 0x4004 +RESOURCE_UNKNOWN_ERROR = 0x4FFF + +ATTRIBUTE_NOT_AVAILABLE = 0x5000 +ATTRIBUTE_GET_FAILURE = 0x5001 +ATTRIBUTE_SET_FAILURE = 0x5002 +ATTRIBUTE_UPDATE_FAILURE = 0x5003 +ATTRIBUTE_ACCESS_DENIED = 0x5004 +ATTRIBUTE_UNKNOWN_ERROR = 0x5FFF + +IO_NOT_READY = 0x6000 +IO_BUSY = 0x6001 +IO_TIMEOUT = 0x6002 +IO_UNKNOWN_ERROR = 0x6FFF + +COMMAND_FAILURE = 0x7000 + +PERMISSION_FAILURE = 0x8000 + +CODE_ERROR = 0xC0DE + +AUTOGEN_ERROR = 0xF000 +PARSER_ERROR = 0xF001 +BUILD_ERROR = 0xF002 +GENFDS_ERROR = 0xF003 +ECC_ERROR = 0xF004 +EOT_ERROR = 0xF005 +DDC_ERROR = 0xF009 +WARNING_AS_ERROR = 0xF006 +MIGRATION_ERROR = 0xF010 +ABORT_ERROR = 0xFFFE +UNKNOWN_ERROR = 0xFFFF + +## Error message of each error code +gErrorMessage = { + FILE_NOT_FOUND : "File/directory not found in workspace", + FILE_OPEN_FAILURE : "File open failure", + FILE_WRITE_FAILURE : "File write failure", + FILE_PARSE_FAILURE : "File parse failure", + FILE_READ_FAILURE : "File read failure", + FILE_CREATE_FAILURE : "File create failure", + FILE_CHECKSUM_FAILURE : "Invalid checksum of file", + FILE_COMPRESS_FAILURE : "File compress failure", + FILE_DECOMPRESS_FAILURE : "File decompress failure", + FILE_MOVE_FAILURE : "File move failure", + FILE_DELETE_FAILURE : "File delete failure", + FILE_COPY_FAILURE : "File copy failure", + FILE_POSITIONING_FAILURE: "Failed to seeking position", + FILE_ALREADY_EXIST : "File or directory already exists", + FILE_TYPE_MISMATCH : "Incorrect file type", + FILE_CASE_MISMATCH : "File name case mismatch", + FILE_DUPLICATED : "Duplicated file found", + FILE_UNKNOWN_ERROR : "Unknown error encountered on file", + + OPTION_UNKNOWN : "Unknown option", + OPTION_MISSING : "Missing option", + OPTION_CONFLICT : "Conflict options", + OPTION_VALUE_INVALID : "Invalid value of option", + OPTION_DEPRECATED : "Deprecated option", + OPTION_NOT_SUPPORTED : "Unsupported option", + OPTION_UNKNOWN_ERROR : "Unknown error when processing options", + + PARAMETER_INVALID : "Invalid parameter", + PARAMETER_MISSING : "Missing parameter", + PARAMETER_UNKNOWN_ERROR : "Unknown error in parameters", + + FORMAT_INVALID : "Invalid syntax/format", + FORMAT_NOT_SUPPORTED : "Not supported syntax/format", + FORMAT_UNKNOWN : "Unknown format", + FORMAT_UNKNOWN_ERROR : "Unknown error in syntax/format ", + + RESOURCE_NOT_AVAILABLE : "Not available", + RESOURCE_ALLOCATE_FAILURE : "Allocate failure", + RESOURCE_FULL : "Full", + RESOURCE_OVERFLOW : "Overflow", + RESOURCE_UNDERRUN : "Underrun", + RESOURCE_UNKNOWN_ERROR : "Unknown error", + + ATTRIBUTE_NOT_AVAILABLE : "Not available", + ATTRIBUTE_GET_FAILURE : "Failed to retrieve", + ATTRIBUTE_SET_FAILURE : "Failed to set", + ATTRIBUTE_UPDATE_FAILURE: "Failed to update", + ATTRIBUTE_ACCESS_DENIED : "Access denied", + ATTRIBUTE_UNKNOWN_ERROR : "Unknown error when accessing", + + COMMAND_FAILURE : "Failed to execute command", + + IO_NOT_READY : "Not ready", + IO_BUSY : "Busy", + IO_TIMEOUT : "Timeout", + IO_UNKNOWN_ERROR : "Unknown error in IO operation", + + UNKNOWN_ERROR : "Unknown error", +} + +## Exception indicating a fatal error +class FatalError(Exception): + pass + +if __name__ == "__main__": + pass diff --git a/BaseTools/Source/Python/Common/BuildVersion.py b/BaseTools/Source/Python/Common/BuildVersion.py index 4decd82c70..bfd4d43bb9 100644 --- a/BaseTools/Source/Python/Common/BuildVersion.py +++ b/BaseTools/Source/Python/Common/BuildVersion.py @@ -13,4 +13,4 @@ # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # -gBUILD_VERSION = "Build 2640" +gBUILD_VERSION = "Build 2649" diff --git a/BaseTools/Source/Python/Common/EdkLogger.py b/BaseTools/Source/Python/Common/EdkLogger.py index a3bcb3a147..10e7222b3d 100644 --- a/BaseTools/Source/Python/Common/EdkLogger.py +++ b/BaseTools/Source/Python/Common/EdkLogger.py @@ -1,269 +1,269 @@ -## @file -# This file implements the log mechanism for Python tools. -# -# Copyright (c) 2007, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## Import modules -import sys, os, logging -import traceback -from BuildToolError import * - -## Log level constants -DEBUG_0 = 1 -DEBUG_1 = 2 -DEBUG_2 = 3 -DEBUG_3 = 4 -DEBUG_4 = 5 -DEBUG_5 = 6 -DEBUG_6 = 7 -DEBUG_7 = 8 -DEBUG_8 = 9 -DEBUG_9 = 10 -VERBOSE = 15 -INFO = 20 -WARN = 30 -QUIET = 40 -ERROR = 50 - -IsRaiseError = True - -# Tool name -_ToolName = os.path.basename(sys.argv[0]) - -# For validation purpose -_LogLevels = [DEBUG_0, DEBUG_1, DEBUG_2, DEBUG_3, DEBUG_4, DEBUG_5, DEBUG_6, DEBUG_7, DEBUG_8, DEBUG_9, VERBOSE, WARN, INFO, ERROR, QUIET] - -# For DEBUG level (All DEBUG_0~9 are applicable) -_DebugLogger = logging.getLogger("tool_debug") -_DebugFormatter = logging.Formatter("[%(asctime)s.%(msecs)d]: %(message)s", datefmt="%H:%M:%S") - -# For VERBOSE, INFO, WARN level -_InfoLogger = logging.getLogger("tool_info") -_InfoFormatter = logging.Formatter("%(message)s") - -# For ERROR level -_ErrorLogger = logging.getLogger("tool_error") -_ErrorFormatter = logging.Formatter("%(message)s") - -# String templates for ERROR/WARN/DEBUG log message -_ErrorMessageTemplate = '\n\n%(tool)s...\n%(file)s(%(line)s): error %(errorcode)04X: %(msg)s\n\t%(extra)s' -_ErrorMessageTemplateWithoutFile = '\n\n%(tool)s...\n : error %(errorcode)04X: %(msg)s\n\t%(extra)s' -_WarningMessageTemplate = '%(tool)s...\n%(file)s(%(line)s): warning: %(msg)s' -_WarningMessageTemplateWithoutFile = '%(tool)s: : warning: %(msg)s' -_DebugMessageTemplate = '%(file)s(%(line)s): debug: \n %(msg)s' - -# -# Flag used to take WARN as ERROR. -# By default, only ERROR message will break the tools execution. -# -_WarningAsError = False - -## Log debug message -# -# @param Level DEBUG level (DEBUG0~9) -# @param Message Debug information -# @param ExtraData More information associated with "Message" -# -def debug(Level, Message, ExtraData=None): - if _DebugLogger.level > Level: - return - if Level > DEBUG_9: - return - - # Find out the caller method information - CallerStack = traceback.extract_stack()[-2] - TemplateDict = { - "file" : CallerStack[0], - "line" : CallerStack[1], - "msg" : Message, - } - - if ExtraData != None: - LogText = _DebugMessageTemplate % TemplateDict + "\n %s" % ExtraData - else: - LogText = _DebugMessageTemplate % TemplateDict - - _DebugLogger.log(Level, LogText) - -## Log verbose message -# -# @param Message Verbose information -# -def verbose(Message): - return _InfoLogger.log(VERBOSE, Message) - -## Log warning message -# -# Warning messages are those which might be wrong but won't fail the tool. -# -# @param ToolName The name of the tool. If not given, the name of caller -# method will be used. -# @param Message Warning information -# @param File The name of file which caused the warning. -# @param Line The line number in the "File" which caused the warning. -# @param ExtraData More information associated with "Message" -# -def warn(ToolName, Message, File=None, Line=None, ExtraData=None): - if _InfoLogger.level > WARN: - return - - # if no tool name given, use caller's source file name as tool name - if ToolName == None or ToolName == "": - ToolName = os.path.basename(traceback.extract_stack()[-2][0]) - - if Line == None: - Line = "..." - else: - Line = "%d" % Line - - TemplateDict = { - "tool" : ToolName, - "file" : File, - "line" : Line, - "msg" : Message, - } - - if File != None: - LogText = _WarningMessageTemplate % TemplateDict - else: - LogText = _WarningMessageTemplateWithoutFile % TemplateDict - - if ExtraData != None: - LogText += "\n %s" % ExtraData - - _InfoLogger.log(WARN, LogText) - - # Raise an execption if indicated - if _WarningAsError == True: - raise FatalError(WARNING_AS_ERROR) - -## Log INFO message -info = _InfoLogger.info - -## Log ERROR message -# -# Once an error messages is logged, the tool's execution will be broken by raising -# an execption. If you don't want to break the execution later, you can give -# "RaiseError" with "False" value. -# -# @param ToolName The name of the tool. If not given, the name of caller -# method will be used. -# @param ErrorCode The error code -# @param Message Warning information -# @param File The name of file which caused the error. -# @param Line The line number in the "File" which caused the warning. -# @param ExtraData More information associated with "Message" -# @param RaiseError Raise an exception to break the tool's executuion if -# it's True. This is the default behavior. -# -def error(ToolName, ErrorCode, Message=None, File=None, Line=None, ExtraData=None, RaiseError=IsRaiseError): - if Line == None: - Line = "..." - else: - Line = "%d" % Line - - if Message == None: - if ErrorCode in gErrorMessage: - Message = gErrorMessage[ErrorCode] - else: - Message = gErrorMessage[UNKNOWN_ERROR] - - if ExtraData == None: - ExtraData = "" - - TemplateDict = { - "tool" : _ToolName, - "file" : File, - "line" : Line, - "errorcode" : ErrorCode, - "msg" : Message, - "extra" : ExtraData - } - - if File != None: - LogText = _ErrorMessageTemplate % TemplateDict - else: - LogText = _ErrorMessageTemplateWithoutFile % TemplateDict - - _ErrorLogger.log(ERROR, LogText) - if RaiseError: - raise FatalError(ErrorCode) - -# Log information which should be always put out -quiet = _ErrorLogger.error - -## Initialize log system -def Initialize(): - # - # Since we use different format to log different levels of message into different - # place (stdout or stderr), we have to use different "Logger" objects to do this. - # - # For DEBUG level (All DEBUG_0~9 are applicable) - _DebugLogger.setLevel(INFO) - _DebugChannel = logging.StreamHandler(sys.stdout) - _DebugChannel.setFormatter(_DebugFormatter) - _DebugLogger.addHandler(_DebugChannel) - - # For VERBOSE, INFO, WARN level - _InfoLogger.setLevel(INFO) - _InfoChannel = logging.StreamHandler(sys.stdout) - _InfoChannel.setFormatter(_InfoFormatter) - _InfoLogger.addHandler(_InfoChannel) - - # For ERROR level - _ErrorLogger.setLevel(INFO) - _ErrorCh = logging.StreamHandler(sys.stderr) - _ErrorCh.setFormatter(_ErrorFormatter) - _ErrorLogger.addHandler(_ErrorCh) - -## Set log level -# -# @param Level One of log level in _LogLevel -def SetLevel(Level): - if Level not in _LogLevels: - info("Not supported log level (%d). Use default level instead." % Level) - Level = INFO - _DebugLogger.setLevel(Level) - _InfoLogger.setLevel(Level) - _ErrorLogger.setLevel(Level) - -## Get current log level -def GetLevel(): - return _InfoLogger.getEffectiveLevel() - -## Raise up warning as error -def SetWarningAsError(): - global _WarningAsError - _WarningAsError = True - -## Specify a file to store the log message as well as put on console -# -# @param LogFile The file path used to store the log message -# -def SetLogFile(LogFile): - if os.path.exists(LogFile): - os.remove(LogFile) - - _Ch = logging.FileHandler(LogFile) - _Ch.setFormatter(_DebugFormatter) - _DebugLogger.addHandler(_Ch) - - _Ch= logging.FileHandler(LogFile) - _Ch.setFormatter(_InfoFormatter) - _InfoLogger.addHandler(_Ch) - - _Ch = logging.FileHandler(LogFile) - _Ch.setFormatter(_ErrorFormatter) - _ErrorLogger.addHandler(_Ch) - -if __name__ == '__main__': - pass - +## @file +# This file implements the log mechanism for Python tools. +# +# Copyright (c) 2007, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## Import modules +import sys, os, logging +import traceback +from BuildToolError import * + +## Log level constants +DEBUG_0 = 1 +DEBUG_1 = 2 +DEBUG_2 = 3 +DEBUG_3 = 4 +DEBUG_4 = 5 +DEBUG_5 = 6 +DEBUG_6 = 7 +DEBUG_7 = 8 +DEBUG_8 = 9 +DEBUG_9 = 10 +VERBOSE = 15 +INFO = 20 +WARN = 30 +QUIET = 40 +ERROR = 50 + +IsRaiseError = True + +# Tool name +_ToolName = os.path.basename(sys.argv[0]) + +# For validation purpose +_LogLevels = [DEBUG_0, DEBUG_1, DEBUG_2, DEBUG_3, DEBUG_4, DEBUG_5, DEBUG_6, DEBUG_7, DEBUG_8, DEBUG_9, VERBOSE, WARN, INFO, ERROR, QUIET] + +# For DEBUG level (All DEBUG_0~9 are applicable) +_DebugLogger = logging.getLogger("tool_debug") +_DebugFormatter = logging.Formatter("[%(asctime)s.%(msecs)d]: %(message)s", datefmt="%H:%M:%S") + +# For VERBOSE, INFO, WARN level +_InfoLogger = logging.getLogger("tool_info") +_InfoFormatter = logging.Formatter("%(message)s") + +# For ERROR level +_ErrorLogger = logging.getLogger("tool_error") +_ErrorFormatter = logging.Formatter("%(message)s") + +# String templates for ERROR/WARN/DEBUG log message +_ErrorMessageTemplate = '\n\n%(tool)s...\n%(file)s(%(line)s): error %(errorcode)04X: %(msg)s\n\t%(extra)s' +_ErrorMessageTemplateWithoutFile = '\n\n%(tool)s...\n : error %(errorcode)04X: %(msg)s\n\t%(extra)s' +_WarningMessageTemplate = '%(tool)s...\n%(file)s(%(line)s): warning: %(msg)s' +_WarningMessageTemplateWithoutFile = '%(tool)s: : warning: %(msg)s' +_DebugMessageTemplate = '%(file)s(%(line)s): debug: \n %(msg)s' + +# +# Flag used to take WARN as ERROR. +# By default, only ERROR message will break the tools execution. +# +_WarningAsError = False + +## Log debug message +# +# @param Level DEBUG level (DEBUG0~9) +# @param Message Debug information +# @param ExtraData More information associated with "Message" +# +def debug(Level, Message, ExtraData=None): + if _DebugLogger.level > Level: + return + if Level > DEBUG_9: + return + + # Find out the caller method information + CallerStack = traceback.extract_stack()[-2] + TemplateDict = { + "file" : CallerStack[0], + "line" : CallerStack[1], + "msg" : Message, + } + + if ExtraData != None: + LogText = _DebugMessageTemplate % TemplateDict + "\n %s" % ExtraData + else: + LogText = _DebugMessageTemplate % TemplateDict + + _DebugLogger.log(Level, LogText) + +## Log verbose message +# +# @param Message Verbose information +# +def verbose(Message): + return _InfoLogger.log(VERBOSE, Message) + +## Log warning message +# +# Warning messages are those which might be wrong but won't fail the tool. +# +# @param ToolName The name of the tool. If not given, the name of caller +# method will be used. +# @param Message Warning information +# @param File The name of file which caused the warning. +# @param Line The line number in the "File" which caused the warning. +# @param ExtraData More information associated with "Message" +# +def warn(ToolName, Message, File=None, Line=None, ExtraData=None): + if _InfoLogger.level > WARN: + return + + # if no tool name given, use caller's source file name as tool name + if ToolName == None or ToolName == "": + ToolName = os.path.basename(traceback.extract_stack()[-2][0]) + + if Line == None: + Line = "..." + else: + Line = "%d" % Line + + TemplateDict = { + "tool" : ToolName, + "file" : File, + "line" : Line, + "msg" : Message, + } + + if File != None: + LogText = _WarningMessageTemplate % TemplateDict + else: + LogText = _WarningMessageTemplateWithoutFile % TemplateDict + + if ExtraData != None: + LogText += "\n %s" % ExtraData + + _InfoLogger.log(WARN, LogText) + + # Raise an execption if indicated + if _WarningAsError == True: + raise FatalError(WARNING_AS_ERROR) + +## Log INFO message +info = _InfoLogger.info + +## Log ERROR message +# +# Once an error messages is logged, the tool's execution will be broken by raising +# an execption. If you don't want to break the execution later, you can give +# "RaiseError" with "False" value. +# +# @param ToolName The name of the tool. If not given, the name of caller +# method will be used. +# @param ErrorCode The error code +# @param Message Warning information +# @param File The name of file which caused the error. +# @param Line The line number in the "File" which caused the warning. +# @param ExtraData More information associated with "Message" +# @param RaiseError Raise an exception to break the tool's executuion if +# it's True. This is the default behavior. +# +def error(ToolName, ErrorCode, Message=None, File=None, Line=None, ExtraData=None, RaiseError=IsRaiseError): + if Line == None: + Line = "..." + else: + Line = "%d" % Line + + if Message == None: + if ErrorCode in gErrorMessage: + Message = gErrorMessage[ErrorCode] + else: + Message = gErrorMessage[UNKNOWN_ERROR] + + if ExtraData == None: + ExtraData = "" + + TemplateDict = { + "tool" : _ToolName, + "file" : File, + "line" : Line, + "errorcode" : ErrorCode, + "msg" : Message, + "extra" : ExtraData + } + + if File != None: + LogText = _ErrorMessageTemplate % TemplateDict + else: + LogText = _ErrorMessageTemplateWithoutFile % TemplateDict + + _ErrorLogger.log(ERROR, LogText) + if RaiseError: + raise FatalError(ErrorCode) + +# Log information which should be always put out +quiet = _ErrorLogger.error + +## Initialize log system +def Initialize(): + # + # Since we use different format to log different levels of message into different + # place (stdout or stderr), we have to use different "Logger" objects to do this. + # + # For DEBUG level (All DEBUG_0~9 are applicable) + _DebugLogger.setLevel(INFO) + _DebugChannel = logging.StreamHandler(sys.stdout) + _DebugChannel.setFormatter(_DebugFormatter) + _DebugLogger.addHandler(_DebugChannel) + + # For VERBOSE, INFO, WARN level + _InfoLogger.setLevel(INFO) + _InfoChannel = logging.StreamHandler(sys.stdout) + _InfoChannel.setFormatter(_InfoFormatter) + _InfoLogger.addHandler(_InfoChannel) + + # For ERROR level + _ErrorLogger.setLevel(INFO) + _ErrorCh = logging.StreamHandler(sys.stderr) + _ErrorCh.setFormatter(_ErrorFormatter) + _ErrorLogger.addHandler(_ErrorCh) + +## Set log level +# +# @param Level One of log level in _LogLevel +def SetLevel(Level): + if Level not in _LogLevels: + info("Not supported log level (%d). Use default level instead." % Level) + Level = INFO + _DebugLogger.setLevel(Level) + _InfoLogger.setLevel(Level) + _ErrorLogger.setLevel(Level) + +## Get current log level +def GetLevel(): + return _InfoLogger.getEffectiveLevel() + +## Raise up warning as error +def SetWarningAsError(): + global _WarningAsError + _WarningAsError = True + +## Specify a file to store the log message as well as put on console +# +# @param LogFile The file path used to store the log message +# +def SetLogFile(LogFile): + if os.path.exists(LogFile): + os.remove(LogFile) + + _Ch = logging.FileHandler(LogFile) + _Ch.setFormatter(_DebugFormatter) + _DebugLogger.addHandler(_Ch) + + _Ch= logging.FileHandler(LogFile) + _Ch.setFormatter(_InfoFormatter) + _InfoLogger.addHandler(_Ch) + + _Ch = logging.FileHandler(LogFile) + _Ch.setFormatter(_ErrorFormatter) + _ErrorLogger.addHandler(_Ch) + +if __name__ == '__main__': + pass + diff --git a/BaseTools/Source/Python/Common/GlobalData.py b/BaseTools/Source/Python/Common/GlobalData.py index 4fbe721823..1f9d91c5d8 100644 --- a/BaseTools/Source/Python/Common/GlobalData.py +++ b/BaseTools/Source/Python/Common/GlobalData.py @@ -1,71 +1,71 @@ -## @file -# This file is used to define common static strings used by INF/DEC/DSC files -# -# Copyright (c) 2007, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -import re - -gIsWindows = None - -gEdkCompatibilityPkg = "EdkCompatibilityPkg" -gWorkspace = "." -gEdkSource = "EdkCompatibilityPkg" -gEfiSource = "." -gEcpSource = "EdkCompatibilityPkg" - -gOptions = None -gCaseInsensitive = False -gAllFiles = None - -gGlobalDefines = {} -gPlatformDefines = {} -# PCD name and value pair for fixed at build and feature flag -gPlatformPcds = {} -# PCDs with type that are not fixed at build and feature flag -gPlatformOtherPcds = {} -gActivePlatform = None -gCommandLineDefines = {} -gEdkGlobal = {} -gOverrideDir = {} - -# for debug trace purpose when problem occurs -gProcessingFile = '' -gBuildingModule = '' - -## Regular expression for matching macro used in DSC/DEC/INF file inclusion -gMacroRefPattern = re.compile("\$\(([A-Z][_A-Z0-9]*)\)", re.UNICODE) -gMacroDefPattern = re.compile("^(DEFINE|EDK_GLOBAL)[ \t]+") -gMacroNamePattern = re.compile("^[A-Z][A-Z0-9_]*$") -# C-style wide string pattern -gWideStringPattern = re.compile('(\W|\A)L"') -# -# A global variable for whether current build in AutoGen phase or not. -# -gAutoGenPhase = False - -# -# The Conf dir outside the workspace dir -# -gConfDirectory = '' - -# -# The relative default database file path -# -gDatabasePath = ".cache/build.db" - -# -# Build flag for binary build -# -gIgnoreSource = False - -# -# FDF parser -# -gFdfParser = None +## @file +# This file is used to define common static strings used by INF/DEC/DSC files +# +# Copyright (c) 2007, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +import re + +gIsWindows = None + +gEdkCompatibilityPkg = "EdkCompatibilityPkg" +gWorkspace = "." +gEdkSource = "EdkCompatibilityPkg" +gEfiSource = "." +gEcpSource = "EdkCompatibilityPkg" + +gOptions = None +gCaseInsensitive = False +gAllFiles = None + +gGlobalDefines = {} +gPlatformDefines = {} +# PCD name and value pair for fixed at build and feature flag +gPlatformPcds = {} +# PCDs with type that are not fixed at build and feature flag +gPlatformOtherPcds = {} +gActivePlatform = None +gCommandLineDefines = {} +gEdkGlobal = {} +gOverrideDir = {} + +# for debug trace purpose when problem occurs +gProcessingFile = '' +gBuildingModule = '' + +## Regular expression for matching macro used in DSC/DEC/INF file inclusion +gMacroRefPattern = re.compile("\$\(([A-Z][_A-Z0-9]*)\)", re.UNICODE) +gMacroDefPattern = re.compile("^(DEFINE|EDK_GLOBAL)[ \t]+") +gMacroNamePattern = re.compile("^[A-Z][A-Z0-9_]*$") +# C-style wide string pattern +gWideStringPattern = re.compile('(\W|\A)L"') +# +# A global variable for whether current build in AutoGen phase or not. +# +gAutoGenPhase = False + +# +# The Conf dir outside the workspace dir +# +gConfDirectory = '' + +# +# The relative default database file path +# +gDatabasePath = ".cache/build.db" + +# +# Build flag for binary build +# +gIgnoreSource = False + +# +# FDF parser +# +gFdfParser = None diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py index fafd84a0eb..7b568dc3e5 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -1,1749 +1,1749 @@ -## @file -# Common routines used by all tools -# -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import string -import thread -import threading -import time -import re -import cPickle -import array -from UserDict import IterableUserDict -from UserList import UserList - -from Common import EdkLogger as EdkLogger -from Common import GlobalData as GlobalData -from DataType import * -from BuildToolError import * -from CommonDataClass.DataClass import * -from Parsing import GetSplitValueList - -## Regular expression used to find out place holders in string template -gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE|re.UNICODE) - -## Dictionary used to store file time stamp for quick re-access -gFileTimeStampCache = {} # {file path : file time stamp} - -## Dictionary used to store dependencies of files -gDependencyDatabase = {} # arch : {file path : [dependent files list]} - -## callback routine for processing variable option -# -# This function can be used to process variable number of option values. The -# typical usage of it is specify architecure list on command line. -# (e.g. -a IA32 X64 IPF) -# -# @param Option Standard callback function parameter -# @param OptionString Standard callback function parameter -# @param Value Standard callback function parameter -# @param Parser Standard callback function parameter -# -# @retval -# -def ProcessVariableArgument(Option, OptionString, Value, Parser): - assert Value is None - Value = [] - RawArgs = Parser.rargs - while RawArgs: - Arg = RawArgs[0] - if (Arg[:2] == "--" and len(Arg) > 2) or \ - (Arg[:1] == "-" and len(Arg) > 1 and Arg[1] != "-"): - break - Value.append(Arg) - del RawArgs[0] - setattr(Parser.values, Option.dest, Value) - -## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style -# -# @param Guid The GUID string -# -# @retval string The GUID string in C structure style -# -def GuidStringToGuidStructureString(Guid): - GuidList = Guid.split('-') - Result = '{' - for Index in range(0,3,1): - Result = Result + '0x' + GuidList[Index] + ', ' - Result = Result + '{0x' + GuidList[3][0:2] + ', 0x' + GuidList[3][2:4] - for Index in range(0,12,2): - Result = Result + ', 0x' + GuidList[4][Index:Index+2] - Result += '}}' - return Result - -## Convert GUID structure in byte array to xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -# -# @param GuidValue The GUID value in byte array -# -# @retval string The GUID value in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format -# -def GuidStructureByteArrayToGuidString(GuidValue): - guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "").replace(";", "") - guidValueList = guidValueString.split(",") - if len(guidValueList) != 16: - return '' - #EdkLogger.error(None, None, "Invalid GUID value string %s" % GuidValue) - try: - return "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( - int(guidValueList[3], 16), - int(guidValueList[2], 16), - int(guidValueList[1], 16), - int(guidValueList[0], 16), - int(guidValueList[5], 16), - int(guidValueList[4], 16), - int(guidValueList[7], 16), - int(guidValueList[6], 16), - int(guidValueList[8], 16), - int(guidValueList[9], 16), - int(guidValueList[10], 16), - int(guidValueList[11], 16), - int(guidValueList[12], 16), - int(guidValueList[13], 16), - int(guidValueList[14], 16), - int(guidValueList[15], 16) - ) - except: - return '' - -## Convert GUID string in C structure style to xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -# -# @param GuidValue The GUID value in C structure format -# -# @retval string The GUID value in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format -# -def GuidStructureStringToGuidString(GuidValue): - guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "").replace(";", "") - guidValueList = guidValueString.split(",") - if len(guidValueList) != 11: - return '' - #EdkLogger.error(None, None, "Invalid GUID value string %s" % GuidValue) - try: - return "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( - int(guidValueList[0], 16), - int(guidValueList[1], 16), - int(guidValueList[2], 16), - int(guidValueList[3], 16), - int(guidValueList[4], 16), - int(guidValueList[5], 16), - int(guidValueList[6], 16), - int(guidValueList[7], 16), - int(guidValueList[8], 16), - int(guidValueList[9], 16), - int(guidValueList[10], 16) - ) - except: - return '' - -## Convert GUID string in C structure style to xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx -# -# @param GuidValue The GUID value in C structure format -# -# @retval string The GUID value in xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx format -# -def GuidStructureStringToGuidValueName(GuidValue): - guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "") - guidValueList = guidValueString.split(",") - if len(guidValueList) != 11: - EdkLogger.error(None, FORMAT_INVALID, "Invalid GUID value string [%s]" % GuidValue) - return "%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x" % ( - int(guidValueList[0], 16), - int(guidValueList[1], 16), - int(guidValueList[2], 16), - int(guidValueList[3], 16), - int(guidValueList[4], 16), - int(guidValueList[5], 16), - int(guidValueList[6], 16), - int(guidValueList[7], 16), - int(guidValueList[8], 16), - int(guidValueList[9], 16), - int(guidValueList[10], 16) - ) - -## Create directories -# -# @param Directory The directory name -# -def CreateDirectory(Directory): - if Directory == None or Directory.strip() == "": - return True - try: - if not os.access(Directory, os.F_OK): - os.makedirs(Directory) - except: - return False - return True - -## Remove directories, including files and sub-directories in it -# -# @param Directory The directory name -# -def RemoveDirectory(Directory, Recursively=False): - if Directory == None or Directory.strip() == "" or not os.path.exists(Directory): - return - if Recursively: - CurrentDirectory = os.getcwd() - os.chdir(Directory) - for File in os.listdir("."): - if os.path.isdir(File): - RemoveDirectory(File, Recursively) - else: - os.remove(File) - os.chdir(CurrentDirectory) - os.rmdir(Directory) - -## Check if given file is changed or not -# -# This method is used to check if a file is changed or not between two build -# actions. It makes use a cache to store files timestamp. -# -# @param File The path of file -# -# @retval True If the given file is changed, doesn't exist, or can't be -# found in timestamp cache -# @retval False If the given file is changed -# -def IsChanged(File): - if not os.path.exists(File): - return True - - FileState = os.stat(File) - TimeStamp = FileState[-2] - - if File in gFileTimeStampCache and TimeStamp == gFileTimeStampCache[File]: - FileChanged = False - else: - FileChanged = True - gFileTimeStampCache[File] = TimeStamp - - return FileChanged - -## Store content in file -# -# This method is used to save file only when its content is changed. This is -# quite useful for "make" system to decide what will be re-built and what won't. -# -# @param File The path of file -# @param Content The new content of the file -# @param IsBinaryFile The flag indicating if the file is binary file or not -# -# @retval True If the file content is changed and the file is renewed -# @retval False If the file content is the same -# -def SaveFileOnChange(File, Content, IsBinaryFile=True): - if not IsBinaryFile: - Content = Content.replace("\n", os.linesep) - - if os.path.exists(File): - try: - if Content == open(File, "rb").read(): - return False - except: - EdkLogger.error(None, FILE_OPEN_FAILURE, ExtraData=File) - - DirName = os.path.dirname(File) - if not CreateDirectory(DirName): - EdkLogger.error(None, FILE_CREATE_FAILURE, "Could not create directory %s" % DirName) - else: - if DirName == '': - DirName = os.getcwd() - if not os.access(DirName, os.W_OK): - EdkLogger.error(None, PERMISSION_FAILURE, "Do not have write permission on directory %s" % DirName) - - try: - if GlobalData.gIsWindows: - try: - from PyUtility import SaveFileToDisk - if not SaveFileToDisk(File, Content): - EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData=File) - except: - Fd = open(File, "wb") - Fd.write(Content) - Fd.close() - else: - Fd = open(File, "wb") - Fd.write(Content) - Fd.close() - except IOError, X: - EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s'%X) - - return True - -## Make a Python object persistent on file system -# -# @param Data The object to be stored in file -# @param File The path of file to store the object -# -def DataDump(Data, File): - Fd = None - try: - Fd = open(File, 'wb') - cPickle.dump(Data, Fd, cPickle.HIGHEST_PROTOCOL) - except: - EdkLogger.error("", FILE_OPEN_FAILURE, ExtraData=File, RaiseError=False) - finally: - if Fd != None: - Fd.close() - -## Restore a Python object from a file -# -# @param File The path of file stored the object -# -# @retval object A python object -# @retval None If failure in file operation -# -def DataRestore(File): - Data = None - Fd = None - try: - Fd = open(File, 'rb') - Data = cPickle.load(Fd) - except Exception, e: - EdkLogger.verbose("Failed to load [%s]\n\t%s" % (File, str(e))) - Data = None - finally: - if Fd != None: - Fd.close() - return Data - -## Retrieve and cache the real path name in file system -# -# @param Root The root directory of path relative to -# -# @retval str The path string if the path exists -# @retval None If path doesn't exist -# -class DirCache: - _CACHE_ = set() - _UPPER_CACHE_ = {} - - def __init__(self, Root): - self._Root = Root - for F in os.listdir(Root): - self._CACHE_.add(F) - self._UPPER_CACHE_[F.upper()] = F - - # =[] operator - def __getitem__(self, Path): - Path = Path[len(os.path.commonprefix([Path, self._Root])):] - if not Path: - return self._Root - if Path and Path[0] == os.path.sep: - Path = Path[1:] - if Path in self._CACHE_: - return os.path.join(self._Root, Path) - UpperPath = Path.upper() - if UpperPath in self._UPPER_CACHE_: - return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath]) - - IndexList = [] - LastSepIndex = -1 - SepIndex = Path.find(os.path.sep) - while SepIndex > -1: - Parent = UpperPath[:SepIndex] - if Parent not in self._UPPER_CACHE_: - break - LastSepIndex = SepIndex - SepIndex = Path.find(os.path.sep, LastSepIndex + 1) - - if LastSepIndex == -1: - return None - - Cwd = os.getcwd() - os.chdir(self._Root) - SepIndex = LastSepIndex - while SepIndex > -1: - Parent = Path[:SepIndex] - ParentKey = UpperPath[:SepIndex] - if ParentKey not in self._UPPER_CACHE_: - os.chdir(Cwd) - return None - - if Parent in self._CACHE_: - ParentDir = Parent - else: - ParentDir = self._UPPER_CACHE_[ParentKey] - for F in os.listdir(ParentDir): - Dir = os.path.join(ParentDir, F) - self._CACHE_.add(Dir) - self._UPPER_CACHE_[Dir.upper()] = Dir - - SepIndex = Path.find(os.path.sep, SepIndex + 1) - - os.chdir(Cwd) - if Path in self._CACHE_: - return os.path.join(self._Root, Path) - elif UpperPath in self._UPPER_CACHE_: - return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath]) - return None - -## Get all files of a directory -# -# @param Root: Root dir -# @param SkipList : The files need be skipped -# -# @retval A list of all files -# -def GetFiles(Root, SkipList=None, FullPath = True): - OriPath = Root - FileList = [] - for Root, Dirs, Files in os.walk(Root): - if SkipList: - for Item in SkipList: - if Item in Dirs: - Dirs.remove(Item) - - for File in Files: - File = os.path.normpath(os.path.join(Root, File)) - if not FullPath: - File = File[len(OriPath) + 1:] - FileList.append(File) - - return FileList - -## Check if gvien file exists or not -# -# @param File File name or path to be checked -# @param Dir The directory the file is relative to -# -# @retval True if file exists -# @retval False if file doesn't exists -# -def ValidFile(File, Ext=None): - if Ext != None: - Dummy, FileExt = os.path.splitext(File) - if FileExt.lower() != Ext.lower(): - return False - if not os.path.exists(File): - return False - return True - -def RealPath(File, Dir='', OverrideDir=''): - NewFile = os.path.normpath(os.path.join(Dir, File)) - NewFile = GlobalData.gAllFiles[NewFile] - if not NewFile and OverrideDir: - NewFile = os.path.normpath(os.path.join(OverrideDir, File)) - NewFile = GlobalData.gAllFiles[NewFile] - return NewFile - -def RealPath2(File, Dir='', OverrideDir=''): - if OverrideDir: - NewFile = GlobalData.gAllFiles[os.path.normpath(os.path.join(OverrideDir, File))] - if NewFile: - if OverrideDir[-1] == os.path.sep: - return NewFile[len(OverrideDir):], NewFile[0:len(OverrideDir)] - else: - return NewFile[len(OverrideDir)+1:], NewFile[0:len(OverrideDir)] - if GlobalData.gAllFiles: - NewFile = GlobalData.gAllFiles[os.path.normpath(os.path.join(Dir, File))] - else: - NewFile = os.path.normpath(os.path.join(Dir, File)) - if NewFile: - if Dir: - if Dir[-1] == os.path.sep: - return NewFile[len(Dir):], NewFile[0:len(Dir)] - else: - return NewFile[len(Dir)+1:], NewFile[0:len(Dir)] - else: - return NewFile, '' - - return None, None - -## Check if gvien file exists or not -# -# -def ValidFile2(AllFiles, File, Ext=None, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''): - NewFile = File - if Ext != None: - Dummy, FileExt = os.path.splitext(File) - if FileExt.lower() != Ext.lower(): - return False, File - - # Replace the Edk macros - if OverrideDir != '' and OverrideDir != None: - if OverrideDir.find('$(EFI_SOURCE)') > -1: - OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource) - if OverrideDir.find('$(EDK_SOURCE)') > -1: - OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource) - - # Replace the default dir to current dir - if Dir == '.': - Dir = os.getcwd() - Dir = Dir[len(Workspace)+1:] - - # First check if File has Edk definition itself - if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1: - NewFile = File.replace('$(EFI_SOURCE)', EfiSource) - NewFile = NewFile.replace('$(EDK_SOURCE)', EdkSource) - NewFile = AllFiles[os.path.normpath(NewFile)] - if NewFile != None: - return True, NewFile - - # Second check the path with override value - if OverrideDir != '' and OverrideDir != None: - NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))] - if NewFile != None: - return True, NewFile - - # Last check the path with normal definitions - File = os.path.join(Dir, File) - NewFile = AllFiles[os.path.normpath(File)] - if NewFile != None: - return True, NewFile - - return False, File - -## Check if gvien file exists or not -# -# -def ValidFile3(AllFiles, File, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''): - # Replace the Edk macros - if OverrideDir != '' and OverrideDir != None: - if OverrideDir.find('$(EFI_SOURCE)') > -1: - OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource) - if OverrideDir.find('$(EDK_SOURCE)') > -1: - OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource) - - # Replace the default dir to current dir - # Dir is current module dir related to workspace - if Dir == '.': - Dir = os.getcwd() - Dir = Dir[len(Workspace)+1:] - - NewFile = File - RelaPath = AllFiles[os.path.normpath(Dir)] - NewRelaPath = RelaPath - - while(True): - # First check if File has Edk definition itself - if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1: - File = File.replace('$(EFI_SOURCE)', EfiSource) - File = File.replace('$(EDK_SOURCE)', EdkSource) - NewFile = AllFiles[os.path.normpath(File)] - if NewFile != None: - NewRelaPath = os.path.dirname(NewFile) - File = os.path.basename(NewFile) - #NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1] - break - - # Second check the path with override value - if OverrideDir != '' and OverrideDir != None: - NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))] - if NewFile != None: - #NewRelaPath = os.path.dirname(NewFile) - NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1] - break - - # Last check the path with normal definitions - NewFile = AllFiles[os.path.normpath(os.path.join(Dir, File))] - if NewFile != None: - break - - # No file found - break - - return NewRelaPath, RelaPath, File - - -def GetRelPath(Path1, Path2): - FileName = os.path.basename(Path2) - L1 = os.path.normpath(Path1).split(os.path.normpath('/')) - L2 = os.path.normpath(Path2).split(os.path.normpath('/')) - for Index in range(0, len(L1)): - if L1[Index] != L2[Index]: - FileName = '../' * (len(L1) - Index) - for Index2 in range(Index, len(L2)): - FileName = os.path.join(FileName, L2[Index2]) - break - return os.path.normpath(FileName) - - -## Get GUID value from given packages -# -# @param CName The CName of the GUID -# @param PackageList List of packages looking-up in -# -# @retval GuidValue if the CName is found in any given package -# @retval None if the CName is not found in all given packages -# -def GuidValue(CName, PackageList): - for P in PackageList: - if CName in P.Guids: - return P.Guids[CName] - return None - -## Get Protocol value from given packages -# -# @param CName The CName of the GUID -# @param PackageList List of packages looking-up in -# -# @retval GuidValue if the CName is found in any given package -# @retval None if the CName is not found in all given packages -# -def ProtocolValue(CName, PackageList): - for P in PackageList: - if CName in P.Protocols: - return P.Protocols[CName] - return None - -## Get PPI value from given packages -# -# @param CName The CName of the GUID -# @param PackageList List of packages looking-up in -# -# @retval GuidValue if the CName is found in any given package -# @retval None if the CName is not found in all given packages -# -def PpiValue(CName, PackageList): - for P in PackageList: - if CName in P.Ppis: - return P.Ppis[CName] - return None - -## A string template class -# -# This class implements a template for string replacement. A string template -# looks like following -# -# ${BEGIN} other_string ${placeholder_name} other_string ${END} -# -# The string between ${BEGIN} and ${END} will be repeated as many times as the -# length of "placeholder_name", which is a list passed through a dict. The -# "placeholder_name" is the key name of the dict. The ${BEGIN} and ${END} can -# be not used and, in this case, the "placeholder_name" must not a list and it -# will just be replaced once. -# -class TemplateString(object): - _REPEAT_START_FLAG = "BEGIN" - _REPEAT_END_FLAG = "END" - - class Section(object): - _LIST_TYPES = [type([]), type(set()), type((0,))] - - def __init__(self, TemplateSection, PlaceHolderList): - self._Template = TemplateSection - self._PlaceHolderList = [] - - # Split the section into sub-sections according to the position of placeholders - if PlaceHolderList: - self._SubSectionList = [] - SubSectionStart = 0 - # - # The placeholders passed in must be in the format of - # - # PlaceHolderName, PlaceHolderStartPoint, PlaceHolderEndPoint - # - for PlaceHolder,Start,End in PlaceHolderList: - self._SubSectionList.append(TemplateSection[SubSectionStart:Start]) - self._SubSectionList.append(TemplateSection[Start:End]) - self._PlaceHolderList.append(PlaceHolder) - SubSectionStart = End - if SubSectionStart < len(TemplateSection): - self._SubSectionList.append(TemplateSection[SubSectionStart:]) - else: - self._SubSectionList = [TemplateSection] - - def __str__(self): - return self._Template + " : " + str(self._PlaceHolderList) - - def Instantiate(self, PlaceHolderValues): - RepeatTime = -1 - RepeatPlaceHolders = {} - NonRepeatPlaceHolders = {} - - for PlaceHolder in self._PlaceHolderList: - if PlaceHolder not in PlaceHolderValues: - continue - Value = PlaceHolderValues[PlaceHolder] - if type(Value) in self._LIST_TYPES: - if RepeatTime < 0: - RepeatTime = len(Value) - elif RepeatTime != len(Value): - EdkLogger.error( - "TemplateString", - PARAMETER_INVALID, - "${%s} has different repeat time from others!" % PlaceHolder, - ExtraData=str(self._Template) - ) - RepeatPlaceHolders["${%s}" % PlaceHolder] = Value - else: - NonRepeatPlaceHolders["${%s}" % PlaceHolder] = Value - - if NonRepeatPlaceHolders: - StringList = [] - for S in self._SubSectionList: - if S not in NonRepeatPlaceHolders: - StringList.append(S) - else: - StringList.append(str(NonRepeatPlaceHolders[S])) - else: - StringList = self._SubSectionList - - if RepeatPlaceHolders: - TempStringList = [] - for Index in range(RepeatTime): - for S in StringList: - if S not in RepeatPlaceHolders: - TempStringList.append(S) - else: - TempStringList.append(str(RepeatPlaceHolders[S][Index])) - StringList = TempStringList - - return "".join(StringList) - - ## Constructor - def __init__(self, Template=None): - self.String = '' - self.IsBinary = False - self._Template = Template - self._TemplateSectionList = self._Parse(Template) - - ## str() operator - # - # @retval string The string replaced - # - def __str__(self): - return self.String - - ## Split the template string into fragments per the ${BEGIN} and ${END} flags - # - # @retval list A list of TemplateString.Section objects - # - def _Parse(self, Template): - SectionStart = 0 - SearchFrom = 0 - MatchEnd = 0 - PlaceHolderList = [] - TemplateSectionList = [] - while Template: - MatchObj = gPlaceholderPattern.search(Template, SearchFrom) - if not MatchObj: - if MatchEnd <= len(Template): - TemplateSection = TemplateString.Section(Template[SectionStart:], PlaceHolderList) - TemplateSectionList.append(TemplateSection) - break - - MatchString = MatchObj.group(1) - MatchStart = MatchObj.start() - MatchEnd = MatchObj.end() - - if MatchString == self._REPEAT_START_FLAG: - if MatchStart > SectionStart: - TemplateSection = TemplateString.Section(Template[SectionStart:MatchStart], PlaceHolderList) - TemplateSectionList.append(TemplateSection) - SectionStart = MatchEnd - PlaceHolderList = [] - elif MatchString == self._REPEAT_END_FLAG: - TemplateSection = TemplateString.Section(Template[SectionStart:MatchStart], PlaceHolderList) - TemplateSectionList.append(TemplateSection) - SectionStart = MatchEnd - PlaceHolderList = [] - else: - PlaceHolderList.append((MatchString, MatchStart - SectionStart, MatchEnd - SectionStart)) - SearchFrom = MatchEnd - return TemplateSectionList - - ## Replace the string template with dictionary of placeholders and append it to previous one - # - # @param AppendString The string template to append - # @param Dictionary The placeholder dictionaries - # - def Append(self, AppendString, Dictionary=None): - if Dictionary: - SectionList = self._Parse(AppendString) - self.String += "".join([S.Instantiate(Dictionary) for S in SectionList]) - else: - self.String += AppendString - - ## Replace the string template with dictionary of placeholders - # - # @param Dictionary The placeholder dictionaries - # - # @retval str The string replaced with placeholder values - # - def Replace(self, Dictionary=None): - return "".join([S.Instantiate(Dictionary) for S in self._TemplateSectionList]) - -## Progress indicator class -# -# This class makes use of thread to print progress on console. -# -class Progressor: - # for avoiding deadloop - _StopFlag = None - _ProgressThread = None - _CheckInterval = 0.25 - - ## Constructor - # - # @param OpenMessage The string printed before progress charaters - # @param CloseMessage The string printed after progress charaters - # @param ProgressChar The charater used to indicate the progress - # @param Interval The interval in seconds between two progress charaters - # - def __init__(self, OpenMessage="", CloseMessage="", ProgressChar='.', Interval=1.0): - self.PromptMessage = OpenMessage - self.CodaMessage = CloseMessage - self.ProgressChar = ProgressChar - self.Interval = Interval - if Progressor._StopFlag == None: - Progressor._StopFlag = threading.Event() - - ## Start to print progress charater - # - # @param OpenMessage The string printed before progress charaters - # - def Start(self, OpenMessage=None): - if OpenMessage != None: - self.PromptMessage = OpenMessage - Progressor._StopFlag.clear() - if Progressor._ProgressThread == None: - Progressor._ProgressThread = threading.Thread(target=self._ProgressThreadEntry) - Progressor._ProgressThread.setDaemon(False) - Progressor._ProgressThread.start() - - ## Stop printing progress charater - # - # @param CloseMessage The string printed after progress charaters - # - def Stop(self, CloseMessage=None): - OriginalCodaMessage = self.CodaMessage - if CloseMessage != None: - self.CodaMessage = CloseMessage - self.Abort() - self.CodaMessage = OriginalCodaMessage - - ## Thread entry method - def _ProgressThreadEntry(self): - sys.stdout.write(self.PromptMessage + " ") - sys.stdout.flush() - TimeUp = 0.0 - while not Progressor._StopFlag.isSet(): - if TimeUp <= 0.0: - sys.stdout.write(self.ProgressChar) - sys.stdout.flush() - TimeUp = self.Interval - time.sleep(self._CheckInterval) - TimeUp -= self._CheckInterval - sys.stdout.write(" " + self.CodaMessage + "\n") - sys.stdout.flush() - - ## Abort the progress display - @staticmethod - def Abort(): - if Progressor._StopFlag != None: - Progressor._StopFlag.set() - if Progressor._ProgressThread != None: - Progressor._ProgressThread.join() - Progressor._ProgressThread = None - -## A dict which can access its keys and/or values orderly -# -# The class implements a new kind of dict which its keys or values can be -# accessed in the order they are added into the dict. It guarantees the order -# by making use of an internal list to keep a copy of keys. -# -class sdict(IterableUserDict): - ## Constructor - def __init__(self): - IterableUserDict.__init__(self) - self._key_list = [] - - ## [] operator - def __setitem__(self, key, value): - if key not in self._key_list: - self._key_list.append(key) - IterableUserDict.__setitem__(self, key, value) - - ## del operator - def __delitem__(self, key): - self._key_list.remove(key) - IterableUserDict.__delitem__(self, key) - - ## used in "for k in dict" loop to ensure the correct order - def __iter__(self): - return self.iterkeys() - - ## len() support - def __len__(self): - return len(self._key_list) - - ## "in" test support - def __contains__(self, key): - return key in self._key_list - - ## indexof support - def index(self, key): - return self._key_list.index(key) - - ## insert support - def insert(self, key, newkey, newvalue, order): - index = self._key_list.index(key) - if order == 'BEFORE': - self._key_list.insert(index, newkey) - IterableUserDict.__setitem__(self, newkey, newvalue) - elif order == 'AFTER': - self._key_list.insert(index + 1, newkey) - IterableUserDict.__setitem__(self, newkey, newvalue) - - ## append support - def append(self, sdict): - for key in sdict: - if key not in self._key_list: - self._key_list.append(key) - IterableUserDict.__setitem__(self, key, sdict[key]) - - def has_key(self, key): - return key in self._key_list - - ## Empty the dict - def clear(self): - self._key_list = [] - IterableUserDict.clear(self) - - ## Return a copy of keys - def keys(self): - keys = [] - for key in self._key_list: - keys.append(key) - return keys - - ## Return a copy of values - def values(self): - values = [] - for key in self._key_list: - values.append(self[key]) - return values - - ## Return a copy of (key, value) list - def items(self): - items = [] - for key in self._key_list: - items.append((key, self[key])) - return items - - ## Iteration support - def iteritems(self): - return iter(self.items()) - - ## Keys interation support - def iterkeys(self): - return iter(self.keys()) - - ## Values interation support - def itervalues(self): - return iter(self.values()) - - ## Return value related to a key, and remove the (key, value) from the dict - def pop(self, key, *dv): - value = None - if key in self._key_list: - value = self[key] - self.__delitem__(key) - elif len(dv) != 0 : - value = kv[0] - return value - - ## Return (key, value) pair, and remove the (key, value) from the dict - def popitem(self): - key = self._key_list[-1] - value = self[key] - self.__delitem__(key) - return key, value - - def update(self, dict=None, **kwargs): - if dict != None: - for k, v in dict.items(): - self[k] = v - if len(kwargs): - for k, v in kwargs.items(): - self[k] = v - -## Dictionary with restricted keys -# -class rdict(dict): - ## Constructor - def __init__(self, KeyList): - for Key in KeyList: - dict.__setitem__(self, Key, "") - - ## []= operator - def __setitem__(self, key, value): - if key not in self: - EdkLogger.error("RestrictedDict", ATTRIBUTE_SET_FAILURE, "Key [%s] is not allowed" % key, - ExtraData=", ".join(dict.keys(self))) - dict.__setitem__(self, key, value) - - ## =[] operator - def __getitem__(self, key): - if key not in self: - return "" - return dict.__getitem__(self, key) - - ## del operator - def __delitem__(self, key): - EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="del") - - ## Empty the dict - def clear(self): - for Key in self: - self.__setitem__(Key, "") - - ## Return value related to a key, and remove the (key, value) from the dict - def pop(self, key, *dv): - EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="pop") - - ## Return (key, value) pair, and remove the (key, value) from the dict - def popitem(self): - EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="popitem") - -## Dictionary using prioritized list as key -# -class tdict: - _ListType = type([]) - _TupleType = type(()) - _Wildcard = 'COMMON' - _ValidWildcardList = ['COMMON', 'DEFAULT', 'ALL', '*', 'PLATFORM'] - - def __init__(self, _Single_=False, _Level_=2): - self._Level_ = _Level_ - self.data = {} - self._Single_ = _Single_ - - # =[] operator - def __getitem__(self, key): - KeyType = type(key) - RestKeys = None - if KeyType == self._ListType or KeyType == self._TupleType: - FirstKey = key[0] - if len(key) > 1: - RestKeys = key[1:] - elif self._Level_ > 1: - RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] - else: - FirstKey = key - if self._Level_ > 1: - RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] - - if FirstKey == None or str(FirstKey).upper() in self._ValidWildcardList: - FirstKey = self._Wildcard - - if self._Single_: - return self._GetSingleValue(FirstKey, RestKeys) - else: - return self._GetAllValues(FirstKey, RestKeys) - - def _GetSingleValue(self, FirstKey, RestKeys): - Value = None - #print "%s-%s" % (FirstKey, self._Level_) , - if self._Level_ > 1: - if FirstKey == self._Wildcard: - if FirstKey in self.data: - Value = self.data[FirstKey][RestKeys] - if Value == None: - for Key in self.data: - Value = self.data[Key][RestKeys] - if Value != None: break - else: - if FirstKey in self.data: - Value = self.data[FirstKey][RestKeys] - if Value == None and self._Wildcard in self.data: - #print "Value=None" - Value = self.data[self._Wildcard][RestKeys] - else: - if FirstKey == self._Wildcard: - if FirstKey in self.data: - Value = self.data[FirstKey] - if Value == None: - for Key in self.data: - Value = self.data[Key] - if Value != None: break - else: - if FirstKey in self.data: - Value = self.data[FirstKey] - elif self._Wildcard in self.data: - Value = self.data[self._Wildcard] - return Value - - def _GetAllValues(self, FirstKey, RestKeys): - Value = [] - if self._Level_ > 1: - if FirstKey == self._Wildcard: - for Key in self.data: - Value += self.data[Key][RestKeys] - else: - if FirstKey in self.data: - Value += self.data[FirstKey][RestKeys] - if self._Wildcard in self.data: - Value += self.data[self._Wildcard][RestKeys] - else: - if FirstKey == self._Wildcard: - for Key in self.data: - Value.append(self.data[Key]) - else: - if FirstKey in self.data: - Value.append(self.data[FirstKey]) - if self._Wildcard in self.data: - Value.append(self.data[self._Wildcard]) - return Value - - ## []= operator - def __setitem__(self, key, value): - KeyType = type(key) - RestKeys = None - if KeyType == self._ListType or KeyType == self._TupleType: - FirstKey = key[0] - if len(key) > 1: - RestKeys = key[1:] - else: - RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] - else: - FirstKey = key - if self._Level_ > 1: - RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] - - if FirstKey in self._ValidWildcardList: - FirstKey = self._Wildcard - - if FirstKey not in self.data and self._Level_ > 0: - self.data[FirstKey] = tdict(self._Single_, self._Level_ - 1) - - if self._Level_ > 1: - self.data[FirstKey][RestKeys] = value - else: - self.data[FirstKey] = value - - def SetGreedyMode(self): - self._Single_ = False - if self._Level_ > 1: - for Key in self.data: - self.data[Key].SetGreedyMode() - - def SetSingleMode(self): - self._Single_ = True - if self._Level_ > 1: - for Key in self.data: - self.data[Key].SetSingleMode() - - def GetKeys(self, KeyIndex=0): - assert KeyIndex >= 0 - if KeyIndex == 0: - return set(self.data.keys()) - else: - keys = set() - for Key in self.data: - keys |= self.data[Key].GetKeys(KeyIndex - 1) - return keys - -## Boolean chain list -# -class Blist(UserList): - def __init__(self, initlist=None): - UserList.__init__(self, initlist) - def __setitem__(self, i, item): - if item not in [True, False]: - if item == 0: - item = False - else: - item = True - self.data[i] = item - def _GetResult(self): - Value = True - for item in self.data: - Value &= item - return Value - Result = property(_GetResult) - -def ParseConsoleLog(Filename): - Opr = open(os.path.normpath(Filename), 'r') - Opw = open(os.path.normpath(Filename + '.New'), 'w+') - for Line in Opr.readlines(): - if Line.find('.efi') > -1: - Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip() - Opw.write('%s\n' % Line) - - Opr.close() - Opw.close() - -## AnalyzeDscPcd -# -# Analyze DSC PCD value, since there is no data type info in DSC -# This fuction is used to match functions (AnalyzePcdData, AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from database -# 1. Feature flag: TokenSpace.PcdCName|PcdValue -# 2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize] -# 3. Dynamic default: -# TokenSpace.PcdCName|PcdValue[|VOID*[|MaxSize]] -# TokenSpace.PcdCName|PcdValue -# 4. Dynamic VPD: -# TokenSpace.PcdCName|VpdOffset[|VpdValue] -# TokenSpace.PcdCName|VpdOffset[|MaxSize[|VpdValue]] -# 5. Dynamic HII: -# TokenSpace.PcdCName|HiiString|VaiableGuid|VariableOffset[|HiiValue] -# PCD value needs to be located in such kind of string, and the PCD value might be an expression in which -# there might have "|" operator, also in string value. -# -# @param Setting: String contain information described above with "TokenSpace.PcdCName|" stripped -# @param PcdType: PCD type: feature, fixed, dynamic default VPD HII -# @param DataType: The datum type of PCD: VOID*, UNIT, BOOL -# @retval: -# ValueList: A List contain fields described above -# IsValid: True if conforming EBNF, otherwise False -# Index: The index where PcdValue is in ValueList -# -def AnalyzeDscPcd(Setting, PcdType, DataType=''): - Setting = Setting.strip() - # There might be escaped quote in a string: \", \\\" - Data = Setting.replace('\\\\', '//').replace('\\\"', '\\\'') - # There might be '|' in string and in ( ... | ... ), replace it with '-' - NewStr = '' - InStr = False - Pair = 0 - for ch in Data: - if ch == '"': - InStr = not InStr - elif ch == '(' and not InStr: - Pair += 1 - elif ch == ')' and not InStr: - Pair -= 1 - - if (Pair > 0 or InStr) and ch == TAB_VALUE_SPLIT: - NewStr += '-' - else: - NewStr += ch - FieldList = [] - StartPos = 0 - while True: - Pos = NewStr.find(TAB_VALUE_SPLIT, StartPos) - if Pos < 0: - FieldList.append(Setting[StartPos:].strip()) - break - FieldList.append(Setting[StartPos:Pos].strip()) - StartPos = Pos + 1 - - IsValid = True - if PcdType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_FEATURE_FLAG): - Value = FieldList[0] - Size = '' - if len(FieldList) > 1: - Type = FieldList[1] - # Fix the PCD type when no DataType input - if Type == 'VOID*': - DataType = 'VOID*' - else: - Size = FieldList[1] - if len(FieldList) > 2: - Size = FieldList[2] - if DataType == 'VOID*': - IsValid = (len(FieldList) <= 3) - else: - IsValid = (len(FieldList) <= 1) - return [Value, '', Size], IsValid, 0 - elif PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT): - Value = FieldList[0] - Size = Type = '' - if len(FieldList) > 1: - Type = FieldList[1] - else: - Type = DataType - if len(FieldList) > 2: - Size = FieldList[2] - else: - if Type == 'VOID*': - if Value.startswith("L"): - Size = str((len(Value)- 3 + 1) * 2) - elif Value.startswith("{"): - Size = str(len(Value.split(","))) - else: - Size = str(len(Value) -2 + 1 ) - if DataType == 'VOID*': - IsValid = (len(FieldList) <= 3) - else: - IsValid = (len(FieldList) <= 1) - return [Value, Type, Size], IsValid, 0 - elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD): - VpdOffset = FieldList[0] - Value = Size = '' - if not DataType == 'VOID*': - if len(FieldList) > 1: - Value = FieldList[1] - else: - if len(FieldList) > 1: - Size = FieldList[1] - if len(FieldList) > 2: - Value = FieldList[2] - if DataType == 'VOID*': - IsValid = (len(FieldList) <= 3) - else: - IsValid = (len(FieldList) <= 2) - return [VpdOffset, Size, Value], IsValid, 2 - elif PcdType in (MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_EX_HII): - HiiString = FieldList[0] - Guid = Offset = Value = '' - if len(FieldList) > 1: - Guid = FieldList[1] - if len(FieldList) > 2: - Offset = FieldList[2] - if len(FieldList) > 3: - Value = FieldList[3] - IsValid = (3 <= len(FieldList) <= 4) - return [HiiString, Guid, Offset, Value], IsValid, 3 - return [], False, 0 - -## AnalyzePcdData -# -# Analyze the pcd Value, Datum type and TokenNumber. -# Used to avoid split issue while the value string contain "|" character -# -# @param[in] Setting: A String contain value/datum type/token number information; -# -# @retval ValueList: A List contain value, datum type and toke number. -# -def AnalyzePcdData(Setting): - ValueList = ['', '', ''] - - ValueRe = re.compile(r'^\s*L?\".*\|.*\"') - PtrValue = ValueRe.findall(Setting) - - ValueUpdateFlag = False - - if len(PtrValue) >= 1: - Setting = re.sub(ValueRe, '', Setting) - ValueUpdateFlag = True - - TokenList = Setting.split(TAB_VALUE_SPLIT) - ValueList[0:len(TokenList)] = TokenList - - if ValueUpdateFlag: - ValueList[0] = PtrValue[0] - - return ValueList - -## AnalyzeHiiPcdData -# -# Analyze the pcd Value, variable name, variable Guid and variable offset. -# Used to avoid split issue while the value string contain "|" character -# -# @param[in] Setting: A String contain VariableName, VariableGuid, VariableOffset, DefaultValue information; -# -# @retval ValueList: A List contaian VariableName, VariableGuid, VariableOffset, DefaultValue. -# -def AnalyzeHiiPcdData(Setting): - ValueList = ['', '', '', ''] - - TokenList = GetSplitValueList(Setting) - ValueList[0:len(TokenList)] = TokenList - - return ValueList - -## AnalyzeVpdPcdData -# -# Analyze the vpd pcd VpdOffset, MaxDatumSize and InitialValue. -# Used to avoid split issue while the value string contain "|" character -# -# @param[in] Setting: A String contain VpdOffset/MaxDatumSize/InitialValue information; -# -# @retval ValueList: A List contain VpdOffset, MaxDatumSize and InitialValue. -# -def AnalyzeVpdPcdData(Setting): - ValueList = ['', '', ''] - - ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$') - PtrValue = ValueRe.findall(Setting) - - ValueUpdateFlag = False - - if len(PtrValue) >= 1: - Setting = re.sub(ValueRe, '', Setting) - ValueUpdateFlag = True - - TokenList = Setting.split(TAB_VALUE_SPLIT) - ValueList[0:len(TokenList)] = TokenList - - if ValueUpdateFlag: - ValueList[2] = PtrValue[0] - - return ValueList - -## check format of PCD value against its the datum type -# -# For PCD value setting -# -def CheckPcdDatum(Type, Value): - if Type == "VOID*": - ValueRe = re.compile(r'\s*L?\".*\"\s*$') - if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"')) - or (Value.startswith('{') and Value.endswith('}')) - ): - return False, "Invalid value [%s] of type [%s]; must be in the form of {...} for array"\ - ", or \"...\" for string, or L\"...\" for unicode string" % (Value, Type) - elif ValueRe.match(Value): - # Check the chars in UnicodeString or CString is printable - if Value.startswith("L"): - Value = Value[2:-1] - else: - Value = Value[1:-1] - Printset = set(string.printable) - Printset.remove(TAB_PRINTCHAR_VT) - Printset.add(TAB_PRINTCHAR_BS) - Printset.add(TAB_PRINTCHAR_NUL) - if not set(Value).issubset(Printset): - PrintList = list(Printset) - PrintList.sort() - return False, "Invalid PCD string value of type [%s]; must be printable chars %s." % (Type, PrintList) - elif Type == 'BOOLEAN': - if Value not in ['TRUE', 'True', 'true', '0x1', '0x01', '1', 'FALSE', 'False', 'false', '0x0', '0x00', '0']: - return False, "Invalid value [%s] of type [%s]; must be one of TRUE, True, true, 0x1, 0x01, 1"\ - ", FALSE, False, false, 0x0, 0x00, 0" % (Value, Type) - elif Type in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64]: - try: - Value = long(Value, 0) - except: - return False, "Invalid value [%s] of type [%s];"\ - " must be a hexadecimal, decimal or octal in C language format." % (Value, Type) - else: - return False, "Invalid type [%s]; must be one of VOID*, BOOLEAN, UINT8, UINT16, UINT32, UINT64." % (Type) - - return True, "" - -## Split command line option string to list -# -# subprocess.Popen needs the args to be a sequence. Otherwise there's problem -# in non-windows platform to launch command -# -def SplitOption(OptionString): - OptionList = [] - LastChar = " " - OptionStart = 0 - QuotationMark = "" - for Index in range(0, len(OptionString)): - CurrentChar = OptionString[Index] - if CurrentChar in ['"', "'"]: - if QuotationMark == CurrentChar: - QuotationMark = "" - elif QuotationMark == "": - QuotationMark = CurrentChar - continue - elif QuotationMark: - continue - - if CurrentChar in ["/", "-"] and LastChar in [" ", "\t", "\r", "\n"]: - if Index > OptionStart: - OptionList.append(OptionString[OptionStart:Index-1]) - OptionStart = Index - LastChar = CurrentChar - OptionList.append(OptionString[OptionStart:]) - return OptionList - -def CommonPath(PathList): - P1 = min(PathList).split(os.path.sep) - P2 = max(PathList).split(os.path.sep) - for Index in xrange(min(len(P1), len(P2))): - if P1[Index] != P2[Index]: - return os.path.sep.join(P1[:Index]) - return os.path.sep.join(P1) - -class PathClass(object): - def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False, - Arch='COMMON', ToolChainFamily='', Target='', TagName='', ToolCode=''): - self.Arch = Arch - self.File = str(File) - if os.path.isabs(self.File): - self.Root = '' - self.AlterRoot = '' - else: - self.Root = str(Root) - self.AlterRoot = str(AlterRoot) - - # Remove any '.' and '..' in path - if self.Root: - self.Path = os.path.normpath(os.path.join(self.Root, self.File)) - self.Root = os.path.normpath(CommonPath([self.Root, self.Path])) - # eliminate the side-effect of 'C:' - if self.Root[-1] == ':': - self.Root += os.path.sep - # file path should not start with path separator - if self.Root[-1] == os.path.sep: - self.File = self.Path[len(self.Root):] - else: - self.File = self.Path[len(self.Root)+1:] - else: - self.Path = os.path.normpath(self.File) - - self.SubDir, self.Name = os.path.split(self.File) - self.BaseName, self.Ext = os.path.splitext(self.Name) - - if self.Root: - if self.SubDir: - self.Dir = os.path.join(self.Root, self.SubDir) - else: - self.Dir = self.Root - else: - self.Dir = self.SubDir - - if IsBinary: - self.Type = Type - else: - self.Type = self.Ext.lower() - - self.IsBinary = IsBinary - self.Target = Target - self.TagName = TagName - self.ToolCode = ToolCode - self.ToolChainFamily = ToolChainFamily - - self._Key = None - - ## Convert the object of this class to a string - # - # Convert member Path of the class to a string - # - # @retval string Formatted String - # - def __str__(self): - return self.Path - - ## Override __eq__ function - # - # Check whether PathClass are the same - # - # @retval False The two PathClass are different - # @retval True The two PathClass are the same - # - def __eq__(self, Other): - if type(Other) == type(self): - return self.Path == Other.Path - else: - return self.Path == str(Other) - - ## Override __cmp__ function - # - # Customize the comparsion operation of two PathClass - # - # @retval 0 The two PathClass are different - # @retval -1 The first PathClass is less than the second PathClass - # @retval 1 The first PathClass is Bigger than the second PathClass - def __cmp__(self, Other): - if type(Other) == type(self): - OtherKey = Other.Path - else: - OtherKey = str(Other) - - SelfKey = self.Path - if SelfKey == OtherKey: - return 0 - elif SelfKey > OtherKey: - return 1 - else: - return -1 - - ## Override __hash__ function - # - # Use Path as key in hash table - # - # @retval string Key for hash table - # - def __hash__(self): - return hash(self.Path) - - def _GetFileKey(self): - if self._Key == None: - self._Key = self.Path.upper() # + self.ToolChainFamily + self.TagName + self.ToolCode + self.Target - return self._Key - - def _GetTimeStamp(self): - return os.stat(self.Path)[8] - - def Validate(self, Type='', CaseSensitive=True): - if GlobalData.gCaseInsensitive: - CaseSensitive = False - if Type and Type.lower() != self.Type: - return FILE_TYPE_MISMATCH, '%s (expect %s but got %s)' % (self.File, Type, self.Type) - - RealFile, RealRoot = RealPath2(self.File, self.Root, self.AlterRoot) - if not RealRoot and not RealFile: - RealFile = self.File - if self.AlterRoot: - RealFile = os.path.join(self.AlterRoot, self.File) - elif self.Root: - RealFile = os.path.join(self.Root, self.File) - return FILE_NOT_FOUND, os.path.join(self.AlterRoot, RealFile) - - ErrorCode = 0 - ErrorInfo = '' - if RealRoot != self.Root or RealFile != self.File: - if CaseSensitive and (RealFile != self.File or (RealRoot != self.Root and RealRoot != self.AlterRoot)): - ErrorCode = FILE_CASE_MISMATCH - ErrorInfo = self.File + '\n\t' + RealFile + " [in file system]" - - self.SubDir, self.Name = os.path.split(RealFile) - self.BaseName, self.Ext = os.path.splitext(self.Name) - if self.SubDir: - self.Dir = os.path.join(RealRoot, self.SubDir) - else: - self.Dir = RealRoot - self.File = RealFile - self.Root = RealRoot - self.Path = os.path.join(RealRoot, RealFile) - return ErrorCode, ErrorInfo - - Key = property(_GetFileKey) - TimeStamp = property(_GetTimeStamp) - -## Parse PE image to get the required PE informaion. -# -class PeImageClass(): - ## Constructor - # - # @param File FilePath of PeImage - # - def __init__(self, PeFile): - self.FileName = PeFile - self.IsValid = False - self.Size = 0 - self.EntryPoint = 0 - self.SectionAlignment = 0 - self.SectionHeaderList = [] - self.ErrorInfo = '' - try: - PeObject = open(PeFile, 'rb') - except: - self.ErrorInfo = self.FileName + ' can not be found\n' - return - # Read DOS header - ByteArray = array.array('B') - ByteArray.fromfile(PeObject, 0x3E) - ByteList = ByteArray.tolist() - # DOS signature should be 'MZ' - if self._ByteListToStr (ByteList[0x0:0x2]) != 'MZ': - self.ErrorInfo = self.FileName + ' has no valid DOS signature MZ' - return - - # Read 4 byte PE Signature - PeOffset = self._ByteListToInt(ByteList[0x3C:0x3E]) - PeObject.seek(PeOffset) - ByteArray = array.array('B') - ByteArray.fromfile(PeObject, 4) - # PE signature should be 'PE\0\0' - if ByteArray.tostring() != 'PE\0\0': - self.ErrorInfo = self.FileName + ' has no valid PE signature PE00' - return - - # Read PE file header - ByteArray = array.array('B') - ByteArray.fromfile(PeObject, 0x14) - ByteList = ByteArray.tolist() - SecNumber = self._ByteListToInt(ByteList[0x2:0x4]) - if SecNumber == 0: - self.ErrorInfo = self.FileName + ' has no section header' - return - - # Read PE optional header - OptionalHeaderSize = self._ByteListToInt(ByteArray[0x10:0x12]) - ByteArray = array.array('B') - ByteArray.fromfile(PeObject, OptionalHeaderSize) - ByteList = ByteArray.tolist() - self.EntryPoint = self._ByteListToInt(ByteList[0x10:0x14]) - self.SectionAlignment = self._ByteListToInt(ByteList[0x20:0x24]) - self.Size = self._ByteListToInt(ByteList[0x38:0x3C]) - - # Read each Section Header - for Index in range(SecNumber): - ByteArray = array.array('B') - ByteArray.fromfile(PeObject, 0x28) - ByteList = ByteArray.tolist() - SecName = self._ByteListToStr(ByteList[0:8]) - SecVirtualSize = self._ByteListToInt(ByteList[8:12]) - SecRawAddress = self._ByteListToInt(ByteList[20:24]) - SecVirtualAddress = self._ByteListToInt(ByteList[12:16]) - self.SectionHeaderList.append((SecName, SecVirtualAddress, SecRawAddress, SecVirtualSize)) - self.IsValid = True - PeObject.close() - - def _ByteListToStr(self, ByteList): - String = '' - for index in range(len(ByteList)): - if ByteList[index] == 0: - break - String += chr(ByteList[index]) - return String - - def _ByteListToInt(self, ByteList): - Value = 0 - for index in range(len(ByteList) - 1, -1, -1): - Value = (Value << 8) | int(ByteList[index]) - return Value - - -class SkuClass(): - - DEFAULT = 0 - SINGLE = 1 - MULTIPLE =2 - - def __init__(self,SkuIdentifier='', SkuIds={}): - - self.AvailableSkuIds = sdict() - self.SkuIdSet = [] - - if SkuIdentifier == '' or SkuIdentifier is None: - self.SkuIdSet = ['DEFAULT'] - elif SkuIdentifier == 'ALL': - self.SkuIdSet = SkuIds.keys() - else: - r = SkuIdentifier.split('|') - self.SkuIdSet=[r[k].strip() for k in range(len(r))] - if len(self.SkuIdSet) == 2 and 'DEFAULT' in self.SkuIdSet and SkuIdentifier != 'ALL': - self.SkuIdSet.remove('DEFAULT') - - for each in self.SkuIdSet: - if each in SkuIds: - self.AvailableSkuIds[each] = SkuIds[each] - else: - EdkLogger.error("build", PARAMETER_INVALID, - ExtraData="SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]" - % (each, " ".join(SkuIds.keys()))) - - def __SkuUsageType(self): - - if len(self.SkuIdSet) == 1: - if self.SkuIdSet[0] == 'DEFAULT': - return SkuClass.DEFAULT - else: - return SkuClass.SINGLE - else: - return SkuClass.MULTIPLE - - def __GetAvailableSkuIds(self): - return self.AvailableSkuIds - - def __GetSystemSkuID(self): - if self.__SkuUsageType() == SkuClass.SINGLE: - return self.SkuIdSet[0] - else: - return 'DEFAULT' - - SystemSkuId = property(__GetSystemSkuID) - AvailableSkuIdSet = property(__GetAvailableSkuIds) - SkuUsageType = property(__SkuUsageType) - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - pass - +## @file +# Common routines used by all tools +# +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import string +import thread +import threading +import time +import re +import cPickle +import array +from UserDict import IterableUserDict +from UserList import UserList + +from Common import EdkLogger as EdkLogger +from Common import GlobalData as GlobalData +from DataType import * +from BuildToolError import * +from CommonDataClass.DataClass import * +from Parsing import GetSplitValueList + +## Regular expression used to find out place holders in string template +gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE|re.UNICODE) + +## Dictionary used to store file time stamp for quick re-access +gFileTimeStampCache = {} # {file path : file time stamp} + +## Dictionary used to store dependencies of files +gDependencyDatabase = {} # arch : {file path : [dependent files list]} + +## callback routine for processing variable option +# +# This function can be used to process variable number of option values. The +# typical usage of it is specify architecure list on command line. +# (e.g. -a IA32 X64 IPF) +# +# @param Option Standard callback function parameter +# @param OptionString Standard callback function parameter +# @param Value Standard callback function parameter +# @param Parser Standard callback function parameter +# +# @retval +# +def ProcessVariableArgument(Option, OptionString, Value, Parser): + assert Value is None + Value = [] + RawArgs = Parser.rargs + while RawArgs: + Arg = RawArgs[0] + if (Arg[:2] == "--" and len(Arg) > 2) or \ + (Arg[:1] == "-" and len(Arg) > 1 and Arg[1] != "-"): + break + Value.append(Arg) + del RawArgs[0] + setattr(Parser.values, Option.dest, Value) + +## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style +# +# @param Guid The GUID string +# +# @retval string The GUID string in C structure style +# +def GuidStringToGuidStructureString(Guid): + GuidList = Guid.split('-') + Result = '{' + for Index in range(0,3,1): + Result = Result + '0x' + GuidList[Index] + ', ' + Result = Result + '{0x' + GuidList[3][0:2] + ', 0x' + GuidList[3][2:4] + for Index in range(0,12,2): + Result = Result + ', 0x' + GuidList[4][Index:Index+2] + Result += '}}' + return Result + +## Convert GUID structure in byte array to xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +# +# @param GuidValue The GUID value in byte array +# +# @retval string The GUID value in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format +# +def GuidStructureByteArrayToGuidString(GuidValue): + guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "").replace(";", "") + guidValueList = guidValueString.split(",") + if len(guidValueList) != 16: + return '' + #EdkLogger.error(None, None, "Invalid GUID value string %s" % GuidValue) + try: + return "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( + int(guidValueList[3], 16), + int(guidValueList[2], 16), + int(guidValueList[1], 16), + int(guidValueList[0], 16), + int(guidValueList[5], 16), + int(guidValueList[4], 16), + int(guidValueList[7], 16), + int(guidValueList[6], 16), + int(guidValueList[8], 16), + int(guidValueList[9], 16), + int(guidValueList[10], 16), + int(guidValueList[11], 16), + int(guidValueList[12], 16), + int(guidValueList[13], 16), + int(guidValueList[14], 16), + int(guidValueList[15], 16) + ) + except: + return '' + +## Convert GUID string in C structure style to xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +# +# @param GuidValue The GUID value in C structure format +# +# @retval string The GUID value in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format +# +def GuidStructureStringToGuidString(GuidValue): + guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "").replace(";", "") + guidValueList = guidValueString.split(",") + if len(guidValueList) != 11: + return '' + #EdkLogger.error(None, None, "Invalid GUID value string %s" % GuidValue) + try: + return "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( + int(guidValueList[0], 16), + int(guidValueList[1], 16), + int(guidValueList[2], 16), + int(guidValueList[3], 16), + int(guidValueList[4], 16), + int(guidValueList[5], 16), + int(guidValueList[6], 16), + int(guidValueList[7], 16), + int(guidValueList[8], 16), + int(guidValueList[9], 16), + int(guidValueList[10], 16) + ) + except: + return '' + +## Convert GUID string in C structure style to xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx +# +# @param GuidValue The GUID value in C structure format +# +# @retval string The GUID value in xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx format +# +def GuidStructureStringToGuidValueName(GuidValue): + guidValueString = GuidValue.lower().replace("{", "").replace("}", "").replace(" ", "") + guidValueList = guidValueString.split(",") + if len(guidValueList) != 11: + EdkLogger.error(None, FORMAT_INVALID, "Invalid GUID value string [%s]" % GuidValue) + return "%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x" % ( + int(guidValueList[0], 16), + int(guidValueList[1], 16), + int(guidValueList[2], 16), + int(guidValueList[3], 16), + int(guidValueList[4], 16), + int(guidValueList[5], 16), + int(guidValueList[6], 16), + int(guidValueList[7], 16), + int(guidValueList[8], 16), + int(guidValueList[9], 16), + int(guidValueList[10], 16) + ) + +## Create directories +# +# @param Directory The directory name +# +def CreateDirectory(Directory): + if Directory == None or Directory.strip() == "": + return True + try: + if not os.access(Directory, os.F_OK): + os.makedirs(Directory) + except: + return False + return True + +## Remove directories, including files and sub-directories in it +# +# @param Directory The directory name +# +def RemoveDirectory(Directory, Recursively=False): + if Directory == None or Directory.strip() == "" or not os.path.exists(Directory): + return + if Recursively: + CurrentDirectory = os.getcwd() + os.chdir(Directory) + for File in os.listdir("."): + if os.path.isdir(File): + RemoveDirectory(File, Recursively) + else: + os.remove(File) + os.chdir(CurrentDirectory) + os.rmdir(Directory) + +## Check if given file is changed or not +# +# This method is used to check if a file is changed or not between two build +# actions. It makes use a cache to store files timestamp. +# +# @param File The path of file +# +# @retval True If the given file is changed, doesn't exist, or can't be +# found in timestamp cache +# @retval False If the given file is changed +# +def IsChanged(File): + if not os.path.exists(File): + return True + + FileState = os.stat(File) + TimeStamp = FileState[-2] + + if File in gFileTimeStampCache and TimeStamp == gFileTimeStampCache[File]: + FileChanged = False + else: + FileChanged = True + gFileTimeStampCache[File] = TimeStamp + + return FileChanged + +## Store content in file +# +# This method is used to save file only when its content is changed. This is +# quite useful for "make" system to decide what will be re-built and what won't. +# +# @param File The path of file +# @param Content The new content of the file +# @param IsBinaryFile The flag indicating if the file is binary file or not +# +# @retval True If the file content is changed and the file is renewed +# @retval False If the file content is the same +# +def SaveFileOnChange(File, Content, IsBinaryFile=True): + if not IsBinaryFile: + Content = Content.replace("\n", os.linesep) + + if os.path.exists(File): + try: + if Content == open(File, "rb").read(): + return False + except: + EdkLogger.error(None, FILE_OPEN_FAILURE, ExtraData=File) + + DirName = os.path.dirname(File) + if not CreateDirectory(DirName): + EdkLogger.error(None, FILE_CREATE_FAILURE, "Could not create directory %s" % DirName) + else: + if DirName == '': + DirName = os.getcwd() + if not os.access(DirName, os.W_OK): + EdkLogger.error(None, PERMISSION_FAILURE, "Do not have write permission on directory %s" % DirName) + + try: + if GlobalData.gIsWindows: + try: + from PyUtility import SaveFileToDisk + if not SaveFileToDisk(File, Content): + EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData=File) + except: + Fd = open(File, "wb") + Fd.write(Content) + Fd.close() + else: + Fd = open(File, "wb") + Fd.write(Content) + Fd.close() + except IOError, X: + EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s'%X) + + return True + +## Make a Python object persistent on file system +# +# @param Data The object to be stored in file +# @param File The path of file to store the object +# +def DataDump(Data, File): + Fd = None + try: + Fd = open(File, 'wb') + cPickle.dump(Data, Fd, cPickle.HIGHEST_PROTOCOL) + except: + EdkLogger.error("", FILE_OPEN_FAILURE, ExtraData=File, RaiseError=False) + finally: + if Fd != None: + Fd.close() + +## Restore a Python object from a file +# +# @param File The path of file stored the object +# +# @retval object A python object +# @retval None If failure in file operation +# +def DataRestore(File): + Data = None + Fd = None + try: + Fd = open(File, 'rb') + Data = cPickle.load(Fd) + except Exception, e: + EdkLogger.verbose("Failed to load [%s]\n\t%s" % (File, str(e))) + Data = None + finally: + if Fd != None: + Fd.close() + return Data + +## Retrieve and cache the real path name in file system +# +# @param Root The root directory of path relative to +# +# @retval str The path string if the path exists +# @retval None If path doesn't exist +# +class DirCache: + _CACHE_ = set() + _UPPER_CACHE_ = {} + + def __init__(self, Root): + self._Root = Root + for F in os.listdir(Root): + self._CACHE_.add(F) + self._UPPER_CACHE_[F.upper()] = F + + # =[] operator + def __getitem__(self, Path): + Path = Path[len(os.path.commonprefix([Path, self._Root])):] + if not Path: + return self._Root + if Path and Path[0] == os.path.sep: + Path = Path[1:] + if Path in self._CACHE_: + return os.path.join(self._Root, Path) + UpperPath = Path.upper() + if UpperPath in self._UPPER_CACHE_: + return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath]) + + IndexList = [] + LastSepIndex = -1 + SepIndex = Path.find(os.path.sep) + while SepIndex > -1: + Parent = UpperPath[:SepIndex] + if Parent not in self._UPPER_CACHE_: + break + LastSepIndex = SepIndex + SepIndex = Path.find(os.path.sep, LastSepIndex + 1) + + if LastSepIndex == -1: + return None + + Cwd = os.getcwd() + os.chdir(self._Root) + SepIndex = LastSepIndex + while SepIndex > -1: + Parent = Path[:SepIndex] + ParentKey = UpperPath[:SepIndex] + if ParentKey not in self._UPPER_CACHE_: + os.chdir(Cwd) + return None + + if Parent in self._CACHE_: + ParentDir = Parent + else: + ParentDir = self._UPPER_CACHE_[ParentKey] + for F in os.listdir(ParentDir): + Dir = os.path.join(ParentDir, F) + self._CACHE_.add(Dir) + self._UPPER_CACHE_[Dir.upper()] = Dir + + SepIndex = Path.find(os.path.sep, SepIndex + 1) + + os.chdir(Cwd) + if Path in self._CACHE_: + return os.path.join(self._Root, Path) + elif UpperPath in self._UPPER_CACHE_: + return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath]) + return None + +## Get all files of a directory +# +# @param Root: Root dir +# @param SkipList : The files need be skipped +# +# @retval A list of all files +# +def GetFiles(Root, SkipList=None, FullPath = True): + OriPath = Root + FileList = [] + for Root, Dirs, Files in os.walk(Root): + if SkipList: + for Item in SkipList: + if Item in Dirs: + Dirs.remove(Item) + + for File in Files: + File = os.path.normpath(os.path.join(Root, File)) + if not FullPath: + File = File[len(OriPath) + 1:] + FileList.append(File) + + return FileList + +## Check if gvien file exists or not +# +# @param File File name or path to be checked +# @param Dir The directory the file is relative to +# +# @retval True if file exists +# @retval False if file doesn't exists +# +def ValidFile(File, Ext=None): + if Ext != None: + Dummy, FileExt = os.path.splitext(File) + if FileExt.lower() != Ext.lower(): + return False + if not os.path.exists(File): + return False + return True + +def RealPath(File, Dir='', OverrideDir=''): + NewFile = os.path.normpath(os.path.join(Dir, File)) + NewFile = GlobalData.gAllFiles[NewFile] + if not NewFile and OverrideDir: + NewFile = os.path.normpath(os.path.join(OverrideDir, File)) + NewFile = GlobalData.gAllFiles[NewFile] + return NewFile + +def RealPath2(File, Dir='', OverrideDir=''): + if OverrideDir: + NewFile = GlobalData.gAllFiles[os.path.normpath(os.path.join(OverrideDir, File))] + if NewFile: + if OverrideDir[-1] == os.path.sep: + return NewFile[len(OverrideDir):], NewFile[0:len(OverrideDir)] + else: + return NewFile[len(OverrideDir)+1:], NewFile[0:len(OverrideDir)] + if GlobalData.gAllFiles: + NewFile = GlobalData.gAllFiles[os.path.normpath(os.path.join(Dir, File))] + else: + NewFile = os.path.normpath(os.path.join(Dir, File)) + if NewFile: + if Dir: + if Dir[-1] == os.path.sep: + return NewFile[len(Dir):], NewFile[0:len(Dir)] + else: + return NewFile[len(Dir)+1:], NewFile[0:len(Dir)] + else: + return NewFile, '' + + return None, None + +## Check if gvien file exists or not +# +# +def ValidFile2(AllFiles, File, Ext=None, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''): + NewFile = File + if Ext != None: + Dummy, FileExt = os.path.splitext(File) + if FileExt.lower() != Ext.lower(): + return False, File + + # Replace the Edk macros + if OverrideDir != '' and OverrideDir != None: + if OverrideDir.find('$(EFI_SOURCE)') > -1: + OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource) + if OverrideDir.find('$(EDK_SOURCE)') > -1: + OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource) + + # Replace the default dir to current dir + if Dir == '.': + Dir = os.getcwd() + Dir = Dir[len(Workspace)+1:] + + # First check if File has Edk definition itself + if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1: + NewFile = File.replace('$(EFI_SOURCE)', EfiSource) + NewFile = NewFile.replace('$(EDK_SOURCE)', EdkSource) + NewFile = AllFiles[os.path.normpath(NewFile)] + if NewFile != None: + return True, NewFile + + # Second check the path with override value + if OverrideDir != '' and OverrideDir != None: + NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))] + if NewFile != None: + return True, NewFile + + # Last check the path with normal definitions + File = os.path.join(Dir, File) + NewFile = AllFiles[os.path.normpath(File)] + if NewFile != None: + return True, NewFile + + return False, File + +## Check if gvien file exists or not +# +# +def ValidFile3(AllFiles, File, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''): + # Replace the Edk macros + if OverrideDir != '' and OverrideDir != None: + if OverrideDir.find('$(EFI_SOURCE)') > -1: + OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource) + if OverrideDir.find('$(EDK_SOURCE)') > -1: + OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource) + + # Replace the default dir to current dir + # Dir is current module dir related to workspace + if Dir == '.': + Dir = os.getcwd() + Dir = Dir[len(Workspace)+1:] + + NewFile = File + RelaPath = AllFiles[os.path.normpath(Dir)] + NewRelaPath = RelaPath + + while(True): + # First check if File has Edk definition itself + if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1: + File = File.replace('$(EFI_SOURCE)', EfiSource) + File = File.replace('$(EDK_SOURCE)', EdkSource) + NewFile = AllFiles[os.path.normpath(File)] + if NewFile != None: + NewRelaPath = os.path.dirname(NewFile) + File = os.path.basename(NewFile) + #NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1] + break + + # Second check the path with override value + if OverrideDir != '' and OverrideDir != None: + NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))] + if NewFile != None: + #NewRelaPath = os.path.dirname(NewFile) + NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1] + break + + # Last check the path with normal definitions + NewFile = AllFiles[os.path.normpath(os.path.join(Dir, File))] + if NewFile != None: + break + + # No file found + break + + return NewRelaPath, RelaPath, File + + +def GetRelPath(Path1, Path2): + FileName = os.path.basename(Path2) + L1 = os.path.normpath(Path1).split(os.path.normpath('/')) + L2 = os.path.normpath(Path2).split(os.path.normpath('/')) + for Index in range(0, len(L1)): + if L1[Index] != L2[Index]: + FileName = '../' * (len(L1) - Index) + for Index2 in range(Index, len(L2)): + FileName = os.path.join(FileName, L2[Index2]) + break + return os.path.normpath(FileName) + + +## Get GUID value from given packages +# +# @param CName The CName of the GUID +# @param PackageList List of packages looking-up in +# +# @retval GuidValue if the CName is found in any given package +# @retval None if the CName is not found in all given packages +# +def GuidValue(CName, PackageList): + for P in PackageList: + if CName in P.Guids: + return P.Guids[CName] + return None + +## Get Protocol value from given packages +# +# @param CName The CName of the GUID +# @param PackageList List of packages looking-up in +# +# @retval GuidValue if the CName is found in any given package +# @retval None if the CName is not found in all given packages +# +def ProtocolValue(CName, PackageList): + for P in PackageList: + if CName in P.Protocols: + return P.Protocols[CName] + return None + +## Get PPI value from given packages +# +# @param CName The CName of the GUID +# @param PackageList List of packages looking-up in +# +# @retval GuidValue if the CName is found in any given package +# @retval None if the CName is not found in all given packages +# +def PpiValue(CName, PackageList): + for P in PackageList: + if CName in P.Ppis: + return P.Ppis[CName] + return None + +## A string template class +# +# This class implements a template for string replacement. A string template +# looks like following +# +# ${BEGIN} other_string ${placeholder_name} other_string ${END} +# +# The string between ${BEGIN} and ${END} will be repeated as many times as the +# length of "placeholder_name", which is a list passed through a dict. The +# "placeholder_name" is the key name of the dict. The ${BEGIN} and ${END} can +# be not used and, in this case, the "placeholder_name" must not a list and it +# will just be replaced once. +# +class TemplateString(object): + _REPEAT_START_FLAG = "BEGIN" + _REPEAT_END_FLAG = "END" + + class Section(object): + _LIST_TYPES = [type([]), type(set()), type((0,))] + + def __init__(self, TemplateSection, PlaceHolderList): + self._Template = TemplateSection + self._PlaceHolderList = [] + + # Split the section into sub-sections according to the position of placeholders + if PlaceHolderList: + self._SubSectionList = [] + SubSectionStart = 0 + # + # The placeholders passed in must be in the format of + # + # PlaceHolderName, PlaceHolderStartPoint, PlaceHolderEndPoint + # + for PlaceHolder,Start,End in PlaceHolderList: + self._SubSectionList.append(TemplateSection[SubSectionStart:Start]) + self._SubSectionList.append(TemplateSection[Start:End]) + self._PlaceHolderList.append(PlaceHolder) + SubSectionStart = End + if SubSectionStart < len(TemplateSection): + self._SubSectionList.append(TemplateSection[SubSectionStart:]) + else: + self._SubSectionList = [TemplateSection] + + def __str__(self): + return self._Template + " : " + str(self._PlaceHolderList) + + def Instantiate(self, PlaceHolderValues): + RepeatTime = -1 + RepeatPlaceHolders = {} + NonRepeatPlaceHolders = {} + + for PlaceHolder in self._PlaceHolderList: + if PlaceHolder not in PlaceHolderValues: + continue + Value = PlaceHolderValues[PlaceHolder] + if type(Value) in self._LIST_TYPES: + if RepeatTime < 0: + RepeatTime = len(Value) + elif RepeatTime != len(Value): + EdkLogger.error( + "TemplateString", + PARAMETER_INVALID, + "${%s} has different repeat time from others!" % PlaceHolder, + ExtraData=str(self._Template) + ) + RepeatPlaceHolders["${%s}" % PlaceHolder] = Value + else: + NonRepeatPlaceHolders["${%s}" % PlaceHolder] = Value + + if NonRepeatPlaceHolders: + StringList = [] + for S in self._SubSectionList: + if S not in NonRepeatPlaceHolders: + StringList.append(S) + else: + StringList.append(str(NonRepeatPlaceHolders[S])) + else: + StringList = self._SubSectionList + + if RepeatPlaceHolders: + TempStringList = [] + for Index in range(RepeatTime): + for S in StringList: + if S not in RepeatPlaceHolders: + TempStringList.append(S) + else: + TempStringList.append(str(RepeatPlaceHolders[S][Index])) + StringList = TempStringList + + return "".join(StringList) + + ## Constructor + def __init__(self, Template=None): + self.String = '' + self.IsBinary = False + self._Template = Template + self._TemplateSectionList = self._Parse(Template) + + ## str() operator + # + # @retval string The string replaced + # + def __str__(self): + return self.String + + ## Split the template string into fragments per the ${BEGIN} and ${END} flags + # + # @retval list A list of TemplateString.Section objects + # + def _Parse(self, Template): + SectionStart = 0 + SearchFrom = 0 + MatchEnd = 0 + PlaceHolderList = [] + TemplateSectionList = [] + while Template: + MatchObj = gPlaceholderPattern.search(Template, SearchFrom) + if not MatchObj: + if MatchEnd <= len(Template): + TemplateSection = TemplateString.Section(Template[SectionStart:], PlaceHolderList) + TemplateSectionList.append(TemplateSection) + break + + MatchString = MatchObj.group(1) + MatchStart = MatchObj.start() + MatchEnd = MatchObj.end() + + if MatchString == self._REPEAT_START_FLAG: + if MatchStart > SectionStart: + TemplateSection = TemplateString.Section(Template[SectionStart:MatchStart], PlaceHolderList) + TemplateSectionList.append(TemplateSection) + SectionStart = MatchEnd + PlaceHolderList = [] + elif MatchString == self._REPEAT_END_FLAG: + TemplateSection = TemplateString.Section(Template[SectionStart:MatchStart], PlaceHolderList) + TemplateSectionList.append(TemplateSection) + SectionStart = MatchEnd + PlaceHolderList = [] + else: + PlaceHolderList.append((MatchString, MatchStart - SectionStart, MatchEnd - SectionStart)) + SearchFrom = MatchEnd + return TemplateSectionList + + ## Replace the string template with dictionary of placeholders and append it to previous one + # + # @param AppendString The string template to append + # @param Dictionary The placeholder dictionaries + # + def Append(self, AppendString, Dictionary=None): + if Dictionary: + SectionList = self._Parse(AppendString) + self.String += "".join([S.Instantiate(Dictionary) for S in SectionList]) + else: + self.String += AppendString + + ## Replace the string template with dictionary of placeholders + # + # @param Dictionary The placeholder dictionaries + # + # @retval str The string replaced with placeholder values + # + def Replace(self, Dictionary=None): + return "".join([S.Instantiate(Dictionary) for S in self._TemplateSectionList]) + +## Progress indicator class +# +# This class makes use of thread to print progress on console. +# +class Progressor: + # for avoiding deadloop + _StopFlag = None + _ProgressThread = None + _CheckInterval = 0.25 + + ## Constructor + # + # @param OpenMessage The string printed before progress charaters + # @param CloseMessage The string printed after progress charaters + # @param ProgressChar The charater used to indicate the progress + # @param Interval The interval in seconds between two progress charaters + # + def __init__(self, OpenMessage="", CloseMessage="", ProgressChar='.', Interval=1.0): + self.PromptMessage = OpenMessage + self.CodaMessage = CloseMessage + self.ProgressChar = ProgressChar + self.Interval = Interval + if Progressor._StopFlag == None: + Progressor._StopFlag = threading.Event() + + ## Start to print progress charater + # + # @param OpenMessage The string printed before progress charaters + # + def Start(self, OpenMessage=None): + if OpenMessage != None: + self.PromptMessage = OpenMessage + Progressor._StopFlag.clear() + if Progressor._ProgressThread == None: + Progressor._ProgressThread = threading.Thread(target=self._ProgressThreadEntry) + Progressor._ProgressThread.setDaemon(False) + Progressor._ProgressThread.start() + + ## Stop printing progress charater + # + # @param CloseMessage The string printed after progress charaters + # + def Stop(self, CloseMessage=None): + OriginalCodaMessage = self.CodaMessage + if CloseMessage != None: + self.CodaMessage = CloseMessage + self.Abort() + self.CodaMessage = OriginalCodaMessage + + ## Thread entry method + def _ProgressThreadEntry(self): + sys.stdout.write(self.PromptMessage + " ") + sys.stdout.flush() + TimeUp = 0.0 + while not Progressor._StopFlag.isSet(): + if TimeUp <= 0.0: + sys.stdout.write(self.ProgressChar) + sys.stdout.flush() + TimeUp = self.Interval + time.sleep(self._CheckInterval) + TimeUp -= self._CheckInterval + sys.stdout.write(" " + self.CodaMessage + "\n") + sys.stdout.flush() + + ## Abort the progress display + @staticmethod + def Abort(): + if Progressor._StopFlag != None: + Progressor._StopFlag.set() + if Progressor._ProgressThread != None: + Progressor._ProgressThread.join() + Progressor._ProgressThread = None + +## A dict which can access its keys and/or values orderly +# +# The class implements a new kind of dict which its keys or values can be +# accessed in the order they are added into the dict. It guarantees the order +# by making use of an internal list to keep a copy of keys. +# +class sdict(IterableUserDict): + ## Constructor + def __init__(self): + IterableUserDict.__init__(self) + self._key_list = [] + + ## [] operator + def __setitem__(self, key, value): + if key not in self._key_list: + self._key_list.append(key) + IterableUserDict.__setitem__(self, key, value) + + ## del operator + def __delitem__(self, key): + self._key_list.remove(key) + IterableUserDict.__delitem__(self, key) + + ## used in "for k in dict" loop to ensure the correct order + def __iter__(self): + return self.iterkeys() + + ## len() support + def __len__(self): + return len(self._key_list) + + ## "in" test support + def __contains__(self, key): + return key in self._key_list + + ## indexof support + def index(self, key): + return self._key_list.index(key) + + ## insert support + def insert(self, key, newkey, newvalue, order): + index = self._key_list.index(key) + if order == 'BEFORE': + self._key_list.insert(index, newkey) + IterableUserDict.__setitem__(self, newkey, newvalue) + elif order == 'AFTER': + self._key_list.insert(index + 1, newkey) + IterableUserDict.__setitem__(self, newkey, newvalue) + + ## append support + def append(self, sdict): + for key in sdict: + if key not in self._key_list: + self._key_list.append(key) + IterableUserDict.__setitem__(self, key, sdict[key]) + + def has_key(self, key): + return key in self._key_list + + ## Empty the dict + def clear(self): + self._key_list = [] + IterableUserDict.clear(self) + + ## Return a copy of keys + def keys(self): + keys = [] + for key in self._key_list: + keys.append(key) + return keys + + ## Return a copy of values + def values(self): + values = [] + for key in self._key_list: + values.append(self[key]) + return values + + ## Return a copy of (key, value) list + def items(self): + items = [] + for key in self._key_list: + items.append((key, self[key])) + return items + + ## Iteration support + def iteritems(self): + return iter(self.items()) + + ## Keys interation support + def iterkeys(self): + return iter(self.keys()) + + ## Values interation support + def itervalues(self): + return iter(self.values()) + + ## Return value related to a key, and remove the (key, value) from the dict + def pop(self, key, *dv): + value = None + if key in self._key_list: + value = self[key] + self.__delitem__(key) + elif len(dv) != 0 : + value = kv[0] + return value + + ## Return (key, value) pair, and remove the (key, value) from the dict + def popitem(self): + key = self._key_list[-1] + value = self[key] + self.__delitem__(key) + return key, value + + def update(self, dict=None, **kwargs): + if dict != None: + for k, v in dict.items(): + self[k] = v + if len(kwargs): + for k, v in kwargs.items(): + self[k] = v + +## Dictionary with restricted keys +# +class rdict(dict): + ## Constructor + def __init__(self, KeyList): + for Key in KeyList: + dict.__setitem__(self, Key, "") + + ## []= operator + def __setitem__(self, key, value): + if key not in self: + EdkLogger.error("RestrictedDict", ATTRIBUTE_SET_FAILURE, "Key [%s] is not allowed" % key, + ExtraData=", ".join(dict.keys(self))) + dict.__setitem__(self, key, value) + + ## =[] operator + def __getitem__(self, key): + if key not in self: + return "" + return dict.__getitem__(self, key) + + ## del operator + def __delitem__(self, key): + EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="del") + + ## Empty the dict + def clear(self): + for Key in self: + self.__setitem__(Key, "") + + ## Return value related to a key, and remove the (key, value) from the dict + def pop(self, key, *dv): + EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="pop") + + ## Return (key, value) pair, and remove the (key, value) from the dict + def popitem(self): + EdkLogger.error("RestrictedDict", ATTRIBUTE_ACCESS_DENIED, ExtraData="popitem") + +## Dictionary using prioritized list as key +# +class tdict: + _ListType = type([]) + _TupleType = type(()) + _Wildcard = 'COMMON' + _ValidWildcardList = ['COMMON', 'DEFAULT', 'ALL', '*', 'PLATFORM'] + + def __init__(self, _Single_=False, _Level_=2): + self._Level_ = _Level_ + self.data = {} + self._Single_ = _Single_ + + # =[] operator + def __getitem__(self, key): + KeyType = type(key) + RestKeys = None + if KeyType == self._ListType or KeyType == self._TupleType: + FirstKey = key[0] + if len(key) > 1: + RestKeys = key[1:] + elif self._Level_ > 1: + RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] + else: + FirstKey = key + if self._Level_ > 1: + RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] + + if FirstKey == None or str(FirstKey).upper() in self._ValidWildcardList: + FirstKey = self._Wildcard + + if self._Single_: + return self._GetSingleValue(FirstKey, RestKeys) + else: + return self._GetAllValues(FirstKey, RestKeys) + + def _GetSingleValue(self, FirstKey, RestKeys): + Value = None + #print "%s-%s" % (FirstKey, self._Level_) , + if self._Level_ > 1: + if FirstKey == self._Wildcard: + if FirstKey in self.data: + Value = self.data[FirstKey][RestKeys] + if Value == None: + for Key in self.data: + Value = self.data[Key][RestKeys] + if Value != None: break + else: + if FirstKey in self.data: + Value = self.data[FirstKey][RestKeys] + if Value == None and self._Wildcard in self.data: + #print "Value=None" + Value = self.data[self._Wildcard][RestKeys] + else: + if FirstKey == self._Wildcard: + if FirstKey in self.data: + Value = self.data[FirstKey] + if Value == None: + for Key in self.data: + Value = self.data[Key] + if Value != None: break + else: + if FirstKey in self.data: + Value = self.data[FirstKey] + elif self._Wildcard in self.data: + Value = self.data[self._Wildcard] + return Value + + def _GetAllValues(self, FirstKey, RestKeys): + Value = [] + if self._Level_ > 1: + if FirstKey == self._Wildcard: + for Key in self.data: + Value += self.data[Key][RestKeys] + else: + if FirstKey in self.data: + Value += self.data[FirstKey][RestKeys] + if self._Wildcard in self.data: + Value += self.data[self._Wildcard][RestKeys] + else: + if FirstKey == self._Wildcard: + for Key in self.data: + Value.append(self.data[Key]) + else: + if FirstKey in self.data: + Value.append(self.data[FirstKey]) + if self._Wildcard in self.data: + Value.append(self.data[self._Wildcard]) + return Value + + ## []= operator + def __setitem__(self, key, value): + KeyType = type(key) + RestKeys = None + if KeyType == self._ListType or KeyType == self._TupleType: + FirstKey = key[0] + if len(key) > 1: + RestKeys = key[1:] + else: + RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] + else: + FirstKey = key + if self._Level_ > 1: + RestKeys = [self._Wildcard for i in range(0, self._Level_-1)] + + if FirstKey in self._ValidWildcardList: + FirstKey = self._Wildcard + + if FirstKey not in self.data and self._Level_ > 0: + self.data[FirstKey] = tdict(self._Single_, self._Level_ - 1) + + if self._Level_ > 1: + self.data[FirstKey][RestKeys] = value + else: + self.data[FirstKey] = value + + def SetGreedyMode(self): + self._Single_ = False + if self._Level_ > 1: + for Key in self.data: + self.data[Key].SetGreedyMode() + + def SetSingleMode(self): + self._Single_ = True + if self._Level_ > 1: + for Key in self.data: + self.data[Key].SetSingleMode() + + def GetKeys(self, KeyIndex=0): + assert KeyIndex >= 0 + if KeyIndex == 0: + return set(self.data.keys()) + else: + keys = set() + for Key in self.data: + keys |= self.data[Key].GetKeys(KeyIndex - 1) + return keys + +## Boolean chain list +# +class Blist(UserList): + def __init__(self, initlist=None): + UserList.__init__(self, initlist) + def __setitem__(self, i, item): + if item not in [True, False]: + if item == 0: + item = False + else: + item = True + self.data[i] = item + def _GetResult(self): + Value = True + for item in self.data: + Value &= item + return Value + Result = property(_GetResult) + +def ParseConsoleLog(Filename): + Opr = open(os.path.normpath(Filename), 'r') + Opw = open(os.path.normpath(Filename + '.New'), 'w+') + for Line in Opr.readlines(): + if Line.find('.efi') > -1: + Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip() + Opw.write('%s\n' % Line) + + Opr.close() + Opw.close() + +## AnalyzeDscPcd +# +# Analyze DSC PCD value, since there is no data type info in DSC +# This fuction is used to match functions (AnalyzePcdData, AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from database +# 1. Feature flag: TokenSpace.PcdCName|PcdValue +# 2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize] +# 3. Dynamic default: +# TokenSpace.PcdCName|PcdValue[|VOID*[|MaxSize]] +# TokenSpace.PcdCName|PcdValue +# 4. Dynamic VPD: +# TokenSpace.PcdCName|VpdOffset[|VpdValue] +# TokenSpace.PcdCName|VpdOffset[|MaxSize[|VpdValue]] +# 5. Dynamic HII: +# TokenSpace.PcdCName|HiiString|VaiableGuid|VariableOffset[|HiiValue] +# PCD value needs to be located in such kind of string, and the PCD value might be an expression in which +# there might have "|" operator, also in string value. +# +# @param Setting: String contain information described above with "TokenSpace.PcdCName|" stripped +# @param PcdType: PCD type: feature, fixed, dynamic default VPD HII +# @param DataType: The datum type of PCD: VOID*, UNIT, BOOL +# @retval: +# ValueList: A List contain fields described above +# IsValid: True if conforming EBNF, otherwise False +# Index: The index where PcdValue is in ValueList +# +def AnalyzeDscPcd(Setting, PcdType, DataType=''): + Setting = Setting.strip() + # There might be escaped quote in a string: \", \\\" + Data = Setting.replace('\\\\', '//').replace('\\\"', '\\\'') + # There might be '|' in string and in ( ... | ... ), replace it with '-' + NewStr = '' + InStr = False + Pair = 0 + for ch in Data: + if ch == '"': + InStr = not InStr + elif ch == '(' and not InStr: + Pair += 1 + elif ch == ')' and not InStr: + Pair -= 1 + + if (Pair > 0 or InStr) and ch == TAB_VALUE_SPLIT: + NewStr += '-' + else: + NewStr += ch + FieldList = [] + StartPos = 0 + while True: + Pos = NewStr.find(TAB_VALUE_SPLIT, StartPos) + if Pos < 0: + FieldList.append(Setting[StartPos:].strip()) + break + FieldList.append(Setting[StartPos:Pos].strip()) + StartPos = Pos + 1 + + IsValid = True + if PcdType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_FEATURE_FLAG): + Value = FieldList[0] + Size = '' + if len(FieldList) > 1: + Type = FieldList[1] + # Fix the PCD type when no DataType input + if Type == 'VOID*': + DataType = 'VOID*' + else: + Size = FieldList[1] + if len(FieldList) > 2: + Size = FieldList[2] + if DataType == 'VOID*': + IsValid = (len(FieldList) <= 3) + else: + IsValid = (len(FieldList) <= 1) + return [Value, '', Size], IsValid, 0 + elif PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT): + Value = FieldList[0] + Size = Type = '' + if len(FieldList) > 1: + Type = FieldList[1] + else: + Type = DataType + if len(FieldList) > 2: + Size = FieldList[2] + else: + if Type == 'VOID*': + if Value.startswith("L"): + Size = str((len(Value)- 3 + 1) * 2) + elif Value.startswith("{"): + Size = str(len(Value.split(","))) + else: + Size = str(len(Value) -2 + 1 ) + if DataType == 'VOID*': + IsValid = (len(FieldList) <= 3) + else: + IsValid = (len(FieldList) <= 1) + return [Value, Type, Size], IsValid, 0 + elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD): + VpdOffset = FieldList[0] + Value = Size = '' + if not DataType == 'VOID*': + if len(FieldList) > 1: + Value = FieldList[1] + else: + if len(FieldList) > 1: + Size = FieldList[1] + if len(FieldList) > 2: + Value = FieldList[2] + if DataType == 'VOID*': + IsValid = (len(FieldList) <= 3) + else: + IsValid = (len(FieldList) <= 2) + return [VpdOffset, Size, Value], IsValid, 2 + elif PcdType in (MODEL_PCD_DYNAMIC_HII, MODEL_PCD_DYNAMIC_EX_HII): + HiiString = FieldList[0] + Guid = Offset = Value = '' + if len(FieldList) > 1: + Guid = FieldList[1] + if len(FieldList) > 2: + Offset = FieldList[2] + if len(FieldList) > 3: + Value = FieldList[3] + IsValid = (3 <= len(FieldList) <= 4) + return [HiiString, Guid, Offset, Value], IsValid, 3 + return [], False, 0 + +## AnalyzePcdData +# +# Analyze the pcd Value, Datum type and TokenNumber. +# Used to avoid split issue while the value string contain "|" character +# +# @param[in] Setting: A String contain value/datum type/token number information; +# +# @retval ValueList: A List contain value, datum type and toke number. +# +def AnalyzePcdData(Setting): + ValueList = ['', '', ''] + + ValueRe = re.compile(r'^\s*L?\".*\|.*\"') + PtrValue = ValueRe.findall(Setting) + + ValueUpdateFlag = False + + if len(PtrValue) >= 1: + Setting = re.sub(ValueRe, '', Setting) + ValueUpdateFlag = True + + TokenList = Setting.split(TAB_VALUE_SPLIT) + ValueList[0:len(TokenList)] = TokenList + + if ValueUpdateFlag: + ValueList[0] = PtrValue[0] + + return ValueList + +## AnalyzeHiiPcdData +# +# Analyze the pcd Value, variable name, variable Guid and variable offset. +# Used to avoid split issue while the value string contain "|" character +# +# @param[in] Setting: A String contain VariableName, VariableGuid, VariableOffset, DefaultValue information; +# +# @retval ValueList: A List contaian VariableName, VariableGuid, VariableOffset, DefaultValue. +# +def AnalyzeHiiPcdData(Setting): + ValueList = ['', '', '', ''] + + TokenList = GetSplitValueList(Setting) + ValueList[0:len(TokenList)] = TokenList + + return ValueList + +## AnalyzeVpdPcdData +# +# Analyze the vpd pcd VpdOffset, MaxDatumSize and InitialValue. +# Used to avoid split issue while the value string contain "|" character +# +# @param[in] Setting: A String contain VpdOffset/MaxDatumSize/InitialValue information; +# +# @retval ValueList: A List contain VpdOffset, MaxDatumSize and InitialValue. +# +def AnalyzeVpdPcdData(Setting): + ValueList = ['', '', ''] + + ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$') + PtrValue = ValueRe.findall(Setting) + + ValueUpdateFlag = False + + if len(PtrValue) >= 1: + Setting = re.sub(ValueRe, '', Setting) + ValueUpdateFlag = True + + TokenList = Setting.split(TAB_VALUE_SPLIT) + ValueList[0:len(TokenList)] = TokenList + + if ValueUpdateFlag: + ValueList[2] = PtrValue[0] + + return ValueList + +## check format of PCD value against its the datum type +# +# For PCD value setting +# +def CheckPcdDatum(Type, Value): + if Type == "VOID*": + ValueRe = re.compile(r'\s*L?\".*\"\s*$') + if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"')) + or (Value.startswith('{') and Value.endswith('}')) + ): + return False, "Invalid value [%s] of type [%s]; must be in the form of {...} for array"\ + ", or \"...\" for string, or L\"...\" for unicode string" % (Value, Type) + elif ValueRe.match(Value): + # Check the chars in UnicodeString or CString is printable + if Value.startswith("L"): + Value = Value[2:-1] + else: + Value = Value[1:-1] + Printset = set(string.printable) + Printset.remove(TAB_PRINTCHAR_VT) + Printset.add(TAB_PRINTCHAR_BS) + Printset.add(TAB_PRINTCHAR_NUL) + if not set(Value).issubset(Printset): + PrintList = list(Printset) + PrintList.sort() + return False, "Invalid PCD string value of type [%s]; must be printable chars %s." % (Type, PrintList) + elif Type == 'BOOLEAN': + if Value not in ['TRUE', 'True', 'true', '0x1', '0x01', '1', 'FALSE', 'False', 'false', '0x0', '0x00', '0']: + return False, "Invalid value [%s] of type [%s]; must be one of TRUE, True, true, 0x1, 0x01, 1"\ + ", FALSE, False, false, 0x0, 0x00, 0" % (Value, Type) + elif Type in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64]: + try: + Value = long(Value, 0) + except: + return False, "Invalid value [%s] of type [%s];"\ + " must be a hexadecimal, decimal or octal in C language format." % (Value, Type) + else: + return False, "Invalid type [%s]; must be one of VOID*, BOOLEAN, UINT8, UINT16, UINT32, UINT64." % (Type) + + return True, "" + +## Split command line option string to list +# +# subprocess.Popen needs the args to be a sequence. Otherwise there's problem +# in non-windows platform to launch command +# +def SplitOption(OptionString): + OptionList = [] + LastChar = " " + OptionStart = 0 + QuotationMark = "" + for Index in range(0, len(OptionString)): + CurrentChar = OptionString[Index] + if CurrentChar in ['"', "'"]: + if QuotationMark == CurrentChar: + QuotationMark = "" + elif QuotationMark == "": + QuotationMark = CurrentChar + continue + elif QuotationMark: + continue + + if CurrentChar in ["/", "-"] and LastChar in [" ", "\t", "\r", "\n"]: + if Index > OptionStart: + OptionList.append(OptionString[OptionStart:Index-1]) + OptionStart = Index + LastChar = CurrentChar + OptionList.append(OptionString[OptionStart:]) + return OptionList + +def CommonPath(PathList): + P1 = min(PathList).split(os.path.sep) + P2 = max(PathList).split(os.path.sep) + for Index in xrange(min(len(P1), len(P2))): + if P1[Index] != P2[Index]: + return os.path.sep.join(P1[:Index]) + return os.path.sep.join(P1) + +class PathClass(object): + def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False, + Arch='COMMON', ToolChainFamily='', Target='', TagName='', ToolCode=''): + self.Arch = Arch + self.File = str(File) + if os.path.isabs(self.File): + self.Root = '' + self.AlterRoot = '' + else: + self.Root = str(Root) + self.AlterRoot = str(AlterRoot) + + # Remove any '.' and '..' in path + if self.Root: + self.Path = os.path.normpath(os.path.join(self.Root, self.File)) + self.Root = os.path.normpath(CommonPath([self.Root, self.Path])) + # eliminate the side-effect of 'C:' + if self.Root[-1] == ':': + self.Root += os.path.sep + # file path should not start with path separator + if self.Root[-1] == os.path.sep: + self.File = self.Path[len(self.Root):] + else: + self.File = self.Path[len(self.Root)+1:] + else: + self.Path = os.path.normpath(self.File) + + self.SubDir, self.Name = os.path.split(self.File) + self.BaseName, self.Ext = os.path.splitext(self.Name) + + if self.Root: + if self.SubDir: + self.Dir = os.path.join(self.Root, self.SubDir) + else: + self.Dir = self.Root + else: + self.Dir = self.SubDir + + if IsBinary: + self.Type = Type + else: + self.Type = self.Ext.lower() + + self.IsBinary = IsBinary + self.Target = Target + self.TagName = TagName + self.ToolCode = ToolCode + self.ToolChainFamily = ToolChainFamily + + self._Key = None + + ## Convert the object of this class to a string + # + # Convert member Path of the class to a string + # + # @retval string Formatted String + # + def __str__(self): + return self.Path + + ## Override __eq__ function + # + # Check whether PathClass are the same + # + # @retval False The two PathClass are different + # @retval True The two PathClass are the same + # + def __eq__(self, Other): + if type(Other) == type(self): + return self.Path == Other.Path + else: + return self.Path == str(Other) + + ## Override __cmp__ function + # + # Customize the comparsion operation of two PathClass + # + # @retval 0 The two PathClass are different + # @retval -1 The first PathClass is less than the second PathClass + # @retval 1 The first PathClass is Bigger than the second PathClass + def __cmp__(self, Other): + if type(Other) == type(self): + OtherKey = Other.Path + else: + OtherKey = str(Other) + + SelfKey = self.Path + if SelfKey == OtherKey: + return 0 + elif SelfKey > OtherKey: + return 1 + else: + return -1 + + ## Override __hash__ function + # + # Use Path as key in hash table + # + # @retval string Key for hash table + # + def __hash__(self): + return hash(self.Path) + + def _GetFileKey(self): + if self._Key == None: + self._Key = self.Path.upper() # + self.ToolChainFamily + self.TagName + self.ToolCode + self.Target + return self._Key + + def _GetTimeStamp(self): + return os.stat(self.Path)[8] + + def Validate(self, Type='', CaseSensitive=True): + if GlobalData.gCaseInsensitive: + CaseSensitive = False + if Type and Type.lower() != self.Type: + return FILE_TYPE_MISMATCH, '%s (expect %s but got %s)' % (self.File, Type, self.Type) + + RealFile, RealRoot = RealPath2(self.File, self.Root, self.AlterRoot) + if not RealRoot and not RealFile: + RealFile = self.File + if self.AlterRoot: + RealFile = os.path.join(self.AlterRoot, self.File) + elif self.Root: + RealFile = os.path.join(self.Root, self.File) + return FILE_NOT_FOUND, os.path.join(self.AlterRoot, RealFile) + + ErrorCode = 0 + ErrorInfo = '' + if RealRoot != self.Root or RealFile != self.File: + if CaseSensitive and (RealFile != self.File or (RealRoot != self.Root and RealRoot != self.AlterRoot)): + ErrorCode = FILE_CASE_MISMATCH + ErrorInfo = self.File + '\n\t' + RealFile + " [in file system]" + + self.SubDir, self.Name = os.path.split(RealFile) + self.BaseName, self.Ext = os.path.splitext(self.Name) + if self.SubDir: + self.Dir = os.path.join(RealRoot, self.SubDir) + else: + self.Dir = RealRoot + self.File = RealFile + self.Root = RealRoot + self.Path = os.path.join(RealRoot, RealFile) + return ErrorCode, ErrorInfo + + Key = property(_GetFileKey) + TimeStamp = property(_GetTimeStamp) + +## Parse PE image to get the required PE informaion. +# +class PeImageClass(): + ## Constructor + # + # @param File FilePath of PeImage + # + def __init__(self, PeFile): + self.FileName = PeFile + self.IsValid = False + self.Size = 0 + self.EntryPoint = 0 + self.SectionAlignment = 0 + self.SectionHeaderList = [] + self.ErrorInfo = '' + try: + PeObject = open(PeFile, 'rb') + except: + self.ErrorInfo = self.FileName + ' can not be found\n' + return + # Read DOS header + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, 0x3E) + ByteList = ByteArray.tolist() + # DOS signature should be 'MZ' + if self._ByteListToStr (ByteList[0x0:0x2]) != 'MZ': + self.ErrorInfo = self.FileName + ' has no valid DOS signature MZ' + return + + # Read 4 byte PE Signature + PeOffset = self._ByteListToInt(ByteList[0x3C:0x3E]) + PeObject.seek(PeOffset) + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, 4) + # PE signature should be 'PE\0\0' + if ByteArray.tostring() != 'PE\0\0': + self.ErrorInfo = self.FileName + ' has no valid PE signature PE00' + return + + # Read PE file header + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, 0x14) + ByteList = ByteArray.tolist() + SecNumber = self._ByteListToInt(ByteList[0x2:0x4]) + if SecNumber == 0: + self.ErrorInfo = self.FileName + ' has no section header' + return + + # Read PE optional header + OptionalHeaderSize = self._ByteListToInt(ByteArray[0x10:0x12]) + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, OptionalHeaderSize) + ByteList = ByteArray.tolist() + self.EntryPoint = self._ByteListToInt(ByteList[0x10:0x14]) + self.SectionAlignment = self._ByteListToInt(ByteList[0x20:0x24]) + self.Size = self._ByteListToInt(ByteList[0x38:0x3C]) + + # Read each Section Header + for Index in range(SecNumber): + ByteArray = array.array('B') + ByteArray.fromfile(PeObject, 0x28) + ByteList = ByteArray.tolist() + SecName = self._ByteListToStr(ByteList[0:8]) + SecVirtualSize = self._ByteListToInt(ByteList[8:12]) + SecRawAddress = self._ByteListToInt(ByteList[20:24]) + SecVirtualAddress = self._ByteListToInt(ByteList[12:16]) + self.SectionHeaderList.append((SecName, SecVirtualAddress, SecRawAddress, SecVirtualSize)) + self.IsValid = True + PeObject.close() + + def _ByteListToStr(self, ByteList): + String = '' + for index in range(len(ByteList)): + if ByteList[index] == 0: + break + String += chr(ByteList[index]) + return String + + def _ByteListToInt(self, ByteList): + Value = 0 + for index in range(len(ByteList) - 1, -1, -1): + Value = (Value << 8) | int(ByteList[index]) + return Value + + +class SkuClass(): + + DEFAULT = 0 + SINGLE = 1 + MULTIPLE =2 + + def __init__(self,SkuIdentifier='', SkuIds={}): + + self.AvailableSkuIds = sdict() + self.SkuIdSet = [] + + if SkuIdentifier == '' or SkuIdentifier is None: + self.SkuIdSet = ['DEFAULT'] + elif SkuIdentifier == 'ALL': + self.SkuIdSet = SkuIds.keys() + else: + r = SkuIdentifier.split('|') + self.SkuIdSet=[r[k].strip() for k in range(len(r))] + if len(self.SkuIdSet) == 2 and 'DEFAULT' in self.SkuIdSet and SkuIdentifier != 'ALL': + self.SkuIdSet.remove('DEFAULT') + + for each in self.SkuIdSet: + if each in SkuIds: + self.AvailableSkuIds[each] = SkuIds[each] + else: + EdkLogger.error("build", PARAMETER_INVALID, + ExtraData="SKU-ID [%s] is not supported by the platform. [Valid SKU-ID: %s]" + % (each, " ".join(SkuIds.keys()))) + + def __SkuUsageType(self): + + if len(self.SkuIdSet) == 1: + if self.SkuIdSet[0] == 'DEFAULT': + return SkuClass.DEFAULT + else: + return SkuClass.SINGLE + else: + return SkuClass.MULTIPLE + + def __GetAvailableSkuIds(self): + return self.AvailableSkuIds + + def __GetSystemSkuID(self): + if self.__SkuUsageType() == SkuClass.SINGLE: + return self.SkuIdSet[0] + else: + return 'DEFAULT' + + SystemSkuId = property(__GetSystemSkuID) + AvailableSkuIdSet = property(__GetAvailableSkuIds) + SkuUsageType = property(__SkuUsageType) + +## +# +# This acts like the main() function for the script, unless it is 'import'ed into another +# script. +# +if __name__ == '__main__': + pass + diff --git a/BaseTools/Source/Python/Ecc/CLexer.py b/BaseTools/Source/Python/Ecc/CLexer.py index a72d4ee3c2..a496f43440 100644 --- a/BaseTools/Source/Python/Ecc/CLexer.py +++ b/BaseTools/Source/Python/Ecc/CLexer.py @@ -1,7 +1,7 @@ -# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 - -from antlr3 import * -from antlr3.compat import set, frozenset +# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 + +from antlr3 import * +from antlr3.compat import set, frozenset ## @file # The file defines the Lexer for C source files. @@ -21,4927 +21,4927 @@ from antlr3.compat import set, frozenset # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # ## - - - -# for convenience in actions -HIDDEN = BaseRecognizer.HIDDEN - -# token types -T114=114 -T115=115 -T116=116 -T117=117 -FloatTypeSuffix=16 -LETTER=11 -T29=29 -T28=28 -T27=27 -T26=26 -T25=25 -EOF=-1 -STRING_LITERAL=9 -FLOATING_POINT_LITERAL=10 -T38=38 -T37=37 -T39=39 -T34=34 -COMMENT=22 -T33=33 -T36=36 -T35=35 -T30=30 -T32=32 -T31=31 -LINE_COMMENT=23 -IntegerTypeSuffix=14 -CHARACTER_LITERAL=8 -T49=49 -T48=48 -T100=100 -T43=43 -T42=42 -T102=102 -T41=41 -T101=101 -T40=40 -T47=47 -T46=46 -T45=45 -T44=44 -T109=109 -T107=107 -T108=108 -T105=105 -WS=19 -T106=106 -T103=103 -T104=104 -T50=50 -LINE_COMMAND=24 -T59=59 -T113=113 -T52=52 -T112=112 -T51=51 -T111=111 -T54=54 -T110=110 -EscapeSequence=12 -DECIMAL_LITERAL=7 -T53=53 -T56=56 -T55=55 -T58=58 -T57=57 -T75=75 -T76=76 -T73=73 -T74=74 -T79=79 -T77=77 -T78=78 -Exponent=15 -HexDigit=13 -T72=72 -T71=71 -T70=70 -T62=62 -T63=63 -T64=64 -T65=65 -T66=66 -T67=67 -T68=68 -T69=69 -IDENTIFIER=4 -UnicodeVocabulary=21 -HEX_LITERAL=5 -T61=61 -T60=60 -T99=99 -T97=97 -BS=20 -T98=98 -T95=95 -T96=96 -OCTAL_LITERAL=6 -T94=94 -Tokens=118 -T93=93 -T92=92 -T91=91 -T90=90 -T88=88 -T89=89 -T84=84 -T85=85 -T86=86 -T87=87 -UnicodeEscape=18 -T81=81 -T80=80 -T83=83 -OctalEscape=17 -T82=82 - -class CLexer(Lexer): - - grammarFileName = "C.g" - - def __init__(self, input=None): - Lexer.__init__(self, input) - self.dfa25 = self.DFA25( - self, 25, - eot = self.DFA25_eot, - eof = self.DFA25_eof, - min = self.DFA25_min, - max = self.DFA25_max, - accept = self.DFA25_accept, - special = self.DFA25_special, - transition = self.DFA25_transition - ) - self.dfa35 = self.DFA35( - self, 35, - eot = self.DFA35_eot, - eof = self.DFA35_eof, - min = self.DFA35_min, - max = self.DFA35_max, - accept = self.DFA35_accept, - special = self.DFA35_special, - transition = self.DFA35_transition - ) - - - - - - - # $ANTLR start T25 - def mT25(self, ): - - try: - self.type = T25 - - # C.g:27:5: ( ';' ) - # C.g:27:7: ';' - self.match(u';') - - - - - - finally: - - pass - - # $ANTLR end T25 - - - - # $ANTLR start T26 - def mT26(self, ): - - try: - self.type = T26 - - # C.g:28:5: ( 'typedef' ) - # C.g:28:7: 'typedef' - self.match("typedef") - - - - - - - finally: - - pass - - # $ANTLR end T26 - - - - # $ANTLR start T27 - def mT27(self, ): - - try: - self.type = T27 - - # C.g:29:5: ( ',' ) - # C.g:29:7: ',' - self.match(u',') - - - - - - finally: - - pass - - # $ANTLR end T27 - - - - # $ANTLR start T28 - def mT28(self, ): - - try: - self.type = T28 - - # C.g:30:5: ( '=' ) - # C.g:30:7: '=' - self.match(u'=') - - - - - - finally: - - pass - - # $ANTLR end T28 - - - - # $ANTLR start T29 - def mT29(self, ): - - try: - self.type = T29 - - # C.g:31:5: ( 'extern' ) - # C.g:31:7: 'extern' - self.match("extern") - - - - - - - finally: - - pass - - # $ANTLR end T29 - - - - # $ANTLR start T30 - def mT30(self, ): - - try: - self.type = T30 - - # C.g:32:5: ( 'static' ) - # C.g:32:7: 'static' - self.match("static") - - - - - - - finally: - - pass - - # $ANTLR end T30 - - - - # $ANTLR start T31 - def mT31(self, ): - - try: - self.type = T31 - - # C.g:33:5: ( 'auto' ) - # C.g:33:7: 'auto' - self.match("auto") - - - - - - - finally: - - pass - - # $ANTLR end T31 - - - - # $ANTLR start T32 - def mT32(self, ): - - try: - self.type = T32 - - # C.g:34:5: ( 'register' ) - # C.g:34:7: 'register' - self.match("register") - - - - - - - finally: - - pass - - # $ANTLR end T32 - - - - # $ANTLR start T33 - def mT33(self, ): - - try: - self.type = T33 - - # C.g:35:5: ( 'STATIC' ) - # C.g:35:7: 'STATIC' - self.match("STATIC") - - - - - - - finally: - - pass - - # $ANTLR end T33 - - - - # $ANTLR start T34 - def mT34(self, ): - - try: - self.type = T34 - - # C.g:36:5: ( 'void' ) - # C.g:36:7: 'void' - self.match("void") - - - - - - - finally: - - pass - - # $ANTLR end T34 - - - - # $ANTLR start T35 - def mT35(self, ): - - try: - self.type = T35 - - # C.g:37:5: ( 'char' ) - # C.g:37:7: 'char' - self.match("char") - - - - - - - finally: - - pass - - # $ANTLR end T35 - - - - # $ANTLR start T36 - def mT36(self, ): - - try: - self.type = T36 - - # C.g:38:5: ( 'short' ) - # C.g:38:7: 'short' - self.match("short") - - - - - - - finally: - - pass - - # $ANTLR end T36 - - - - # $ANTLR start T37 - def mT37(self, ): - - try: - self.type = T37 - - # C.g:39:5: ( 'int' ) - # C.g:39:7: 'int' - self.match("int") - - - - - - - finally: - - pass - - # $ANTLR end T37 - - - - # $ANTLR start T38 - def mT38(self, ): - - try: - self.type = T38 - - # C.g:40:5: ( 'long' ) - # C.g:40:7: 'long' - self.match("long") - - - - - - - finally: - - pass - - # $ANTLR end T38 - - - - # $ANTLR start T39 - def mT39(self, ): - - try: - self.type = T39 - - # C.g:41:5: ( 'float' ) - # C.g:41:7: 'float' - self.match("float") - - - - - - - finally: - - pass - - # $ANTLR end T39 - - - - # $ANTLR start T40 - def mT40(self, ): - - try: - self.type = T40 - - # C.g:42:5: ( 'double' ) - # C.g:42:7: 'double' - self.match("double") - - - - - - - finally: - - pass - - # $ANTLR end T40 - - - - # $ANTLR start T41 - def mT41(self, ): - - try: - self.type = T41 - - # C.g:43:5: ( 'signed' ) - # C.g:43:7: 'signed' - self.match("signed") - - - - - - - finally: - - pass - - # $ANTLR end T41 - - - - # $ANTLR start T42 - def mT42(self, ): - - try: - self.type = T42 - - # C.g:44:5: ( 'unsigned' ) - # C.g:44:7: 'unsigned' - self.match("unsigned") - - - - - - - finally: - - pass - - # $ANTLR end T42 - - - - # $ANTLR start T43 - def mT43(self, ): - - try: - self.type = T43 - - # C.g:45:5: ( '{' ) - # C.g:45:7: '{' - self.match(u'{') - - - - - - finally: - - pass - - # $ANTLR end T43 - - - - # $ANTLR start T44 - def mT44(self, ): - - try: - self.type = T44 - - # C.g:46:5: ( '}' ) - # C.g:46:7: '}' - self.match(u'}') - - - - - - finally: - - pass - - # $ANTLR end T44 - - - - # $ANTLR start T45 - def mT45(self, ): - - try: - self.type = T45 - - # C.g:47:5: ( 'struct' ) - # C.g:47:7: 'struct' - self.match("struct") - - - - - - - finally: - - pass - - # $ANTLR end T45 - - - - # $ANTLR start T46 - def mT46(self, ): - - try: - self.type = T46 - - # C.g:48:5: ( 'union' ) - # C.g:48:7: 'union' - self.match("union") - - - - - - - finally: - - pass - - # $ANTLR end T46 - - - - # $ANTLR start T47 - def mT47(self, ): - - try: - self.type = T47 - - # C.g:49:5: ( ':' ) - # C.g:49:7: ':' - self.match(u':') - - - - - - finally: - - pass - - # $ANTLR end T47 - - - - # $ANTLR start T48 - def mT48(self, ): - - try: - self.type = T48 - - # C.g:50:5: ( 'enum' ) - # C.g:50:7: 'enum' - self.match("enum") - - - - - - - finally: - - pass - - # $ANTLR end T48 - - - - # $ANTLR start T49 - def mT49(self, ): - - try: - self.type = T49 - - # C.g:51:5: ( 'const' ) - # C.g:51:7: 'const' - self.match("const") - - - - - - - finally: - - pass - - # $ANTLR end T49 - - - - # $ANTLR start T50 - def mT50(self, ): - - try: - self.type = T50 - - # C.g:52:5: ( 'volatile' ) - # C.g:52:7: 'volatile' - self.match("volatile") - - - - - - - finally: - - pass - - # $ANTLR end T50 - - - - # $ANTLR start T51 - def mT51(self, ): - - try: - self.type = T51 - - # C.g:53:5: ( 'IN' ) - # C.g:53:7: 'IN' - self.match("IN") - - - - - - - finally: - - pass - - # $ANTLR end T51 - - - - # $ANTLR start T52 - def mT52(self, ): - - try: - self.type = T52 - - # C.g:54:5: ( 'OUT' ) - # C.g:54:7: 'OUT' - self.match("OUT") - - - - - - - finally: - - pass - - # $ANTLR end T52 - - - - # $ANTLR start T53 - def mT53(self, ): - - try: - self.type = T53 - - # C.g:55:5: ( 'OPTIONAL' ) - # C.g:55:7: 'OPTIONAL' - self.match("OPTIONAL") - - - - - - - finally: - - pass - - # $ANTLR end T53 - - - - # $ANTLR start T54 - def mT54(self, ): - - try: - self.type = T54 - - # C.g:56:5: ( 'CONST' ) - # C.g:56:7: 'CONST' - self.match("CONST") - - - - - - - finally: - - pass - - # $ANTLR end T54 - - - - # $ANTLR start T55 - def mT55(self, ): - - try: - self.type = T55 - - # C.g:57:5: ( 'UNALIGNED' ) - # C.g:57:7: 'UNALIGNED' - self.match("UNALIGNED") - - - - - - - finally: - - pass - - # $ANTLR end T55 - - - - # $ANTLR start T56 - def mT56(self, ): - - try: - self.type = T56 - - # C.g:58:5: ( 'VOLATILE' ) - # C.g:58:7: 'VOLATILE' - self.match("VOLATILE") - - - - - - - finally: - - pass - - # $ANTLR end T56 - - - - # $ANTLR start T57 - def mT57(self, ): - - try: - self.type = T57 - - # C.g:59:5: ( 'GLOBAL_REMOVE_IF_UNREFERENCED' ) - # C.g:59:7: 'GLOBAL_REMOVE_IF_UNREFERENCED' - self.match("GLOBAL_REMOVE_IF_UNREFERENCED") - - - - - - - finally: - - pass - - # $ANTLR end T57 - - - - # $ANTLR start T58 - def mT58(self, ): - - try: - self.type = T58 - - # C.g:60:5: ( 'EFIAPI' ) - # C.g:60:7: 'EFIAPI' - self.match("EFIAPI") - - - - - - - finally: - - pass - - # $ANTLR end T58 - - - - # $ANTLR start T59 - def mT59(self, ): - - try: - self.type = T59 - - # C.g:61:5: ( 'EFI_BOOTSERVICE' ) - # C.g:61:7: 'EFI_BOOTSERVICE' - self.match("EFI_BOOTSERVICE") - - - - - - - finally: - - pass - - # $ANTLR end T59 - - - - # $ANTLR start T60 - def mT60(self, ): - - try: - self.type = T60 - - # C.g:62:5: ( 'EFI_RUNTIMESERVICE' ) - # C.g:62:7: 'EFI_RUNTIMESERVICE' - self.match("EFI_RUNTIMESERVICE") - - - - - - - finally: - - pass - - # $ANTLR end T60 - - - - # $ANTLR start T61 - def mT61(self, ): - - try: - self.type = T61 - - # C.g:63:5: ( 'PACKED' ) - # C.g:63:7: 'PACKED' - self.match("PACKED") - - - - - - - finally: - - pass - - # $ANTLR end T61 - - - - # $ANTLR start T62 - def mT62(self, ): - - try: - self.type = T62 - - # C.g:64:5: ( '(' ) - # C.g:64:7: '(' - self.match(u'(') - - - - - - finally: - - pass - - # $ANTLR end T62 - - - - # $ANTLR start T63 - def mT63(self, ): - - try: - self.type = T63 - - # C.g:65:5: ( ')' ) - # C.g:65:7: ')' - self.match(u')') - - - - - - finally: - - pass - - # $ANTLR end T63 - - - - # $ANTLR start T64 - def mT64(self, ): - - try: - self.type = T64 - - # C.g:66:5: ( '[' ) - # C.g:66:7: '[' - self.match(u'[') - - - - - - finally: - - pass - - # $ANTLR end T64 - - - - # $ANTLR start T65 - def mT65(self, ): - - try: - self.type = T65 - - # C.g:67:5: ( ']' ) - # C.g:67:7: ']' - self.match(u']') - - - - - - finally: - - pass - - # $ANTLR end T65 - - - - # $ANTLR start T66 - def mT66(self, ): - - try: - self.type = T66 - - # C.g:68:5: ( '*' ) - # C.g:68:7: '*' - self.match(u'*') - - - - - - finally: - - pass - - # $ANTLR end T66 - - - - # $ANTLR start T67 - def mT67(self, ): - - try: - self.type = T67 - - # C.g:69:5: ( '...' ) - # C.g:69:7: '...' - self.match("...") - - - - - - - finally: - - pass - - # $ANTLR end T67 - - - - # $ANTLR start T68 - def mT68(self, ): - - try: - self.type = T68 - - # C.g:70:5: ( '+' ) - # C.g:70:7: '+' - self.match(u'+') - - - - - - finally: - - pass - - # $ANTLR end T68 - - - - # $ANTLR start T69 - def mT69(self, ): - - try: - self.type = T69 - - # C.g:71:5: ( '-' ) - # C.g:71:7: '-' - self.match(u'-') - - - - - - finally: - - pass - - # $ANTLR end T69 - - - - # $ANTLR start T70 - def mT70(self, ): - - try: - self.type = T70 - - # C.g:72:5: ( '/' ) - # C.g:72:7: '/' - self.match(u'/') - - - - - - finally: - - pass - - # $ANTLR end T70 - - - - # $ANTLR start T71 - def mT71(self, ): - - try: - self.type = T71 - - # C.g:73:5: ( '%' ) - # C.g:73:7: '%' - self.match(u'%') - - - - - - finally: - - pass - - # $ANTLR end T71 - - - - # $ANTLR start T72 - def mT72(self, ): - - try: - self.type = T72 - - # C.g:74:5: ( '++' ) - # C.g:74:7: '++' - self.match("++") - - - - - - - finally: - - pass - - # $ANTLR end T72 - - - - # $ANTLR start T73 - def mT73(self, ): - - try: - self.type = T73 - - # C.g:75:5: ( '--' ) - # C.g:75:7: '--' - self.match("--") - - - - - - - finally: - - pass - - # $ANTLR end T73 - - - - # $ANTLR start T74 - def mT74(self, ): - - try: - self.type = T74 - - # C.g:76:5: ( 'sizeof' ) - # C.g:76:7: 'sizeof' - self.match("sizeof") - - - - - - - finally: - - pass - - # $ANTLR end T74 - - - - # $ANTLR start T75 - def mT75(self, ): - - try: - self.type = T75 - - # C.g:77:5: ( '.' ) - # C.g:77:7: '.' - self.match(u'.') - - - - - - finally: - - pass - - # $ANTLR end T75 - - - - # $ANTLR start T76 - def mT76(self, ): - - try: - self.type = T76 - - # C.g:78:5: ( '->' ) - # C.g:78:7: '->' - self.match("->") - - - - - - - finally: - - pass - - # $ANTLR end T76 - - - - # $ANTLR start T77 - def mT77(self, ): - - try: - self.type = T77 - - # C.g:79:5: ( '&' ) - # C.g:79:7: '&' - self.match(u'&') - - - - - - finally: - - pass - - # $ANTLR end T77 - - - - # $ANTLR start T78 - def mT78(self, ): - - try: - self.type = T78 - - # C.g:80:5: ( '~' ) - # C.g:80:7: '~' - self.match(u'~') - - - - - - finally: - - pass - - # $ANTLR end T78 - - - - # $ANTLR start T79 - def mT79(self, ): - - try: - self.type = T79 - - # C.g:81:5: ( '!' ) - # C.g:81:7: '!' - self.match(u'!') - - - - - - finally: - - pass - - # $ANTLR end T79 - - - - # $ANTLR start T80 - def mT80(self, ): - - try: - self.type = T80 - - # C.g:82:5: ( '*=' ) - # C.g:82:7: '*=' - self.match("*=") - - - - - - - finally: - - pass - - # $ANTLR end T80 - - - - # $ANTLR start T81 - def mT81(self, ): - - try: - self.type = T81 - - # C.g:83:5: ( '/=' ) - # C.g:83:7: '/=' - self.match("/=") - - - - - - - finally: - - pass - - # $ANTLR end T81 - - - - # $ANTLR start T82 - def mT82(self, ): - - try: - self.type = T82 - - # C.g:84:5: ( '%=' ) - # C.g:84:7: '%=' - self.match("%=") - - - - - - - finally: - - pass - - # $ANTLR end T82 - - - - # $ANTLR start T83 - def mT83(self, ): - - try: - self.type = T83 - - # C.g:85:5: ( '+=' ) - # C.g:85:7: '+=' - self.match("+=") - - - - - - - finally: - - pass - - # $ANTLR end T83 - - - - # $ANTLR start T84 - def mT84(self, ): - - try: - self.type = T84 - - # C.g:86:5: ( '-=' ) - # C.g:86:7: '-=' - self.match("-=") - - - - - - - finally: - - pass - - # $ANTLR end T84 - - - - # $ANTLR start T85 - def mT85(self, ): - - try: - self.type = T85 - - # C.g:87:5: ( '<<=' ) - # C.g:87:7: '<<=' - self.match("<<=") - - - - - - - finally: - - pass - - # $ANTLR end T85 - - - - # $ANTLR start T86 - def mT86(self, ): - - try: - self.type = T86 - - # C.g:88:5: ( '>>=' ) - # C.g:88:7: '>>=' - self.match(">>=") - - - - - - - finally: - - pass - - # $ANTLR end T86 - - - - # $ANTLR start T87 - def mT87(self, ): - - try: - self.type = T87 - - # C.g:89:5: ( '&=' ) - # C.g:89:7: '&=' - self.match("&=") - - - - - - - finally: - - pass - - # $ANTLR end T87 - - - - # $ANTLR start T88 - def mT88(self, ): - - try: - self.type = T88 - - # C.g:90:5: ( '^=' ) - # C.g:90:7: '^=' - self.match("^=") - - - - - - - finally: - - pass - - # $ANTLR end T88 - - - - # $ANTLR start T89 - def mT89(self, ): - - try: - self.type = T89 - - # C.g:91:5: ( '|=' ) - # C.g:91:7: '|=' - self.match("|=") - - - - - - - finally: - - pass - - # $ANTLR end T89 - - - - # $ANTLR start T90 - def mT90(self, ): - - try: - self.type = T90 - - # C.g:92:5: ( '?' ) - # C.g:92:7: '?' - self.match(u'?') - - - - - - finally: - - pass - - # $ANTLR end T90 - - - - # $ANTLR start T91 - def mT91(self, ): - - try: - self.type = T91 - - # C.g:93:5: ( '||' ) - # C.g:93:7: '||' - self.match("||") - - - - - - - finally: - - pass - - # $ANTLR end T91 - - - - # $ANTLR start T92 - def mT92(self, ): - - try: - self.type = T92 - - # C.g:94:5: ( '&&' ) - # C.g:94:7: '&&' - self.match("&&") - - - - - - - finally: - - pass - - # $ANTLR end T92 - - - - # $ANTLR start T93 - def mT93(self, ): - - try: - self.type = T93 - - # C.g:95:5: ( '|' ) - # C.g:95:7: '|' - self.match(u'|') - - - - - - finally: - - pass - - # $ANTLR end T93 - - - - # $ANTLR start T94 - def mT94(self, ): - - try: - self.type = T94 - - # C.g:96:5: ( '^' ) - # C.g:96:7: '^' - self.match(u'^') - - - - - - finally: - - pass - - # $ANTLR end T94 - - - - # $ANTLR start T95 - def mT95(self, ): - - try: - self.type = T95 - - # C.g:97:5: ( '==' ) - # C.g:97:7: '==' - self.match("==") - - - - - - - finally: - - pass - - # $ANTLR end T95 - - - - # $ANTLR start T96 - def mT96(self, ): - - try: - self.type = T96 - - # C.g:98:5: ( '!=' ) - # C.g:98:7: '!=' - self.match("!=") - - - - - - - finally: - - pass - - # $ANTLR end T96 - - - - # $ANTLR start T97 - def mT97(self, ): - - try: - self.type = T97 - - # C.g:99:5: ( '<' ) - # C.g:99:7: '<' - self.match(u'<') - - - - - - finally: - - pass - - # $ANTLR end T97 - - - - # $ANTLR start T98 - def mT98(self, ): - - try: - self.type = T98 - - # C.g:100:5: ( '>' ) - # C.g:100:7: '>' - self.match(u'>') - - - - - - finally: - - pass - - # $ANTLR end T98 - - - - # $ANTLR start T99 - def mT99(self, ): - - try: - self.type = T99 - - # C.g:101:5: ( '<=' ) - # C.g:101:7: '<=' - self.match("<=") - - - - - - - finally: - - pass - - # $ANTLR end T99 - - - - # $ANTLR start T100 - def mT100(self, ): - - try: - self.type = T100 - - # C.g:102:6: ( '>=' ) - # C.g:102:8: '>=' - self.match(">=") - - - - - - - finally: - - pass - - # $ANTLR end T100 - - - - # $ANTLR start T101 - def mT101(self, ): - - try: - self.type = T101 - - # C.g:103:6: ( '<<' ) - # C.g:103:8: '<<' - self.match("<<") - - - - - - - finally: - - pass - - # $ANTLR end T101 - - - - # $ANTLR start T102 - def mT102(self, ): - - try: - self.type = T102 - - # C.g:104:6: ( '>>' ) - # C.g:104:8: '>>' - self.match(">>") - - - - - - - finally: - - pass - - # $ANTLR end T102 - - - - # $ANTLR start T103 - def mT103(self, ): - - try: - self.type = T103 - - # C.g:105:6: ( '__asm__' ) - # C.g:105:8: '__asm__' - self.match("__asm__") - - - - - - - finally: - - pass - - # $ANTLR end T103 - - - - # $ANTLR start T104 - def mT104(self, ): - - try: - self.type = T104 - - # C.g:106:6: ( '_asm' ) - # C.g:106:8: '_asm' - self.match("_asm") - - - - - - - finally: - - pass - - # $ANTLR end T104 - - - - # $ANTLR start T105 - def mT105(self, ): - - try: - self.type = T105 - - # C.g:107:6: ( '__asm' ) - # C.g:107:8: '__asm' - self.match("__asm") - - - - - - - finally: - - pass - - # $ANTLR end T105 - - - - # $ANTLR start T106 - def mT106(self, ): - - try: - self.type = T106 - - # C.g:108:6: ( 'case' ) - # C.g:108:8: 'case' - self.match("case") - - - - - - - finally: - - pass - - # $ANTLR end T106 - - - - # $ANTLR start T107 - def mT107(self, ): - - try: - self.type = T107 - - # C.g:109:6: ( 'default' ) - # C.g:109:8: 'default' - self.match("default") - - - - - - - finally: - - pass - - # $ANTLR end T107 - - - - # $ANTLR start T108 - def mT108(self, ): - - try: - self.type = T108 - - # C.g:110:6: ( 'if' ) - # C.g:110:8: 'if' - self.match("if") - - - - - - - finally: - - pass - - # $ANTLR end T108 - - - - # $ANTLR start T109 - def mT109(self, ): - - try: - self.type = T109 - - # C.g:111:6: ( 'else' ) - # C.g:111:8: 'else' - self.match("else") - - - - - - - finally: - - pass - - # $ANTLR end T109 - - - - # $ANTLR start T110 - def mT110(self, ): - - try: - self.type = T110 - - # C.g:112:6: ( 'switch' ) - # C.g:112:8: 'switch' - self.match("switch") - - - - - - - finally: - - pass - - # $ANTLR end T110 - - - - # $ANTLR start T111 - def mT111(self, ): - - try: - self.type = T111 - - # C.g:113:6: ( 'while' ) - # C.g:113:8: 'while' - self.match("while") - - - - - - - finally: - - pass - - # $ANTLR end T111 - - - - # $ANTLR start T112 - def mT112(self, ): - - try: - self.type = T112 - - # C.g:114:6: ( 'do' ) - # C.g:114:8: 'do' - self.match("do") - - - - - - - finally: - - pass - - # $ANTLR end T112 - - - - # $ANTLR start T113 - def mT113(self, ): - - try: - self.type = T113 - - # C.g:115:6: ( 'for' ) - # C.g:115:8: 'for' - self.match("for") - - - - - - - finally: - - pass - - # $ANTLR end T113 - - - - # $ANTLR start T114 - def mT114(self, ): - - try: - self.type = T114 - - # C.g:116:6: ( 'goto' ) - # C.g:116:8: 'goto' - self.match("goto") - - - - - - - finally: - - pass - - # $ANTLR end T114 - - - - # $ANTLR start T115 - def mT115(self, ): - - try: - self.type = T115 - - # C.g:117:6: ( 'continue' ) - # C.g:117:8: 'continue' - self.match("continue") - - - - - - - finally: - - pass - - # $ANTLR end T115 - - - - # $ANTLR start T116 - def mT116(self, ): - - try: - self.type = T116 - - # C.g:118:6: ( 'break' ) - # C.g:118:8: 'break' - self.match("break") - - - - - - - finally: - - pass - - # $ANTLR end T116 - - - - # $ANTLR start T117 - def mT117(self, ): - - try: - self.type = T117 - - # C.g:119:6: ( 'return' ) - # C.g:119:8: 'return' - self.match("return") - - - - - - - finally: - - pass - - # $ANTLR end T117 - - - - # $ANTLR start IDENTIFIER - def mIDENTIFIER(self, ): - - try: - self.type = IDENTIFIER - - # C.g:586:2: ( LETTER ( LETTER | '0' .. '9' )* ) - # C.g:586:4: LETTER ( LETTER | '0' .. '9' )* - self.mLETTER() - - # C.g:586:11: ( LETTER | '0' .. '9' )* - while True: #loop1 - alt1 = 2 - LA1_0 = self.input.LA(1) - - if (LA1_0 == u'$' or (u'0' <= LA1_0 <= u'9') or (u'A' <= LA1_0 <= u'Z') or LA1_0 == u'_' or (u'a' <= LA1_0 <= u'z')) : - alt1 = 1 - - - if alt1 == 1: - # C.g: - if self.input.LA(1) == u'$' or (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop1 - - - - - - - finally: - - pass - - # $ANTLR end IDENTIFIER - - - - # $ANTLR start LETTER - def mLETTER(self, ): - - try: - # C.g:591:2: ( '$' | 'A' .. 'Z' | 'a' .. 'z' | '_' ) - # C.g: - if self.input.LA(1) == u'$' or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end LETTER - - - - # $ANTLR start CHARACTER_LITERAL - def mCHARACTER_LITERAL(self, ): - - try: - self.type = CHARACTER_LITERAL - - # C.g:598:5: ( ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' ) - # C.g:598:9: ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' - # C.g:598:9: ( 'L' )? - alt2 = 2 - LA2_0 = self.input.LA(1) - - if (LA2_0 == u'L') : - alt2 = 1 - if alt2 == 1: - # C.g:598:10: 'L' - self.match(u'L') - - - - - self.match(u'\'') - - # C.g:598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) - alt3 = 2 - LA3_0 = self.input.LA(1) - - if (LA3_0 == u'\\') : - alt3 = 1 - elif ((u'\u0000' <= LA3_0 <= u'&') or (u'(' <= LA3_0 <= u'[') or (u']' <= LA3_0 <= u'\uFFFE')) : - alt3 = 2 - else: - nvae = NoViableAltException("598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) )", 3, 0, self.input) - - raise nvae - - if alt3 == 1: - # C.g:598:23: EscapeSequence - self.mEscapeSequence() - - - - elif alt3 == 2: - # C.g:598:40: ~ ( '\\'' | '\\\\' ) - if (u'\u0000' <= self.input.LA(1) <= u'&') or (u'(' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - self.match(u'\'') - - - - - - finally: - - pass - - # $ANTLR end CHARACTER_LITERAL - - - - # $ANTLR start STRING_LITERAL - def mSTRING_LITERAL(self, ): - - try: - self.type = STRING_LITERAL - - # C.g:602:5: ( ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) - # C.g:602:8: ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' - # C.g:602:8: ( 'L' )? - alt4 = 2 - LA4_0 = self.input.LA(1) - - if (LA4_0 == u'L') : - alt4 = 1 - if alt4 == 1: - # C.g:602:9: 'L' - self.match(u'L') - - - - - self.match(u'"') - - # C.g:602:19: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* - while True: #loop5 - alt5 = 3 - LA5_0 = self.input.LA(1) - - if (LA5_0 == u'\\') : - alt5 = 1 - elif ((u'\u0000' <= LA5_0 <= u'!') or (u'#' <= LA5_0 <= u'[') or (u']' <= LA5_0 <= u'\uFFFE')) : - alt5 = 2 - - - if alt5 == 1: - # C.g:602:21: EscapeSequence - self.mEscapeSequence() - - - - elif alt5 == 2: - # C.g:602:38: ~ ( '\\\\' | '\"' ) - if (u'\u0000' <= self.input.LA(1) <= u'!') or (u'#' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop5 - - - self.match(u'"') - - - - - - finally: - - pass - - # $ANTLR end STRING_LITERAL - - - - # $ANTLR start HEX_LITERAL - def mHEX_LITERAL(self, ): - - try: - self.type = HEX_LITERAL - - # C.g:605:13: ( '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? ) - # C.g:605:15: '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? - self.match(u'0') - - if self.input.LA(1) == u'X' or self.input.LA(1) == u'x': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - # C.g:605:29: ( HexDigit )+ - cnt6 = 0 - while True: #loop6 - alt6 = 2 - LA6_0 = self.input.LA(1) - - if ((u'0' <= LA6_0 <= u'9') or (u'A' <= LA6_0 <= u'F') or (u'a' <= LA6_0 <= u'f')) : - alt6 = 1 - - - if alt6 == 1: - # C.g:605:29: HexDigit - self.mHexDigit() - - - - else: - if cnt6 >= 1: - break #loop6 - - eee = EarlyExitException(6, self.input) - raise eee - - cnt6 += 1 - - - # C.g:605:39: ( IntegerTypeSuffix )? - alt7 = 2 - LA7_0 = self.input.LA(1) - - if (LA7_0 == u'L' or LA7_0 == u'U' or LA7_0 == u'l' or LA7_0 == u'u') : - alt7 = 1 - if alt7 == 1: - # C.g:605:39: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end HEX_LITERAL - - - - # $ANTLR start DECIMAL_LITERAL - def mDECIMAL_LITERAL(self, ): - - try: - self.type = DECIMAL_LITERAL - - # C.g:607:17: ( ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? ) - # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? - # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) - alt9 = 2 - LA9_0 = self.input.LA(1) - - if (LA9_0 == u'0') : - alt9 = 1 - elif ((u'1' <= LA9_0 <= u'9')) : - alt9 = 2 - else: - nvae = NoViableAltException("607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* )", 9, 0, self.input) - - raise nvae - - if alt9 == 1: - # C.g:607:20: '0' - self.match(u'0') - - - - elif alt9 == 2: - # C.g:607:26: '1' .. '9' ( '0' .. '9' )* - self.matchRange(u'1', u'9') - - # C.g:607:35: ( '0' .. '9' )* - while True: #loop8 - alt8 = 2 - LA8_0 = self.input.LA(1) - - if ((u'0' <= LA8_0 <= u'9')) : - alt8 = 1 - - - if alt8 == 1: - # C.g:607:35: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - break #loop8 - - - - - - # C.g:607:46: ( IntegerTypeSuffix )? - alt10 = 2 - LA10_0 = self.input.LA(1) - - if (LA10_0 == u'L' or LA10_0 == u'U' or LA10_0 == u'l' or LA10_0 == u'u') : - alt10 = 1 - if alt10 == 1: - # C.g:607:46: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end DECIMAL_LITERAL - - - - # $ANTLR start OCTAL_LITERAL - def mOCTAL_LITERAL(self, ): - - try: - self.type = OCTAL_LITERAL - - # C.g:609:15: ( '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? ) - # C.g:609:17: '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? - self.match(u'0') - - # C.g:609:21: ( '0' .. '7' )+ - cnt11 = 0 - while True: #loop11 - alt11 = 2 - LA11_0 = self.input.LA(1) - - if ((u'0' <= LA11_0 <= u'7')) : - alt11 = 1 - - - if alt11 == 1: - # C.g:609:22: '0' .. '7' - self.matchRange(u'0', u'7') - - - - else: - if cnt11 >= 1: - break #loop11 - - eee = EarlyExitException(11, self.input) - raise eee - - cnt11 += 1 - - - # C.g:609:33: ( IntegerTypeSuffix )? - alt12 = 2 - LA12_0 = self.input.LA(1) - - if (LA12_0 == u'L' or LA12_0 == u'U' or LA12_0 == u'l' or LA12_0 == u'u') : - alt12 = 1 - if alt12 == 1: - # C.g:609:33: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end OCTAL_LITERAL - - - - # $ANTLR start HexDigit - def mHexDigit(self, ): - - try: - # C.g:612:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) ) - # C.g:612:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) - if (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'F') or (u'a' <= self.input.LA(1) <= u'f'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end HexDigit - - - - # $ANTLR start IntegerTypeSuffix - def mIntegerTypeSuffix(self, ): - - try: - # C.g:616:2: ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) ) - alt13 = 4 - LA13_0 = self.input.LA(1) - - if (LA13_0 == u'U' or LA13_0 == u'u') : - LA13_1 = self.input.LA(2) - - if (LA13_1 == u'L' or LA13_1 == u'l') : - LA13_3 = self.input.LA(3) - - if (LA13_3 == u'L' or LA13_3 == u'l') : - alt13 = 4 - else: - alt13 = 3 - else: - alt13 = 1 - elif (LA13_0 == u'L' or LA13_0 == u'l') : - alt13 = 2 - else: - nvae = NoViableAltException("614:1: fragment IntegerTypeSuffix : ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) );", 13, 0, self.input) - - raise nvae - - if alt13 == 1: - # C.g:616:4: ( 'u' | 'U' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 2: - # C.g:617:4: ( 'l' | 'L' ) - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 3: - # C.g:618:4: ( 'u' | 'U' ) ( 'l' | 'L' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 4: - # C.g:619:4: ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - finally: - - pass - - # $ANTLR end IntegerTypeSuffix - - - - # $ANTLR start FLOATING_POINT_LITERAL - def mFLOATING_POINT_LITERAL(self, ): - - try: - self.type = FLOATING_POINT_LITERAL - - # C.g:623:5: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? | '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? | ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? | ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix ) - alt25 = 4 - alt25 = self.dfa25.predict(self.input) - if alt25 == 1: - # C.g:623:9: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? - # C.g:623:9: ( '0' .. '9' )+ - cnt14 = 0 - while True: #loop14 - alt14 = 2 - LA14_0 = self.input.LA(1) - - if ((u'0' <= LA14_0 <= u'9')) : - alt14 = 1 - - - if alt14 == 1: - # C.g:623:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt14 >= 1: - break #loop14 - - eee = EarlyExitException(14, self.input) - raise eee - - cnt14 += 1 - - - self.match(u'.') - - # C.g:623:25: ( '0' .. '9' )* - while True: #loop15 - alt15 = 2 - LA15_0 = self.input.LA(1) - - if ((u'0' <= LA15_0 <= u'9')) : - alt15 = 1 - - - if alt15 == 1: - # C.g:623:26: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - break #loop15 - - - # C.g:623:37: ( Exponent )? - alt16 = 2 - LA16_0 = self.input.LA(1) - - if (LA16_0 == u'E' or LA16_0 == u'e') : - alt16 = 1 - if alt16 == 1: - # C.g:623:37: Exponent - self.mExponent() - - - - - # C.g:623:47: ( FloatTypeSuffix )? - alt17 = 2 - LA17_0 = self.input.LA(1) - - if (LA17_0 == u'D' or LA17_0 == u'F' or LA17_0 == u'd' or LA17_0 == u'f') : - alt17 = 1 - if alt17 == 1: - # C.g:623:47: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 2: - # C.g:624:9: '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? - self.match(u'.') - - # C.g:624:13: ( '0' .. '9' )+ - cnt18 = 0 - while True: #loop18 - alt18 = 2 - LA18_0 = self.input.LA(1) - - if ((u'0' <= LA18_0 <= u'9')) : - alt18 = 1 - - - if alt18 == 1: - # C.g:624:14: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt18 >= 1: - break #loop18 - - eee = EarlyExitException(18, self.input) - raise eee - - cnt18 += 1 - - - # C.g:624:25: ( Exponent )? - alt19 = 2 - LA19_0 = self.input.LA(1) - - if (LA19_0 == u'E' or LA19_0 == u'e') : - alt19 = 1 - if alt19 == 1: - # C.g:624:25: Exponent - self.mExponent() - - - - - # C.g:624:35: ( FloatTypeSuffix )? - alt20 = 2 - LA20_0 = self.input.LA(1) - - if (LA20_0 == u'D' or LA20_0 == u'F' or LA20_0 == u'd' or LA20_0 == u'f') : - alt20 = 1 - if alt20 == 1: - # C.g:624:35: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 3: - # C.g:625:9: ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? - # C.g:625:9: ( '0' .. '9' )+ - cnt21 = 0 - while True: #loop21 - alt21 = 2 - LA21_0 = self.input.LA(1) - - if ((u'0' <= LA21_0 <= u'9')) : - alt21 = 1 - - - if alt21 == 1: - # C.g:625:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt21 >= 1: - break #loop21 - - eee = EarlyExitException(21, self.input) - raise eee - - cnt21 += 1 - - - self.mExponent() - - # C.g:625:30: ( FloatTypeSuffix )? - alt22 = 2 - LA22_0 = self.input.LA(1) - - if (LA22_0 == u'D' or LA22_0 == u'F' or LA22_0 == u'd' or LA22_0 == u'f') : - alt22 = 1 - if alt22 == 1: - # C.g:625:30: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 4: - # C.g:626:9: ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix - # C.g:626:9: ( '0' .. '9' )+ - cnt23 = 0 - while True: #loop23 - alt23 = 2 - LA23_0 = self.input.LA(1) - - if ((u'0' <= LA23_0 <= u'9')) : - alt23 = 1 - - - if alt23 == 1: - # C.g:626:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt23 >= 1: - break #loop23 - - eee = EarlyExitException(23, self.input) - raise eee - - cnt23 += 1 - - - # C.g:626:21: ( Exponent )? - alt24 = 2 - LA24_0 = self.input.LA(1) - - if (LA24_0 == u'E' or LA24_0 == u'e') : - alt24 = 1 - if alt24 == 1: - # C.g:626:21: Exponent - self.mExponent() - - - - - self.mFloatTypeSuffix() - - - - - finally: - - pass - - # $ANTLR end FLOATING_POINT_LITERAL - - - - # $ANTLR start Exponent - def mExponent(self, ): - - try: - # C.g:630:10: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ ) - # C.g:630:12: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ - if self.input.LA(1) == u'E' or self.input.LA(1) == u'e': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - # C.g:630:22: ( '+' | '-' )? - alt26 = 2 - LA26_0 = self.input.LA(1) - - if (LA26_0 == u'+' or LA26_0 == u'-') : - alt26 = 1 - if alt26 == 1: - # C.g: - if self.input.LA(1) == u'+' or self.input.LA(1) == u'-': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - # C.g:630:33: ( '0' .. '9' )+ - cnt27 = 0 - while True: #loop27 - alt27 = 2 - LA27_0 = self.input.LA(1) - - if ((u'0' <= LA27_0 <= u'9')) : - alt27 = 1 - - - if alt27 == 1: - # C.g:630:34: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt27 >= 1: - break #loop27 - - eee = EarlyExitException(27, self.input) - raise eee - - cnt27 += 1 - - - - - - - finally: - - pass - - # $ANTLR end Exponent - - - - # $ANTLR start FloatTypeSuffix - def mFloatTypeSuffix(self, ): - - try: - # C.g:633:17: ( ( 'f' | 'F' | 'd' | 'D' ) ) - # C.g:633:19: ( 'f' | 'F' | 'd' | 'D' ) - if self.input.LA(1) == u'D' or self.input.LA(1) == u'F' or self.input.LA(1) == u'd' or self.input.LA(1) == u'f': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end FloatTypeSuffix - - - - # $ANTLR start EscapeSequence - def mEscapeSequence(self, ): - - try: - # C.g:637:5: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape ) - alt28 = 2 - LA28_0 = self.input.LA(1) - - if (LA28_0 == u'\\') : - LA28_1 = self.input.LA(2) - - if (LA28_1 == u'"' or LA28_1 == u'\'' or LA28_1 == u'\\' or LA28_1 == u'b' or LA28_1 == u'f' or LA28_1 == u'n' or LA28_1 == u'r' or LA28_1 == u't') : - alt28 = 1 - elif ((u'0' <= LA28_1 <= u'7')) : - alt28 = 2 - else: - nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 1, self.input) - - raise nvae - - else: - nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 0, self.input) - - raise nvae - - if alt28 == 1: - # C.g:637:8: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) - self.match(u'\\') - - if self.input.LA(1) == u'"' or self.input.LA(1) == u'\'' or self.input.LA(1) == u'\\' or self.input.LA(1) == u'b' or self.input.LA(1) == u'f' or self.input.LA(1) == u'n' or self.input.LA(1) == u'r' or self.input.LA(1) == u't': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt28 == 2: - # C.g:638:9: OctalEscape - self.mOctalEscape() - - - - - finally: - - pass - - # $ANTLR end EscapeSequence - - - - # $ANTLR start OctalEscape - def mOctalEscape(self, ): - - try: - # C.g:643:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ) - alt29 = 3 - LA29_0 = self.input.LA(1) - - if (LA29_0 == u'\\') : - LA29_1 = self.input.LA(2) - - if ((u'0' <= LA29_1 <= u'3')) : - LA29_2 = self.input.LA(3) - - if ((u'0' <= LA29_2 <= u'7')) : - LA29_4 = self.input.LA(4) - - if ((u'0' <= LA29_4 <= u'7')) : - alt29 = 1 - else: - alt29 = 2 - else: - alt29 = 3 - elif ((u'4' <= LA29_1 <= u'7')) : - LA29_3 = self.input.LA(3) - - if ((u'0' <= LA29_3 <= u'7')) : - alt29 = 2 - else: - alt29 = 3 - else: - nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 1, self.input) - - raise nvae - - else: - nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 0, self.input) - - raise nvae - - if alt29 == 1: - # C.g:643:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) - self.match(u'\\') - - # C.g:643:14: ( '0' .. '3' ) - # C.g:643:15: '0' .. '3' - self.matchRange(u'0', u'3') - - - - - # C.g:643:25: ( '0' .. '7' ) - # C.g:643:26: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - # C.g:643:36: ( '0' .. '7' ) - # C.g:643:37: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - elif alt29 == 2: - # C.g:644:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) - self.match(u'\\') - - # C.g:644:14: ( '0' .. '7' ) - # C.g:644:15: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - # C.g:644:25: ( '0' .. '7' ) - # C.g:644:26: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - elif alt29 == 3: - # C.g:645:9: '\\\\' ( '0' .. '7' ) - self.match(u'\\') - - # C.g:645:14: ( '0' .. '7' ) - # C.g:645:15: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - - finally: - - pass - - # $ANTLR end OctalEscape - - - - # $ANTLR start UnicodeEscape - def mUnicodeEscape(self, ): - - try: - # C.g:650:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit ) - # C.g:650:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit - self.match(u'\\') - - self.match(u'u') - - self.mHexDigit() - - self.mHexDigit() - - self.mHexDigit() - - self.mHexDigit() - - - - - - finally: - - pass - - # $ANTLR end UnicodeEscape - - - - # $ANTLR start WS - def mWS(self, ): - - try: - self.type = WS - - # C.g:653:5: ( ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) ) - # C.g:653:8: ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) - if (u'\t' <= self.input.LA(1) <= u'\n') or (u'\f' <= self.input.LA(1) <= u'\r') or self.input.LA(1) == u' ': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end WS - - - - # $ANTLR start BS - def mBS(self, ): - - try: - self.type = BS - - # C.g:657:5: ( ( '\\\\' ) ) - # C.g:657:7: ( '\\\\' ) - # C.g:657:7: ( '\\\\' ) - # C.g:657:8: '\\\\' - self.match(u'\\') - - - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end BS - - - - # $ANTLR start UnicodeVocabulary - def mUnicodeVocabulary(self, ): - - try: - self.type = UnicodeVocabulary - - # C.g:665:5: ( '\\u0003' .. '\\uFFFE' ) - # C.g:665:7: '\\u0003' .. '\\uFFFE' - self.matchRange(u'\u0003', u'\uFFFE') - - - - - - finally: - - pass - - # $ANTLR end UnicodeVocabulary - - - - # $ANTLR start COMMENT - def mCOMMENT(self, ): - - try: - self.type = COMMENT - - # C.g:668:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) - # C.g:668:9: '/*' ( options {greedy=false; } : . )* '*/' - self.match("/*") - - - # C.g:668:14: ( options {greedy=false; } : . )* - while True: #loop30 - alt30 = 2 - LA30_0 = self.input.LA(1) - - if (LA30_0 == u'*') : - LA30_1 = self.input.LA(2) - - if (LA30_1 == u'/') : - alt30 = 2 - elif ((u'\u0000' <= LA30_1 <= u'.') or (u'0' <= LA30_1 <= u'\uFFFE')) : - alt30 = 1 - - - elif ((u'\u0000' <= LA30_0 <= u')') or (u'+' <= LA30_0 <= u'\uFFFE')) : - alt30 = 1 - - - if alt30 == 1: - # C.g:668:42: . - self.matchAny() - - - - else: - break #loop30 - - - self.match("*/") - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end COMMENT - - - - # $ANTLR start LINE_COMMENT - def mLINE_COMMENT(self, ): - - try: - self.type = LINE_COMMENT - - # C.g:673:5: ( '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) - # C.g:673:7: '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' - self.match("//") - - - # C.g:673:12: (~ ( '\\n' | '\\r' ) )* - while True: #loop31 - alt31 = 2 - LA31_0 = self.input.LA(1) - - if ((u'\u0000' <= LA31_0 <= u'\t') or (u'\u000B' <= LA31_0 <= u'\f') or (u'\u000E' <= LA31_0 <= u'\uFFFE')) : - alt31 = 1 - - - if alt31 == 1: - # C.g:673:12: ~ ( '\\n' | '\\r' ) - if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop31 - - - # C.g:673:26: ( '\\r' )? - alt32 = 2 - LA32_0 = self.input.LA(1) - - if (LA32_0 == u'\r') : - alt32 = 1 - if alt32 == 1: - # C.g:673:26: '\\r' - self.match(u'\r') - - - - - self.match(u'\n') - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end LINE_COMMENT - - - - # $ANTLR start LINE_COMMAND - def mLINE_COMMAND(self, ): - - try: - self.type = LINE_COMMAND - - # C.g:678:5: ( '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) - # C.g:678:7: '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' - self.match(u'#') - - # C.g:678:11: (~ ( '\\n' | '\\r' ) )* - while True: #loop33 - alt33 = 2 - LA33_0 = self.input.LA(1) - - if ((u'\u0000' <= LA33_0 <= u'\t') or (u'\u000B' <= LA33_0 <= u'\f') or (u'\u000E' <= LA33_0 <= u'\uFFFE')) : - alt33 = 1 - - - if alt33 == 1: - # C.g:678:11: ~ ( '\\n' | '\\r' ) - if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop33 - - - # C.g:678:25: ( '\\r' )? - alt34 = 2 - LA34_0 = self.input.LA(1) - - if (LA34_0 == u'\r') : - alt34 = 1 - if alt34 == 1: - # C.g:678:25: '\\r' - self.match(u'\r') - - - - - self.match(u'\n') - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end LINE_COMMAND - - - - def mTokens(self): - # C.g:1:8: ( T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | T90 | T91 | T92 | T93 | T94 | T95 | T96 | T97 | T98 | T99 | T100 | T101 | T102 | T103 | T104 | T105 | T106 | T107 | T108 | T109 | T110 | T111 | T112 | T113 | T114 | T115 | T116 | T117 | IDENTIFIER | CHARACTER_LITERAL | STRING_LITERAL | HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL | FLOATING_POINT_LITERAL | WS | BS | UnicodeVocabulary | COMMENT | LINE_COMMENT | LINE_COMMAND ) - alt35 = 106 - alt35 = self.dfa35.predict(self.input) - if alt35 == 1: - # C.g:1:10: T25 - self.mT25() - - - - elif alt35 == 2: - # C.g:1:14: T26 - self.mT26() - - - - elif alt35 == 3: - # C.g:1:18: T27 - self.mT27() - - - - elif alt35 == 4: - # C.g:1:22: T28 - self.mT28() - - - - elif alt35 == 5: - # C.g:1:26: T29 - self.mT29() - - - - elif alt35 == 6: - # C.g:1:30: T30 - self.mT30() - - - - elif alt35 == 7: - # C.g:1:34: T31 - self.mT31() - - - - elif alt35 == 8: - # C.g:1:38: T32 - self.mT32() - - - - elif alt35 == 9: - # C.g:1:42: T33 - self.mT33() - - - - elif alt35 == 10: - # C.g:1:46: T34 - self.mT34() - - - - elif alt35 == 11: - # C.g:1:50: T35 - self.mT35() - - - - elif alt35 == 12: - # C.g:1:54: T36 - self.mT36() - - - - elif alt35 == 13: - # C.g:1:58: T37 - self.mT37() - - - - elif alt35 == 14: - # C.g:1:62: T38 - self.mT38() - - - - elif alt35 == 15: - # C.g:1:66: T39 - self.mT39() - - - - elif alt35 == 16: - # C.g:1:70: T40 - self.mT40() - - - - elif alt35 == 17: - # C.g:1:74: T41 - self.mT41() - - - - elif alt35 == 18: - # C.g:1:78: T42 - self.mT42() - - - - elif alt35 == 19: - # C.g:1:82: T43 - self.mT43() - - - - elif alt35 == 20: - # C.g:1:86: T44 - self.mT44() - - - - elif alt35 == 21: - # C.g:1:90: T45 - self.mT45() - - - - elif alt35 == 22: - # C.g:1:94: T46 - self.mT46() - - - - elif alt35 == 23: - # C.g:1:98: T47 - self.mT47() - - - - elif alt35 == 24: - # C.g:1:102: T48 - self.mT48() - - - - elif alt35 == 25: - # C.g:1:106: T49 - self.mT49() - - - - elif alt35 == 26: - # C.g:1:110: T50 - self.mT50() - - - - elif alt35 == 27: - # C.g:1:114: T51 - self.mT51() - - - - elif alt35 == 28: - # C.g:1:118: T52 - self.mT52() - - - - elif alt35 == 29: - # C.g:1:122: T53 - self.mT53() - - - - elif alt35 == 30: - # C.g:1:126: T54 - self.mT54() - - - - elif alt35 == 31: - # C.g:1:130: T55 - self.mT55() - - - - elif alt35 == 32: - # C.g:1:134: T56 - self.mT56() - - - - elif alt35 == 33: - # C.g:1:138: T57 - self.mT57() - - - - elif alt35 == 34: - # C.g:1:142: T58 - self.mT58() - - - - elif alt35 == 35: - # C.g:1:146: T59 - self.mT59() - - - - elif alt35 == 36: - # C.g:1:150: T60 - self.mT60() - - - - elif alt35 == 37: - # C.g:1:154: T61 - self.mT61() - - - - elif alt35 == 38: - # C.g:1:158: T62 - self.mT62() - - - - elif alt35 == 39: - # C.g:1:162: T63 - self.mT63() - - - - elif alt35 == 40: - # C.g:1:166: T64 - self.mT64() - - - - elif alt35 == 41: - # C.g:1:170: T65 - self.mT65() - - - - elif alt35 == 42: - # C.g:1:174: T66 - self.mT66() - - - - elif alt35 == 43: - # C.g:1:178: T67 - self.mT67() - - - - elif alt35 == 44: - # C.g:1:182: T68 - self.mT68() - - - - elif alt35 == 45: - # C.g:1:186: T69 - self.mT69() - - - - elif alt35 == 46: - # C.g:1:190: T70 - self.mT70() - - - - elif alt35 == 47: - # C.g:1:194: T71 - self.mT71() - - - - elif alt35 == 48: - # C.g:1:198: T72 - self.mT72() - - - - elif alt35 == 49: - # C.g:1:202: T73 - self.mT73() - - - - elif alt35 == 50: - # C.g:1:206: T74 - self.mT74() - - - - elif alt35 == 51: - # C.g:1:210: T75 - self.mT75() - - - - elif alt35 == 52: - # C.g:1:214: T76 - self.mT76() - - - - elif alt35 == 53: - # C.g:1:218: T77 - self.mT77() - - - - elif alt35 == 54: - # C.g:1:222: T78 - self.mT78() - - - - elif alt35 == 55: - # C.g:1:226: T79 - self.mT79() - - - - elif alt35 == 56: - # C.g:1:230: T80 - self.mT80() - - - - elif alt35 == 57: - # C.g:1:234: T81 - self.mT81() - - - - elif alt35 == 58: - # C.g:1:238: T82 - self.mT82() - - - - elif alt35 == 59: - # C.g:1:242: T83 - self.mT83() - - - - elif alt35 == 60: - # C.g:1:246: T84 - self.mT84() - - - - elif alt35 == 61: - # C.g:1:250: T85 - self.mT85() - - - - elif alt35 == 62: - # C.g:1:254: T86 - self.mT86() - - - - elif alt35 == 63: - # C.g:1:258: T87 - self.mT87() - - - - elif alt35 == 64: - # C.g:1:262: T88 - self.mT88() - - - - elif alt35 == 65: - # C.g:1:266: T89 - self.mT89() - - - - elif alt35 == 66: - # C.g:1:270: T90 - self.mT90() - - - - elif alt35 == 67: - # C.g:1:274: T91 - self.mT91() - - - - elif alt35 == 68: - # C.g:1:278: T92 - self.mT92() - - - - elif alt35 == 69: - # C.g:1:282: T93 - self.mT93() - - - - elif alt35 == 70: - # C.g:1:286: T94 - self.mT94() - - - - elif alt35 == 71: - # C.g:1:290: T95 - self.mT95() - - - - elif alt35 == 72: - # C.g:1:294: T96 - self.mT96() - - - - elif alt35 == 73: - # C.g:1:298: T97 - self.mT97() - - - - elif alt35 == 74: - # C.g:1:302: T98 - self.mT98() - - - - elif alt35 == 75: - # C.g:1:306: T99 - self.mT99() - - - - elif alt35 == 76: - # C.g:1:310: T100 - self.mT100() - - - - elif alt35 == 77: - # C.g:1:315: T101 - self.mT101() - - - - elif alt35 == 78: - # C.g:1:320: T102 - self.mT102() - - - - elif alt35 == 79: - # C.g:1:325: T103 - self.mT103() - - - - elif alt35 == 80: - # C.g:1:330: T104 - self.mT104() - - - - elif alt35 == 81: - # C.g:1:335: T105 - self.mT105() - - - - elif alt35 == 82: - # C.g:1:340: T106 - self.mT106() - - - - elif alt35 == 83: - # C.g:1:345: T107 - self.mT107() - - - - elif alt35 == 84: - # C.g:1:350: T108 - self.mT108() - - - - elif alt35 == 85: - # C.g:1:355: T109 - self.mT109() - - - - elif alt35 == 86: - # C.g:1:360: T110 - self.mT110() - - - - elif alt35 == 87: - # C.g:1:365: T111 - self.mT111() - - - - elif alt35 == 88: - # C.g:1:370: T112 - self.mT112() - - - - elif alt35 == 89: - # C.g:1:375: T113 - self.mT113() - - - - elif alt35 == 90: - # C.g:1:380: T114 - self.mT114() - - - - elif alt35 == 91: - # C.g:1:385: T115 - self.mT115() - - - - elif alt35 == 92: - # C.g:1:390: T116 - self.mT116() - - - - elif alt35 == 93: - # C.g:1:395: T117 - self.mT117() - - - - elif alt35 == 94: - # C.g:1:400: IDENTIFIER - self.mIDENTIFIER() - - - - elif alt35 == 95: - # C.g:1:411: CHARACTER_LITERAL - self.mCHARACTER_LITERAL() - - - - elif alt35 == 96: - # C.g:1:429: STRING_LITERAL - self.mSTRING_LITERAL() - - - - elif alt35 == 97: - # C.g:1:444: HEX_LITERAL - self.mHEX_LITERAL() - - - - elif alt35 == 98: - # C.g:1:456: DECIMAL_LITERAL - self.mDECIMAL_LITERAL() - - - - elif alt35 == 99: - # C.g:1:472: OCTAL_LITERAL - self.mOCTAL_LITERAL() - - - - elif alt35 == 100: - # C.g:1:486: FLOATING_POINT_LITERAL - self.mFLOATING_POINT_LITERAL() - - - - elif alt35 == 101: - # C.g:1:509: WS - self.mWS() - - - - elif alt35 == 102: - # C.g:1:512: BS - self.mBS() - - - - elif alt35 == 103: - # C.g:1:515: UnicodeVocabulary - self.mUnicodeVocabulary() - - - - elif alt35 == 104: - # C.g:1:533: COMMENT - self.mCOMMENT() - - - - elif alt35 == 105: - # C.g:1:541: LINE_COMMENT - self.mLINE_COMMENT() - - - - elif alt35 == 106: - # C.g:1:554: LINE_COMMAND - self.mLINE_COMMAND() - - - - - - - - - # lookup tables for DFA #25 - - DFA25_eot = DFA.unpack( - u"\7\uffff\1\10\2\uffff" - ) - - DFA25_eof = DFA.unpack( - u"\12\uffff" - ) - - DFA25_min = DFA.unpack( - u"\2\56\2\uffff\1\53\1\uffff\2\60\2\uffff" - ) - - DFA25_max = DFA.unpack( - u"\1\71\1\146\2\uffff\1\71\1\uffff\1\71\1\146\2\uffff" - ) - - DFA25_accept = DFA.unpack( - u"\2\uffff\1\2\1\1\1\uffff\1\4\2\uffff\2\3" - ) - - DFA25_special = DFA.unpack( - u"\12\uffff" - ) - - - DFA25_transition = [ - DFA.unpack(u"\1\2\1\uffff\12\1"), - DFA.unpack(u"\1\3\1\uffff\12\1\12\uffff\1\5\1\4\1\5\35\uffff\1\5" - u"\1\4\1\5"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\6\1\uffff\1\6\2\uffff\12\7"), - DFA.unpack(u""), - DFA.unpack(u"\12\7"), - DFA.unpack(u"\12\7\12\uffff\1\11\1\uffff\1\11\35\uffff\1\11\1\uffff" - u"\1\11"), - DFA.unpack(u""), - DFA.unpack(u"") - ] - - # class definition for DFA #25 - - DFA25 = DFA - # lookup tables for DFA #35 - - DFA35_eot = DFA.unpack( - u"\2\uffff\1\76\1\uffff\1\101\14\76\3\uffff\10\76\4\uffff\1\151\1" - u"\153\1\157\1\163\1\167\1\171\1\174\1\uffff\1\177\1\u0082\1\u0085" - u"\1\u0087\1\u008a\1\uffff\5\76\1\uffff\2\73\2\u0095\2\uffff\1\73" - u"\2\uffff\1\76\4\uffff\16\76\1\u00ad\5\76\1\u00b4\1\76\3\uffff\1" - u"\u00b7\10\76\34\uffff\1\u00c1\2\uffff\1\u00c3\10\uffff\5\76\3\uffff" - u"\1\u00c9\1\uffff\1\u0095\3\uffff\23\76\1\uffff\1\u00de\1\76\1\u00e0" - u"\3\76\1\uffff\2\76\1\uffff\1\76\1\u00e7\6\76\4\uffff\5\76\1\uffff" - u"\1\76\1\u00f5\1\76\1\u00f7\6\76\1\u00fe\4\76\1\u0103\1\u0104\2" - u"\76\1\u0107\1\uffff\1\u0108\1\uffff\6\76\1\uffff\10\76\1\u0118" - u"\1\76\1\u011a\2\76\1\uffff\1\76\1\uffff\5\76\1\u0123\1\uffff\4" - u"\76\2\uffff\1\76\1\u0129\2\uffff\1\u012a\3\76\1\u012e\1\76\1\u0130" - u"\7\76\1\u0139\1\uffff\1\u013a\1\uffff\1\u013b\1\76\1\u013d\1\u013e" - u"\1\u013f\1\u0140\1\u0141\1\u0142\1\uffff\1\76\1\u0144\1\u0145\2" - u"\76\2\uffff\1\76\1\u0149\1\76\1\uffff\1\76\1\uffff\5\76\1\u0151" - u"\1\u0152\1\76\3\uffff\1\u0154\6\uffff\1\76\2\uffff\2\76\1\u0158" - u"\1\uffff\7\76\2\uffff\1\u0160\1\uffff\1\u0161\1\u0162\1\u0163\1" - u"\uffff\1\u0164\1\u0165\1\76\1\u0167\3\76\6\uffff\1\u016b\1\uffff" - u"\3\76\1\uffff\21\76\1\u0180\2\76\1\uffff\3\76\1\u0186\1\76\1\uffff" - u"\11\76\1\u0191\1\uffff" - ) - - DFA35_eof = DFA.unpack( - u"\u0192\uffff" - ) - - DFA35_min = DFA.unpack( - u"\1\3\1\uffff\1\171\1\uffff\1\75\1\154\1\150\1\165\1\145\1\124\1" - u"\157\1\141\1\146\1\157\1\154\1\145\1\156\3\uffff\1\116\1\120\1" - u"\117\1\116\1\117\1\114\1\106\1\101\4\uffff\1\75\1\56\1\53\1\55" - u"\1\52\1\75\1\46\1\uffff\1\75\1\74\3\75\1\uffff\1\137\1\150\1\157" - u"\1\162\1\42\1\uffff\2\0\2\56\2\uffff\1\0\2\uffff\1\160\4\uffff" - u"\1\163\1\164\1\165\1\151\1\141\1\147\1\157\1\164\1\147\1\101\1" - u"\151\1\163\1\156\1\141\1\44\1\164\1\156\1\162\1\157\1\146\1\44" - u"\1\151\3\uffff\1\44\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34" - u"\uffff\1\75\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145" - u"\3\uffff\1\56\1\uffff\1\56\3\uffff\3\145\1\155\2\164\1\165\1\145" - u"\1\156\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\163\1" - u"\162\1\uffff\1\44\1\147\1\44\2\141\1\142\1\uffff\1\151\1\157\1" - u"\uffff\1\111\1\44\1\123\1\114\1\101\1\102\1\101\1\113\4\uffff\1" - u"\163\1\155\1\154\1\157\1\141\1\uffff\1\144\1\44\1\162\1\44\1\143" - u"\1\151\1\143\1\157\1\145\1\164\1\44\1\163\1\162\1\111\1\164\2\44" - u"\1\151\1\164\1\44\1\uffff\1\44\1\uffff\1\164\1\165\1\154\1\147" - u"\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\102\1\120\1\105" - u"\1\155\1\44\1\145\1\44\1\153\1\145\1\uffff\1\156\1\uffff\1\150" - u"\1\143\1\164\1\146\1\144\1\44\1\uffff\1\164\1\156\1\103\1\151\2" - u"\uffff\1\156\1\44\2\uffff\1\44\1\154\1\145\1\156\1\44\1\116\1\44" - u"\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\44\1\uffff\1\44\1" - u"\uffff\1\44\1\146\6\44\1\uffff\1\145\2\44\1\154\1\165\2\uffff\1" - u"\164\1\44\1\145\1\uffff\1\101\1\uffff\1\116\1\114\1\137\1\116\1" - u"\117\2\44\1\137\3\uffff\1\44\6\uffff\1\162\2\uffff\2\145\1\44\1" - u"\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff\1\44\1\uffff\3\44" - u"\1\uffff\2\44\1\104\1\44\1\105\1\111\1\123\6\uffff\1\44\1\uffff" - u"\2\115\1\105\1\uffff\1\117\1\105\1\122\1\126\1\123\1\126\2\105" - u"\1\111\1\137\1\122\1\103\1\111\1\126\1\105\1\106\1\111\1\44\1\137" - u"\1\103\1\uffff\1\125\1\105\1\116\1\44\1\122\1\uffff\1\105\1\106" - u"\1\105\1\122\1\105\1\116\1\103\1\105\1\104\1\44\1\uffff" - ) - - DFA35_max = DFA.unpack( - u"\1\ufffe\1\uffff\1\171\1\uffff\1\75\1\170\1\167\1\165\1\145\1\124" - u"\2\157\1\156\3\157\1\156\3\uffff\1\116\1\125\1\117\1\116\1\117" - u"\1\114\1\106\1\101\4\uffff\1\75\1\71\1\75\1\76\3\75\1\uffff\2\75" - u"\1\76\1\75\1\174\1\uffff\1\141\1\150\1\157\1\162\1\47\1\uffff\2" - u"\ufffe\1\170\1\146\2\uffff\1\ufffe\2\uffff\1\160\4\uffff\1\163" - u"\1\164\1\165\1\151\1\162\1\172\1\157\2\164\1\101\1\154\1\163\1" - u"\156\1\141\1\172\1\164\1\156\1\162\1\157\1\146\1\172\1\163\3\uffff" - u"\1\172\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34\uffff\1\75" - u"\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145\3\uffff\1" - u"\146\1\uffff\1\146\3\uffff\3\145\1\155\2\164\1\165\1\145\1\156" - u"\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\164\1\162\1" - u"\uffff\1\172\1\147\1\172\2\141\1\142\1\uffff\1\151\1\157\1\uffff" - u"\1\111\1\172\1\123\1\114\1\101\1\102\1\137\1\113\4\uffff\1\163" - u"\1\155\1\154\1\157\1\141\1\uffff\1\144\1\172\1\162\1\172\1\143" - u"\1\151\1\143\1\157\1\145\1\164\1\172\1\163\1\162\1\111\1\164\2" - u"\172\1\151\1\164\1\172\1\uffff\1\172\1\uffff\1\164\1\165\1\154" - u"\1\147\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\122\1\120" - u"\1\105\1\155\1\172\1\145\1\172\1\153\1\145\1\uffff\1\156\1\uffff" - u"\1\150\1\143\1\164\1\146\1\144\1\172\1\uffff\1\164\1\156\1\103" - u"\1\151\2\uffff\1\156\1\172\2\uffff\1\172\1\154\1\145\1\156\1\172" - u"\1\116\1\172\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\172\1" - u"\uffff\1\172\1\uffff\1\172\1\146\6\172\1\uffff\1\145\2\172\1\154" - u"\1\165\2\uffff\1\164\1\172\1\145\1\uffff\1\101\1\uffff\1\116\1" - u"\114\1\137\1\116\1\117\2\172\1\137\3\uffff\1\172\6\uffff\1\162" - u"\2\uffff\2\145\1\172\1\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff" - u"\1\172\1\uffff\3\172\1\uffff\2\172\1\104\1\172\1\105\1\111\1\123" - u"\6\uffff\1\172\1\uffff\2\115\1\105\1\uffff\1\117\1\105\1\122\1" - u"\126\1\123\1\126\2\105\1\111\1\137\1\122\1\103\1\111\1\126\1\105" - u"\1\106\1\111\1\172\1\137\1\103\1\uffff\1\125\1\105\1\116\1\172" - u"\1\122\1\uffff\1\105\1\106\1\105\1\122\1\105\1\116\1\103\1\105" - u"\1\104\1\172\1\uffff" - ) - - DFA35_accept = DFA.unpack( - u"\1\uffff\1\1\1\uffff\1\3\15\uffff\1\23\1\24\1\27\10\uffff\1\46" - u"\1\47\1\50\1\51\7\uffff\1\66\5\uffff\1\102\5\uffff\1\136\4\uffff" - u"\1\145\1\146\1\uffff\1\147\1\1\1\uffff\1\136\1\3\1\107\1\4\26\uffff" - u"\1\23\1\24\1\27\11\uffff\1\46\1\47\1\50\1\51\1\70\1\52\1\53\1\63" - u"\1\144\1\73\1\60\1\54\1\74\1\64\1\61\1\55\1\150\1\151\1\71\1\56" - u"\1\72\1\57\1\77\1\104\1\65\1\66\1\110\1\67\1\uffff\1\113\1\111" - u"\1\uffff\1\114\1\112\1\100\1\106\1\103\1\101\1\105\1\102\5\uffff" - u"\1\140\1\137\1\141\1\uffff\1\142\1\uffff\1\145\1\146\1\152\23\uffff" - u"\1\124\6\uffff\1\130\2\uffff\1\33\10\uffff\1\75\1\115\1\76\1\116" - u"\5\uffff\1\143\24\uffff\1\15\1\uffff\1\131\6\uffff\1\34\15\uffff" - u"\1\125\1\uffff\1\30\6\uffff\1\7\4\uffff\1\12\1\122\2\uffff\1\13" - u"\1\16\17\uffff\1\120\1\uffff\1\132\10\uffff\1\14\5\uffff\1\31\1" - u"\17\3\uffff\1\26\1\uffff\1\36\10\uffff\1\121\1\127\1\134\1\uffff" - u"\1\5\1\126\1\6\1\25\1\62\1\21\1\uffff\1\135\1\11\3\uffff\1\20\7" - u"\uffff\1\42\1\45\1\uffff\1\2\3\uffff\1\123\7\uffff\1\117\1\10\1" - u"\32\1\133\1\22\1\35\1\uffff\1\40\3\uffff\1\37\24\uffff\1\43\5\uffff" - u"\1\44\12\uffff\1\41" - ) - - DFA35_special = DFA.unpack( - u"\u0192\uffff" - ) - - - DFA35_transition = [ - DFA.unpack(u"\6\73\2\70\1\73\2\70\22\73\1\70\1\50\1\65\1\72\1\63" - u"\1\45\1\46\1\64\1\34\1\35\1\40\1\42\1\3\1\43\1\41\1\44\1\66\11" - u"\67\1\23\1\1\1\51\1\4\1\52\1\55\1\73\2\63\1\26\1\63\1\32\1\63\1" - u"\31\1\63\1\24\2\63\1\62\2\63\1\25\1\33\2\63\1\11\1\63\1\27\1\30" - u"\4\63\1\36\1\71\1\37\1\53\1\56\1\73\1\7\1\61\1\13\1\17\1\5\1\16" - u"\1\60\1\63\1\14\2\63\1\15\5\63\1\10\1\6\1\2\1\20\1\12\1\57\3\63" - u"\1\21\1\54\1\22\1\47\uff80\73"), - DFA.unpack(u""), - DFA.unpack(u"\1\75"), - DFA.unpack(u""), - DFA.unpack(u"\1\100"), - DFA.unpack(u"\1\102\1\uffff\1\104\11\uffff\1\103"), - DFA.unpack(u"\1\110\1\107\12\uffff\1\106\2\uffff\1\105"), - DFA.unpack(u"\1\111"), - DFA.unpack(u"\1\112"), - DFA.unpack(u"\1\113"), - DFA.unpack(u"\1\114"), - DFA.unpack(u"\1\115\6\uffff\1\117\6\uffff\1\116"), - DFA.unpack(u"\1\120\7\uffff\1\121"), - DFA.unpack(u"\1\122"), - DFA.unpack(u"\1\124\2\uffff\1\123"), - DFA.unpack(u"\1\125\11\uffff\1\126"), - DFA.unpack(u"\1\127"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\133"), - DFA.unpack(u"\1\134\4\uffff\1\135"), - DFA.unpack(u"\1\136"), - DFA.unpack(u"\1\137"), - DFA.unpack(u"\1\140"), - DFA.unpack(u"\1\141"), - DFA.unpack(u"\1\142"), - DFA.unpack(u"\1\143"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\150"), - DFA.unpack(u"\1\152\1\uffff\12\154"), - DFA.unpack(u"\1\156\21\uffff\1\155"), - DFA.unpack(u"\1\162\17\uffff\1\160\1\161"), - DFA.unpack(u"\1\164\4\uffff\1\165\15\uffff\1\166"), - DFA.unpack(u"\1\170"), - DFA.unpack(u"\1\173\26\uffff\1\172"), - DFA.unpack(u""), - DFA.unpack(u"\1\176"), - DFA.unpack(u"\1\u0080\1\u0081"), - DFA.unpack(u"\1\u0084\1\u0083"), - DFA.unpack(u"\1\u0086"), - DFA.unpack(u"\1\u0089\76\uffff\1\u0088"), - DFA.unpack(u""), - DFA.unpack(u"\1\u008c\1\uffff\1\u008d"), - DFA.unpack(u"\1\u008e"), - DFA.unpack(u"\1\u008f"), - DFA.unpack(u"\1\u0090"), - DFA.unpack(u"\1\u0091\4\uffff\1\u0092"), - DFA.unpack(u""), - DFA.unpack(u"\47\u0092\1\uffff\uffd7\u0092"), - DFA.unpack(u"\uffff\u0091"), - DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\21\uffff" - u"\1\u0093\13\uffff\3\154\21\uffff\1\u0093"), - DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\uffff\u0099"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u009a"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u009b"), - DFA.unpack(u"\1\u009c"), - DFA.unpack(u"\1\u009d"), - DFA.unpack(u"\1\u009e"), - DFA.unpack(u"\1\u009f\20\uffff\1\u00a0"), - DFA.unpack(u"\1\u00a2\22\uffff\1\u00a1"), - DFA.unpack(u"\1\u00a3"), - DFA.unpack(u"\1\u00a4"), - DFA.unpack(u"\1\u00a5\14\uffff\1\u00a6"), - DFA.unpack(u"\1\u00a7"), - DFA.unpack(u"\1\u00a9\2\uffff\1\u00a8"), - DFA.unpack(u"\1\u00aa"), - DFA.unpack(u"\1\u00ab"), - DFA.unpack(u"\1\u00ac"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00ae"), - DFA.unpack(u"\1\u00af"), - DFA.unpack(u"\1\u00b0"), - DFA.unpack(u"\1\u00b1"), - DFA.unpack(u"\1\u00b2"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\24\76\1\u00b3\5\76"), - DFA.unpack(u"\1\u00b6\11\uffff\1\u00b5"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00b8"), - DFA.unpack(u"\1\u00b9"), - DFA.unpack(u"\1\u00ba"), - DFA.unpack(u"\1\u00bb"), - DFA.unpack(u"\1\u00bc"), - DFA.unpack(u"\1\u00bd"), - DFA.unpack(u"\1\u00be"), - DFA.unpack(u"\1\u00bf"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c0"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c2"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c4"), - DFA.unpack(u"\1\u00c5"), - DFA.unpack(u"\1\u00c6"), - DFA.unpack(u"\1\u00c7"), - DFA.unpack(u"\1\u00c8"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\35\uffff" - u"\3\154"), - DFA.unpack(u""), - DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00ca"), - DFA.unpack(u"\1\u00cb"), - DFA.unpack(u"\1\u00cc"), - DFA.unpack(u"\1\u00cd"), - DFA.unpack(u"\1\u00ce"), - DFA.unpack(u"\1\u00cf"), - DFA.unpack(u"\1\u00d0"), - DFA.unpack(u"\1\u00d1"), - DFA.unpack(u"\1\u00d2"), - DFA.unpack(u"\1\u00d3"), - DFA.unpack(u"\1\u00d4"), - DFA.unpack(u"\1\u00d5"), - DFA.unpack(u"\1\u00d6"), - DFA.unpack(u"\1\u00d7"), - DFA.unpack(u"\1\u00d8"), - DFA.unpack(u"\1\u00d9"), - DFA.unpack(u"\1\u00da"), - DFA.unpack(u"\1\u00dc\1\u00db"), - DFA.unpack(u"\1\u00dd"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00df"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00e1"), - DFA.unpack(u"\1\u00e2"), - DFA.unpack(u"\1\u00e3"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00e4"), - DFA.unpack(u"\1\u00e5"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00e6"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00e8"), - DFA.unpack(u"\1\u00e9"), - DFA.unpack(u"\1\u00ea"), - DFA.unpack(u"\1\u00eb"), - DFA.unpack(u"\1\u00ed\35\uffff\1\u00ec"), - DFA.unpack(u"\1\u00ee"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00ef"), - DFA.unpack(u"\1\u00f0"), - DFA.unpack(u"\1\u00f1"), - DFA.unpack(u"\1\u00f2"), - DFA.unpack(u"\1\u00f3"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00f4"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00f6"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00f8"), - DFA.unpack(u"\1\u00f9"), - DFA.unpack(u"\1\u00fa"), - DFA.unpack(u"\1\u00fb"), - DFA.unpack(u"\1\u00fc"), - DFA.unpack(u"\1\u00fd"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00ff"), - DFA.unpack(u"\1\u0100"), - DFA.unpack(u"\1\u0101"), - DFA.unpack(u"\1\u0102"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0105"), - DFA.unpack(u"\1\u0106"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0109"), - DFA.unpack(u"\1\u010a"), - DFA.unpack(u"\1\u010b"), - DFA.unpack(u"\1\u010c"), - DFA.unpack(u"\1\u010d"), - DFA.unpack(u"\1\u010e"), - DFA.unpack(u""), - DFA.unpack(u"\1\u010f"), - DFA.unpack(u"\1\u0110"), - DFA.unpack(u"\1\u0111"), - DFA.unpack(u"\1\u0112"), - DFA.unpack(u"\1\u0114\17\uffff\1\u0113"), - DFA.unpack(u"\1\u0115"), - DFA.unpack(u"\1\u0116"), - DFA.unpack(u"\1\u0117"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0119"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u011b"), - DFA.unpack(u"\1\u011c"), - DFA.unpack(u""), - DFA.unpack(u"\1\u011d"), - DFA.unpack(u""), - DFA.unpack(u"\1\u011e"), - DFA.unpack(u"\1\u011f"), - DFA.unpack(u"\1\u0120"), - DFA.unpack(u"\1\u0121"), - DFA.unpack(u"\1\u0122"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0124"), - DFA.unpack(u"\1\u0125"), - DFA.unpack(u"\1\u0126"), - DFA.unpack(u"\1\u0127"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0128"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u012b"), - DFA.unpack(u"\1\u012c"), - DFA.unpack(u"\1\u012d"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u012f"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0131"), - DFA.unpack(u"\1\u0132"), - DFA.unpack(u"\1\u0133"), - DFA.unpack(u"\1\u0134"), - DFA.unpack(u"\1\u0135"), - DFA.unpack(u"\1\u0136"), - DFA.unpack(u"\1\u0137"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\u0138\1" - u"\uffff\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u013c"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0143"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0146"), - DFA.unpack(u"\1\u0147"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0148"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u014a"), - DFA.unpack(u""), - DFA.unpack(u"\1\u014b"), - DFA.unpack(u""), - DFA.unpack(u"\1\u014c"), - DFA.unpack(u"\1\u014d"), - DFA.unpack(u"\1\u014e"), - DFA.unpack(u"\1\u014f"), - DFA.unpack(u"\1\u0150"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0153"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0155"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0156"), - DFA.unpack(u"\1\u0157"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0159"), - DFA.unpack(u"\1\u015a"), - DFA.unpack(u"\1\u015b"), - DFA.unpack(u"\1\u015c"), - DFA.unpack(u"\1\u015d"), - DFA.unpack(u"\1\u015e"), - DFA.unpack(u"\1\u015f"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0166"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0168"), - DFA.unpack(u"\1\u0169"), - DFA.unpack(u"\1\u016a"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u016c"), - DFA.unpack(u"\1\u016d"), - DFA.unpack(u"\1\u016e"), - DFA.unpack(u""), - DFA.unpack(u"\1\u016f"), - DFA.unpack(u"\1\u0170"), - DFA.unpack(u"\1\u0171"), - DFA.unpack(u"\1\u0172"), - DFA.unpack(u"\1\u0173"), - DFA.unpack(u"\1\u0174"), - DFA.unpack(u"\1\u0175"), - DFA.unpack(u"\1\u0176"), - DFA.unpack(u"\1\u0177"), - DFA.unpack(u"\1\u0178"), - DFA.unpack(u"\1\u0179"), - DFA.unpack(u"\1\u017a"), - DFA.unpack(u"\1\u017b"), - DFA.unpack(u"\1\u017c"), - DFA.unpack(u"\1\u017d"), - DFA.unpack(u"\1\u017e"), - DFA.unpack(u"\1\u017f"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0181"), - DFA.unpack(u"\1\u0182"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0183"), - DFA.unpack(u"\1\u0184"), - DFA.unpack(u"\1\u0185"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0187"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0188"), - DFA.unpack(u"\1\u0189"), - DFA.unpack(u"\1\u018a"), - DFA.unpack(u"\1\u018b"), - DFA.unpack(u"\1\u018c"), - DFA.unpack(u"\1\u018d"), - DFA.unpack(u"\1\u018e"), - DFA.unpack(u"\1\u018f"), - DFA.unpack(u"\1\u0190"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"") - ] - - # class definition for DFA #35 - - DFA35 = DFA - - + + + +# for convenience in actions +HIDDEN = BaseRecognizer.HIDDEN + +# token types +T114=114 +T115=115 +T116=116 +T117=117 +FloatTypeSuffix=16 +LETTER=11 +T29=29 +T28=28 +T27=27 +T26=26 +T25=25 +EOF=-1 +STRING_LITERAL=9 +FLOATING_POINT_LITERAL=10 +T38=38 +T37=37 +T39=39 +T34=34 +COMMENT=22 +T33=33 +T36=36 +T35=35 +T30=30 +T32=32 +T31=31 +LINE_COMMENT=23 +IntegerTypeSuffix=14 +CHARACTER_LITERAL=8 +T49=49 +T48=48 +T100=100 +T43=43 +T42=42 +T102=102 +T41=41 +T101=101 +T40=40 +T47=47 +T46=46 +T45=45 +T44=44 +T109=109 +T107=107 +T108=108 +T105=105 +WS=19 +T106=106 +T103=103 +T104=104 +T50=50 +LINE_COMMAND=24 +T59=59 +T113=113 +T52=52 +T112=112 +T51=51 +T111=111 +T54=54 +T110=110 +EscapeSequence=12 +DECIMAL_LITERAL=7 +T53=53 +T56=56 +T55=55 +T58=58 +T57=57 +T75=75 +T76=76 +T73=73 +T74=74 +T79=79 +T77=77 +T78=78 +Exponent=15 +HexDigit=13 +T72=72 +T71=71 +T70=70 +T62=62 +T63=63 +T64=64 +T65=65 +T66=66 +T67=67 +T68=68 +T69=69 +IDENTIFIER=4 +UnicodeVocabulary=21 +HEX_LITERAL=5 +T61=61 +T60=60 +T99=99 +T97=97 +BS=20 +T98=98 +T95=95 +T96=96 +OCTAL_LITERAL=6 +T94=94 +Tokens=118 +T93=93 +T92=92 +T91=91 +T90=90 +T88=88 +T89=89 +T84=84 +T85=85 +T86=86 +T87=87 +UnicodeEscape=18 +T81=81 +T80=80 +T83=83 +OctalEscape=17 +T82=82 + +class CLexer(Lexer): + + grammarFileName = "C.g" + + def __init__(self, input=None): + Lexer.__init__(self, input) + self.dfa25 = self.DFA25( + self, 25, + eot = self.DFA25_eot, + eof = self.DFA25_eof, + min = self.DFA25_min, + max = self.DFA25_max, + accept = self.DFA25_accept, + special = self.DFA25_special, + transition = self.DFA25_transition + ) + self.dfa35 = self.DFA35( + self, 35, + eot = self.DFA35_eot, + eof = self.DFA35_eof, + min = self.DFA35_min, + max = self.DFA35_max, + accept = self.DFA35_accept, + special = self.DFA35_special, + transition = self.DFA35_transition + ) + + + + + + + # $ANTLR start T25 + def mT25(self, ): + + try: + self.type = T25 + + # C.g:27:5: ( ';' ) + # C.g:27:7: ';' + self.match(u';') + + + + + + finally: + + pass + + # $ANTLR end T25 + + + + # $ANTLR start T26 + def mT26(self, ): + + try: + self.type = T26 + + # C.g:28:5: ( 'typedef' ) + # C.g:28:7: 'typedef' + self.match("typedef") + + + + + + + finally: + + pass + + # $ANTLR end T26 + + + + # $ANTLR start T27 + def mT27(self, ): + + try: + self.type = T27 + + # C.g:29:5: ( ',' ) + # C.g:29:7: ',' + self.match(u',') + + + + + + finally: + + pass + + # $ANTLR end T27 + + + + # $ANTLR start T28 + def mT28(self, ): + + try: + self.type = T28 + + # C.g:30:5: ( '=' ) + # C.g:30:7: '=' + self.match(u'=') + + + + + + finally: + + pass + + # $ANTLR end T28 + + + + # $ANTLR start T29 + def mT29(self, ): + + try: + self.type = T29 + + # C.g:31:5: ( 'extern' ) + # C.g:31:7: 'extern' + self.match("extern") + + + + + + + finally: + + pass + + # $ANTLR end T29 + + + + # $ANTLR start T30 + def mT30(self, ): + + try: + self.type = T30 + + # C.g:32:5: ( 'static' ) + # C.g:32:7: 'static' + self.match("static") + + + + + + + finally: + + pass + + # $ANTLR end T30 + + + + # $ANTLR start T31 + def mT31(self, ): + + try: + self.type = T31 + + # C.g:33:5: ( 'auto' ) + # C.g:33:7: 'auto' + self.match("auto") + + + + + + + finally: + + pass + + # $ANTLR end T31 + + + + # $ANTLR start T32 + def mT32(self, ): + + try: + self.type = T32 + + # C.g:34:5: ( 'register' ) + # C.g:34:7: 'register' + self.match("register") + + + + + + + finally: + + pass + + # $ANTLR end T32 + + + + # $ANTLR start T33 + def mT33(self, ): + + try: + self.type = T33 + + # C.g:35:5: ( 'STATIC' ) + # C.g:35:7: 'STATIC' + self.match("STATIC") + + + + + + + finally: + + pass + + # $ANTLR end T33 + + + + # $ANTLR start T34 + def mT34(self, ): + + try: + self.type = T34 + + # C.g:36:5: ( 'void' ) + # C.g:36:7: 'void' + self.match("void") + + + + + + + finally: + + pass + + # $ANTLR end T34 + + + + # $ANTLR start T35 + def mT35(self, ): + + try: + self.type = T35 + + # C.g:37:5: ( 'char' ) + # C.g:37:7: 'char' + self.match("char") + + + + + + + finally: + + pass + + # $ANTLR end T35 + + + + # $ANTLR start T36 + def mT36(self, ): + + try: + self.type = T36 + + # C.g:38:5: ( 'short' ) + # C.g:38:7: 'short' + self.match("short") + + + + + + + finally: + + pass + + # $ANTLR end T36 + + + + # $ANTLR start T37 + def mT37(self, ): + + try: + self.type = T37 + + # C.g:39:5: ( 'int' ) + # C.g:39:7: 'int' + self.match("int") + + + + + + + finally: + + pass + + # $ANTLR end T37 + + + + # $ANTLR start T38 + def mT38(self, ): + + try: + self.type = T38 + + # C.g:40:5: ( 'long' ) + # C.g:40:7: 'long' + self.match("long") + + + + + + + finally: + + pass + + # $ANTLR end T38 + + + + # $ANTLR start T39 + def mT39(self, ): + + try: + self.type = T39 + + # C.g:41:5: ( 'float' ) + # C.g:41:7: 'float' + self.match("float") + + + + + + + finally: + + pass + + # $ANTLR end T39 + + + + # $ANTLR start T40 + def mT40(self, ): + + try: + self.type = T40 + + # C.g:42:5: ( 'double' ) + # C.g:42:7: 'double' + self.match("double") + + + + + + + finally: + + pass + + # $ANTLR end T40 + + + + # $ANTLR start T41 + def mT41(self, ): + + try: + self.type = T41 + + # C.g:43:5: ( 'signed' ) + # C.g:43:7: 'signed' + self.match("signed") + + + + + + + finally: + + pass + + # $ANTLR end T41 + + + + # $ANTLR start T42 + def mT42(self, ): + + try: + self.type = T42 + + # C.g:44:5: ( 'unsigned' ) + # C.g:44:7: 'unsigned' + self.match("unsigned") + + + + + + + finally: + + pass + + # $ANTLR end T42 + + + + # $ANTLR start T43 + def mT43(self, ): + + try: + self.type = T43 + + # C.g:45:5: ( '{' ) + # C.g:45:7: '{' + self.match(u'{') + + + + + + finally: + + pass + + # $ANTLR end T43 + + + + # $ANTLR start T44 + def mT44(self, ): + + try: + self.type = T44 + + # C.g:46:5: ( '}' ) + # C.g:46:7: '}' + self.match(u'}') + + + + + + finally: + + pass + + # $ANTLR end T44 + + + + # $ANTLR start T45 + def mT45(self, ): + + try: + self.type = T45 + + # C.g:47:5: ( 'struct' ) + # C.g:47:7: 'struct' + self.match("struct") + + + + + + + finally: + + pass + + # $ANTLR end T45 + + + + # $ANTLR start T46 + def mT46(self, ): + + try: + self.type = T46 + + # C.g:48:5: ( 'union' ) + # C.g:48:7: 'union' + self.match("union") + + + + + + + finally: + + pass + + # $ANTLR end T46 + + + + # $ANTLR start T47 + def mT47(self, ): + + try: + self.type = T47 + + # C.g:49:5: ( ':' ) + # C.g:49:7: ':' + self.match(u':') + + + + + + finally: + + pass + + # $ANTLR end T47 + + + + # $ANTLR start T48 + def mT48(self, ): + + try: + self.type = T48 + + # C.g:50:5: ( 'enum' ) + # C.g:50:7: 'enum' + self.match("enum") + + + + + + + finally: + + pass + + # $ANTLR end T48 + + + + # $ANTLR start T49 + def mT49(self, ): + + try: + self.type = T49 + + # C.g:51:5: ( 'const' ) + # C.g:51:7: 'const' + self.match("const") + + + + + + + finally: + + pass + + # $ANTLR end T49 + + + + # $ANTLR start T50 + def mT50(self, ): + + try: + self.type = T50 + + # C.g:52:5: ( 'volatile' ) + # C.g:52:7: 'volatile' + self.match("volatile") + + + + + + + finally: + + pass + + # $ANTLR end T50 + + + + # $ANTLR start T51 + def mT51(self, ): + + try: + self.type = T51 + + # C.g:53:5: ( 'IN' ) + # C.g:53:7: 'IN' + self.match("IN") + + + + + + + finally: + + pass + + # $ANTLR end T51 + + + + # $ANTLR start T52 + def mT52(self, ): + + try: + self.type = T52 + + # C.g:54:5: ( 'OUT' ) + # C.g:54:7: 'OUT' + self.match("OUT") + + + + + + + finally: + + pass + + # $ANTLR end T52 + + + + # $ANTLR start T53 + def mT53(self, ): + + try: + self.type = T53 + + # C.g:55:5: ( 'OPTIONAL' ) + # C.g:55:7: 'OPTIONAL' + self.match("OPTIONAL") + + + + + + + finally: + + pass + + # $ANTLR end T53 + + + + # $ANTLR start T54 + def mT54(self, ): + + try: + self.type = T54 + + # C.g:56:5: ( 'CONST' ) + # C.g:56:7: 'CONST' + self.match("CONST") + + + + + + + finally: + + pass + + # $ANTLR end T54 + + + + # $ANTLR start T55 + def mT55(self, ): + + try: + self.type = T55 + + # C.g:57:5: ( 'UNALIGNED' ) + # C.g:57:7: 'UNALIGNED' + self.match("UNALIGNED") + + + + + + + finally: + + pass + + # $ANTLR end T55 + + + + # $ANTLR start T56 + def mT56(self, ): + + try: + self.type = T56 + + # C.g:58:5: ( 'VOLATILE' ) + # C.g:58:7: 'VOLATILE' + self.match("VOLATILE") + + + + + + + finally: + + pass + + # $ANTLR end T56 + + + + # $ANTLR start T57 + def mT57(self, ): + + try: + self.type = T57 + + # C.g:59:5: ( 'GLOBAL_REMOVE_IF_UNREFERENCED' ) + # C.g:59:7: 'GLOBAL_REMOVE_IF_UNREFERENCED' + self.match("GLOBAL_REMOVE_IF_UNREFERENCED") + + + + + + + finally: + + pass + + # $ANTLR end T57 + + + + # $ANTLR start T58 + def mT58(self, ): + + try: + self.type = T58 + + # C.g:60:5: ( 'EFIAPI' ) + # C.g:60:7: 'EFIAPI' + self.match("EFIAPI") + + + + + + + finally: + + pass + + # $ANTLR end T58 + + + + # $ANTLR start T59 + def mT59(self, ): + + try: + self.type = T59 + + # C.g:61:5: ( 'EFI_BOOTSERVICE' ) + # C.g:61:7: 'EFI_BOOTSERVICE' + self.match("EFI_BOOTSERVICE") + + + + + + + finally: + + pass + + # $ANTLR end T59 + + + + # $ANTLR start T60 + def mT60(self, ): + + try: + self.type = T60 + + # C.g:62:5: ( 'EFI_RUNTIMESERVICE' ) + # C.g:62:7: 'EFI_RUNTIMESERVICE' + self.match("EFI_RUNTIMESERVICE") + + + + + + + finally: + + pass + + # $ANTLR end T60 + + + + # $ANTLR start T61 + def mT61(self, ): + + try: + self.type = T61 + + # C.g:63:5: ( 'PACKED' ) + # C.g:63:7: 'PACKED' + self.match("PACKED") + + + + + + + finally: + + pass + + # $ANTLR end T61 + + + + # $ANTLR start T62 + def mT62(self, ): + + try: + self.type = T62 + + # C.g:64:5: ( '(' ) + # C.g:64:7: '(' + self.match(u'(') + + + + + + finally: + + pass + + # $ANTLR end T62 + + + + # $ANTLR start T63 + def mT63(self, ): + + try: + self.type = T63 + + # C.g:65:5: ( ')' ) + # C.g:65:7: ')' + self.match(u')') + + + + + + finally: + + pass + + # $ANTLR end T63 + + + + # $ANTLR start T64 + def mT64(self, ): + + try: + self.type = T64 + + # C.g:66:5: ( '[' ) + # C.g:66:7: '[' + self.match(u'[') + + + + + + finally: + + pass + + # $ANTLR end T64 + + + + # $ANTLR start T65 + def mT65(self, ): + + try: + self.type = T65 + + # C.g:67:5: ( ']' ) + # C.g:67:7: ']' + self.match(u']') + + + + + + finally: + + pass + + # $ANTLR end T65 + + + + # $ANTLR start T66 + def mT66(self, ): + + try: + self.type = T66 + + # C.g:68:5: ( '*' ) + # C.g:68:7: '*' + self.match(u'*') + + + + + + finally: + + pass + + # $ANTLR end T66 + + + + # $ANTLR start T67 + def mT67(self, ): + + try: + self.type = T67 + + # C.g:69:5: ( '...' ) + # C.g:69:7: '...' + self.match("...") + + + + + + + finally: + + pass + + # $ANTLR end T67 + + + + # $ANTLR start T68 + def mT68(self, ): + + try: + self.type = T68 + + # C.g:70:5: ( '+' ) + # C.g:70:7: '+' + self.match(u'+') + + + + + + finally: + + pass + + # $ANTLR end T68 + + + + # $ANTLR start T69 + def mT69(self, ): + + try: + self.type = T69 + + # C.g:71:5: ( '-' ) + # C.g:71:7: '-' + self.match(u'-') + + + + + + finally: + + pass + + # $ANTLR end T69 + + + + # $ANTLR start T70 + def mT70(self, ): + + try: + self.type = T70 + + # C.g:72:5: ( '/' ) + # C.g:72:7: '/' + self.match(u'/') + + + + + + finally: + + pass + + # $ANTLR end T70 + + + + # $ANTLR start T71 + def mT71(self, ): + + try: + self.type = T71 + + # C.g:73:5: ( '%' ) + # C.g:73:7: '%' + self.match(u'%') + + + + + + finally: + + pass + + # $ANTLR end T71 + + + + # $ANTLR start T72 + def mT72(self, ): + + try: + self.type = T72 + + # C.g:74:5: ( '++' ) + # C.g:74:7: '++' + self.match("++") + + + + + + + finally: + + pass + + # $ANTLR end T72 + + + + # $ANTLR start T73 + def mT73(self, ): + + try: + self.type = T73 + + # C.g:75:5: ( '--' ) + # C.g:75:7: '--' + self.match("--") + + + + + + + finally: + + pass + + # $ANTLR end T73 + + + + # $ANTLR start T74 + def mT74(self, ): + + try: + self.type = T74 + + # C.g:76:5: ( 'sizeof' ) + # C.g:76:7: 'sizeof' + self.match("sizeof") + + + + + + + finally: + + pass + + # $ANTLR end T74 + + + + # $ANTLR start T75 + def mT75(self, ): + + try: + self.type = T75 + + # C.g:77:5: ( '.' ) + # C.g:77:7: '.' + self.match(u'.') + + + + + + finally: + + pass + + # $ANTLR end T75 + + + + # $ANTLR start T76 + def mT76(self, ): + + try: + self.type = T76 + + # C.g:78:5: ( '->' ) + # C.g:78:7: '->' + self.match("->") + + + + + + + finally: + + pass + + # $ANTLR end T76 + + + + # $ANTLR start T77 + def mT77(self, ): + + try: + self.type = T77 + + # C.g:79:5: ( '&' ) + # C.g:79:7: '&' + self.match(u'&') + + + + + + finally: + + pass + + # $ANTLR end T77 + + + + # $ANTLR start T78 + def mT78(self, ): + + try: + self.type = T78 + + # C.g:80:5: ( '~' ) + # C.g:80:7: '~' + self.match(u'~') + + + + + + finally: + + pass + + # $ANTLR end T78 + + + + # $ANTLR start T79 + def mT79(self, ): + + try: + self.type = T79 + + # C.g:81:5: ( '!' ) + # C.g:81:7: '!' + self.match(u'!') + + + + + + finally: + + pass + + # $ANTLR end T79 + + + + # $ANTLR start T80 + def mT80(self, ): + + try: + self.type = T80 + + # C.g:82:5: ( '*=' ) + # C.g:82:7: '*=' + self.match("*=") + + + + + + + finally: + + pass + + # $ANTLR end T80 + + + + # $ANTLR start T81 + def mT81(self, ): + + try: + self.type = T81 + + # C.g:83:5: ( '/=' ) + # C.g:83:7: '/=' + self.match("/=") + + + + + + + finally: + + pass + + # $ANTLR end T81 + + + + # $ANTLR start T82 + def mT82(self, ): + + try: + self.type = T82 + + # C.g:84:5: ( '%=' ) + # C.g:84:7: '%=' + self.match("%=") + + + + + + + finally: + + pass + + # $ANTLR end T82 + + + + # $ANTLR start T83 + def mT83(self, ): + + try: + self.type = T83 + + # C.g:85:5: ( '+=' ) + # C.g:85:7: '+=' + self.match("+=") + + + + + + + finally: + + pass + + # $ANTLR end T83 + + + + # $ANTLR start T84 + def mT84(self, ): + + try: + self.type = T84 + + # C.g:86:5: ( '-=' ) + # C.g:86:7: '-=' + self.match("-=") + + + + + + + finally: + + pass + + # $ANTLR end T84 + + + + # $ANTLR start T85 + def mT85(self, ): + + try: + self.type = T85 + + # C.g:87:5: ( '<<=' ) + # C.g:87:7: '<<=' + self.match("<<=") + + + + + + + finally: + + pass + + # $ANTLR end T85 + + + + # $ANTLR start T86 + def mT86(self, ): + + try: + self.type = T86 + + # C.g:88:5: ( '>>=' ) + # C.g:88:7: '>>=' + self.match(">>=") + + + + + + + finally: + + pass + + # $ANTLR end T86 + + + + # $ANTLR start T87 + def mT87(self, ): + + try: + self.type = T87 + + # C.g:89:5: ( '&=' ) + # C.g:89:7: '&=' + self.match("&=") + + + + + + + finally: + + pass + + # $ANTLR end T87 + + + + # $ANTLR start T88 + def mT88(self, ): + + try: + self.type = T88 + + # C.g:90:5: ( '^=' ) + # C.g:90:7: '^=' + self.match("^=") + + + + + + + finally: + + pass + + # $ANTLR end T88 + + + + # $ANTLR start T89 + def mT89(self, ): + + try: + self.type = T89 + + # C.g:91:5: ( '|=' ) + # C.g:91:7: '|=' + self.match("|=") + + + + + + + finally: + + pass + + # $ANTLR end T89 + + + + # $ANTLR start T90 + def mT90(self, ): + + try: + self.type = T90 + + # C.g:92:5: ( '?' ) + # C.g:92:7: '?' + self.match(u'?') + + + + + + finally: + + pass + + # $ANTLR end T90 + + + + # $ANTLR start T91 + def mT91(self, ): + + try: + self.type = T91 + + # C.g:93:5: ( '||' ) + # C.g:93:7: '||' + self.match("||") + + + + + + + finally: + + pass + + # $ANTLR end T91 + + + + # $ANTLR start T92 + def mT92(self, ): + + try: + self.type = T92 + + # C.g:94:5: ( '&&' ) + # C.g:94:7: '&&' + self.match("&&") + + + + + + + finally: + + pass + + # $ANTLR end T92 + + + + # $ANTLR start T93 + def mT93(self, ): + + try: + self.type = T93 + + # C.g:95:5: ( '|' ) + # C.g:95:7: '|' + self.match(u'|') + + + + + + finally: + + pass + + # $ANTLR end T93 + + + + # $ANTLR start T94 + def mT94(self, ): + + try: + self.type = T94 + + # C.g:96:5: ( '^' ) + # C.g:96:7: '^' + self.match(u'^') + + + + + + finally: + + pass + + # $ANTLR end T94 + + + + # $ANTLR start T95 + def mT95(self, ): + + try: + self.type = T95 + + # C.g:97:5: ( '==' ) + # C.g:97:7: '==' + self.match("==") + + + + + + + finally: + + pass + + # $ANTLR end T95 + + + + # $ANTLR start T96 + def mT96(self, ): + + try: + self.type = T96 + + # C.g:98:5: ( '!=' ) + # C.g:98:7: '!=' + self.match("!=") + + + + + + + finally: + + pass + + # $ANTLR end T96 + + + + # $ANTLR start T97 + def mT97(self, ): + + try: + self.type = T97 + + # C.g:99:5: ( '<' ) + # C.g:99:7: '<' + self.match(u'<') + + + + + + finally: + + pass + + # $ANTLR end T97 + + + + # $ANTLR start T98 + def mT98(self, ): + + try: + self.type = T98 + + # C.g:100:5: ( '>' ) + # C.g:100:7: '>' + self.match(u'>') + + + + + + finally: + + pass + + # $ANTLR end T98 + + + + # $ANTLR start T99 + def mT99(self, ): + + try: + self.type = T99 + + # C.g:101:5: ( '<=' ) + # C.g:101:7: '<=' + self.match("<=") + + + + + + + finally: + + pass + + # $ANTLR end T99 + + + + # $ANTLR start T100 + def mT100(self, ): + + try: + self.type = T100 + + # C.g:102:6: ( '>=' ) + # C.g:102:8: '>=' + self.match(">=") + + + + + + + finally: + + pass + + # $ANTLR end T100 + + + + # $ANTLR start T101 + def mT101(self, ): + + try: + self.type = T101 + + # C.g:103:6: ( '<<' ) + # C.g:103:8: '<<' + self.match("<<") + + + + + + + finally: + + pass + + # $ANTLR end T101 + + + + # $ANTLR start T102 + def mT102(self, ): + + try: + self.type = T102 + + # C.g:104:6: ( '>>' ) + # C.g:104:8: '>>' + self.match(">>") + + + + + + + finally: + + pass + + # $ANTLR end T102 + + + + # $ANTLR start T103 + def mT103(self, ): + + try: + self.type = T103 + + # C.g:105:6: ( '__asm__' ) + # C.g:105:8: '__asm__' + self.match("__asm__") + + + + + + + finally: + + pass + + # $ANTLR end T103 + + + + # $ANTLR start T104 + def mT104(self, ): + + try: + self.type = T104 + + # C.g:106:6: ( '_asm' ) + # C.g:106:8: '_asm' + self.match("_asm") + + + + + + + finally: + + pass + + # $ANTLR end T104 + + + + # $ANTLR start T105 + def mT105(self, ): + + try: + self.type = T105 + + # C.g:107:6: ( '__asm' ) + # C.g:107:8: '__asm' + self.match("__asm") + + + + + + + finally: + + pass + + # $ANTLR end T105 + + + + # $ANTLR start T106 + def mT106(self, ): + + try: + self.type = T106 + + # C.g:108:6: ( 'case' ) + # C.g:108:8: 'case' + self.match("case") + + + + + + + finally: + + pass + + # $ANTLR end T106 + + + + # $ANTLR start T107 + def mT107(self, ): + + try: + self.type = T107 + + # C.g:109:6: ( 'default' ) + # C.g:109:8: 'default' + self.match("default") + + + + + + + finally: + + pass + + # $ANTLR end T107 + + + + # $ANTLR start T108 + def mT108(self, ): + + try: + self.type = T108 + + # C.g:110:6: ( 'if' ) + # C.g:110:8: 'if' + self.match("if") + + + + + + + finally: + + pass + + # $ANTLR end T108 + + + + # $ANTLR start T109 + def mT109(self, ): + + try: + self.type = T109 + + # C.g:111:6: ( 'else' ) + # C.g:111:8: 'else' + self.match("else") + + + + + + + finally: + + pass + + # $ANTLR end T109 + + + + # $ANTLR start T110 + def mT110(self, ): + + try: + self.type = T110 + + # C.g:112:6: ( 'switch' ) + # C.g:112:8: 'switch' + self.match("switch") + + + + + + + finally: + + pass + + # $ANTLR end T110 + + + + # $ANTLR start T111 + def mT111(self, ): + + try: + self.type = T111 + + # C.g:113:6: ( 'while' ) + # C.g:113:8: 'while' + self.match("while") + + + + + + + finally: + + pass + + # $ANTLR end T111 + + + + # $ANTLR start T112 + def mT112(self, ): + + try: + self.type = T112 + + # C.g:114:6: ( 'do' ) + # C.g:114:8: 'do' + self.match("do") + + + + + + + finally: + + pass + + # $ANTLR end T112 + + + + # $ANTLR start T113 + def mT113(self, ): + + try: + self.type = T113 + + # C.g:115:6: ( 'for' ) + # C.g:115:8: 'for' + self.match("for") + + + + + + + finally: + + pass + + # $ANTLR end T113 + + + + # $ANTLR start T114 + def mT114(self, ): + + try: + self.type = T114 + + # C.g:116:6: ( 'goto' ) + # C.g:116:8: 'goto' + self.match("goto") + + + + + + + finally: + + pass + + # $ANTLR end T114 + + + + # $ANTLR start T115 + def mT115(self, ): + + try: + self.type = T115 + + # C.g:117:6: ( 'continue' ) + # C.g:117:8: 'continue' + self.match("continue") + + + + + + + finally: + + pass + + # $ANTLR end T115 + + + + # $ANTLR start T116 + def mT116(self, ): + + try: + self.type = T116 + + # C.g:118:6: ( 'break' ) + # C.g:118:8: 'break' + self.match("break") + + + + + + + finally: + + pass + + # $ANTLR end T116 + + + + # $ANTLR start T117 + def mT117(self, ): + + try: + self.type = T117 + + # C.g:119:6: ( 'return' ) + # C.g:119:8: 'return' + self.match("return") + + + + + + + finally: + + pass + + # $ANTLR end T117 + + + + # $ANTLR start IDENTIFIER + def mIDENTIFIER(self, ): + + try: + self.type = IDENTIFIER + + # C.g:586:2: ( LETTER ( LETTER | '0' .. '9' )* ) + # C.g:586:4: LETTER ( LETTER | '0' .. '9' )* + self.mLETTER() + + # C.g:586:11: ( LETTER | '0' .. '9' )* + while True: #loop1 + alt1 = 2 + LA1_0 = self.input.LA(1) + + if (LA1_0 == u'$' or (u'0' <= LA1_0 <= u'9') or (u'A' <= LA1_0 <= u'Z') or LA1_0 == u'_' or (u'a' <= LA1_0 <= u'z')) : + alt1 = 1 + + + if alt1 == 1: + # C.g: + if self.input.LA(1) == u'$' or (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop1 + + + + + + + finally: + + pass + + # $ANTLR end IDENTIFIER + + + + # $ANTLR start LETTER + def mLETTER(self, ): + + try: + # C.g:591:2: ( '$' | 'A' .. 'Z' | 'a' .. 'z' | '_' ) + # C.g: + if self.input.LA(1) == u'$' or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end LETTER + + + + # $ANTLR start CHARACTER_LITERAL + def mCHARACTER_LITERAL(self, ): + + try: + self.type = CHARACTER_LITERAL + + # C.g:598:5: ( ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' ) + # C.g:598:9: ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' + # C.g:598:9: ( 'L' )? + alt2 = 2 + LA2_0 = self.input.LA(1) + + if (LA2_0 == u'L') : + alt2 = 1 + if alt2 == 1: + # C.g:598:10: 'L' + self.match(u'L') + + + + + self.match(u'\'') + + # C.g:598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) + alt3 = 2 + LA3_0 = self.input.LA(1) + + if (LA3_0 == u'\\') : + alt3 = 1 + elif ((u'\u0000' <= LA3_0 <= u'&') or (u'(' <= LA3_0 <= u'[') or (u']' <= LA3_0 <= u'\uFFFE')) : + alt3 = 2 + else: + nvae = NoViableAltException("598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) )", 3, 0, self.input) + + raise nvae + + if alt3 == 1: + # C.g:598:23: EscapeSequence + self.mEscapeSequence() + + + + elif alt3 == 2: + # C.g:598:40: ~ ( '\\'' | '\\\\' ) + if (u'\u0000' <= self.input.LA(1) <= u'&') or (u'(' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + self.match(u'\'') + + + + + + finally: + + pass + + # $ANTLR end CHARACTER_LITERAL + + + + # $ANTLR start STRING_LITERAL + def mSTRING_LITERAL(self, ): + + try: + self.type = STRING_LITERAL + + # C.g:602:5: ( ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) + # C.g:602:8: ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' + # C.g:602:8: ( 'L' )? + alt4 = 2 + LA4_0 = self.input.LA(1) + + if (LA4_0 == u'L') : + alt4 = 1 + if alt4 == 1: + # C.g:602:9: 'L' + self.match(u'L') + + + + + self.match(u'"') + + # C.g:602:19: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* + while True: #loop5 + alt5 = 3 + LA5_0 = self.input.LA(1) + + if (LA5_0 == u'\\') : + alt5 = 1 + elif ((u'\u0000' <= LA5_0 <= u'!') or (u'#' <= LA5_0 <= u'[') or (u']' <= LA5_0 <= u'\uFFFE')) : + alt5 = 2 + + + if alt5 == 1: + # C.g:602:21: EscapeSequence + self.mEscapeSequence() + + + + elif alt5 == 2: + # C.g:602:38: ~ ( '\\\\' | '\"' ) + if (u'\u0000' <= self.input.LA(1) <= u'!') or (u'#' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop5 + + + self.match(u'"') + + + + + + finally: + + pass + + # $ANTLR end STRING_LITERAL + + + + # $ANTLR start HEX_LITERAL + def mHEX_LITERAL(self, ): + + try: + self.type = HEX_LITERAL + + # C.g:605:13: ( '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? ) + # C.g:605:15: '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? + self.match(u'0') + + if self.input.LA(1) == u'X' or self.input.LA(1) == u'x': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + # C.g:605:29: ( HexDigit )+ + cnt6 = 0 + while True: #loop6 + alt6 = 2 + LA6_0 = self.input.LA(1) + + if ((u'0' <= LA6_0 <= u'9') or (u'A' <= LA6_0 <= u'F') or (u'a' <= LA6_0 <= u'f')) : + alt6 = 1 + + + if alt6 == 1: + # C.g:605:29: HexDigit + self.mHexDigit() + + + + else: + if cnt6 >= 1: + break #loop6 + + eee = EarlyExitException(6, self.input) + raise eee + + cnt6 += 1 + + + # C.g:605:39: ( IntegerTypeSuffix )? + alt7 = 2 + LA7_0 = self.input.LA(1) + + if (LA7_0 == u'L' or LA7_0 == u'U' or LA7_0 == u'l' or LA7_0 == u'u') : + alt7 = 1 + if alt7 == 1: + # C.g:605:39: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end HEX_LITERAL + + + + # $ANTLR start DECIMAL_LITERAL + def mDECIMAL_LITERAL(self, ): + + try: + self.type = DECIMAL_LITERAL + + # C.g:607:17: ( ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? ) + # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? + # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) + alt9 = 2 + LA9_0 = self.input.LA(1) + + if (LA9_0 == u'0') : + alt9 = 1 + elif ((u'1' <= LA9_0 <= u'9')) : + alt9 = 2 + else: + nvae = NoViableAltException("607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* )", 9, 0, self.input) + + raise nvae + + if alt9 == 1: + # C.g:607:20: '0' + self.match(u'0') + + + + elif alt9 == 2: + # C.g:607:26: '1' .. '9' ( '0' .. '9' )* + self.matchRange(u'1', u'9') + + # C.g:607:35: ( '0' .. '9' )* + while True: #loop8 + alt8 = 2 + LA8_0 = self.input.LA(1) + + if ((u'0' <= LA8_0 <= u'9')) : + alt8 = 1 + + + if alt8 == 1: + # C.g:607:35: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + break #loop8 + + + + + + # C.g:607:46: ( IntegerTypeSuffix )? + alt10 = 2 + LA10_0 = self.input.LA(1) + + if (LA10_0 == u'L' or LA10_0 == u'U' or LA10_0 == u'l' or LA10_0 == u'u') : + alt10 = 1 + if alt10 == 1: + # C.g:607:46: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end DECIMAL_LITERAL + + + + # $ANTLR start OCTAL_LITERAL + def mOCTAL_LITERAL(self, ): + + try: + self.type = OCTAL_LITERAL + + # C.g:609:15: ( '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? ) + # C.g:609:17: '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? + self.match(u'0') + + # C.g:609:21: ( '0' .. '7' )+ + cnt11 = 0 + while True: #loop11 + alt11 = 2 + LA11_0 = self.input.LA(1) + + if ((u'0' <= LA11_0 <= u'7')) : + alt11 = 1 + + + if alt11 == 1: + # C.g:609:22: '0' .. '7' + self.matchRange(u'0', u'7') + + + + else: + if cnt11 >= 1: + break #loop11 + + eee = EarlyExitException(11, self.input) + raise eee + + cnt11 += 1 + + + # C.g:609:33: ( IntegerTypeSuffix )? + alt12 = 2 + LA12_0 = self.input.LA(1) + + if (LA12_0 == u'L' or LA12_0 == u'U' or LA12_0 == u'l' or LA12_0 == u'u') : + alt12 = 1 + if alt12 == 1: + # C.g:609:33: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end OCTAL_LITERAL + + + + # $ANTLR start HexDigit + def mHexDigit(self, ): + + try: + # C.g:612:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) ) + # C.g:612:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) + if (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'F') or (u'a' <= self.input.LA(1) <= u'f'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end HexDigit + + + + # $ANTLR start IntegerTypeSuffix + def mIntegerTypeSuffix(self, ): + + try: + # C.g:616:2: ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) ) + alt13 = 4 + LA13_0 = self.input.LA(1) + + if (LA13_0 == u'U' or LA13_0 == u'u') : + LA13_1 = self.input.LA(2) + + if (LA13_1 == u'L' or LA13_1 == u'l') : + LA13_3 = self.input.LA(3) + + if (LA13_3 == u'L' or LA13_3 == u'l') : + alt13 = 4 + else: + alt13 = 3 + else: + alt13 = 1 + elif (LA13_0 == u'L' or LA13_0 == u'l') : + alt13 = 2 + else: + nvae = NoViableAltException("614:1: fragment IntegerTypeSuffix : ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) );", 13, 0, self.input) + + raise nvae + + if alt13 == 1: + # C.g:616:4: ( 'u' | 'U' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 2: + # C.g:617:4: ( 'l' | 'L' ) + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 3: + # C.g:618:4: ( 'u' | 'U' ) ( 'l' | 'L' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 4: + # C.g:619:4: ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + finally: + + pass + + # $ANTLR end IntegerTypeSuffix + + + + # $ANTLR start FLOATING_POINT_LITERAL + def mFLOATING_POINT_LITERAL(self, ): + + try: + self.type = FLOATING_POINT_LITERAL + + # C.g:623:5: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? | '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? | ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? | ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix ) + alt25 = 4 + alt25 = self.dfa25.predict(self.input) + if alt25 == 1: + # C.g:623:9: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? + # C.g:623:9: ( '0' .. '9' )+ + cnt14 = 0 + while True: #loop14 + alt14 = 2 + LA14_0 = self.input.LA(1) + + if ((u'0' <= LA14_0 <= u'9')) : + alt14 = 1 + + + if alt14 == 1: + # C.g:623:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt14 >= 1: + break #loop14 + + eee = EarlyExitException(14, self.input) + raise eee + + cnt14 += 1 + + + self.match(u'.') + + # C.g:623:25: ( '0' .. '9' )* + while True: #loop15 + alt15 = 2 + LA15_0 = self.input.LA(1) + + if ((u'0' <= LA15_0 <= u'9')) : + alt15 = 1 + + + if alt15 == 1: + # C.g:623:26: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + break #loop15 + + + # C.g:623:37: ( Exponent )? + alt16 = 2 + LA16_0 = self.input.LA(1) + + if (LA16_0 == u'E' or LA16_0 == u'e') : + alt16 = 1 + if alt16 == 1: + # C.g:623:37: Exponent + self.mExponent() + + + + + # C.g:623:47: ( FloatTypeSuffix )? + alt17 = 2 + LA17_0 = self.input.LA(1) + + if (LA17_0 == u'D' or LA17_0 == u'F' or LA17_0 == u'd' or LA17_0 == u'f') : + alt17 = 1 + if alt17 == 1: + # C.g:623:47: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 2: + # C.g:624:9: '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? + self.match(u'.') + + # C.g:624:13: ( '0' .. '9' )+ + cnt18 = 0 + while True: #loop18 + alt18 = 2 + LA18_0 = self.input.LA(1) + + if ((u'0' <= LA18_0 <= u'9')) : + alt18 = 1 + + + if alt18 == 1: + # C.g:624:14: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt18 >= 1: + break #loop18 + + eee = EarlyExitException(18, self.input) + raise eee + + cnt18 += 1 + + + # C.g:624:25: ( Exponent )? + alt19 = 2 + LA19_0 = self.input.LA(1) + + if (LA19_0 == u'E' or LA19_0 == u'e') : + alt19 = 1 + if alt19 == 1: + # C.g:624:25: Exponent + self.mExponent() + + + + + # C.g:624:35: ( FloatTypeSuffix )? + alt20 = 2 + LA20_0 = self.input.LA(1) + + if (LA20_0 == u'D' or LA20_0 == u'F' or LA20_0 == u'd' or LA20_0 == u'f') : + alt20 = 1 + if alt20 == 1: + # C.g:624:35: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 3: + # C.g:625:9: ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? + # C.g:625:9: ( '0' .. '9' )+ + cnt21 = 0 + while True: #loop21 + alt21 = 2 + LA21_0 = self.input.LA(1) + + if ((u'0' <= LA21_0 <= u'9')) : + alt21 = 1 + + + if alt21 == 1: + # C.g:625:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt21 >= 1: + break #loop21 + + eee = EarlyExitException(21, self.input) + raise eee + + cnt21 += 1 + + + self.mExponent() + + # C.g:625:30: ( FloatTypeSuffix )? + alt22 = 2 + LA22_0 = self.input.LA(1) + + if (LA22_0 == u'D' or LA22_0 == u'F' or LA22_0 == u'd' or LA22_0 == u'f') : + alt22 = 1 + if alt22 == 1: + # C.g:625:30: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 4: + # C.g:626:9: ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix + # C.g:626:9: ( '0' .. '9' )+ + cnt23 = 0 + while True: #loop23 + alt23 = 2 + LA23_0 = self.input.LA(1) + + if ((u'0' <= LA23_0 <= u'9')) : + alt23 = 1 + + + if alt23 == 1: + # C.g:626:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt23 >= 1: + break #loop23 + + eee = EarlyExitException(23, self.input) + raise eee + + cnt23 += 1 + + + # C.g:626:21: ( Exponent )? + alt24 = 2 + LA24_0 = self.input.LA(1) + + if (LA24_0 == u'E' or LA24_0 == u'e') : + alt24 = 1 + if alt24 == 1: + # C.g:626:21: Exponent + self.mExponent() + + + + + self.mFloatTypeSuffix() + + + + + finally: + + pass + + # $ANTLR end FLOATING_POINT_LITERAL + + + + # $ANTLR start Exponent + def mExponent(self, ): + + try: + # C.g:630:10: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ ) + # C.g:630:12: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ + if self.input.LA(1) == u'E' or self.input.LA(1) == u'e': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + # C.g:630:22: ( '+' | '-' )? + alt26 = 2 + LA26_0 = self.input.LA(1) + + if (LA26_0 == u'+' or LA26_0 == u'-') : + alt26 = 1 + if alt26 == 1: + # C.g: + if self.input.LA(1) == u'+' or self.input.LA(1) == u'-': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + # C.g:630:33: ( '0' .. '9' )+ + cnt27 = 0 + while True: #loop27 + alt27 = 2 + LA27_0 = self.input.LA(1) + + if ((u'0' <= LA27_0 <= u'9')) : + alt27 = 1 + + + if alt27 == 1: + # C.g:630:34: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt27 >= 1: + break #loop27 + + eee = EarlyExitException(27, self.input) + raise eee + + cnt27 += 1 + + + + + + + finally: + + pass + + # $ANTLR end Exponent + + + + # $ANTLR start FloatTypeSuffix + def mFloatTypeSuffix(self, ): + + try: + # C.g:633:17: ( ( 'f' | 'F' | 'd' | 'D' ) ) + # C.g:633:19: ( 'f' | 'F' | 'd' | 'D' ) + if self.input.LA(1) == u'D' or self.input.LA(1) == u'F' or self.input.LA(1) == u'd' or self.input.LA(1) == u'f': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end FloatTypeSuffix + + + + # $ANTLR start EscapeSequence + def mEscapeSequence(self, ): + + try: + # C.g:637:5: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape ) + alt28 = 2 + LA28_0 = self.input.LA(1) + + if (LA28_0 == u'\\') : + LA28_1 = self.input.LA(2) + + if (LA28_1 == u'"' or LA28_1 == u'\'' or LA28_1 == u'\\' or LA28_1 == u'b' or LA28_1 == u'f' or LA28_1 == u'n' or LA28_1 == u'r' or LA28_1 == u't') : + alt28 = 1 + elif ((u'0' <= LA28_1 <= u'7')) : + alt28 = 2 + else: + nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 1, self.input) + + raise nvae + + else: + nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 0, self.input) + + raise nvae + + if alt28 == 1: + # C.g:637:8: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) + self.match(u'\\') + + if self.input.LA(1) == u'"' or self.input.LA(1) == u'\'' or self.input.LA(1) == u'\\' or self.input.LA(1) == u'b' or self.input.LA(1) == u'f' or self.input.LA(1) == u'n' or self.input.LA(1) == u'r' or self.input.LA(1) == u't': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt28 == 2: + # C.g:638:9: OctalEscape + self.mOctalEscape() + + + + + finally: + + pass + + # $ANTLR end EscapeSequence + + + + # $ANTLR start OctalEscape + def mOctalEscape(self, ): + + try: + # C.g:643:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ) + alt29 = 3 + LA29_0 = self.input.LA(1) + + if (LA29_0 == u'\\') : + LA29_1 = self.input.LA(2) + + if ((u'0' <= LA29_1 <= u'3')) : + LA29_2 = self.input.LA(3) + + if ((u'0' <= LA29_2 <= u'7')) : + LA29_4 = self.input.LA(4) + + if ((u'0' <= LA29_4 <= u'7')) : + alt29 = 1 + else: + alt29 = 2 + else: + alt29 = 3 + elif ((u'4' <= LA29_1 <= u'7')) : + LA29_3 = self.input.LA(3) + + if ((u'0' <= LA29_3 <= u'7')) : + alt29 = 2 + else: + alt29 = 3 + else: + nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 1, self.input) + + raise nvae + + else: + nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 0, self.input) + + raise nvae + + if alt29 == 1: + # C.g:643:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) + self.match(u'\\') + + # C.g:643:14: ( '0' .. '3' ) + # C.g:643:15: '0' .. '3' + self.matchRange(u'0', u'3') + + + + + # C.g:643:25: ( '0' .. '7' ) + # C.g:643:26: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + # C.g:643:36: ( '0' .. '7' ) + # C.g:643:37: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + elif alt29 == 2: + # C.g:644:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) + self.match(u'\\') + + # C.g:644:14: ( '0' .. '7' ) + # C.g:644:15: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + # C.g:644:25: ( '0' .. '7' ) + # C.g:644:26: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + elif alt29 == 3: + # C.g:645:9: '\\\\' ( '0' .. '7' ) + self.match(u'\\') + + # C.g:645:14: ( '0' .. '7' ) + # C.g:645:15: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + + finally: + + pass + + # $ANTLR end OctalEscape + + + + # $ANTLR start UnicodeEscape + def mUnicodeEscape(self, ): + + try: + # C.g:650:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit ) + # C.g:650:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit + self.match(u'\\') + + self.match(u'u') + + self.mHexDigit() + + self.mHexDigit() + + self.mHexDigit() + + self.mHexDigit() + + + + + + finally: + + pass + + # $ANTLR end UnicodeEscape + + + + # $ANTLR start WS + def mWS(self, ): + + try: + self.type = WS + + # C.g:653:5: ( ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) ) + # C.g:653:8: ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) + if (u'\t' <= self.input.LA(1) <= u'\n') or (u'\f' <= self.input.LA(1) <= u'\r') or self.input.LA(1) == u' ': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end WS + + + + # $ANTLR start BS + def mBS(self, ): + + try: + self.type = BS + + # C.g:657:5: ( ( '\\\\' ) ) + # C.g:657:7: ( '\\\\' ) + # C.g:657:7: ( '\\\\' ) + # C.g:657:8: '\\\\' + self.match(u'\\') + + + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end BS + + + + # $ANTLR start UnicodeVocabulary + def mUnicodeVocabulary(self, ): + + try: + self.type = UnicodeVocabulary + + # C.g:665:5: ( '\\u0003' .. '\\uFFFE' ) + # C.g:665:7: '\\u0003' .. '\\uFFFE' + self.matchRange(u'\u0003', u'\uFFFE') + + + + + + finally: + + pass + + # $ANTLR end UnicodeVocabulary + + + + # $ANTLR start COMMENT + def mCOMMENT(self, ): + + try: + self.type = COMMENT + + # C.g:668:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) + # C.g:668:9: '/*' ( options {greedy=false; } : . )* '*/' + self.match("/*") + + + # C.g:668:14: ( options {greedy=false; } : . )* + while True: #loop30 + alt30 = 2 + LA30_0 = self.input.LA(1) + + if (LA30_0 == u'*') : + LA30_1 = self.input.LA(2) + + if (LA30_1 == u'/') : + alt30 = 2 + elif ((u'\u0000' <= LA30_1 <= u'.') or (u'0' <= LA30_1 <= u'\uFFFE')) : + alt30 = 1 + + + elif ((u'\u0000' <= LA30_0 <= u')') or (u'+' <= LA30_0 <= u'\uFFFE')) : + alt30 = 1 + + + if alt30 == 1: + # C.g:668:42: . + self.matchAny() + + + + else: + break #loop30 + + + self.match("*/") + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end COMMENT + + + + # $ANTLR start LINE_COMMENT + def mLINE_COMMENT(self, ): + + try: + self.type = LINE_COMMENT + + # C.g:673:5: ( '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) + # C.g:673:7: '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' + self.match("//") + + + # C.g:673:12: (~ ( '\\n' | '\\r' ) )* + while True: #loop31 + alt31 = 2 + LA31_0 = self.input.LA(1) + + if ((u'\u0000' <= LA31_0 <= u'\t') or (u'\u000B' <= LA31_0 <= u'\f') or (u'\u000E' <= LA31_0 <= u'\uFFFE')) : + alt31 = 1 + + + if alt31 == 1: + # C.g:673:12: ~ ( '\\n' | '\\r' ) + if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop31 + + + # C.g:673:26: ( '\\r' )? + alt32 = 2 + LA32_0 = self.input.LA(1) + + if (LA32_0 == u'\r') : + alt32 = 1 + if alt32 == 1: + # C.g:673:26: '\\r' + self.match(u'\r') + + + + + self.match(u'\n') + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end LINE_COMMENT + + + + # $ANTLR start LINE_COMMAND + def mLINE_COMMAND(self, ): + + try: + self.type = LINE_COMMAND + + # C.g:678:5: ( '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) + # C.g:678:7: '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' + self.match(u'#') + + # C.g:678:11: (~ ( '\\n' | '\\r' ) )* + while True: #loop33 + alt33 = 2 + LA33_0 = self.input.LA(1) + + if ((u'\u0000' <= LA33_0 <= u'\t') or (u'\u000B' <= LA33_0 <= u'\f') or (u'\u000E' <= LA33_0 <= u'\uFFFE')) : + alt33 = 1 + + + if alt33 == 1: + # C.g:678:11: ~ ( '\\n' | '\\r' ) + if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop33 + + + # C.g:678:25: ( '\\r' )? + alt34 = 2 + LA34_0 = self.input.LA(1) + + if (LA34_0 == u'\r') : + alt34 = 1 + if alt34 == 1: + # C.g:678:25: '\\r' + self.match(u'\r') + + + + + self.match(u'\n') + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end LINE_COMMAND + + + + def mTokens(self): + # C.g:1:8: ( T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | T90 | T91 | T92 | T93 | T94 | T95 | T96 | T97 | T98 | T99 | T100 | T101 | T102 | T103 | T104 | T105 | T106 | T107 | T108 | T109 | T110 | T111 | T112 | T113 | T114 | T115 | T116 | T117 | IDENTIFIER | CHARACTER_LITERAL | STRING_LITERAL | HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL | FLOATING_POINT_LITERAL | WS | BS | UnicodeVocabulary | COMMENT | LINE_COMMENT | LINE_COMMAND ) + alt35 = 106 + alt35 = self.dfa35.predict(self.input) + if alt35 == 1: + # C.g:1:10: T25 + self.mT25() + + + + elif alt35 == 2: + # C.g:1:14: T26 + self.mT26() + + + + elif alt35 == 3: + # C.g:1:18: T27 + self.mT27() + + + + elif alt35 == 4: + # C.g:1:22: T28 + self.mT28() + + + + elif alt35 == 5: + # C.g:1:26: T29 + self.mT29() + + + + elif alt35 == 6: + # C.g:1:30: T30 + self.mT30() + + + + elif alt35 == 7: + # C.g:1:34: T31 + self.mT31() + + + + elif alt35 == 8: + # C.g:1:38: T32 + self.mT32() + + + + elif alt35 == 9: + # C.g:1:42: T33 + self.mT33() + + + + elif alt35 == 10: + # C.g:1:46: T34 + self.mT34() + + + + elif alt35 == 11: + # C.g:1:50: T35 + self.mT35() + + + + elif alt35 == 12: + # C.g:1:54: T36 + self.mT36() + + + + elif alt35 == 13: + # C.g:1:58: T37 + self.mT37() + + + + elif alt35 == 14: + # C.g:1:62: T38 + self.mT38() + + + + elif alt35 == 15: + # C.g:1:66: T39 + self.mT39() + + + + elif alt35 == 16: + # C.g:1:70: T40 + self.mT40() + + + + elif alt35 == 17: + # C.g:1:74: T41 + self.mT41() + + + + elif alt35 == 18: + # C.g:1:78: T42 + self.mT42() + + + + elif alt35 == 19: + # C.g:1:82: T43 + self.mT43() + + + + elif alt35 == 20: + # C.g:1:86: T44 + self.mT44() + + + + elif alt35 == 21: + # C.g:1:90: T45 + self.mT45() + + + + elif alt35 == 22: + # C.g:1:94: T46 + self.mT46() + + + + elif alt35 == 23: + # C.g:1:98: T47 + self.mT47() + + + + elif alt35 == 24: + # C.g:1:102: T48 + self.mT48() + + + + elif alt35 == 25: + # C.g:1:106: T49 + self.mT49() + + + + elif alt35 == 26: + # C.g:1:110: T50 + self.mT50() + + + + elif alt35 == 27: + # C.g:1:114: T51 + self.mT51() + + + + elif alt35 == 28: + # C.g:1:118: T52 + self.mT52() + + + + elif alt35 == 29: + # C.g:1:122: T53 + self.mT53() + + + + elif alt35 == 30: + # C.g:1:126: T54 + self.mT54() + + + + elif alt35 == 31: + # C.g:1:130: T55 + self.mT55() + + + + elif alt35 == 32: + # C.g:1:134: T56 + self.mT56() + + + + elif alt35 == 33: + # C.g:1:138: T57 + self.mT57() + + + + elif alt35 == 34: + # C.g:1:142: T58 + self.mT58() + + + + elif alt35 == 35: + # C.g:1:146: T59 + self.mT59() + + + + elif alt35 == 36: + # C.g:1:150: T60 + self.mT60() + + + + elif alt35 == 37: + # C.g:1:154: T61 + self.mT61() + + + + elif alt35 == 38: + # C.g:1:158: T62 + self.mT62() + + + + elif alt35 == 39: + # C.g:1:162: T63 + self.mT63() + + + + elif alt35 == 40: + # C.g:1:166: T64 + self.mT64() + + + + elif alt35 == 41: + # C.g:1:170: T65 + self.mT65() + + + + elif alt35 == 42: + # C.g:1:174: T66 + self.mT66() + + + + elif alt35 == 43: + # C.g:1:178: T67 + self.mT67() + + + + elif alt35 == 44: + # C.g:1:182: T68 + self.mT68() + + + + elif alt35 == 45: + # C.g:1:186: T69 + self.mT69() + + + + elif alt35 == 46: + # C.g:1:190: T70 + self.mT70() + + + + elif alt35 == 47: + # C.g:1:194: T71 + self.mT71() + + + + elif alt35 == 48: + # C.g:1:198: T72 + self.mT72() + + + + elif alt35 == 49: + # C.g:1:202: T73 + self.mT73() + + + + elif alt35 == 50: + # C.g:1:206: T74 + self.mT74() + + + + elif alt35 == 51: + # C.g:1:210: T75 + self.mT75() + + + + elif alt35 == 52: + # C.g:1:214: T76 + self.mT76() + + + + elif alt35 == 53: + # C.g:1:218: T77 + self.mT77() + + + + elif alt35 == 54: + # C.g:1:222: T78 + self.mT78() + + + + elif alt35 == 55: + # C.g:1:226: T79 + self.mT79() + + + + elif alt35 == 56: + # C.g:1:230: T80 + self.mT80() + + + + elif alt35 == 57: + # C.g:1:234: T81 + self.mT81() + + + + elif alt35 == 58: + # C.g:1:238: T82 + self.mT82() + + + + elif alt35 == 59: + # C.g:1:242: T83 + self.mT83() + + + + elif alt35 == 60: + # C.g:1:246: T84 + self.mT84() + + + + elif alt35 == 61: + # C.g:1:250: T85 + self.mT85() + + + + elif alt35 == 62: + # C.g:1:254: T86 + self.mT86() + + + + elif alt35 == 63: + # C.g:1:258: T87 + self.mT87() + + + + elif alt35 == 64: + # C.g:1:262: T88 + self.mT88() + + + + elif alt35 == 65: + # C.g:1:266: T89 + self.mT89() + + + + elif alt35 == 66: + # C.g:1:270: T90 + self.mT90() + + + + elif alt35 == 67: + # C.g:1:274: T91 + self.mT91() + + + + elif alt35 == 68: + # C.g:1:278: T92 + self.mT92() + + + + elif alt35 == 69: + # C.g:1:282: T93 + self.mT93() + + + + elif alt35 == 70: + # C.g:1:286: T94 + self.mT94() + + + + elif alt35 == 71: + # C.g:1:290: T95 + self.mT95() + + + + elif alt35 == 72: + # C.g:1:294: T96 + self.mT96() + + + + elif alt35 == 73: + # C.g:1:298: T97 + self.mT97() + + + + elif alt35 == 74: + # C.g:1:302: T98 + self.mT98() + + + + elif alt35 == 75: + # C.g:1:306: T99 + self.mT99() + + + + elif alt35 == 76: + # C.g:1:310: T100 + self.mT100() + + + + elif alt35 == 77: + # C.g:1:315: T101 + self.mT101() + + + + elif alt35 == 78: + # C.g:1:320: T102 + self.mT102() + + + + elif alt35 == 79: + # C.g:1:325: T103 + self.mT103() + + + + elif alt35 == 80: + # C.g:1:330: T104 + self.mT104() + + + + elif alt35 == 81: + # C.g:1:335: T105 + self.mT105() + + + + elif alt35 == 82: + # C.g:1:340: T106 + self.mT106() + + + + elif alt35 == 83: + # C.g:1:345: T107 + self.mT107() + + + + elif alt35 == 84: + # C.g:1:350: T108 + self.mT108() + + + + elif alt35 == 85: + # C.g:1:355: T109 + self.mT109() + + + + elif alt35 == 86: + # C.g:1:360: T110 + self.mT110() + + + + elif alt35 == 87: + # C.g:1:365: T111 + self.mT111() + + + + elif alt35 == 88: + # C.g:1:370: T112 + self.mT112() + + + + elif alt35 == 89: + # C.g:1:375: T113 + self.mT113() + + + + elif alt35 == 90: + # C.g:1:380: T114 + self.mT114() + + + + elif alt35 == 91: + # C.g:1:385: T115 + self.mT115() + + + + elif alt35 == 92: + # C.g:1:390: T116 + self.mT116() + + + + elif alt35 == 93: + # C.g:1:395: T117 + self.mT117() + + + + elif alt35 == 94: + # C.g:1:400: IDENTIFIER + self.mIDENTIFIER() + + + + elif alt35 == 95: + # C.g:1:411: CHARACTER_LITERAL + self.mCHARACTER_LITERAL() + + + + elif alt35 == 96: + # C.g:1:429: STRING_LITERAL + self.mSTRING_LITERAL() + + + + elif alt35 == 97: + # C.g:1:444: HEX_LITERAL + self.mHEX_LITERAL() + + + + elif alt35 == 98: + # C.g:1:456: DECIMAL_LITERAL + self.mDECIMAL_LITERAL() + + + + elif alt35 == 99: + # C.g:1:472: OCTAL_LITERAL + self.mOCTAL_LITERAL() + + + + elif alt35 == 100: + # C.g:1:486: FLOATING_POINT_LITERAL + self.mFLOATING_POINT_LITERAL() + + + + elif alt35 == 101: + # C.g:1:509: WS + self.mWS() + + + + elif alt35 == 102: + # C.g:1:512: BS + self.mBS() + + + + elif alt35 == 103: + # C.g:1:515: UnicodeVocabulary + self.mUnicodeVocabulary() + + + + elif alt35 == 104: + # C.g:1:533: COMMENT + self.mCOMMENT() + + + + elif alt35 == 105: + # C.g:1:541: LINE_COMMENT + self.mLINE_COMMENT() + + + + elif alt35 == 106: + # C.g:1:554: LINE_COMMAND + self.mLINE_COMMAND() + + + + + + + + + # lookup tables for DFA #25 + + DFA25_eot = DFA.unpack( + u"\7\uffff\1\10\2\uffff" + ) + + DFA25_eof = DFA.unpack( + u"\12\uffff" + ) + + DFA25_min = DFA.unpack( + u"\2\56\2\uffff\1\53\1\uffff\2\60\2\uffff" + ) + + DFA25_max = DFA.unpack( + u"\1\71\1\146\2\uffff\1\71\1\uffff\1\71\1\146\2\uffff" + ) + + DFA25_accept = DFA.unpack( + u"\2\uffff\1\2\1\1\1\uffff\1\4\2\uffff\2\3" + ) + + DFA25_special = DFA.unpack( + u"\12\uffff" + ) + + + DFA25_transition = [ + DFA.unpack(u"\1\2\1\uffff\12\1"), + DFA.unpack(u"\1\3\1\uffff\12\1\12\uffff\1\5\1\4\1\5\35\uffff\1\5" + u"\1\4\1\5"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\6\1\uffff\1\6\2\uffff\12\7"), + DFA.unpack(u""), + DFA.unpack(u"\12\7"), + DFA.unpack(u"\12\7\12\uffff\1\11\1\uffff\1\11\35\uffff\1\11\1\uffff" + u"\1\11"), + DFA.unpack(u""), + DFA.unpack(u"") + ] + + # class definition for DFA #25 + + DFA25 = DFA + # lookup tables for DFA #35 + + DFA35_eot = DFA.unpack( + u"\2\uffff\1\76\1\uffff\1\101\14\76\3\uffff\10\76\4\uffff\1\151\1" + u"\153\1\157\1\163\1\167\1\171\1\174\1\uffff\1\177\1\u0082\1\u0085" + u"\1\u0087\1\u008a\1\uffff\5\76\1\uffff\2\73\2\u0095\2\uffff\1\73" + u"\2\uffff\1\76\4\uffff\16\76\1\u00ad\5\76\1\u00b4\1\76\3\uffff\1" + u"\u00b7\10\76\34\uffff\1\u00c1\2\uffff\1\u00c3\10\uffff\5\76\3\uffff" + u"\1\u00c9\1\uffff\1\u0095\3\uffff\23\76\1\uffff\1\u00de\1\76\1\u00e0" + u"\3\76\1\uffff\2\76\1\uffff\1\76\1\u00e7\6\76\4\uffff\5\76\1\uffff" + u"\1\76\1\u00f5\1\76\1\u00f7\6\76\1\u00fe\4\76\1\u0103\1\u0104\2" + u"\76\1\u0107\1\uffff\1\u0108\1\uffff\6\76\1\uffff\10\76\1\u0118" + u"\1\76\1\u011a\2\76\1\uffff\1\76\1\uffff\5\76\1\u0123\1\uffff\4" + u"\76\2\uffff\1\76\1\u0129\2\uffff\1\u012a\3\76\1\u012e\1\76\1\u0130" + u"\7\76\1\u0139\1\uffff\1\u013a\1\uffff\1\u013b\1\76\1\u013d\1\u013e" + u"\1\u013f\1\u0140\1\u0141\1\u0142\1\uffff\1\76\1\u0144\1\u0145\2" + u"\76\2\uffff\1\76\1\u0149\1\76\1\uffff\1\76\1\uffff\5\76\1\u0151" + u"\1\u0152\1\76\3\uffff\1\u0154\6\uffff\1\76\2\uffff\2\76\1\u0158" + u"\1\uffff\7\76\2\uffff\1\u0160\1\uffff\1\u0161\1\u0162\1\u0163\1" + u"\uffff\1\u0164\1\u0165\1\76\1\u0167\3\76\6\uffff\1\u016b\1\uffff" + u"\3\76\1\uffff\21\76\1\u0180\2\76\1\uffff\3\76\1\u0186\1\76\1\uffff" + u"\11\76\1\u0191\1\uffff" + ) + + DFA35_eof = DFA.unpack( + u"\u0192\uffff" + ) + + DFA35_min = DFA.unpack( + u"\1\3\1\uffff\1\171\1\uffff\1\75\1\154\1\150\1\165\1\145\1\124\1" + u"\157\1\141\1\146\1\157\1\154\1\145\1\156\3\uffff\1\116\1\120\1" + u"\117\1\116\1\117\1\114\1\106\1\101\4\uffff\1\75\1\56\1\53\1\55" + u"\1\52\1\75\1\46\1\uffff\1\75\1\74\3\75\1\uffff\1\137\1\150\1\157" + u"\1\162\1\42\1\uffff\2\0\2\56\2\uffff\1\0\2\uffff\1\160\4\uffff" + u"\1\163\1\164\1\165\1\151\1\141\1\147\1\157\1\164\1\147\1\101\1" + u"\151\1\163\1\156\1\141\1\44\1\164\1\156\1\162\1\157\1\146\1\44" + u"\1\151\3\uffff\1\44\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34" + u"\uffff\1\75\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145" + u"\3\uffff\1\56\1\uffff\1\56\3\uffff\3\145\1\155\2\164\1\165\1\145" + u"\1\156\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\163\1" + u"\162\1\uffff\1\44\1\147\1\44\2\141\1\142\1\uffff\1\151\1\157\1" + u"\uffff\1\111\1\44\1\123\1\114\1\101\1\102\1\101\1\113\4\uffff\1" + u"\163\1\155\1\154\1\157\1\141\1\uffff\1\144\1\44\1\162\1\44\1\143" + u"\1\151\1\143\1\157\1\145\1\164\1\44\1\163\1\162\1\111\1\164\2\44" + u"\1\151\1\164\1\44\1\uffff\1\44\1\uffff\1\164\1\165\1\154\1\147" + u"\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\102\1\120\1\105" + u"\1\155\1\44\1\145\1\44\1\153\1\145\1\uffff\1\156\1\uffff\1\150" + u"\1\143\1\164\1\146\1\144\1\44\1\uffff\1\164\1\156\1\103\1\151\2" + u"\uffff\1\156\1\44\2\uffff\1\44\1\154\1\145\1\156\1\44\1\116\1\44" + u"\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\44\1\uffff\1\44\1" + u"\uffff\1\44\1\146\6\44\1\uffff\1\145\2\44\1\154\1\165\2\uffff\1" + u"\164\1\44\1\145\1\uffff\1\101\1\uffff\1\116\1\114\1\137\1\116\1" + u"\117\2\44\1\137\3\uffff\1\44\6\uffff\1\162\2\uffff\2\145\1\44\1" + u"\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff\1\44\1\uffff\3\44" + u"\1\uffff\2\44\1\104\1\44\1\105\1\111\1\123\6\uffff\1\44\1\uffff" + u"\2\115\1\105\1\uffff\1\117\1\105\1\122\1\126\1\123\1\126\2\105" + u"\1\111\1\137\1\122\1\103\1\111\1\126\1\105\1\106\1\111\1\44\1\137" + u"\1\103\1\uffff\1\125\1\105\1\116\1\44\1\122\1\uffff\1\105\1\106" + u"\1\105\1\122\1\105\1\116\1\103\1\105\1\104\1\44\1\uffff" + ) + + DFA35_max = DFA.unpack( + u"\1\ufffe\1\uffff\1\171\1\uffff\1\75\1\170\1\167\1\165\1\145\1\124" + u"\2\157\1\156\3\157\1\156\3\uffff\1\116\1\125\1\117\1\116\1\117" + u"\1\114\1\106\1\101\4\uffff\1\75\1\71\1\75\1\76\3\75\1\uffff\2\75" + u"\1\76\1\75\1\174\1\uffff\1\141\1\150\1\157\1\162\1\47\1\uffff\2" + u"\ufffe\1\170\1\146\2\uffff\1\ufffe\2\uffff\1\160\4\uffff\1\163" + u"\1\164\1\165\1\151\1\162\1\172\1\157\2\164\1\101\1\154\1\163\1" + u"\156\1\141\1\172\1\164\1\156\1\162\1\157\1\146\1\172\1\163\3\uffff" + u"\1\172\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34\uffff\1\75" + u"\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145\3\uffff\1" + u"\146\1\uffff\1\146\3\uffff\3\145\1\155\2\164\1\165\1\145\1\156" + u"\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\164\1\162\1" + u"\uffff\1\172\1\147\1\172\2\141\1\142\1\uffff\1\151\1\157\1\uffff" + u"\1\111\1\172\1\123\1\114\1\101\1\102\1\137\1\113\4\uffff\1\163" + u"\1\155\1\154\1\157\1\141\1\uffff\1\144\1\172\1\162\1\172\1\143" + u"\1\151\1\143\1\157\1\145\1\164\1\172\1\163\1\162\1\111\1\164\2" + u"\172\1\151\1\164\1\172\1\uffff\1\172\1\uffff\1\164\1\165\1\154" + u"\1\147\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\122\1\120" + u"\1\105\1\155\1\172\1\145\1\172\1\153\1\145\1\uffff\1\156\1\uffff" + u"\1\150\1\143\1\164\1\146\1\144\1\172\1\uffff\1\164\1\156\1\103" + u"\1\151\2\uffff\1\156\1\172\2\uffff\1\172\1\154\1\145\1\156\1\172" + u"\1\116\1\172\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\172\1" + u"\uffff\1\172\1\uffff\1\172\1\146\6\172\1\uffff\1\145\2\172\1\154" + u"\1\165\2\uffff\1\164\1\172\1\145\1\uffff\1\101\1\uffff\1\116\1" + u"\114\1\137\1\116\1\117\2\172\1\137\3\uffff\1\172\6\uffff\1\162" + u"\2\uffff\2\145\1\172\1\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff" + u"\1\172\1\uffff\3\172\1\uffff\2\172\1\104\1\172\1\105\1\111\1\123" + u"\6\uffff\1\172\1\uffff\2\115\1\105\1\uffff\1\117\1\105\1\122\1" + u"\126\1\123\1\126\2\105\1\111\1\137\1\122\1\103\1\111\1\126\1\105" + u"\1\106\1\111\1\172\1\137\1\103\1\uffff\1\125\1\105\1\116\1\172" + u"\1\122\1\uffff\1\105\1\106\1\105\1\122\1\105\1\116\1\103\1\105" + u"\1\104\1\172\1\uffff" + ) + + DFA35_accept = DFA.unpack( + u"\1\uffff\1\1\1\uffff\1\3\15\uffff\1\23\1\24\1\27\10\uffff\1\46" + u"\1\47\1\50\1\51\7\uffff\1\66\5\uffff\1\102\5\uffff\1\136\4\uffff" + u"\1\145\1\146\1\uffff\1\147\1\1\1\uffff\1\136\1\3\1\107\1\4\26\uffff" + u"\1\23\1\24\1\27\11\uffff\1\46\1\47\1\50\1\51\1\70\1\52\1\53\1\63" + u"\1\144\1\73\1\60\1\54\1\74\1\64\1\61\1\55\1\150\1\151\1\71\1\56" + u"\1\72\1\57\1\77\1\104\1\65\1\66\1\110\1\67\1\uffff\1\113\1\111" + u"\1\uffff\1\114\1\112\1\100\1\106\1\103\1\101\1\105\1\102\5\uffff" + u"\1\140\1\137\1\141\1\uffff\1\142\1\uffff\1\145\1\146\1\152\23\uffff" + u"\1\124\6\uffff\1\130\2\uffff\1\33\10\uffff\1\75\1\115\1\76\1\116" + u"\5\uffff\1\143\24\uffff\1\15\1\uffff\1\131\6\uffff\1\34\15\uffff" + u"\1\125\1\uffff\1\30\6\uffff\1\7\4\uffff\1\12\1\122\2\uffff\1\13" + u"\1\16\17\uffff\1\120\1\uffff\1\132\10\uffff\1\14\5\uffff\1\31\1" + u"\17\3\uffff\1\26\1\uffff\1\36\10\uffff\1\121\1\127\1\134\1\uffff" + u"\1\5\1\126\1\6\1\25\1\62\1\21\1\uffff\1\135\1\11\3\uffff\1\20\7" + u"\uffff\1\42\1\45\1\uffff\1\2\3\uffff\1\123\7\uffff\1\117\1\10\1" + u"\32\1\133\1\22\1\35\1\uffff\1\40\3\uffff\1\37\24\uffff\1\43\5\uffff" + u"\1\44\12\uffff\1\41" + ) + + DFA35_special = DFA.unpack( + u"\u0192\uffff" + ) + + + DFA35_transition = [ + DFA.unpack(u"\6\73\2\70\1\73\2\70\22\73\1\70\1\50\1\65\1\72\1\63" + u"\1\45\1\46\1\64\1\34\1\35\1\40\1\42\1\3\1\43\1\41\1\44\1\66\11" + u"\67\1\23\1\1\1\51\1\4\1\52\1\55\1\73\2\63\1\26\1\63\1\32\1\63\1" + u"\31\1\63\1\24\2\63\1\62\2\63\1\25\1\33\2\63\1\11\1\63\1\27\1\30" + u"\4\63\1\36\1\71\1\37\1\53\1\56\1\73\1\7\1\61\1\13\1\17\1\5\1\16" + u"\1\60\1\63\1\14\2\63\1\15\5\63\1\10\1\6\1\2\1\20\1\12\1\57\3\63" + u"\1\21\1\54\1\22\1\47\uff80\73"), + DFA.unpack(u""), + DFA.unpack(u"\1\75"), + DFA.unpack(u""), + DFA.unpack(u"\1\100"), + DFA.unpack(u"\1\102\1\uffff\1\104\11\uffff\1\103"), + DFA.unpack(u"\1\110\1\107\12\uffff\1\106\2\uffff\1\105"), + DFA.unpack(u"\1\111"), + DFA.unpack(u"\1\112"), + DFA.unpack(u"\1\113"), + DFA.unpack(u"\1\114"), + DFA.unpack(u"\1\115\6\uffff\1\117\6\uffff\1\116"), + DFA.unpack(u"\1\120\7\uffff\1\121"), + DFA.unpack(u"\1\122"), + DFA.unpack(u"\1\124\2\uffff\1\123"), + DFA.unpack(u"\1\125\11\uffff\1\126"), + DFA.unpack(u"\1\127"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\133"), + DFA.unpack(u"\1\134\4\uffff\1\135"), + DFA.unpack(u"\1\136"), + DFA.unpack(u"\1\137"), + DFA.unpack(u"\1\140"), + DFA.unpack(u"\1\141"), + DFA.unpack(u"\1\142"), + DFA.unpack(u"\1\143"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\150"), + DFA.unpack(u"\1\152\1\uffff\12\154"), + DFA.unpack(u"\1\156\21\uffff\1\155"), + DFA.unpack(u"\1\162\17\uffff\1\160\1\161"), + DFA.unpack(u"\1\164\4\uffff\1\165\15\uffff\1\166"), + DFA.unpack(u"\1\170"), + DFA.unpack(u"\1\173\26\uffff\1\172"), + DFA.unpack(u""), + DFA.unpack(u"\1\176"), + DFA.unpack(u"\1\u0080\1\u0081"), + DFA.unpack(u"\1\u0084\1\u0083"), + DFA.unpack(u"\1\u0086"), + DFA.unpack(u"\1\u0089\76\uffff\1\u0088"), + DFA.unpack(u""), + DFA.unpack(u"\1\u008c\1\uffff\1\u008d"), + DFA.unpack(u"\1\u008e"), + DFA.unpack(u"\1\u008f"), + DFA.unpack(u"\1\u0090"), + DFA.unpack(u"\1\u0091\4\uffff\1\u0092"), + DFA.unpack(u""), + DFA.unpack(u"\47\u0092\1\uffff\uffd7\u0092"), + DFA.unpack(u"\uffff\u0091"), + DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\21\uffff" + u"\1\u0093\13\uffff\3\154\21\uffff\1\u0093"), + DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\uffff\u0099"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u009a"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u009b"), + DFA.unpack(u"\1\u009c"), + DFA.unpack(u"\1\u009d"), + DFA.unpack(u"\1\u009e"), + DFA.unpack(u"\1\u009f\20\uffff\1\u00a0"), + DFA.unpack(u"\1\u00a2\22\uffff\1\u00a1"), + DFA.unpack(u"\1\u00a3"), + DFA.unpack(u"\1\u00a4"), + DFA.unpack(u"\1\u00a5\14\uffff\1\u00a6"), + DFA.unpack(u"\1\u00a7"), + DFA.unpack(u"\1\u00a9\2\uffff\1\u00a8"), + DFA.unpack(u"\1\u00aa"), + DFA.unpack(u"\1\u00ab"), + DFA.unpack(u"\1\u00ac"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00ae"), + DFA.unpack(u"\1\u00af"), + DFA.unpack(u"\1\u00b0"), + DFA.unpack(u"\1\u00b1"), + DFA.unpack(u"\1\u00b2"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\24\76\1\u00b3\5\76"), + DFA.unpack(u"\1\u00b6\11\uffff\1\u00b5"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00b8"), + DFA.unpack(u"\1\u00b9"), + DFA.unpack(u"\1\u00ba"), + DFA.unpack(u"\1\u00bb"), + DFA.unpack(u"\1\u00bc"), + DFA.unpack(u"\1\u00bd"), + DFA.unpack(u"\1\u00be"), + DFA.unpack(u"\1\u00bf"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c0"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c2"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c4"), + DFA.unpack(u"\1\u00c5"), + DFA.unpack(u"\1\u00c6"), + DFA.unpack(u"\1\u00c7"), + DFA.unpack(u"\1\u00c8"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\35\uffff" + u"\3\154"), + DFA.unpack(u""), + DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00ca"), + DFA.unpack(u"\1\u00cb"), + DFA.unpack(u"\1\u00cc"), + DFA.unpack(u"\1\u00cd"), + DFA.unpack(u"\1\u00ce"), + DFA.unpack(u"\1\u00cf"), + DFA.unpack(u"\1\u00d0"), + DFA.unpack(u"\1\u00d1"), + DFA.unpack(u"\1\u00d2"), + DFA.unpack(u"\1\u00d3"), + DFA.unpack(u"\1\u00d4"), + DFA.unpack(u"\1\u00d5"), + DFA.unpack(u"\1\u00d6"), + DFA.unpack(u"\1\u00d7"), + DFA.unpack(u"\1\u00d8"), + DFA.unpack(u"\1\u00d9"), + DFA.unpack(u"\1\u00da"), + DFA.unpack(u"\1\u00dc\1\u00db"), + DFA.unpack(u"\1\u00dd"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00df"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00e1"), + DFA.unpack(u"\1\u00e2"), + DFA.unpack(u"\1\u00e3"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00e4"), + DFA.unpack(u"\1\u00e5"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00e6"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00e8"), + DFA.unpack(u"\1\u00e9"), + DFA.unpack(u"\1\u00ea"), + DFA.unpack(u"\1\u00eb"), + DFA.unpack(u"\1\u00ed\35\uffff\1\u00ec"), + DFA.unpack(u"\1\u00ee"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00ef"), + DFA.unpack(u"\1\u00f0"), + DFA.unpack(u"\1\u00f1"), + DFA.unpack(u"\1\u00f2"), + DFA.unpack(u"\1\u00f3"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00f4"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00f6"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00f8"), + DFA.unpack(u"\1\u00f9"), + DFA.unpack(u"\1\u00fa"), + DFA.unpack(u"\1\u00fb"), + DFA.unpack(u"\1\u00fc"), + DFA.unpack(u"\1\u00fd"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00ff"), + DFA.unpack(u"\1\u0100"), + DFA.unpack(u"\1\u0101"), + DFA.unpack(u"\1\u0102"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0105"), + DFA.unpack(u"\1\u0106"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0109"), + DFA.unpack(u"\1\u010a"), + DFA.unpack(u"\1\u010b"), + DFA.unpack(u"\1\u010c"), + DFA.unpack(u"\1\u010d"), + DFA.unpack(u"\1\u010e"), + DFA.unpack(u""), + DFA.unpack(u"\1\u010f"), + DFA.unpack(u"\1\u0110"), + DFA.unpack(u"\1\u0111"), + DFA.unpack(u"\1\u0112"), + DFA.unpack(u"\1\u0114\17\uffff\1\u0113"), + DFA.unpack(u"\1\u0115"), + DFA.unpack(u"\1\u0116"), + DFA.unpack(u"\1\u0117"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0119"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u011b"), + DFA.unpack(u"\1\u011c"), + DFA.unpack(u""), + DFA.unpack(u"\1\u011d"), + DFA.unpack(u""), + DFA.unpack(u"\1\u011e"), + DFA.unpack(u"\1\u011f"), + DFA.unpack(u"\1\u0120"), + DFA.unpack(u"\1\u0121"), + DFA.unpack(u"\1\u0122"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0124"), + DFA.unpack(u"\1\u0125"), + DFA.unpack(u"\1\u0126"), + DFA.unpack(u"\1\u0127"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0128"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u012b"), + DFA.unpack(u"\1\u012c"), + DFA.unpack(u"\1\u012d"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u012f"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0131"), + DFA.unpack(u"\1\u0132"), + DFA.unpack(u"\1\u0133"), + DFA.unpack(u"\1\u0134"), + DFA.unpack(u"\1\u0135"), + DFA.unpack(u"\1\u0136"), + DFA.unpack(u"\1\u0137"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\u0138\1" + u"\uffff\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u013c"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0143"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0146"), + DFA.unpack(u"\1\u0147"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0148"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u014a"), + DFA.unpack(u""), + DFA.unpack(u"\1\u014b"), + DFA.unpack(u""), + DFA.unpack(u"\1\u014c"), + DFA.unpack(u"\1\u014d"), + DFA.unpack(u"\1\u014e"), + DFA.unpack(u"\1\u014f"), + DFA.unpack(u"\1\u0150"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0153"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0155"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0156"), + DFA.unpack(u"\1\u0157"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0159"), + DFA.unpack(u"\1\u015a"), + DFA.unpack(u"\1\u015b"), + DFA.unpack(u"\1\u015c"), + DFA.unpack(u"\1\u015d"), + DFA.unpack(u"\1\u015e"), + DFA.unpack(u"\1\u015f"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0166"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0168"), + DFA.unpack(u"\1\u0169"), + DFA.unpack(u"\1\u016a"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u016c"), + DFA.unpack(u"\1\u016d"), + DFA.unpack(u"\1\u016e"), + DFA.unpack(u""), + DFA.unpack(u"\1\u016f"), + DFA.unpack(u"\1\u0170"), + DFA.unpack(u"\1\u0171"), + DFA.unpack(u"\1\u0172"), + DFA.unpack(u"\1\u0173"), + DFA.unpack(u"\1\u0174"), + DFA.unpack(u"\1\u0175"), + DFA.unpack(u"\1\u0176"), + DFA.unpack(u"\1\u0177"), + DFA.unpack(u"\1\u0178"), + DFA.unpack(u"\1\u0179"), + DFA.unpack(u"\1\u017a"), + DFA.unpack(u"\1\u017b"), + DFA.unpack(u"\1\u017c"), + DFA.unpack(u"\1\u017d"), + DFA.unpack(u"\1\u017e"), + DFA.unpack(u"\1\u017f"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0181"), + DFA.unpack(u"\1\u0182"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0183"), + DFA.unpack(u"\1\u0184"), + DFA.unpack(u"\1\u0185"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0187"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0188"), + DFA.unpack(u"\1\u0189"), + DFA.unpack(u"\1\u018a"), + DFA.unpack(u"\1\u018b"), + DFA.unpack(u"\1\u018c"), + DFA.unpack(u"\1\u018d"), + DFA.unpack(u"\1\u018e"), + DFA.unpack(u"\1\u018f"), + DFA.unpack(u"\1\u0190"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"") + ] + + # class definition for DFA #35 + + DFA35 = DFA + + diff --git a/BaseTools/Source/Python/Ecc/CParser.py b/BaseTools/Source/Python/Ecc/CParser.py index 511d429f26..baa521f43c 100644 --- a/BaseTools/Source/Python/Ecc/CParser.py +++ b/BaseTools/Source/Python/Ecc/CParser.py @@ -1,7 +1,7 @@ -# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 - -from antlr3 import * -from antlr3.compat import set, frozenset +# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 + +from antlr3 import * +from antlr3.compat import set, frozenset ## @file # The file defines the parser for C source files. @@ -24,88 +24,88 @@ from antlr3.compat import set, frozenset import CodeFragment import FileProfile - - - -# for convenience in actions -HIDDEN = BaseRecognizer.HIDDEN - -# token types -BS=20 -LINE_COMMENT=23 -FloatTypeSuffix=16 -IntegerTypeSuffix=14 -LETTER=11 -OCTAL_LITERAL=6 -CHARACTER_LITERAL=8 -Exponent=15 -EOF=-1 -HexDigit=13 -STRING_LITERAL=9 -WS=19 -FLOATING_POINT_LITERAL=10 -IDENTIFIER=4 -UnicodeEscape=18 -LINE_COMMAND=24 -UnicodeVocabulary=21 -HEX_LITERAL=5 -COMMENT=22 -DECIMAL_LITERAL=7 -EscapeSequence=12 -OctalEscape=17 - -# token names -tokenNames = [ - "", "", "", "", - "IDENTIFIER", "HEX_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", "CHARACTER_LITERAL", - "STRING_LITERAL", "FLOATING_POINT_LITERAL", "LETTER", "EscapeSequence", - "HexDigit", "IntegerTypeSuffix", "Exponent", "FloatTypeSuffix", "OctalEscape", - "UnicodeEscape", "WS", "BS", "UnicodeVocabulary", "COMMENT", "LINE_COMMENT", - "LINE_COMMAND", "';'", "'typedef'", "','", "'='", "'extern'", "'static'", - "'auto'", "'register'", "'STATIC'", "'void'", "'char'", "'short'", "'int'", - "'long'", "'float'", "'double'", "'signed'", "'unsigned'", "'{'", "'}'", - "'struct'", "'union'", "':'", "'enum'", "'const'", "'volatile'", "'IN'", - "'OUT'", "'OPTIONAL'", "'CONST'", "'UNALIGNED'", "'VOLATILE'", "'GLOBAL_REMOVE_IF_UNREFERENCED'", - "'EFIAPI'", "'EFI_BOOTSERVICE'", "'EFI_RUNTIMESERVICE'", "'PACKED'", - "'('", "')'", "'['", "']'", "'*'", "'...'", "'+'", "'-'", "'/'", "'%'", - "'++'", "'--'", "'sizeof'", "'.'", "'->'", "'&'", "'~'", "'!'", "'*='", - "'/='", "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", "'|='", - "'?'", "'||'", "'&&'", "'|'", "'^'", "'=='", "'!='", "'<'", "'>'", "'<='", - "'>='", "'<<'", "'>>'", "'__asm__'", "'_asm'", "'__asm'", "'case'", - "'default'", "'if'", "'else'", "'switch'", "'while'", "'do'", "'for'", - "'goto'", "'continue'", "'break'", "'return'" -] - - -class function_definition_scope(object): - def __init__(self): - self.ModifierText = None - self.DeclText = None - self.LBLine = None - self.LBOffset = None - self.DeclLine = None - self.DeclOffset = None -class postfix_expression_scope(object): - def __init__(self): - self.FuncCallText = None - - -class CParser(Parser): - grammarFileName = "C.g" - tokenNames = tokenNames - - def __init__(self, input): - Parser.__init__(self, input) - self.ruleMemo = {} - - self.function_definition_stack = [] - self.postfix_expression_stack = [] - - - - - - + + + +# for convenience in actions +HIDDEN = BaseRecognizer.HIDDEN + +# token types +BS=20 +LINE_COMMENT=23 +FloatTypeSuffix=16 +IntegerTypeSuffix=14 +LETTER=11 +OCTAL_LITERAL=6 +CHARACTER_LITERAL=8 +Exponent=15 +EOF=-1 +HexDigit=13 +STRING_LITERAL=9 +WS=19 +FLOATING_POINT_LITERAL=10 +IDENTIFIER=4 +UnicodeEscape=18 +LINE_COMMAND=24 +UnicodeVocabulary=21 +HEX_LITERAL=5 +COMMENT=22 +DECIMAL_LITERAL=7 +EscapeSequence=12 +OctalEscape=17 + +# token names +tokenNames = [ + "", "", "", "", + "IDENTIFIER", "HEX_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", "CHARACTER_LITERAL", + "STRING_LITERAL", "FLOATING_POINT_LITERAL", "LETTER", "EscapeSequence", + "HexDigit", "IntegerTypeSuffix", "Exponent", "FloatTypeSuffix", "OctalEscape", + "UnicodeEscape", "WS", "BS", "UnicodeVocabulary", "COMMENT", "LINE_COMMENT", + "LINE_COMMAND", "';'", "'typedef'", "','", "'='", "'extern'", "'static'", + "'auto'", "'register'", "'STATIC'", "'void'", "'char'", "'short'", "'int'", + "'long'", "'float'", "'double'", "'signed'", "'unsigned'", "'{'", "'}'", + "'struct'", "'union'", "':'", "'enum'", "'const'", "'volatile'", "'IN'", + "'OUT'", "'OPTIONAL'", "'CONST'", "'UNALIGNED'", "'VOLATILE'", "'GLOBAL_REMOVE_IF_UNREFERENCED'", + "'EFIAPI'", "'EFI_BOOTSERVICE'", "'EFI_RUNTIMESERVICE'", "'PACKED'", + "'('", "')'", "'['", "']'", "'*'", "'...'", "'+'", "'-'", "'/'", "'%'", + "'++'", "'--'", "'sizeof'", "'.'", "'->'", "'&'", "'~'", "'!'", "'*='", + "'/='", "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", "'|='", + "'?'", "'||'", "'&&'", "'|'", "'^'", "'=='", "'!='", "'<'", "'>'", "'<='", + "'>='", "'<<'", "'>>'", "'__asm__'", "'_asm'", "'__asm'", "'case'", + "'default'", "'if'", "'else'", "'switch'", "'while'", "'do'", "'for'", + "'goto'", "'continue'", "'break'", "'return'" +] + + +class function_definition_scope(object): + def __init__(self): + self.ModifierText = None + self.DeclText = None + self.LBLine = None + self.LBOffset = None + self.DeclLine = None + self.DeclOffset = None +class postfix_expression_scope(object): + def __init__(self): + self.FuncCallText = None + + +class CParser(Parser): + grammarFileName = "C.g" + tokenNames = tokenNames + + def __init__(self, input): + Parser.__init__(self, input) + self.ruleMemo = {} + + self.function_definition_stack = [] + self.postfix_expression_stack = [] + + + + + + def printTokenInfo(self, line, offset, tokenText): @@ -139,442 +139,442 @@ class CParser(Parser): FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset)) FileProfile.FunctionCallingList.append(FuncCall) - - - - # $ANTLR start translation_unit - # C.g:102:1: translation_unit : ( external_declaration )* ; - def translation_unit(self, ): - - translation_unit_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 1): - return - - # C.g:103:2: ( ( external_declaration )* ) - # C.g:103:4: ( external_declaration )* - # C.g:103:4: ( external_declaration )* - while True: #loop1 - alt1 = 2 - LA1_0 = self.input.LA(1) - - if (LA1_0 == IDENTIFIER or LA1_0 == 26 or (29 <= LA1_0 <= 42) or (45 <= LA1_0 <= 46) or (48 <= LA1_0 <= 62) or LA1_0 == 66) : - alt1 = 1 - - - if alt1 == 1: - # C.g:0:0: external_declaration - self.following.append(self.FOLLOW_external_declaration_in_translation_unit74) - self.external_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 1, translation_unit_StartIndex) - - pass - - return - - # $ANTLR end translation_unit - - - # $ANTLR start external_declaration - # C.g:114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ); - def external_declaration(self, ): - - external_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 2): - return - - # C.g:119:2: ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ) - alt3 = 3 - LA3_0 = self.input.LA(1) - - if ((29 <= LA3_0 <= 33)) : - LA3_1 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 1, self.input) - - raise nvae - - elif (LA3_0 == 34) : - LA3_2 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 2, self.input) - - raise nvae - - elif (LA3_0 == 35) : - LA3_3 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 3, self.input) - - raise nvae - - elif (LA3_0 == 36) : - LA3_4 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 4, self.input) - - raise nvae - - elif (LA3_0 == 37) : - LA3_5 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 5, self.input) - - raise nvae - - elif (LA3_0 == 38) : - LA3_6 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 6, self.input) - - raise nvae - - elif (LA3_0 == 39) : - LA3_7 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 7, self.input) - - raise nvae - - elif (LA3_0 == 40) : - LA3_8 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 8, self.input) - - raise nvae - - elif (LA3_0 == 41) : - LA3_9 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 9, self.input) - - raise nvae - - elif (LA3_0 == 42) : - LA3_10 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 10, self.input) - - raise nvae - - elif ((45 <= LA3_0 <= 46)) : - LA3_11 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 11, self.input) - - raise nvae - - elif (LA3_0 == 48) : - LA3_12 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 12, self.input) - - raise nvae - - elif (LA3_0 == IDENTIFIER) : - LA3_13 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - elif (True) : - alt3 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 13, self.input) - - raise nvae - - elif (LA3_0 == 58) : - LA3_14 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 14, self.input) - - raise nvae - - elif (LA3_0 == 66) and (self.synpred4()): - alt3 = 1 - elif (LA3_0 == 59) : - LA3_16 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 16, self.input) - - raise nvae - - elif (LA3_0 == 60) : - LA3_17 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 17, self.input) - - raise nvae - - elif ((49 <= LA3_0 <= 57) or LA3_0 == 61) : - LA3_18 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 18, self.input) - - raise nvae - - elif (LA3_0 == 62) and (self.synpred4()): - alt3 = 1 - elif (LA3_0 == 26) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 0, self.input) - - raise nvae - - if alt3 == 1: - # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition - self.following.append(self.FOLLOW_function_definition_in_external_declaration113) - self.function_definition() - self.following.pop() - if self.failed: - return - - - elif alt3 == 2: - # C.g:120:4: declaration - self.following.append(self.FOLLOW_declaration_in_external_declaration118) - self.declaration() - self.following.pop() - if self.failed: - return - - - elif alt3 == 3: - # C.g:121:4: macro_statement ( ';' )? - self.following.append(self.FOLLOW_macro_statement_in_external_declaration123) - self.macro_statement() - self.following.pop() - if self.failed: - return - # C.g:121:20: ( ';' )? - alt2 = 2 - LA2_0 = self.input.LA(1) - - if (LA2_0 == 25) : - alt2 = 1 - if alt2 == 1: - # C.g:121:21: ';' - self.match(self.input, 25, self.FOLLOW_25_in_external_declaration126) - if self.failed: - return - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 2, external_declaration_StartIndex) - - pass - - return - - # $ANTLR end external_declaration - - class function_definition_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start function_definition - # C.g:126:1: function_definition : (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ; - def function_definition(self, ): - self.function_definition_stack.append(function_definition_scope()) - retval = self.function_definition_return() - retval.start = self.input.LT(1) - function_definition_StartIndex = self.input.index() - d = None - - a = None - - b = None - - declarator1 = None - - + + + + # $ANTLR start translation_unit + # C.g:102:1: translation_unit : ( external_declaration )* ; + def translation_unit(self, ): + + translation_unit_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 1): + return + + # C.g:103:2: ( ( external_declaration )* ) + # C.g:103:4: ( external_declaration )* + # C.g:103:4: ( external_declaration )* + while True: #loop1 + alt1 = 2 + LA1_0 = self.input.LA(1) + + if (LA1_0 == IDENTIFIER or LA1_0 == 26 or (29 <= LA1_0 <= 42) or (45 <= LA1_0 <= 46) or (48 <= LA1_0 <= 62) or LA1_0 == 66) : + alt1 = 1 + + + if alt1 == 1: + # C.g:0:0: external_declaration + self.following.append(self.FOLLOW_external_declaration_in_translation_unit74) + self.external_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 1, translation_unit_StartIndex) + + pass + + return + + # $ANTLR end translation_unit + + + # $ANTLR start external_declaration + # C.g:114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ); + def external_declaration(self, ): + + external_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 2): + return + + # C.g:119:2: ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ) + alt3 = 3 + LA3_0 = self.input.LA(1) + + if ((29 <= LA3_0 <= 33)) : + LA3_1 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 1, self.input) + + raise nvae + + elif (LA3_0 == 34) : + LA3_2 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 2, self.input) + + raise nvae + + elif (LA3_0 == 35) : + LA3_3 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 3, self.input) + + raise nvae + + elif (LA3_0 == 36) : + LA3_4 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 4, self.input) + + raise nvae + + elif (LA3_0 == 37) : + LA3_5 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 5, self.input) + + raise nvae + + elif (LA3_0 == 38) : + LA3_6 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 6, self.input) + + raise nvae + + elif (LA3_0 == 39) : + LA3_7 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 7, self.input) + + raise nvae + + elif (LA3_0 == 40) : + LA3_8 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 8, self.input) + + raise nvae + + elif (LA3_0 == 41) : + LA3_9 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 9, self.input) + + raise nvae + + elif (LA3_0 == 42) : + LA3_10 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 10, self.input) + + raise nvae + + elif ((45 <= LA3_0 <= 46)) : + LA3_11 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 11, self.input) + + raise nvae + + elif (LA3_0 == 48) : + LA3_12 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 12, self.input) + + raise nvae + + elif (LA3_0 == IDENTIFIER) : + LA3_13 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + elif (True) : + alt3 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 13, self.input) + + raise nvae + + elif (LA3_0 == 58) : + LA3_14 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 14, self.input) + + raise nvae + + elif (LA3_0 == 66) and (self.synpred4()): + alt3 = 1 + elif (LA3_0 == 59) : + LA3_16 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 16, self.input) + + raise nvae + + elif (LA3_0 == 60) : + LA3_17 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 17, self.input) + + raise nvae + + elif ((49 <= LA3_0 <= 57) or LA3_0 == 61) : + LA3_18 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 18, self.input) + + raise nvae + + elif (LA3_0 == 62) and (self.synpred4()): + alt3 = 1 + elif (LA3_0 == 26) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 0, self.input) + + raise nvae + + if alt3 == 1: + # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition + self.following.append(self.FOLLOW_function_definition_in_external_declaration113) + self.function_definition() + self.following.pop() + if self.failed: + return + + + elif alt3 == 2: + # C.g:120:4: declaration + self.following.append(self.FOLLOW_declaration_in_external_declaration118) + self.declaration() + self.following.pop() + if self.failed: + return + + + elif alt3 == 3: + # C.g:121:4: macro_statement ( ';' )? + self.following.append(self.FOLLOW_macro_statement_in_external_declaration123) + self.macro_statement() + self.following.pop() + if self.failed: + return + # C.g:121:20: ( ';' )? + alt2 = 2 + LA2_0 = self.input.LA(1) + + if (LA2_0 == 25) : + alt2 = 1 + if alt2 == 1: + # C.g:121:21: ';' + self.match(self.input, 25, self.FOLLOW_25_in_external_declaration126) + if self.failed: + return + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 2, external_declaration_StartIndex) + + pass + + return + + # $ANTLR end external_declaration + + class function_definition_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start function_definition + # C.g:126:1: function_definition : (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ; + def function_definition(self, ): + self.function_definition_stack.append(function_definition_scope()) + retval = self.function_definition_return() + retval.start = self.input.LT(1) + function_definition_StartIndex = self.input.index() + d = None + + a = None + + b = None + + declarator1 = None + + self.function_definition_stack[-1].ModifierText = '' self.function_definition_stack[-1].DeclText = '' @@ -582,213 +582,213 @@ class CParser(Parser): self.function_definition_stack[-1].LBOffset = 0 self.function_definition_stack[-1].DeclLine = 0 self.function_definition_stack[-1].DeclOffset = 0 - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 3): - return retval - - # C.g:146:2: ( (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ) - # C.g:146:4: (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) - # C.g:146:5: (d= declaration_specifiers )? - alt4 = 2 - LA4 = self.input.LA(1) - if LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33 or LA4 == 34 or LA4 == 35 or LA4 == 36 or LA4 == 37 or LA4 == 38 or LA4 == 39 or LA4 == 40 or LA4 == 41 or LA4 == 42 or LA4 == 45 or LA4 == 46 or LA4 == 48 or LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: - alt4 = 1 - elif LA4 == IDENTIFIER: - LA4 = self.input.LA(2) - if LA4 == 66: - alt4 = 1 - elif LA4 == 58: - LA4_21 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 59: - LA4_22 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 60: - LA4_23 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == IDENTIFIER: - LA4_24 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 62: - LA4_25 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33: - LA4_26 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 34: - LA4_27 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 35: - LA4_28 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 36: - LA4_29 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 37: - LA4_30 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 38: - LA4_31 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 39: - LA4_32 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 40: - LA4_33 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 41: - LA4_34 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 42: - LA4_35 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 45 or LA4 == 46: - LA4_36 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 48: - LA4_37 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: - LA4_38 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 58: - LA4_14 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 59: - LA4_16 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 60: - LA4_17 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - if alt4 == 1: - # C.g:0:0: d= declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_function_definition157) - d = self.declaration_specifiers() - self.following.pop() - if self.failed: - return retval - - - - self.following.append(self.FOLLOW_declarator_in_function_definition160) - declarator1 = self.declarator() - self.following.pop() - if self.failed: - return retval - # C.g:147:3: ( ( declaration )+ a= compound_statement | b= compound_statement ) - alt6 = 2 - LA6_0 = self.input.LA(1) - - if (LA6_0 == IDENTIFIER or LA6_0 == 26 or (29 <= LA6_0 <= 42) or (45 <= LA6_0 <= 46) or (48 <= LA6_0 <= 61)) : - alt6 = 1 - elif (LA6_0 == 43) : - alt6 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("147:3: ( ( declaration )+ a= compound_statement | b= compound_statement )", 6, 0, self.input) - - raise nvae - - if alt6 == 1: - # C.g:147:5: ( declaration )+ a= compound_statement - # C.g:147:5: ( declaration )+ - cnt5 = 0 - while True: #loop5 - alt5 = 2 - LA5_0 = self.input.LA(1) - - if (LA5_0 == IDENTIFIER or LA5_0 == 26 or (29 <= LA5_0 <= 42) or (45 <= LA5_0 <= 46) or (48 <= LA5_0 <= 61)) : - alt5 = 1 - - - if alt5 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_function_definition166) - self.declaration() - self.following.pop() - if self.failed: - return retval - - - else: - if cnt5 >= 1: - break #loop5 - - if self.backtracking > 0: - self.failed = True - return retval - - eee = EarlyExitException(5, self.input) - raise eee - - cnt5 += 1 - - - self.following.append(self.FOLLOW_compound_statement_in_function_definition171) - a = self.compound_statement() - self.following.pop() - if self.failed: - return retval - - - elif alt6 == 2: - # C.g:148:5: b= compound_statement - self.following.append(self.FOLLOW_compound_statement_in_function_definition180) - b = self.compound_statement() - self.following.pop() - if self.failed: - return retval - - - - if self.backtracking == 0: + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 3): + return retval + + # C.g:146:2: ( (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ) + # C.g:146:4: (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) + # C.g:146:5: (d= declaration_specifiers )? + alt4 = 2 + LA4 = self.input.LA(1) + if LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33 or LA4 == 34 or LA4 == 35 or LA4 == 36 or LA4 == 37 or LA4 == 38 or LA4 == 39 or LA4 == 40 or LA4 == 41 or LA4 == 42 or LA4 == 45 or LA4 == 46 or LA4 == 48 or LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: + alt4 = 1 + elif LA4 == IDENTIFIER: + LA4 = self.input.LA(2) + if LA4 == 66: + alt4 = 1 + elif LA4 == 58: + LA4_21 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 59: + LA4_22 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 60: + LA4_23 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == IDENTIFIER: + LA4_24 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 62: + LA4_25 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33: + LA4_26 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 34: + LA4_27 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 35: + LA4_28 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 36: + LA4_29 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 37: + LA4_30 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 38: + LA4_31 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 39: + LA4_32 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 40: + LA4_33 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 41: + LA4_34 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 42: + LA4_35 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 45 or LA4 == 46: + LA4_36 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 48: + LA4_37 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: + LA4_38 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 58: + LA4_14 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 59: + LA4_16 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 60: + LA4_17 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + if alt4 == 1: + # C.g:0:0: d= declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_function_definition157) + d = self.declaration_specifiers() + self.following.pop() + if self.failed: + return retval + + + + self.following.append(self.FOLLOW_declarator_in_function_definition160) + declarator1 = self.declarator() + self.following.pop() + if self.failed: + return retval + # C.g:147:3: ( ( declaration )+ a= compound_statement | b= compound_statement ) + alt6 = 2 + LA6_0 = self.input.LA(1) + + if (LA6_0 == IDENTIFIER or LA6_0 == 26 or (29 <= LA6_0 <= 42) or (45 <= LA6_0 <= 46) or (48 <= LA6_0 <= 61)) : + alt6 = 1 + elif (LA6_0 == 43) : + alt6 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("147:3: ( ( declaration )+ a= compound_statement | b= compound_statement )", 6, 0, self.input) + + raise nvae + + if alt6 == 1: + # C.g:147:5: ( declaration )+ a= compound_statement + # C.g:147:5: ( declaration )+ + cnt5 = 0 + while True: #loop5 + alt5 = 2 + LA5_0 = self.input.LA(1) + + if (LA5_0 == IDENTIFIER or LA5_0 == 26 or (29 <= LA5_0 <= 42) or (45 <= LA5_0 <= 46) or (48 <= LA5_0 <= 61)) : + alt5 = 1 + + + if alt5 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_function_definition166) + self.declaration() + self.following.pop() + if self.failed: + return retval + + + else: + if cnt5 >= 1: + break #loop5 + + if self.backtracking > 0: + self.failed = True + return retval + + eee = EarlyExitException(5, self.input) + raise eee + + cnt5 += 1 + + + self.following.append(self.FOLLOW_compound_statement_in_function_definition171) + a = self.compound_statement() + self.following.pop() + if self.failed: + return retval + + + elif alt6 == 2: + # C.g:148:5: b= compound_statement + self.following.append(self.FOLLOW_compound_statement_in_function_definition180) + b = self.compound_statement() + self.following.pop() + if self.failed: + return retval + + + + if self.backtracking == 0: if d != None: self.function_definition_stack[-1].ModifierText = self.input.toString(d.start,d.stop) @@ -803,18042 +803,18042 @@ class CParser(Parser): else: self.function_definition_stack[-1].LBLine = b.start.line self.function_definition_stack[-1].LBOffset = b.start.charPositionInLine - - - - - - retval.stop = self.input.LT(-1) - - if self.backtracking == 0: + + + + + + retval.stop = self.input.LT(-1) + + if self.backtracking == 0: self.StoreFunctionDefinition(retval.start.line, retval.start.charPositionInLine, retval.stop.line, retval.stop.charPositionInLine, self.function_definition_stack[-1].ModifierText, self.function_definition_stack[-1].DeclText, self.function_definition_stack[-1].LBLine, self.function_definition_stack[-1].LBOffset, self.function_definition_stack[-1].DeclLine, self.function_definition_stack[-1].DeclOffset) - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 3, function_definition_StartIndex) - - self.function_definition_stack.pop() - pass - - return retval - - # $ANTLR end function_definition - - - # $ANTLR start declaration - # C.g:166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ); - def declaration(self, ): - - declaration_StartIndex = self.input.index() - a = None - d = None - e = None - b = None - - c = None - - s = None - - t = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 4): - return - - # C.g:167:2: (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ) - alt9 = 2 - LA9_0 = self.input.LA(1) - - if (LA9_0 == 26) : - alt9 = 1 - elif (LA9_0 == IDENTIFIER or (29 <= LA9_0 <= 42) or (45 <= LA9_0 <= 46) or (48 <= LA9_0 <= 61)) : - alt9 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' );", 9, 0, self.input) - - raise nvae - - if alt9 == 1: - # C.g:167:4: a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' - a = self.input.LT(1) - self.match(self.input, 26, self.FOLLOW_26_in_declaration203) - if self.failed: - return - # C.g:167:17: (b= declaration_specifiers )? - alt7 = 2 - LA7 = self.input.LA(1) - if LA7 == 29 or LA7 == 30 or LA7 == 31 or LA7 == 32 or LA7 == 33 or LA7 == 34 or LA7 == 35 or LA7 == 36 or LA7 == 37 or LA7 == 38 or LA7 == 39 or LA7 == 40 or LA7 == 41 or LA7 == 42 or LA7 == 45 or LA7 == 46 or LA7 == 48 or LA7 == 49 or LA7 == 50 or LA7 == 51 or LA7 == 52 or LA7 == 53 or LA7 == 54 or LA7 == 55 or LA7 == 56 or LA7 == 57 or LA7 == 61: - alt7 = 1 - elif LA7 == IDENTIFIER: - LA7_13 = self.input.LA(2) - - if (LA7_13 == 62) : - LA7_21 = self.input.LA(3) - - if (self.synpred10()) : - alt7 = 1 - elif (LA7_13 == IDENTIFIER or (29 <= LA7_13 <= 42) or (45 <= LA7_13 <= 46) or (48 <= LA7_13 <= 61) or LA7_13 == 66) : - alt7 = 1 - elif LA7 == 58: - LA7_14 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - elif LA7 == 59: - LA7_16 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - elif LA7 == 60: - LA7_17 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - if alt7 == 1: - # C.g:0:0: b= declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_declaration207) - b = self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - - self.following.append(self.FOLLOW_init_declarator_list_in_declaration216) - c = self.init_declarator_list() - self.following.pop() - if self.failed: - return - d = self.input.LT(1) - self.match(self.input, 25, self.FOLLOW_25_in_declaration220) - if self.failed: - return - if self.backtracking == 0: + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 3, function_definition_StartIndex) + + self.function_definition_stack.pop() + pass + + return retval + + # $ANTLR end function_definition + + + # $ANTLR start declaration + # C.g:166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ); + def declaration(self, ): + + declaration_StartIndex = self.input.index() + a = None + d = None + e = None + b = None + + c = None + + s = None + + t = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 4): + return + + # C.g:167:2: (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ) + alt9 = 2 + LA9_0 = self.input.LA(1) + + if (LA9_0 == 26) : + alt9 = 1 + elif (LA9_0 == IDENTIFIER or (29 <= LA9_0 <= 42) or (45 <= LA9_0 <= 46) or (48 <= LA9_0 <= 61)) : + alt9 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' );", 9, 0, self.input) + + raise nvae + + if alt9 == 1: + # C.g:167:4: a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' + a = self.input.LT(1) + self.match(self.input, 26, self.FOLLOW_26_in_declaration203) + if self.failed: + return + # C.g:167:17: (b= declaration_specifiers )? + alt7 = 2 + LA7 = self.input.LA(1) + if LA7 == 29 or LA7 == 30 or LA7 == 31 or LA7 == 32 or LA7 == 33 or LA7 == 34 or LA7 == 35 or LA7 == 36 or LA7 == 37 or LA7 == 38 or LA7 == 39 or LA7 == 40 or LA7 == 41 or LA7 == 42 or LA7 == 45 or LA7 == 46 or LA7 == 48 or LA7 == 49 or LA7 == 50 or LA7 == 51 or LA7 == 52 or LA7 == 53 or LA7 == 54 or LA7 == 55 or LA7 == 56 or LA7 == 57 or LA7 == 61: + alt7 = 1 + elif LA7 == IDENTIFIER: + LA7_13 = self.input.LA(2) + + if (LA7_13 == 62) : + LA7_21 = self.input.LA(3) + + if (self.synpred10()) : + alt7 = 1 + elif (LA7_13 == IDENTIFIER or (29 <= LA7_13 <= 42) or (45 <= LA7_13 <= 46) or (48 <= LA7_13 <= 61) or LA7_13 == 66) : + alt7 = 1 + elif LA7 == 58: + LA7_14 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + elif LA7 == 59: + LA7_16 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + elif LA7 == 60: + LA7_17 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + if alt7 == 1: + # C.g:0:0: b= declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_declaration207) + b = self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + + self.following.append(self.FOLLOW_init_declarator_list_in_declaration216) + c = self.init_declarator_list() + self.following.pop() + if self.failed: + return + d = self.input.LT(1) + self.match(self.input, 25, self.FOLLOW_25_in_declaration220) + if self.failed: + return + if self.backtracking == 0: if b != None: self.StoreTypedefDefinition(a.line, a.charPositionInLine, d.line, d.charPositionInLine, self.input.toString(b.start,b.stop), self.input.toString(c.start,c.stop)) else: self.StoreTypedefDefinition(a.line, a.charPositionInLine, d.line, d.charPositionInLine, '', self.input.toString(c.start,c.stop)) - - - - - elif alt9 == 2: - # C.g:175:4: s= declaration_specifiers (t= init_declarator_list )? e= ';' - self.following.append(self.FOLLOW_declaration_specifiers_in_declaration234) - s = self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:175:30: (t= init_declarator_list )? - alt8 = 2 - LA8_0 = self.input.LA(1) - - if (LA8_0 == IDENTIFIER or (58 <= LA8_0 <= 60) or LA8_0 == 62 or LA8_0 == 66) : - alt8 = 1 - if alt8 == 1: - # C.g:0:0: t= init_declarator_list - self.following.append(self.FOLLOW_init_declarator_list_in_declaration238) - t = self.init_declarator_list() - self.following.pop() - if self.failed: - return - - - - e = self.input.LT(1) - self.match(self.input, 25, self.FOLLOW_25_in_declaration243) - if self.failed: - return - if self.backtracking == 0: + + + + + elif alt9 == 2: + # C.g:175:4: s= declaration_specifiers (t= init_declarator_list )? e= ';' + self.following.append(self.FOLLOW_declaration_specifiers_in_declaration234) + s = self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:175:30: (t= init_declarator_list )? + alt8 = 2 + LA8_0 = self.input.LA(1) + + if (LA8_0 == IDENTIFIER or (58 <= LA8_0 <= 60) or LA8_0 == 62 or LA8_0 == 66) : + alt8 = 1 + if alt8 == 1: + # C.g:0:0: t= init_declarator_list + self.following.append(self.FOLLOW_init_declarator_list_in_declaration238) + t = self.init_declarator_list() + self.following.pop() + if self.failed: + return + + + + e = self.input.LT(1) + self.match(self.input, 25, self.FOLLOW_25_in_declaration243) + if self.failed: + return + if self.backtracking == 0: if t != None: self.StoreVariableDeclaration(s.start.line, s.start.charPositionInLine, t.start.line, t.start.charPositionInLine, self.input.toString(s.start,s.stop), self.input.toString(t.start,t.stop)) - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 4, declaration_StartIndex) - - pass - - return - - # $ANTLR end declaration - - class declaration_specifiers_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start declaration_specifiers - # C.g:182:1: declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ; - def declaration_specifiers(self, ): - - retval = self.declaration_specifiers_return() - retval.start = self.input.LT(1) - declaration_specifiers_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 5): - return retval - - # C.g:183:2: ( ( storage_class_specifier | type_specifier | type_qualifier )+ ) - # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ - # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ - cnt10 = 0 - while True: #loop10 - alt10 = 4 - LA10 = self.input.LA(1) - if LA10 == 58: - LA10_2 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 59: - LA10_3 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 60: - LA10_4 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == IDENTIFIER: - LA10_5 = self.input.LA(2) - - if (self.synpred14()) : - alt10 = 2 - - - elif LA10 == 53: - LA10_9 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 29 or LA10 == 30 or LA10 == 31 or LA10 == 32 or LA10 == 33: - alt10 = 1 - elif LA10 == 34 or LA10 == 35 or LA10 == 36 or LA10 == 37 or LA10 == 38 or LA10 == 39 or LA10 == 40 or LA10 == 41 or LA10 == 42 or LA10 == 45 or LA10 == 46 or LA10 == 48: - alt10 = 2 - elif LA10 == 49 or LA10 == 50 or LA10 == 51 or LA10 == 52 or LA10 == 54 or LA10 == 55 or LA10 == 56 or LA10 == 57 or LA10 == 61: - alt10 = 3 - - if alt10 == 1: - # C.g:183:10: storage_class_specifier - self.following.append(self.FOLLOW_storage_class_specifier_in_declaration_specifiers264) - self.storage_class_specifier() - self.following.pop() - if self.failed: - return retval - - - elif alt10 == 2: - # C.g:184:7: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_declaration_specifiers272) - self.type_specifier() - self.following.pop() - if self.failed: - return retval - - - elif alt10 == 3: - # C.g:185:13: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_declaration_specifiers286) - self.type_qualifier() - self.following.pop() - if self.failed: - return retval - - - else: - if cnt10 >= 1: - break #loop10 - - if self.backtracking > 0: - self.failed = True - return retval - - eee = EarlyExitException(10, self.input) - raise eee - - cnt10 += 1 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 5, declaration_specifiers_StartIndex) - - pass - - return retval - - # $ANTLR end declaration_specifiers - - class init_declarator_list_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start init_declarator_list - # C.g:189:1: init_declarator_list : init_declarator ( ',' init_declarator )* ; - def init_declarator_list(self, ): - - retval = self.init_declarator_list_return() - retval.start = self.input.LT(1) - init_declarator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 6): - return retval - - # C.g:190:2: ( init_declarator ( ',' init_declarator )* ) - # C.g:190:4: init_declarator ( ',' init_declarator )* - self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list308) - self.init_declarator() - self.following.pop() - if self.failed: - return retval - # C.g:190:20: ( ',' init_declarator )* - while True: #loop11 - alt11 = 2 - LA11_0 = self.input.LA(1) - - if (LA11_0 == 27) : - alt11 = 1 - - - if alt11 == 1: - # C.g:190:21: ',' init_declarator - self.match(self.input, 27, self.FOLLOW_27_in_init_declarator_list311) - if self.failed: - return retval - self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list313) - self.init_declarator() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop11 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 6, init_declarator_list_StartIndex) - - pass - - return retval - - # $ANTLR end init_declarator_list - - - # $ANTLR start init_declarator - # C.g:193:1: init_declarator : declarator ( '=' initializer )? ; - def init_declarator(self, ): - - init_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 7): - return - - # C.g:194:2: ( declarator ( '=' initializer )? ) - # C.g:194:4: declarator ( '=' initializer )? - self.following.append(self.FOLLOW_declarator_in_init_declarator326) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:194:15: ( '=' initializer )? - alt12 = 2 - LA12_0 = self.input.LA(1) - - if (LA12_0 == 28) : - alt12 = 1 - if alt12 == 1: - # C.g:194:16: '=' initializer - self.match(self.input, 28, self.FOLLOW_28_in_init_declarator329) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_in_init_declarator331) - self.initializer() - self.following.pop() - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 7, init_declarator_StartIndex) - - pass - - return - - # $ANTLR end init_declarator - - - # $ANTLR start storage_class_specifier - # C.g:197:1: storage_class_specifier : ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ); - def storage_class_specifier(self, ): - - storage_class_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 8): - return - - # C.g:198:2: ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ) - # C.g: - if (29 <= self.input.LA(1) <= 33): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_storage_class_specifier0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 8, storage_class_specifier_StartIndex) - - pass - - return - - # $ANTLR end storage_class_specifier - - - # $ANTLR start type_specifier - # C.g:205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ); - def type_specifier(self, ): - - type_specifier_StartIndex = self.input.index() - s = None - - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 9): - return - - # C.g:206:2: ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ) - alt13 = 12 - LA13_0 = self.input.LA(1) - - if (LA13_0 == 34) : - alt13 = 1 - elif (LA13_0 == 35) : - alt13 = 2 - elif (LA13_0 == 36) : - alt13 = 3 - elif (LA13_0 == 37) : - alt13 = 4 - elif (LA13_0 == 38) : - alt13 = 5 - elif (LA13_0 == 39) : - alt13 = 6 - elif (LA13_0 == 40) : - alt13 = 7 - elif (LA13_0 == 41) : - alt13 = 8 - elif (LA13_0 == 42) : - alt13 = 9 - elif ((45 <= LA13_0 <= 46)) : - alt13 = 10 - elif (LA13_0 == 48) : - alt13 = 11 - elif (LA13_0 == IDENTIFIER) and (self.synpred34()): - alt13 = 12 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id );", 13, 0, self.input) - - raise nvae - - if alt13 == 1: - # C.g:206:4: 'void' - self.match(self.input, 34, self.FOLLOW_34_in_type_specifier376) - if self.failed: - return - - - elif alt13 == 2: - # C.g:207:4: 'char' - self.match(self.input, 35, self.FOLLOW_35_in_type_specifier381) - if self.failed: - return - - - elif alt13 == 3: - # C.g:208:4: 'short' - self.match(self.input, 36, self.FOLLOW_36_in_type_specifier386) - if self.failed: - return - - - elif alt13 == 4: - # C.g:209:4: 'int' - self.match(self.input, 37, self.FOLLOW_37_in_type_specifier391) - if self.failed: - return - - - elif alt13 == 5: - # C.g:210:4: 'long' - self.match(self.input, 38, self.FOLLOW_38_in_type_specifier396) - if self.failed: - return - - - elif alt13 == 6: - # C.g:211:4: 'float' - self.match(self.input, 39, self.FOLLOW_39_in_type_specifier401) - if self.failed: - return - - - elif alt13 == 7: - # C.g:212:4: 'double' - self.match(self.input, 40, self.FOLLOW_40_in_type_specifier406) - if self.failed: - return - - - elif alt13 == 8: - # C.g:213:4: 'signed' - self.match(self.input, 41, self.FOLLOW_41_in_type_specifier411) - if self.failed: - return - - - elif alt13 == 9: - # C.g:214:4: 'unsigned' - self.match(self.input, 42, self.FOLLOW_42_in_type_specifier416) - if self.failed: - return - - - elif alt13 == 10: - # C.g:215:4: s= struct_or_union_specifier - self.following.append(self.FOLLOW_struct_or_union_specifier_in_type_specifier423) - s = self.struct_or_union_specifier() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - - if s.stop != None: - self.StoreStructUnionDefinition(s.start.line, s.start.charPositionInLine, s.stop.line, s.stop.charPositionInLine, self.input.toString(s.start,s.stop)) - - - - - elif alt13 == 11: - # C.g:220:4: e= enum_specifier - self.following.append(self.FOLLOW_enum_specifier_in_type_specifier433) - e = self.enum_specifier() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - - if e.stop != None: - self.StoreEnumerationDefinition(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - elif alt13 == 12: - # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator )=> type_id - self.following.append(self.FOLLOW_type_id_in_type_specifier451) - self.type_id() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 9, type_specifier_StartIndex) - - pass - - return - - # $ANTLR end type_specifier - - - # $ANTLR start type_id - # C.g:228:1: type_id : IDENTIFIER ; - def type_id(self, ): - - type_id_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 10): - return - - # C.g:229:5: ( IDENTIFIER ) - # C.g:229:9: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_type_id467) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 10, type_id_StartIndex) - - pass - - return - - # $ANTLR end type_id - - class struct_or_union_specifier_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start struct_or_union_specifier - # C.g:233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ); - def struct_or_union_specifier(self, ): - - retval = self.struct_or_union_specifier_return() - retval.start = self.input.LT(1) - struct_or_union_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 11): - return retval - - # C.g:235:2: ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ) - alt15 = 2 - LA15_0 = self.input.LA(1) - - if ((45 <= LA15_0 <= 46)) : - LA15_1 = self.input.LA(2) - - if (LA15_1 == IDENTIFIER) : - LA15_2 = self.input.LA(3) - - if (LA15_2 == 43) : - alt15 = 1 - elif (LA15_2 == EOF or LA15_2 == IDENTIFIER or LA15_2 == 25 or LA15_2 == 27 or (29 <= LA15_2 <= 42) or (45 <= LA15_2 <= 64) or LA15_2 == 66) : - alt15 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 2, self.input) - - raise nvae - - elif (LA15_1 == 43) : - alt15 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 0, self.input) - - raise nvae - - if alt15 == 1: - # C.g:235:4: struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' - self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier494) - self.struct_or_union() - self.following.pop() - if self.failed: - return retval - # C.g:235:20: ( IDENTIFIER )? - alt14 = 2 - LA14_0 = self.input.LA(1) - - if (LA14_0 == IDENTIFIER) : - alt14 = 1 - if alt14 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier496) - if self.failed: - return retval - - - - self.match(self.input, 43, self.FOLLOW_43_in_struct_or_union_specifier499) - if self.failed: - return retval - self.following.append(self.FOLLOW_struct_declaration_list_in_struct_or_union_specifier501) - self.struct_declaration_list() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 44, self.FOLLOW_44_in_struct_or_union_specifier503) - if self.failed: - return retval - - - elif alt15 == 2: - # C.g:236:4: struct_or_union IDENTIFIER - self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier508) - self.struct_or_union() - self.following.pop() - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier510) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 11, struct_or_union_specifier_StartIndex) - - pass - - return retval - - # $ANTLR end struct_or_union_specifier - - - # $ANTLR start struct_or_union - # C.g:239:1: struct_or_union : ( 'struct' | 'union' ); - def struct_or_union(self, ): - - struct_or_union_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 12): - return - - # C.g:240:2: ( 'struct' | 'union' ) - # C.g: - if (45 <= self.input.LA(1) <= 46): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_struct_or_union0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 12, struct_or_union_StartIndex) - - pass - - return - - # $ANTLR end struct_or_union - - - # $ANTLR start struct_declaration_list - # C.g:244:1: struct_declaration_list : ( struct_declaration )+ ; - def struct_declaration_list(self, ): - - struct_declaration_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 13): - return - - # C.g:245:2: ( ( struct_declaration )+ ) - # C.g:245:4: ( struct_declaration )+ - # C.g:245:4: ( struct_declaration )+ - cnt16 = 0 - while True: #loop16 - alt16 = 2 - LA16_0 = self.input.LA(1) - - if (LA16_0 == IDENTIFIER or (34 <= LA16_0 <= 42) or (45 <= LA16_0 <= 46) or (48 <= LA16_0 <= 61)) : - alt16 = 1 - - - if alt16 == 1: - # C.g:0:0: struct_declaration - self.following.append(self.FOLLOW_struct_declaration_in_struct_declaration_list537) - self.struct_declaration() - self.following.pop() - if self.failed: - return - - - else: - if cnt16 >= 1: - break #loop16 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(16, self.input) - raise eee - - cnt16 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 13, struct_declaration_list_StartIndex) - - pass - - return - - # $ANTLR end struct_declaration_list - - - # $ANTLR start struct_declaration - # C.g:248:1: struct_declaration : specifier_qualifier_list struct_declarator_list ';' ; - def struct_declaration(self, ): - - struct_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 14): - return - - # C.g:249:2: ( specifier_qualifier_list struct_declarator_list ';' ) - # C.g:249:4: specifier_qualifier_list struct_declarator_list ';' - self.following.append(self.FOLLOW_specifier_qualifier_list_in_struct_declaration549) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_struct_declarator_list_in_struct_declaration551) - self.struct_declarator_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_struct_declaration553) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 14, struct_declaration_StartIndex) - - pass - - return - - # $ANTLR end struct_declaration - - - # $ANTLR start specifier_qualifier_list - # C.g:252:1: specifier_qualifier_list : ( type_qualifier | type_specifier )+ ; - def specifier_qualifier_list(self, ): - - specifier_qualifier_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 15): - return - - # C.g:253:2: ( ( type_qualifier | type_specifier )+ ) - # C.g:253:4: ( type_qualifier | type_specifier )+ - # C.g:253:4: ( type_qualifier | type_specifier )+ - cnt17 = 0 - while True: #loop17 - alt17 = 3 - LA17 = self.input.LA(1) - if LA17 == 58: - LA17_2 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == 59: - LA17_3 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == 60: - LA17_4 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == IDENTIFIER: - LA17 = self.input.LA(2) - if LA17 == EOF or LA17 == IDENTIFIER or LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48 or LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 58 or LA17 == 59 or LA17 == 60 or LA17 == 61 or LA17 == 63 or LA17 == 66: - alt17 = 2 - elif LA17 == 62: - LA17_94 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - elif LA17 == 47: - LA17_95 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - elif LA17 == 64: - LA17_96 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - - elif LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 61: - alt17 = 1 - elif LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48: - alt17 = 2 - - if alt17 == 1: - # C.g:253:6: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_specifier_qualifier_list566) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - elif alt17 == 2: - # C.g:253:23: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_specifier_qualifier_list570) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt17 >= 1: - break #loop17 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(17, self.input) - raise eee - - cnt17 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 15, specifier_qualifier_list_StartIndex) - - pass - - return - - # $ANTLR end specifier_qualifier_list - - - # $ANTLR start struct_declarator_list - # C.g:256:1: struct_declarator_list : struct_declarator ( ',' struct_declarator )* ; - def struct_declarator_list(self, ): - - struct_declarator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 16): - return - - # C.g:257:2: ( struct_declarator ( ',' struct_declarator )* ) - # C.g:257:4: struct_declarator ( ',' struct_declarator )* - self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list584) - self.struct_declarator() - self.following.pop() - if self.failed: - return - # C.g:257:22: ( ',' struct_declarator )* - while True: #loop18 - alt18 = 2 - LA18_0 = self.input.LA(1) - - if (LA18_0 == 27) : - alt18 = 1 - - - if alt18 == 1: - # C.g:257:23: ',' struct_declarator - self.match(self.input, 27, self.FOLLOW_27_in_struct_declarator_list587) - if self.failed: - return - self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list589) - self.struct_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop18 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 16, struct_declarator_list_StartIndex) - - pass - - return - - # $ANTLR end struct_declarator_list - - - # $ANTLR start struct_declarator - # C.g:260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression ); - def struct_declarator(self, ): - - struct_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 17): - return - - # C.g:261:2: ( declarator ( ':' constant_expression )? | ':' constant_expression ) - alt20 = 2 - LA20_0 = self.input.LA(1) - - if (LA20_0 == IDENTIFIER or (58 <= LA20_0 <= 60) or LA20_0 == 62 or LA20_0 == 66) : - alt20 = 1 - elif (LA20_0 == 47) : - alt20 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression );", 20, 0, self.input) - - raise nvae - - if alt20 == 1: - # C.g:261:4: declarator ( ':' constant_expression )? - self.following.append(self.FOLLOW_declarator_in_struct_declarator602) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:261:15: ( ':' constant_expression )? - alt19 = 2 - LA19_0 = self.input.LA(1) - - if (LA19_0 == 47) : - alt19 = 1 - if alt19 == 1: - # C.g:261:16: ':' constant_expression - self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator605) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_struct_declarator607) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - - - elif alt20 == 2: - # C.g:262:4: ':' constant_expression - self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator614) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_struct_declarator616) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 17, struct_declarator_StartIndex) - - pass - - return - - # $ANTLR end struct_declarator - - class enum_specifier_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start enum_specifier - # C.g:265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ); - def enum_specifier(self, ): - - retval = self.enum_specifier_return() - retval.start = self.input.LT(1) - enum_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 18): - return retval - - # C.g:267:2: ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ) - alt23 = 3 - LA23_0 = self.input.LA(1) - - if (LA23_0 == 48) : - LA23_1 = self.input.LA(2) - - if (LA23_1 == IDENTIFIER) : - LA23_2 = self.input.LA(3) - - if (LA23_2 == 43) : - alt23 = 2 - elif (LA23_2 == EOF or LA23_2 == IDENTIFIER or LA23_2 == 25 or LA23_2 == 27 or (29 <= LA23_2 <= 42) or (45 <= LA23_2 <= 64) or LA23_2 == 66) : - alt23 = 3 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 2, self.input) - - raise nvae - - elif (LA23_1 == 43) : - alt23 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 0, self.input) - - raise nvae - - if alt23 == 1: - # C.g:267:4: 'enum' '{' enumerator_list ( ',' )? '}' - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier634) - if self.failed: - return retval - self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier636) - if self.failed: - return retval - self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier638) - self.enumerator_list() - self.following.pop() - if self.failed: - return retval - # C.g:267:31: ( ',' )? - alt21 = 2 - LA21_0 = self.input.LA(1) - - if (LA21_0 == 27) : - alt21 = 1 - if alt21 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier640) - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier643) - if self.failed: - return retval - - - elif alt23 == 2: - # C.g:268:4: 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier648) - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier650) - if self.failed: - return retval - self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier652) - if self.failed: - return retval - self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier654) - self.enumerator_list() - self.following.pop() - if self.failed: - return retval - # C.g:268:42: ( ',' )? - alt22 = 2 - LA22_0 = self.input.LA(1) - - if (LA22_0 == 27) : - alt22 = 1 - if alt22 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier656) - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier659) - if self.failed: - return retval - - - elif alt23 == 3: - # C.g:269:4: 'enum' IDENTIFIER - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier664) - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier666) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 18, enum_specifier_StartIndex) - - pass - - return retval - - # $ANTLR end enum_specifier - - - # $ANTLR start enumerator_list - # C.g:272:1: enumerator_list : enumerator ( ',' enumerator )* ; - def enumerator_list(self, ): - - enumerator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 19): - return - - # C.g:273:2: ( enumerator ( ',' enumerator )* ) - # C.g:273:4: enumerator ( ',' enumerator )* - self.following.append(self.FOLLOW_enumerator_in_enumerator_list677) - self.enumerator() - self.following.pop() - if self.failed: - return - # C.g:273:15: ( ',' enumerator )* - while True: #loop24 - alt24 = 2 - LA24_0 = self.input.LA(1) - - if (LA24_0 == 27) : - LA24_1 = self.input.LA(2) - - if (LA24_1 == IDENTIFIER) : - alt24 = 1 - - - - - if alt24 == 1: - # C.g:273:16: ',' enumerator - self.match(self.input, 27, self.FOLLOW_27_in_enumerator_list680) - if self.failed: - return - self.following.append(self.FOLLOW_enumerator_in_enumerator_list682) - self.enumerator() - self.following.pop() - if self.failed: - return - - - else: - break #loop24 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 19, enumerator_list_StartIndex) - - pass - - return - - # $ANTLR end enumerator_list - - - # $ANTLR start enumerator - # C.g:276:1: enumerator : IDENTIFIER ( '=' constant_expression )? ; - def enumerator(self, ): - - enumerator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 20): - return - - # C.g:277:2: ( IDENTIFIER ( '=' constant_expression )? ) - # C.g:277:4: IDENTIFIER ( '=' constant_expression )? - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enumerator695) - if self.failed: - return - # C.g:277:15: ( '=' constant_expression )? - alt25 = 2 - LA25_0 = self.input.LA(1) - - if (LA25_0 == 28) : - alt25 = 1 - if alt25 == 1: - # C.g:277:16: '=' constant_expression - self.match(self.input, 28, self.FOLLOW_28_in_enumerator698) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_enumerator700) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 20, enumerator_StartIndex) - - pass - - return - - # $ANTLR end enumerator - - - # $ANTLR start type_qualifier - # C.g:280:1: type_qualifier : ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ); - def type_qualifier(self, ): - - type_qualifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 21): - return - - # C.g:281:2: ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ) - # C.g: - if (49 <= self.input.LA(1) <= 61): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_type_qualifier0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 21, type_qualifier_StartIndex) - - pass - - return - - # $ANTLR end type_qualifier - - class declarator_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start declarator - # C.g:296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ); - def declarator(self, ): - - retval = self.declarator_return() - retval.start = self.input.LT(1) - declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 22): - return retval - - # C.g:297:2: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ) - alt30 = 2 - LA30_0 = self.input.LA(1) - - if (LA30_0 == 66) : - LA30_1 = self.input.LA(2) - - if (self.synpred66()) : - alt30 = 1 - elif (True) : - alt30 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 1, self.input) - - raise nvae - - elif (LA30_0 == IDENTIFIER or (58 <= LA30_0 <= 60) or LA30_0 == 62) : - alt30 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 0, self.input) - - raise nvae - - if alt30 == 1: - # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator - # C.g:297:4: ( pointer )? - alt26 = 2 - LA26_0 = self.input.LA(1) - - if (LA26_0 == 66) : - alt26 = 1 - if alt26 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_declarator784) - self.pointer() - self.following.pop() - if self.failed: - return retval - - - - # C.g:297:13: ( 'EFIAPI' )? - alt27 = 2 - LA27_0 = self.input.LA(1) - - if (LA27_0 == 58) : - alt27 = 1 - if alt27 == 1: - # C.g:297:14: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_declarator788) - if self.failed: - return retval - - - - # C.g:297:25: ( 'EFI_BOOTSERVICE' )? - alt28 = 2 - LA28_0 = self.input.LA(1) - - if (LA28_0 == 59) : - alt28 = 1 - if alt28 == 1: - # C.g:297:26: 'EFI_BOOTSERVICE' - self.match(self.input, 59, self.FOLLOW_59_in_declarator793) - if self.failed: - return retval - - - - # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? - alt29 = 2 - LA29_0 = self.input.LA(1) - - if (LA29_0 == 60) : - alt29 = 1 - if alt29 == 1: - # C.g:297:47: 'EFI_RUNTIMESERVICE' - self.match(self.input, 60, self.FOLLOW_60_in_declarator798) - if self.failed: - return retval - - - - self.following.append(self.FOLLOW_direct_declarator_in_declarator802) - self.direct_declarator() - self.following.pop() - if self.failed: - return retval - - - elif alt30 == 2: - # C.g:299:4: pointer - self.following.append(self.FOLLOW_pointer_in_declarator808) - self.pointer() - self.following.pop() - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 22, declarator_StartIndex) - - pass - - return retval - - # $ANTLR end declarator - - - # $ANTLR start direct_declarator - # C.g:302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ); - def direct_declarator(self, ): - - direct_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 23): - return - - # C.g:303:2: ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ) - alt34 = 2 - LA34_0 = self.input.LA(1) - - if (LA34_0 == IDENTIFIER) : - alt34 = 1 - elif (LA34_0 == 62) : - alt34 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ );", 34, 0, self.input) - - raise nvae - - if alt34 == 1: - # C.g:303:4: IDENTIFIER ( declarator_suffix )* - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_direct_declarator819) - if self.failed: - return - # C.g:303:15: ( declarator_suffix )* - while True: #loop31 - alt31 = 2 - LA31_0 = self.input.LA(1) - - if (LA31_0 == 62) : - LA31 = self.input.LA(2) - if LA31 == 63: - LA31_30 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 58: - LA31_31 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 66: - LA31_32 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 59: - LA31_33 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 60: - LA31_34 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == IDENTIFIER: - LA31_35 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 29 or LA31 == 30 or LA31 == 31 or LA31 == 32 or LA31 == 33: - LA31_37 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 34: - LA31_38 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 35: - LA31_39 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 36: - LA31_40 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 37: - LA31_41 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 38: - LA31_42 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 39: - LA31_43 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 40: - LA31_44 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 41: - LA31_45 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 42: - LA31_46 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 45 or LA31 == 46: - LA31_47 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 48: - LA31_48 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 49 or LA31 == 50 or LA31 == 51 or LA31 == 52 or LA31 == 53 or LA31 == 54 or LA31 == 55 or LA31 == 56 or LA31 == 57 or LA31 == 61: - LA31_49 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - - elif (LA31_0 == 64) : - LA31 = self.input.LA(2) - if LA31 == 65: - LA31_51 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 62: - LA31_52 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == IDENTIFIER: - LA31_53 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == HEX_LITERAL: - LA31_54 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == OCTAL_LITERAL: - LA31_55 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == DECIMAL_LITERAL: - LA31_56 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == CHARACTER_LITERAL: - LA31_57 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == STRING_LITERAL: - LA31_58 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == FLOATING_POINT_LITERAL: - LA31_59 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 72: - LA31_60 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 73: - LA31_61 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 66 or LA31 == 68 or LA31 == 69 or LA31 == 77 or LA31 == 78 or LA31 == 79: - LA31_62 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 74: - LA31_63 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - - - - if alt31 == 1: - # C.g:0:0: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator821) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - break #loop31 - - - - - elif alt34 == 2: - # C.g:304:4: '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ - self.match(self.input, 62, self.FOLLOW_62_in_direct_declarator827) - if self.failed: - return - # C.g:304:8: ( 'EFIAPI' )? - alt32 = 2 - LA32_0 = self.input.LA(1) - - if (LA32_0 == 58) : - LA32_1 = self.input.LA(2) - - if (self.synpred69()) : - alt32 = 1 - if alt32 == 1: - # C.g:304:9: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_direct_declarator830) - if self.failed: - return - - - - self.following.append(self.FOLLOW_declarator_in_direct_declarator834) - self.declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_direct_declarator836) - if self.failed: - return - # C.g:304:35: ( declarator_suffix )+ - cnt33 = 0 - while True: #loop33 - alt33 = 2 - LA33_0 = self.input.LA(1) - - if (LA33_0 == 62) : - LA33 = self.input.LA(2) - if LA33 == 63: - LA33_30 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 58: - LA33_31 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 66: - LA33_32 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 59: - LA33_33 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 60: - LA33_34 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == IDENTIFIER: - LA33_35 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 29 or LA33 == 30 or LA33 == 31 or LA33 == 32 or LA33 == 33: - LA33_37 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 34: - LA33_38 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 35: - LA33_39 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 36: - LA33_40 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 37: - LA33_41 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 38: - LA33_42 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 39: - LA33_43 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 40: - LA33_44 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 41: - LA33_45 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 42: - LA33_46 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 45 or LA33 == 46: - LA33_47 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 48: - LA33_48 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 49 or LA33 == 50 or LA33 == 51 or LA33 == 52 or LA33 == 53 or LA33 == 54 or LA33 == 55 or LA33 == 56 or LA33 == 57 or LA33 == 61: - LA33_49 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - - elif (LA33_0 == 64) : - LA33 = self.input.LA(2) - if LA33 == 65: - LA33_51 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 62: - LA33_52 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == IDENTIFIER: - LA33_53 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == HEX_LITERAL: - LA33_54 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == OCTAL_LITERAL: - LA33_55 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == DECIMAL_LITERAL: - LA33_56 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == CHARACTER_LITERAL: - LA33_57 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == STRING_LITERAL: - LA33_58 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == FLOATING_POINT_LITERAL: - LA33_59 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 72: - LA33_60 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 73: - LA33_61 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 66 or LA33 == 68 or LA33 == 69 or LA33 == 77 or LA33 == 78 or LA33 == 79: - LA33_62 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 74: - LA33_63 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - - - - if alt33 == 1: - # C.g:0:0: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator838) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - if cnt33 >= 1: - break #loop33 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(33, self.input) - raise eee - - cnt33 += 1 - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 23, direct_declarator_StartIndex) - - pass - - return - - # $ANTLR end direct_declarator - - - # $ANTLR start declarator_suffix - # C.g:307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ); - def declarator_suffix(self, ): - - declarator_suffix_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 24): - return - - # C.g:308:2: ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ) - alt35 = 5 - LA35_0 = self.input.LA(1) - - if (LA35_0 == 64) : - LA35_1 = self.input.LA(2) - - if (LA35_1 == 65) : - alt35 = 2 - elif ((IDENTIFIER <= LA35_1 <= FLOATING_POINT_LITERAL) or LA35_1 == 62 or LA35_1 == 66 or (68 <= LA35_1 <= 69) or (72 <= LA35_1 <= 74) or (77 <= LA35_1 <= 79)) : - alt35 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 1, self.input) - - raise nvae - - elif (LA35_0 == 62) : - LA35 = self.input.LA(2) - if LA35 == 63: - alt35 = 5 - elif LA35 == 29 or LA35 == 30 or LA35 == 31 or LA35 == 32 or LA35 == 33 or LA35 == 34 or LA35 == 35 or LA35 == 36 or LA35 == 37 or LA35 == 38 or LA35 == 39 or LA35 == 40 or LA35 == 41 or LA35 == 42 or LA35 == 45 or LA35 == 46 or LA35 == 48 or LA35 == 49 or LA35 == 50 or LA35 == 51 or LA35 == 52 or LA35 == 53 or LA35 == 54 or LA35 == 55 or LA35 == 56 or LA35 == 57 or LA35 == 58 or LA35 == 59 or LA35 == 60 or LA35 == 61 or LA35 == 66: - alt35 = 3 - elif LA35 == IDENTIFIER: - LA35_29 = self.input.LA(3) - - if (self.synpred73()) : - alt35 = 3 - elif (self.synpred74()) : - alt35 = 4 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 29, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 2, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 0, self.input) - - raise nvae - - if alt35 == 1: - # C.g:308:6: '[' constant_expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix852) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_declarator_suffix854) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix856) - if self.failed: - return - - - elif alt35 == 2: - # C.g:309:9: '[' ']' - self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix866) - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix868) - if self.failed: - return - - - elif alt35 == 3: - # C.g:310:9: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix878) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_declarator_suffix880) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix882) - if self.failed: - return - - - elif alt35 == 4: - # C.g:311:9: '(' identifier_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix892) - if self.failed: - return - self.following.append(self.FOLLOW_identifier_list_in_declarator_suffix894) - self.identifier_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix896) - if self.failed: - return - - - elif alt35 == 5: - # C.g:312:9: '(' ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix906) - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix908) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 24, declarator_suffix_StartIndex) - - pass - - return - - # $ANTLR end declarator_suffix - - - # $ANTLR start pointer - # C.g:315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ); - def pointer(self, ): - - pointer_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 25): - return - - # C.g:316:2: ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ) - alt38 = 3 - LA38_0 = self.input.LA(1) - - if (LA38_0 == 66) : - LA38 = self.input.LA(2) - if LA38 == 66: - LA38_2 = self.input.LA(3) - - if (self.synpred78()) : - alt38 = 2 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 2, self.input) - - raise nvae - - elif LA38 == 58: - LA38_3 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 3, self.input) - - raise nvae - - elif LA38 == 59: - LA38_4 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 4, self.input) - - raise nvae - - elif LA38 == 60: - LA38_5 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 5, self.input) - - raise nvae - - elif LA38 == EOF or LA38 == IDENTIFIER or LA38 == 25 or LA38 == 26 or LA38 == 27 or LA38 == 28 or LA38 == 29 or LA38 == 30 or LA38 == 31 or LA38 == 32 or LA38 == 33 or LA38 == 34 or LA38 == 35 or LA38 == 36 or LA38 == 37 or LA38 == 38 or LA38 == 39 or LA38 == 40 or LA38 == 41 or LA38 == 42 or LA38 == 43 or LA38 == 45 or LA38 == 46 or LA38 == 47 or LA38 == 48 or LA38 == 62 or LA38 == 63 or LA38 == 64: - alt38 = 3 - elif LA38 == 53: - LA38_21 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 21, self.input) - - raise nvae - - elif LA38 == 49 or LA38 == 50 or LA38 == 51 or LA38 == 52 or LA38 == 54 or LA38 == 55 or LA38 == 56 or LA38 == 57 or LA38 == 61: - LA38_29 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 29, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 0, self.input) - - raise nvae - - if alt38 == 1: - # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? - self.match(self.input, 66, self.FOLLOW_66_in_pointer919) - if self.failed: - return - # C.g:316:8: ( type_qualifier )+ - cnt36 = 0 - while True: #loop36 - alt36 = 2 - LA36 = self.input.LA(1) - if LA36 == 58: - LA36_2 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 59: - LA36_3 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 60: - LA36_4 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 53: - LA36_20 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 49 or LA36 == 50 or LA36 == 51 or LA36 == 52 or LA36 == 54 or LA36 == 55 or LA36 == 56 or LA36 == 57 or LA36 == 61: - LA36_28 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - - if alt36 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_pointer921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt36 >= 1: - break #loop36 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(36, self.input) - raise eee - - cnt36 += 1 - - - # C.g:316:24: ( pointer )? - alt37 = 2 - LA37_0 = self.input.LA(1) - - if (LA37_0 == 66) : - LA37_1 = self.input.LA(2) - - if (self.synpred76()) : - alt37 = 1 - if alt37 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_pointer924) - self.pointer() - self.following.pop() - if self.failed: - return - - - - - - elif alt38 == 2: - # C.g:317:4: '*' pointer - self.match(self.input, 66, self.FOLLOW_66_in_pointer930) - if self.failed: - return - self.following.append(self.FOLLOW_pointer_in_pointer932) - self.pointer() - self.following.pop() - if self.failed: - return - - - elif alt38 == 3: - # C.g:318:4: '*' - self.match(self.input, 66, self.FOLLOW_66_in_pointer937) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 25, pointer_StartIndex) - - pass - - return - - # $ANTLR end pointer - - - # $ANTLR start parameter_type_list - # C.g:321:1: parameter_type_list : parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ; - def parameter_type_list(self, ): - - parameter_type_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 26): - return - - # C.g:322:2: ( parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ) - # C.g:322:4: parameter_list ( ',' ( 'OPTIONAL' )? '...' )? - self.following.append(self.FOLLOW_parameter_list_in_parameter_type_list948) - self.parameter_list() - self.following.pop() - if self.failed: - return - # C.g:322:19: ( ',' ( 'OPTIONAL' )? '...' )? - alt40 = 2 - LA40_0 = self.input.LA(1) - - if (LA40_0 == 27) : - alt40 = 1 - if alt40 == 1: - # C.g:322:20: ',' ( 'OPTIONAL' )? '...' - self.match(self.input, 27, self.FOLLOW_27_in_parameter_type_list951) - if self.failed: - return - # C.g:322:24: ( 'OPTIONAL' )? - alt39 = 2 - LA39_0 = self.input.LA(1) - - if (LA39_0 == 53) : - alt39 = 1 - if alt39 == 1: - # C.g:322:25: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_type_list954) - if self.failed: - return - - - - self.match(self.input, 67, self.FOLLOW_67_in_parameter_type_list958) - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 26, parameter_type_list_StartIndex) - - pass - - return - - # $ANTLR end parameter_type_list - - - # $ANTLR start parameter_list - # C.g:325:1: parameter_list : parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ; - def parameter_list(self, ): - - parameter_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 27): - return - - # C.g:326:2: ( parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ) - # C.g:326:4: parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* - self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list971) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - # C.g:326:26: ( ',' ( 'OPTIONAL' )? parameter_declaration )* - while True: #loop42 - alt42 = 2 - LA42_0 = self.input.LA(1) - - if (LA42_0 == 27) : - LA42_1 = self.input.LA(2) - - if (LA42_1 == 53) : - LA42_3 = self.input.LA(3) - - if (self.synpred82()) : - alt42 = 1 - - - elif (LA42_1 == IDENTIFIER or (29 <= LA42_1 <= 42) or (45 <= LA42_1 <= 46) or (48 <= LA42_1 <= 52) or (54 <= LA42_1 <= 61) or LA42_1 == 66) : - alt42 = 1 - - - - - if alt42 == 1: - # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_parameter_list974) - if self.failed: - return - # C.g:326:31: ( 'OPTIONAL' )? - alt41 = 2 - LA41_0 = self.input.LA(1) - - if (LA41_0 == 53) : - LA41_1 = self.input.LA(2) - - if (self.synpred81()) : - alt41 = 1 - if alt41 == 1: - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_list977) - if self.failed: - return - - - - self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list981) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop42 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 27, parameter_list_StartIndex) - - pass - - return - - # $ANTLR end parameter_list - - - # $ANTLR start parameter_declaration - # C.g:329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ); - def parameter_declaration(self, ): - - parameter_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 28): - return - - # C.g:330:2: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ) - alt46 = 2 - LA46 = self.input.LA(1) - if LA46 == 29 or LA46 == 30 or LA46 == 31 or LA46 == 32 or LA46 == 33 or LA46 == 34 or LA46 == 35 or LA46 == 36 or LA46 == 37 or LA46 == 38 or LA46 == 39 or LA46 == 40 or LA46 == 41 or LA46 == 42 or LA46 == 45 or LA46 == 46 or LA46 == 48 or LA46 == 49 or LA46 == 50 or LA46 == 51 or LA46 == 52 or LA46 == 53 or LA46 == 54 or LA46 == 55 or LA46 == 56 or LA46 == 57 or LA46 == 58 or LA46 == 59 or LA46 == 60 or LA46 == 61: - alt46 = 1 - elif LA46 == IDENTIFIER: - LA46_13 = self.input.LA(2) - - if (self.synpred86()) : - alt46 = 1 - elif (True) : - alt46 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 13, self.input) - - raise nvae - - elif LA46 == 66: - alt46 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 0, self.input) - - raise nvae - - if alt46 == 1: - # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? - self.following.append(self.FOLLOW_declaration_specifiers_in_parameter_declaration994) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:330:27: ( declarator | abstract_declarator )* - while True: #loop43 - alt43 = 3 - LA43 = self.input.LA(1) - if LA43 == 66: - LA43_5 = self.input.LA(2) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == IDENTIFIER or LA43 == 58 or LA43 == 59 or LA43 == 60: - alt43 = 1 - elif LA43 == 62: - LA43 = self.input.LA(2) - if LA43 == 29 or LA43 == 30 or LA43 == 31 or LA43 == 32 or LA43 == 33 or LA43 == 34 or LA43 == 35 or LA43 == 36 or LA43 == 37 or LA43 == 38 or LA43 == 39 or LA43 == 40 or LA43 == 41 or LA43 == 42 or LA43 == 45 or LA43 == 46 or LA43 == 48 or LA43 == 49 or LA43 == 50 or LA43 == 51 or LA43 == 52 or LA43 == 53 or LA43 == 54 or LA43 == 55 or LA43 == 56 or LA43 == 57 or LA43 == 61 or LA43 == 63 or LA43 == 64: - alt43 = 2 - elif LA43 == IDENTIFIER: - LA43_37 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 58: - LA43_38 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 66: - LA43_39 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 59: - LA43_40 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 60: - LA43_41 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 62: - LA43_43 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - - elif LA43 == 64: - alt43 = 2 - - if alt43 == 1: - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_parameter_declaration997) - self.declarator() - self.following.pop() - if self.failed: - return - - - elif alt43 == 2: - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_parameter_declaration999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop43 - - - # C.g:330:61: ( 'OPTIONAL' )? - alt44 = 2 - LA44_0 = self.input.LA(1) - - if (LA44_0 == 53) : - alt44 = 1 - if alt44 == 1: - # C.g:330:62: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_declaration1004) - if self.failed: - return - - - - - - elif alt46 == 2: - # C.g:332:4: ( pointer )* IDENTIFIER - # C.g:332:4: ( pointer )* - while True: #loop45 - alt45 = 2 - LA45_0 = self.input.LA(1) - - if (LA45_0 == 66) : - alt45 = 1 - - - if alt45 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_parameter_declaration1013) - self.pointer() - self.following.pop() - if self.failed: - return - - - else: - break #loop45 - - - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_parameter_declaration1016) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 28, parameter_declaration_StartIndex) - - pass - - return - - # $ANTLR end parameter_declaration - - - # $ANTLR start identifier_list - # C.g:335:1: identifier_list : IDENTIFIER ( ',' IDENTIFIER )* ; - def identifier_list(self, ): - - identifier_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 29): - return - - # C.g:336:2: ( IDENTIFIER ( ',' IDENTIFIER )* ) - # C.g:336:4: IDENTIFIER ( ',' IDENTIFIER )* - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1027) - if self.failed: - return - # C.g:337:2: ( ',' IDENTIFIER )* - while True: #loop47 - alt47 = 2 - LA47_0 = self.input.LA(1) - - if (LA47_0 == 27) : - alt47 = 1 - - - if alt47 == 1: - # C.g:337:3: ',' IDENTIFIER - self.match(self.input, 27, self.FOLLOW_27_in_identifier_list1031) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1033) - if self.failed: - return - - - else: - break #loop47 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 29, identifier_list_StartIndex) - - pass - - return - - # $ANTLR end identifier_list - - - # $ANTLR start type_name - # C.g:340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id ); - def type_name(self, ): - - type_name_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 30): - return - - # C.g:341:2: ( specifier_qualifier_list ( abstract_declarator )? | type_id ) - alt49 = 2 - LA49_0 = self.input.LA(1) - - if ((34 <= LA49_0 <= 42) or (45 <= LA49_0 <= 46) or (48 <= LA49_0 <= 61)) : - alt49 = 1 - elif (LA49_0 == IDENTIFIER) : - LA49_13 = self.input.LA(2) - - if (self.synpred90()) : - alt49 = 1 - elif (True) : - alt49 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 13, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 0, self.input) - - raise nvae - - if alt49 == 1: - # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? - self.following.append(self.FOLLOW_specifier_qualifier_list_in_type_name1046) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - # C.g:341:29: ( abstract_declarator )? - alt48 = 2 - LA48_0 = self.input.LA(1) - - if (LA48_0 == 62 or LA48_0 == 64 or LA48_0 == 66) : - alt48 = 1 - if alt48 == 1: - # C.g:0:0: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_type_name1048) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - elif alt49 == 2: - # C.g:342:4: type_id - self.following.append(self.FOLLOW_type_id_in_type_name1054) - self.type_id() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 30, type_name_StartIndex) - - pass - - return - - # $ANTLR end type_name - - - # $ANTLR start abstract_declarator - # C.g:345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ); - def abstract_declarator(self, ): - - abstract_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 31): - return - - # C.g:346:2: ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ) - alt51 = 2 - LA51_0 = self.input.LA(1) - - if (LA51_0 == 66) : - alt51 = 1 - elif (LA51_0 == 62 or LA51_0 == 64) : - alt51 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator );", 51, 0, self.input) - - raise nvae - - if alt51 == 1: - # C.g:346:4: pointer ( direct_abstract_declarator )? - self.following.append(self.FOLLOW_pointer_in_abstract_declarator1065) - self.pointer() - self.following.pop() - if self.failed: - return - # C.g:346:12: ( direct_abstract_declarator )? - alt50 = 2 - LA50_0 = self.input.LA(1) - - if (LA50_0 == 62) : - LA50 = self.input.LA(2) - if LA50 == 63: - LA50_12 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 58: - LA50_13 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 66: - LA50_14 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 59: - LA50_15 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 60: - LA50_16 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == IDENTIFIER: - LA50_17 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 62: - LA50_18 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 64: - LA50_19 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 29 or LA50 == 30 or LA50 == 31 or LA50 == 32 or LA50 == 33: - LA50_20 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 34: - LA50_21 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 35: - LA50_22 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 36: - LA50_23 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 37: - LA50_24 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 38: - LA50_25 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 39: - LA50_26 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 40: - LA50_27 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 41: - LA50_28 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 42: - LA50_29 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 45 or LA50 == 46: - LA50_30 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 48: - LA50_31 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 49 or LA50 == 50 or LA50 == 51 or LA50 == 52 or LA50 == 53 or LA50 == 54 or LA50 == 55 or LA50 == 56 or LA50 == 57 or LA50 == 61: - LA50_32 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif (LA50_0 == 64) : - LA50 = self.input.LA(2) - if LA50 == 65: - LA50_33 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 62: - LA50_34 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == IDENTIFIER: - LA50_35 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == HEX_LITERAL: - LA50_36 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == OCTAL_LITERAL: - LA50_37 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == DECIMAL_LITERAL: - LA50_38 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == CHARACTER_LITERAL: - LA50_39 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == STRING_LITERAL: - LA50_40 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == FLOATING_POINT_LITERAL: - LA50_41 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 72: - LA50_42 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 73: - LA50_43 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 66 or LA50 == 68 or LA50 == 69 or LA50 == 77 or LA50 == 78 or LA50 == 79: - LA50_44 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 74: - LA50_45 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - if alt50 == 1: - # C.g:0:0: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1067) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - elif alt51 == 2: - # C.g:347:4: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1073) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 31, abstract_declarator_StartIndex) - - pass - - return - - # $ANTLR end abstract_declarator - - - # $ANTLR start direct_abstract_declarator - # C.g:350:1: direct_abstract_declarator : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ; - def direct_abstract_declarator(self, ): - - direct_abstract_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 32): - return - - # C.g:351:2: ( ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ) - # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* - # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) - alt52 = 2 - LA52_0 = self.input.LA(1) - - if (LA52_0 == 62) : - LA52 = self.input.LA(2) - if LA52 == IDENTIFIER or LA52 == 29 or LA52 == 30 or LA52 == 31 or LA52 == 32 or LA52 == 33 or LA52 == 34 or LA52 == 35 or LA52 == 36 or LA52 == 37 or LA52 == 38 or LA52 == 39 or LA52 == 40 or LA52 == 41 or LA52 == 42 or LA52 == 45 or LA52 == 46 or LA52 == 48 or LA52 == 49 or LA52 == 50 or LA52 == 51 or LA52 == 52 or LA52 == 53 or LA52 == 54 or LA52 == 55 or LA52 == 56 or LA52 == 57 or LA52 == 58 or LA52 == 59 or LA52 == 60 or LA52 == 61 or LA52 == 63: - alt52 = 2 - elif LA52 == 66: - LA52_18 = self.input.LA(3) - - if (self.synpred93()) : - alt52 = 1 - elif (True) : - alt52 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 18, self.input) - - raise nvae - - elif LA52 == 62 or LA52 == 64: - alt52 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 1, self.input) - - raise nvae - - elif (LA52_0 == 64) : - alt52 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 0, self.input) - - raise nvae - - if alt52 == 1: - # C.g:351:6: '(' abstract_declarator ')' - self.match(self.input, 62, self.FOLLOW_62_in_direct_abstract_declarator1086) - if self.failed: - return - self.following.append(self.FOLLOW_abstract_declarator_in_direct_abstract_declarator1088) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_direct_abstract_declarator1090) - if self.failed: - return - - - elif alt52 == 2: - # C.g:351:36: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - - # C.g:351:65: ( abstract_declarator_suffix )* - while True: #loop53 - alt53 = 2 - LA53_0 = self.input.LA(1) - - if (LA53_0 == 62) : - LA53 = self.input.LA(2) - if LA53 == 63: - LA53_12 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 58: - LA53_13 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 66: - LA53_14 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 59: - LA53_15 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 60: - LA53_16 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == IDENTIFIER: - LA53_17 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 29 or LA53 == 30 or LA53 == 31 or LA53 == 32 or LA53 == 33: - LA53_19 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 34: - LA53_20 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 35: - LA53_21 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 36: - LA53_22 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 37: - LA53_23 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 38: - LA53_24 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 39: - LA53_25 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 40: - LA53_26 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 41: - LA53_27 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 42: - LA53_28 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 45 or LA53 == 46: - LA53_29 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 48: - LA53_30 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 49 or LA53 == 50 or LA53 == 51 or LA53 == 52 or LA53 == 53 or LA53 == 54 or LA53 == 55 or LA53 == 56 or LA53 == 57 or LA53 == 61: - LA53_31 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - - elif (LA53_0 == 64) : - LA53 = self.input.LA(2) - if LA53 == 65: - LA53_33 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 62: - LA53_34 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == IDENTIFIER: - LA53_35 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == HEX_LITERAL: - LA53_36 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == OCTAL_LITERAL: - LA53_37 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == DECIMAL_LITERAL: - LA53_38 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == CHARACTER_LITERAL: - LA53_39 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == STRING_LITERAL: - LA53_40 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == FLOATING_POINT_LITERAL: - LA53_41 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 72: - LA53_42 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 73: - LA53_43 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 66 or LA53 == 68 or LA53 == 69 or LA53 == 77 or LA53 == 78 or LA53 == 79: - LA53_44 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 74: - LA53_45 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - - - - if alt53 == 1: - # C.g:0:0: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - break #loop53 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 32, direct_abstract_declarator_StartIndex) - - pass - - return - - # $ANTLR end direct_abstract_declarator - - - # $ANTLR start abstract_declarator_suffix - # C.g:354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ); - def abstract_declarator_suffix(self, ): - - abstract_declarator_suffix_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 33): - return - - # C.g:355:2: ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ) - alt54 = 4 - LA54_0 = self.input.LA(1) - - if (LA54_0 == 64) : - LA54_1 = self.input.LA(2) - - if (LA54_1 == 65) : - alt54 = 1 - elif ((IDENTIFIER <= LA54_1 <= FLOATING_POINT_LITERAL) or LA54_1 == 62 or LA54_1 == 66 or (68 <= LA54_1 <= 69) or (72 <= LA54_1 <= 74) or (77 <= LA54_1 <= 79)) : - alt54 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 1, self.input) - - raise nvae - - elif (LA54_0 == 62) : - LA54_2 = self.input.LA(2) - - if (LA54_2 == 63) : - alt54 = 3 - elif (LA54_2 == IDENTIFIER or (29 <= LA54_2 <= 42) or (45 <= LA54_2 <= 46) or (48 <= LA54_2 <= 61) or LA54_2 == 66) : - alt54 = 4 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 2, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 0, self.input) - - raise nvae - - if alt54 == 1: - # C.g:355:4: '[' ']' - self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1110) - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1112) - if self.failed: - return - - - elif alt54 == 2: - # C.g:356:4: '[' constant_expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1117) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_abstract_declarator_suffix1119) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1121) - if self.failed: - return - - - elif alt54 == 3: - # C.g:357:4: '(' ')' - self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1126) - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1128) - if self.failed: - return - - - elif alt54 == 4: - # C.g:358:4: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1133) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1137) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 33, abstract_declarator_suffix_StartIndex) - - pass - - return - - # $ANTLR end abstract_declarator_suffix - - - # $ANTLR start initializer - # C.g:361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' ); - def initializer(self, ): - - initializer_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 34): - return - - # C.g:363:2: ( assignment_expression | '{' initializer_list ( ',' )? '}' ) - alt56 = 2 - LA56_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA56_0 <= FLOATING_POINT_LITERAL) or LA56_0 == 62 or LA56_0 == 66 or (68 <= LA56_0 <= 69) or (72 <= LA56_0 <= 74) or (77 <= LA56_0 <= 79)) : - alt56 = 1 - elif (LA56_0 == 43) : - alt56 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' );", 56, 0, self.input) - - raise nvae - - if alt56 == 1: - # C.g:363:4: assignment_expression - self.following.append(self.FOLLOW_assignment_expression_in_initializer1150) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - elif alt56 == 2: - # C.g:364:4: '{' initializer_list ( ',' )? '}' - self.match(self.input, 43, self.FOLLOW_43_in_initializer1155) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_list_in_initializer1157) - self.initializer_list() - self.following.pop() - if self.failed: - return - # C.g:364:25: ( ',' )? - alt55 = 2 - LA55_0 = self.input.LA(1) - - if (LA55_0 == 27) : - alt55 = 1 - if alt55 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_initializer1159) - if self.failed: - return - - - - self.match(self.input, 44, self.FOLLOW_44_in_initializer1162) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 34, initializer_StartIndex) - - pass - - return - - # $ANTLR end initializer - - - # $ANTLR start initializer_list - # C.g:367:1: initializer_list : initializer ( ',' initializer )* ; - def initializer_list(self, ): - - initializer_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 35): - return - - # C.g:368:2: ( initializer ( ',' initializer )* ) - # C.g:368:4: initializer ( ',' initializer )* - self.following.append(self.FOLLOW_initializer_in_initializer_list1173) - self.initializer() - self.following.pop() - if self.failed: - return - # C.g:368:16: ( ',' initializer )* - while True: #loop57 - alt57 = 2 - LA57_0 = self.input.LA(1) - - if (LA57_0 == 27) : - LA57_1 = self.input.LA(2) - - if ((IDENTIFIER <= LA57_1 <= FLOATING_POINT_LITERAL) or LA57_1 == 43 or LA57_1 == 62 or LA57_1 == 66 or (68 <= LA57_1 <= 69) or (72 <= LA57_1 <= 74) or (77 <= LA57_1 <= 79)) : - alt57 = 1 - - - - - if alt57 == 1: - # C.g:368:17: ',' initializer - self.match(self.input, 27, self.FOLLOW_27_in_initializer_list1176) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_in_initializer_list1178) - self.initializer() - self.following.pop() - if self.failed: - return - - - else: - break #loop57 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 35, initializer_list_StartIndex) - - pass - - return - - # $ANTLR end initializer_list - - class argument_expression_list_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start argument_expression_list - # C.g:373:1: argument_expression_list : assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ; - def argument_expression_list(self, ): - - retval = self.argument_expression_list_return() - retval.start = self.input.LT(1) - argument_expression_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 36): - return retval - - # C.g:374:2: ( assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ) - # C.g:374:6: assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* - self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1196) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:374:28: ( 'OPTIONAL' )? - alt58 = 2 - LA58_0 = self.input.LA(1) - - if (LA58_0 == 53) : - alt58 = 1 - if alt58 == 1: - # C.g:374:29: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1199) - if self.failed: - return retval - - - - # C.g:374:42: ( ',' assignment_expression ( 'OPTIONAL' )? )* - while True: #loop60 - alt60 = 2 - LA60_0 = self.input.LA(1) - - if (LA60_0 == 27) : - alt60 = 1 - - - if alt60 == 1: - # C.g:374:43: ',' assignment_expression ( 'OPTIONAL' )? - self.match(self.input, 27, self.FOLLOW_27_in_argument_expression_list1204) - if self.failed: - return retval - self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1206) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:374:69: ( 'OPTIONAL' )? - alt59 = 2 - LA59_0 = self.input.LA(1) - - if (LA59_0 == 53) : - alt59 = 1 - if alt59 == 1: - # C.g:374:70: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1209) - if self.failed: - return retval - - - - - - else: - break #loop60 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 36, argument_expression_list_StartIndex) - - pass - - return retval - - # $ANTLR end argument_expression_list - - - # $ANTLR start additive_expression - # C.g:377:1: additive_expression : ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ; - def additive_expression(self, ): - - additive_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 37): - return - - # C.g:378:2: ( ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ) - # C.g:378:4: ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* - # C.g:378:4: ( multiplicative_expression ) - # C.g:378:5: multiplicative_expression - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1225) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - - # C.g:378:32: ( '+' multiplicative_expression | '-' multiplicative_expression )* - while True: #loop61 - alt61 = 3 - LA61_0 = self.input.LA(1) - - if (LA61_0 == 68) : - alt61 = 1 - elif (LA61_0 == 69) : - alt61 = 2 - - - if alt61 == 1: - # C.g:378:33: '+' multiplicative_expression - self.match(self.input, 68, self.FOLLOW_68_in_additive_expression1229) - if self.failed: - return - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1231) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - elif alt61 == 2: - # C.g:378:65: '-' multiplicative_expression - self.match(self.input, 69, self.FOLLOW_69_in_additive_expression1235) - if self.failed: - return - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1237) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop61 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 37, additive_expression_StartIndex) - - pass - - return - - # $ANTLR end additive_expression - - - # $ANTLR start multiplicative_expression - # C.g:381:1: multiplicative_expression : ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ; - def multiplicative_expression(self, ): - - multiplicative_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 38): - return - - # C.g:382:2: ( ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ) - # C.g:382:4: ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* - # C.g:382:4: ( cast_expression ) - # C.g:382:5: cast_expression - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1251) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - - # C.g:382:22: ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* - while True: #loop62 - alt62 = 4 - LA62 = self.input.LA(1) - if LA62 == 66: - alt62 = 1 - elif LA62 == 70: - alt62 = 2 - elif LA62 == 71: - alt62 = 3 - - if alt62 == 1: - # C.g:382:23: '*' cast_expression - self.match(self.input, 66, self.FOLLOW_66_in_multiplicative_expression1255) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1257) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt62 == 2: - # C.g:382:45: '/' cast_expression - self.match(self.input, 70, self.FOLLOW_70_in_multiplicative_expression1261) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1263) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt62 == 3: - # C.g:382:67: '%' cast_expression - self.match(self.input, 71, self.FOLLOW_71_in_multiplicative_expression1267) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1269) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop62 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 38, multiplicative_expression_StartIndex) - - pass - - return - - # $ANTLR end multiplicative_expression - - - # $ANTLR start cast_expression - # C.g:385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression ); - def cast_expression(self, ): - - cast_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 39): - return - - # C.g:386:2: ( '(' type_name ')' cast_expression | unary_expression ) - alt63 = 2 - LA63_0 = self.input.LA(1) - - if (LA63_0 == 62) : - LA63 = self.input.LA(2) - if LA63 == 34 or LA63 == 35 or LA63 == 36 or LA63 == 37 or LA63 == 38 or LA63 == 39 or LA63 == 40 or LA63 == 41 or LA63 == 42 or LA63 == 45 or LA63 == 46 or LA63 == 48 or LA63 == 49 or LA63 == 50 or LA63 == 51 or LA63 == 52 or LA63 == 53 or LA63 == 54 or LA63 == 55 or LA63 == 56 or LA63 == 57 or LA63 == 58 or LA63 == 59 or LA63 == 60 or LA63 == 61: - alt63 = 1 - elif LA63 == IDENTIFIER: - LA63_25 = self.input.LA(3) - - if (self.synpred109()) : - alt63 = 1 - elif (True) : - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 25, self.input) - - raise nvae - - elif LA63 == HEX_LITERAL or LA63 == OCTAL_LITERAL or LA63 == DECIMAL_LITERAL or LA63 == CHARACTER_LITERAL or LA63 == STRING_LITERAL or LA63 == FLOATING_POINT_LITERAL or LA63 == 62 or LA63 == 66 or LA63 == 68 or LA63 == 69 or LA63 == 72 or LA63 == 73 or LA63 == 74 or LA63 == 77 or LA63 == 78 or LA63 == 79: - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 1, self.input) - - raise nvae - - elif ((IDENTIFIER <= LA63_0 <= FLOATING_POINT_LITERAL) or LA63_0 == 66 or (68 <= LA63_0 <= 69) or (72 <= LA63_0 <= 74) or (77 <= LA63_0 <= 79)) : - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 0, self.input) - - raise nvae - - if alt63 == 1: - # C.g:386:4: '(' type_name ')' cast_expression - self.match(self.input, 62, self.FOLLOW_62_in_cast_expression1282) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_cast_expression1284) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_cast_expression1286) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_cast_expression1288) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt63 == 2: - # C.g:387:4: unary_expression - self.following.append(self.FOLLOW_unary_expression_in_cast_expression1293) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 39, cast_expression_StartIndex) - - pass - - return - - # $ANTLR end cast_expression - - - # $ANTLR start unary_expression - # C.g:390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ); - def unary_expression(self, ): - - unary_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 40): - return - - # C.g:391:2: ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ) - alt64 = 6 - LA64 = self.input.LA(1) - if LA64 == IDENTIFIER or LA64 == HEX_LITERAL or LA64 == OCTAL_LITERAL or LA64 == DECIMAL_LITERAL or LA64 == CHARACTER_LITERAL or LA64 == STRING_LITERAL or LA64 == FLOATING_POINT_LITERAL or LA64 == 62: - alt64 = 1 - elif LA64 == 72: - alt64 = 2 - elif LA64 == 73: - alt64 = 3 - elif LA64 == 66 or LA64 == 68 or LA64 == 69 or LA64 == 77 or LA64 == 78 or LA64 == 79: - alt64 = 4 - elif LA64 == 74: - LA64_12 = self.input.LA(2) - - if (LA64_12 == 62) : - LA64_13 = self.input.LA(3) - - if (self.synpred114()) : - alt64 = 5 - elif (True) : - alt64 = 6 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 13, self.input) - - raise nvae - - elif ((IDENTIFIER <= LA64_12 <= FLOATING_POINT_LITERAL) or LA64_12 == 66 or (68 <= LA64_12 <= 69) or (72 <= LA64_12 <= 74) or (77 <= LA64_12 <= 79)) : - alt64 = 5 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 12, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 0, self.input) - - raise nvae - - if alt64 == 1: - # C.g:391:4: postfix_expression - self.following.append(self.FOLLOW_postfix_expression_in_unary_expression1304) - self.postfix_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 2: - # C.g:392:4: '++' unary_expression - self.match(self.input, 72, self.FOLLOW_72_in_unary_expression1309) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1311) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 3: - # C.g:393:4: '--' unary_expression - self.match(self.input, 73, self.FOLLOW_73_in_unary_expression1316) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1318) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 4: - # C.g:394:4: unary_operator cast_expression - self.following.append(self.FOLLOW_unary_operator_in_unary_expression1323) - self.unary_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_unary_expression1325) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 5: - # C.g:395:4: 'sizeof' unary_expression - self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1330) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1332) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 6: - # C.g:396:4: 'sizeof' '(' type_name ')' - self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1337) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_unary_expression1339) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_unary_expression1341) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_unary_expression1343) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 40, unary_expression_StartIndex) - - pass - - return - - # $ANTLR end unary_expression - - - # $ANTLR start postfix_expression - # C.g:399:1: postfix_expression : p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ; - def postfix_expression(self, ): - self.postfix_expression_stack.append(postfix_expression_scope()) - postfix_expression_StartIndex = self.input.index() - a = None - b = None - x = None - y = None - z = None - p = None - - c = None - - - - self.postfix_expression_stack[-1].FuncCallText = '' - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 41): - return - - # C.g:406:2: (p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ) - # C.g:406:6: p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* - self.following.append(self.FOLLOW_primary_expression_in_postfix_expression1367) - p = self.primary_expression() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += self.input.toString(p.start,p.stop) - - # C.g:407:9: ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* - while True: #loop65 - alt65 = 10 - LA65 = self.input.LA(1) - if LA65 == 66: - LA65_1 = self.input.LA(2) - - if (LA65_1 == IDENTIFIER) : - LA65_30 = self.input.LA(3) - - if (self.synpred120()) : - alt65 = 6 - - - - - elif LA65 == 64: - alt65 = 1 - elif LA65 == 62: - LA65 = self.input.LA(2) - if LA65 == 63: - alt65 = 2 - elif LA65 == 29 or LA65 == 30 or LA65 == 31 or LA65 == 32 or LA65 == 33 or LA65 == 34 or LA65 == 35 or LA65 == 36 or LA65 == 37 or LA65 == 38 or LA65 == 39 or LA65 == 40 or LA65 == 41 or LA65 == 42 or LA65 == 45 or LA65 == 46 or LA65 == 48 or LA65 == 49 or LA65 == 50 or LA65 == 51 or LA65 == 52 or LA65 == 53 or LA65 == 54 or LA65 == 55 or LA65 == 56 or LA65 == 57 or LA65 == 58 or LA65 == 59 or LA65 == 60 or LA65 == 61: - alt65 = 4 - elif LA65 == IDENTIFIER: - LA65_55 = self.input.LA(3) - - if (self.synpred117()) : - alt65 = 3 - elif (self.synpred118()) : - alt65 = 4 - - - elif LA65 == 66: - LA65_57 = self.input.LA(3) - - if (self.synpred117()) : - alt65 = 3 - elif (self.synpred118()) : - alt65 = 4 - - - elif LA65 == HEX_LITERAL or LA65 == OCTAL_LITERAL or LA65 == DECIMAL_LITERAL or LA65 == CHARACTER_LITERAL or LA65 == STRING_LITERAL or LA65 == FLOATING_POINT_LITERAL or LA65 == 62 or LA65 == 68 or LA65 == 69 or LA65 == 72 or LA65 == 73 or LA65 == 74 or LA65 == 77 or LA65 == 78 or LA65 == 79: - alt65 = 3 - - elif LA65 == 75: - alt65 = 5 - elif LA65 == 76: - alt65 = 7 - elif LA65 == 72: - alt65 = 8 - elif LA65 == 73: - alt65 = 9 - - if alt65 == 1: - # C.g:407:13: '[' expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_postfix_expression1383) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_postfix_expression1385) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_postfix_expression1387) - if self.failed: - return - - - elif alt65 == 2: - # C.g:408:13: '(' a= ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1401) - if self.failed: - return - a = self.input.LT(1) - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1405) - if self.failed: - return - if self.backtracking == 0: - self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, a.line, a.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, '') - - - - elif alt65 == 3: - # C.g:409:13: '(' c= argument_expression_list b= ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1420) - if self.failed: - return - self.following.append(self.FOLLOW_argument_expression_list_in_postfix_expression1424) - c = self.argument_expression_list() - self.following.pop() - if self.failed: - return - b = self.input.LT(1) - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1428) - if self.failed: - return - if self.backtracking == 0: - self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, b.line, b.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, self.input.toString(c.start,c.stop)) - - - - elif alt65 == 4: - # C.g:410:13: '(' macro_parameter_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1444) - if self.failed: - return - self.following.append(self.FOLLOW_macro_parameter_list_in_postfix_expression1446) - self.macro_parameter_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1448) - if self.failed: - return - - - elif alt65 == 5: - # C.g:411:13: '.' x= IDENTIFIER - self.match(self.input, 75, self.FOLLOW_75_in_postfix_expression1462) - if self.failed: - return - x = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1466) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += '.' + x.text - - - - elif alt65 == 6: - # C.g:412:13: '*' y= IDENTIFIER - self.match(self.input, 66, self.FOLLOW_66_in_postfix_expression1482) - if self.failed: - return - y = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1486) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText = y.text - - - - elif alt65 == 7: - # C.g:413:13: '->' z= IDENTIFIER - self.match(self.input, 76, self.FOLLOW_76_in_postfix_expression1502) - if self.failed: - return - z = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1506) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += '->' + z.text - - - - elif alt65 == 8: - # C.g:414:13: '++' - self.match(self.input, 72, self.FOLLOW_72_in_postfix_expression1522) - if self.failed: - return - - - elif alt65 == 9: - # C.g:415:13: '--' - self.match(self.input, 73, self.FOLLOW_73_in_postfix_expression1536) - if self.failed: - return - - - else: - break #loop65 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 41, postfix_expression_StartIndex) - - self.postfix_expression_stack.pop() - pass - - return - - # $ANTLR end postfix_expression - - - # $ANTLR start macro_parameter_list - # C.g:419:1: macro_parameter_list : parameter_declaration ( ',' parameter_declaration )* ; - def macro_parameter_list(self, ): - - macro_parameter_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 42): - return - - # C.g:420:2: ( parameter_declaration ( ',' parameter_declaration )* ) - # C.g:420:4: parameter_declaration ( ',' parameter_declaration )* - self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1559) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - # C.g:420:26: ( ',' parameter_declaration )* - while True: #loop66 - alt66 = 2 - LA66_0 = self.input.LA(1) - - if (LA66_0 == 27) : - alt66 = 1 - - - if alt66 == 1: - # C.g:420:27: ',' parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_macro_parameter_list1562) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1564) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop66 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 42, macro_parameter_list_StartIndex) - - pass - - return - - # $ANTLR end macro_parameter_list - - - # $ANTLR start unary_operator - # C.g:423:1: unary_operator : ( '&' | '*' | '+' | '-' | '~' | '!' ); - def unary_operator(self, ): - - unary_operator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 43): - return - - # C.g:424:2: ( '&' | '*' | '+' | '-' | '~' | '!' ) - # C.g: - if self.input.LA(1) == 66 or (68 <= self.input.LA(1) <= 69) or (77 <= self.input.LA(1) <= 79): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_unary_operator0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 43, unary_operator_StartIndex) - - pass - - return - - # $ANTLR end unary_operator - - class primary_expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start primary_expression - # C.g:432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' ); - def primary_expression(self, ): - - retval = self.primary_expression_return() - retval.start = self.input.LT(1) - primary_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 44): - return retval - - # C.g:433:2: ( IDENTIFIER | constant | '(' expression ')' ) - alt67 = 3 - LA67 = self.input.LA(1) - if LA67 == IDENTIFIER: - LA67_1 = self.input.LA(2) - - if (LA67_1 == EOF or LA67_1 == 25 or (27 <= LA67_1 <= 28) or LA67_1 == 44 or LA67_1 == 47 or LA67_1 == 53 or (62 <= LA67_1 <= 66) or (68 <= LA67_1 <= 73) or (75 <= LA67_1 <= 77) or (80 <= LA67_1 <= 102)) : - alt67 = 1 - elif (LA67_1 == IDENTIFIER or LA67_1 == STRING_LITERAL) : - alt67 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 1, self.input) - - raise nvae - - elif LA67 == HEX_LITERAL or LA67 == OCTAL_LITERAL or LA67 == DECIMAL_LITERAL or LA67 == CHARACTER_LITERAL or LA67 == STRING_LITERAL or LA67 == FLOATING_POINT_LITERAL: - alt67 = 2 - elif LA67 == 62: - alt67 = 3 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 0, self.input) - - raise nvae - - if alt67 == 1: - # C.g:433:4: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_primary_expression1613) - if self.failed: - return retval - - - elif alt67 == 2: - # C.g:434:4: constant - self.following.append(self.FOLLOW_constant_in_primary_expression1618) - self.constant() - self.following.pop() - if self.failed: - return retval - - - elif alt67 == 3: - # C.g:435:4: '(' expression ')' - self.match(self.input, 62, self.FOLLOW_62_in_primary_expression1623) - if self.failed: - return retval - self.following.append(self.FOLLOW_expression_in_primary_expression1625) - self.expression() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 63, self.FOLLOW_63_in_primary_expression1627) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 44, primary_expression_StartIndex) - - pass - - return retval - - # $ANTLR end primary_expression - - - # $ANTLR start constant - # C.g:438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ); - def constant(self, ): - - constant_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 45): - return - - # C.g:439:5: ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ) - alt72 = 6 - LA72 = self.input.LA(1) - if LA72 == HEX_LITERAL: - alt72 = 1 - elif LA72 == OCTAL_LITERAL: - alt72 = 2 - elif LA72 == DECIMAL_LITERAL: - alt72 = 3 - elif LA72 == CHARACTER_LITERAL: - alt72 = 4 - elif LA72 == IDENTIFIER or LA72 == STRING_LITERAL: - alt72 = 5 - elif LA72 == FLOATING_POINT_LITERAL: - alt72 = 6 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL );", 72, 0, self.input) - - raise nvae - - if alt72 == 1: - # C.g:439:9: HEX_LITERAL - self.match(self.input, HEX_LITERAL, self.FOLLOW_HEX_LITERAL_in_constant1643) - if self.failed: - return - - - elif alt72 == 2: - # C.g:440:9: OCTAL_LITERAL - self.match(self.input, OCTAL_LITERAL, self.FOLLOW_OCTAL_LITERAL_in_constant1653) - if self.failed: - return - - - elif alt72 == 3: - # C.g:441:9: DECIMAL_LITERAL - self.match(self.input, DECIMAL_LITERAL, self.FOLLOW_DECIMAL_LITERAL_in_constant1663) - if self.failed: - return - - - elif alt72 == 4: - # C.g:442:7: CHARACTER_LITERAL - self.match(self.input, CHARACTER_LITERAL, self.FOLLOW_CHARACTER_LITERAL_in_constant1671) - if self.failed: - return - - - elif alt72 == 5: - # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* - # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ - cnt70 = 0 - while True: #loop70 - alt70 = 2 - LA70_0 = self.input.LA(1) - - if (LA70_0 == IDENTIFIER) : - LA70_1 = self.input.LA(2) - - if (LA70_1 == STRING_LITERAL) : - alt70 = 1 - elif (LA70_1 == IDENTIFIER) : - LA70_33 = self.input.LA(3) - - if (self.synpred138()) : - alt70 = 1 - - - - - elif (LA70_0 == STRING_LITERAL) : - alt70 = 1 - - - if alt70 == 1: - # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ - # C.g:443:8: ( IDENTIFIER )* - while True: #loop68 - alt68 = 2 - LA68_0 = self.input.LA(1) - - if (LA68_0 == IDENTIFIER) : - alt68 = 1 - - - if alt68 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1680) - if self.failed: - return - - - else: - break #loop68 - - - # C.g:443:20: ( STRING_LITERAL )+ - cnt69 = 0 - while True: #loop69 - alt69 = 2 - LA69_0 = self.input.LA(1) - - if (LA69_0 == STRING_LITERAL) : - LA69_31 = self.input.LA(2) - - if (self.synpred137()) : - alt69 = 1 - - - - - if alt69 == 1: - # C.g:0:0: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_constant1683) - if self.failed: - return - - - else: - if cnt69 >= 1: - break #loop69 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(69, self.input) - raise eee - - cnt69 += 1 - - - - - else: - if cnt70 >= 1: - break #loop70 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(70, self.input) - raise eee - - cnt70 += 1 - - - # C.g:443:38: ( IDENTIFIER )* - while True: #loop71 - alt71 = 2 - LA71_0 = self.input.LA(1) - - if (LA71_0 == IDENTIFIER) : - alt71 = 1 - - - if alt71 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1688) - if self.failed: - return - - - else: - break #loop71 - - - - - elif alt72 == 6: - # C.g:444:9: FLOATING_POINT_LITERAL - self.match(self.input, FLOATING_POINT_LITERAL, self.FOLLOW_FLOATING_POINT_LITERAL_in_constant1699) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 45, constant_StartIndex) - - pass - - return - - # $ANTLR end constant - - class expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start expression - # C.g:449:1: expression : assignment_expression ( ',' assignment_expression )* ; - def expression(self, ): - - retval = self.expression_return() - retval.start = self.input.LT(1) - expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 46): - return retval - - # C.g:450:2: ( assignment_expression ( ',' assignment_expression )* ) - # C.g:450:4: assignment_expression ( ',' assignment_expression )* - self.following.append(self.FOLLOW_assignment_expression_in_expression1715) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:450:26: ( ',' assignment_expression )* - while True: #loop73 - alt73 = 2 - LA73_0 = self.input.LA(1) - - if (LA73_0 == 27) : - alt73 = 1 - - - if alt73 == 1: - # C.g:450:27: ',' assignment_expression - self.match(self.input, 27, self.FOLLOW_27_in_expression1718) - if self.failed: - return retval - self.following.append(self.FOLLOW_assignment_expression_in_expression1720) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop73 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 46, expression_StartIndex) - - pass - - return retval - - # $ANTLR end expression - - - # $ANTLR start constant_expression - # C.g:453:1: constant_expression : conditional_expression ; - def constant_expression(self, ): - - constant_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 47): - return - - # C.g:454:2: ( conditional_expression ) - # C.g:454:4: conditional_expression - self.following.append(self.FOLLOW_conditional_expression_in_constant_expression1733) - self.conditional_expression() - self.following.pop() - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 47, constant_expression_StartIndex) - - pass - - return - - # $ANTLR end constant_expression - - - # $ANTLR start assignment_expression - # C.g:457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression ); - def assignment_expression(self, ): - - assignment_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 48): - return - - # C.g:458:2: ( lvalue assignment_operator assignment_expression | conditional_expression ) - alt74 = 2 - LA74 = self.input.LA(1) - if LA74 == IDENTIFIER: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_13 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 13, self.input) - - raise nvae - - elif LA74 == 62: - LA74_14 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 14, self.input) - - raise nvae - - elif LA74 == 75: - LA74_15 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 15, self.input) - - raise nvae - - elif LA74 == 66: - LA74_16 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 16, self.input) - - raise nvae - - elif LA74 == 76: - LA74_17 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 17, self.input) - - raise nvae - - elif LA74 == 72: - LA74_18 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 18, self.input) - - raise nvae - - elif LA74 == 73: - LA74_19 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 19, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - elif LA74 == STRING_LITERAL: - LA74_21 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 21, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_22 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 22, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 1, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_44 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 44, self.input) - - raise nvae - - elif LA74 == 62: - LA74_45 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 45, self.input) - - raise nvae - - elif LA74 == 75: - LA74_46 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 46, self.input) - - raise nvae - - elif LA74 == 66: - LA74_47 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 47, self.input) - - raise nvae - - elif LA74 == 76: - LA74_48 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 48, self.input) - - raise nvae - - elif LA74 == 72: - LA74_49 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 49, self.input) - - raise nvae - - elif LA74 == 73: - LA74_50 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 50, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 2, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_73 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 73, self.input) - - raise nvae - - elif LA74 == 62: - LA74_74 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 74, self.input) - - raise nvae - - elif LA74 == 75: - LA74_75 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 75, self.input) - - raise nvae - - elif LA74 == 66: - LA74_76 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 76, self.input) - - raise nvae - - elif LA74 == 76: - LA74_77 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 77, self.input) - - raise nvae - - elif LA74 == 72: - LA74_78 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 78, self.input) - - raise nvae - - elif LA74 == 73: - LA74_79 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 79, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 3, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_102 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 102, self.input) - - raise nvae - - elif LA74 == 62: - LA74_103 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 103, self.input) - - raise nvae - - elif LA74 == 75: - LA74_104 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 104, self.input) - - raise nvae - - elif LA74 == 66: - LA74_105 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 105, self.input) - - raise nvae - - elif LA74 == 76: - LA74_106 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 106, self.input) - - raise nvae - - elif LA74 == 72: - LA74_107 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 107, self.input) - - raise nvae - - elif LA74 == 73: - LA74_108 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 108, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 4, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_131 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 131, self.input) - - raise nvae - - elif LA74 == 62: - LA74_132 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 132, self.input) - - raise nvae - - elif LA74 == 75: - LA74_133 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 133, self.input) - - raise nvae - - elif LA74 == 66: - LA74_134 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 134, self.input) - - raise nvae - - elif LA74 == 76: - LA74_135 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 135, self.input) - - raise nvae - - elif LA74 == 72: - LA74_136 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 136, self.input) - - raise nvae - - elif LA74 == 73: - LA74_137 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 137, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 5, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_160 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 160, self.input) - - raise nvae - - elif LA74 == 64: - LA74_161 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 161, self.input) - - raise nvae - - elif LA74 == 62: - LA74_162 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 162, self.input) - - raise nvae - - elif LA74 == 75: - LA74_163 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 163, self.input) - - raise nvae - - elif LA74 == 66: - LA74_164 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 164, self.input) - - raise nvae - - elif LA74 == 76: - LA74_165 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 165, self.input) - - raise nvae - - elif LA74 == 72: - LA74_166 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 166, self.input) - - raise nvae - - elif LA74 == 73: - LA74_167 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 167, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == STRING_LITERAL: - LA74_189 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 189, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 6, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_191 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 191, self.input) - - raise nvae - - elif LA74 == 62: - LA74_192 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 192, self.input) - - raise nvae - - elif LA74 == 75: - LA74_193 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 193, self.input) - - raise nvae - - elif LA74 == 66: - LA74_194 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 194, self.input) - - raise nvae - - elif LA74 == 76: - LA74_195 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 195, self.input) - - raise nvae - - elif LA74 == 72: - LA74_196 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 196, self.input) - - raise nvae - - elif LA74 == 73: - LA74_197 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 197, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 7, self.input) - - raise nvae - - elif LA74 == 62: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_220 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 220, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_221 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 221, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_222 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 222, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_223 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 223, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_224 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 224, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_225 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 225, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_226 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 226, self.input) - - raise nvae - - elif LA74 == 62: - LA74_227 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 227, self.input) - - raise nvae - - elif LA74 == 72: - LA74_228 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 228, self.input) - - raise nvae - - elif LA74 == 73: - LA74_229 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 229, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_230 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 230, self.input) - - raise nvae - - elif LA74 == 74: - LA74_231 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 231, self.input) - - raise nvae - - elif LA74 == 34 or LA74 == 35 or LA74 == 36 or LA74 == 37 or LA74 == 38 or LA74 == 39 or LA74 == 40 or LA74 == 41 or LA74 == 42 or LA74 == 45 or LA74 == 46 or LA74 == 48 or LA74 == 49 or LA74 == 50 or LA74 == 51 or LA74 == 52 or LA74 == 53 or LA74 == 54 or LA74 == 55 or LA74 == 56 or LA74 == 57 or LA74 == 58 or LA74 == 59 or LA74 == 60 or LA74 == 61: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 8, self.input) - - raise nvae - - elif LA74 == 72: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_244 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 244, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_245 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 245, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_246 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 246, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_247 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 247, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_248 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 248, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_249 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 249, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_250 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 250, self.input) - - raise nvae - - elif LA74 == 62: - LA74_251 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 251, self.input) - - raise nvae - - elif LA74 == 72: - LA74_252 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 252, self.input) - - raise nvae - - elif LA74 == 73: - LA74_253 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 253, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_254 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 254, self.input) - - raise nvae - - elif LA74 == 74: - LA74_255 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 255, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 9, self.input) - - raise nvae - - elif LA74 == 73: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_256 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 256, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_257 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 257, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_258 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 258, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_259 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 259, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_260 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 260, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_261 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 261, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_262 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 262, self.input) - - raise nvae - - elif LA74 == 62: - LA74_263 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 263, self.input) - - raise nvae - - elif LA74 == 72: - LA74_264 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 264, self.input) - - raise nvae - - elif LA74 == 73: - LA74_265 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 265, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_266 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 266, self.input) - - raise nvae - - elif LA74 == 74: - LA74_267 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 267, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 10, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74 = self.input.LA(2) - if LA74 == 62: - LA74_268 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 268, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_269 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 269, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_270 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 270, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_271 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 271, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_272 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 272, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_273 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 273, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_274 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 274, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_275 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 275, self.input) - - raise nvae - - elif LA74 == 72: - LA74_276 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 276, self.input) - - raise nvae - - elif LA74 == 73: - LA74_277 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 277, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_278 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 278, self.input) - - raise nvae - - elif LA74 == 74: - LA74_279 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 279, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 11, self.input) - - raise nvae - - elif LA74 == 74: - LA74 = self.input.LA(2) - if LA74 == 62: - LA74_280 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 280, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_281 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 281, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_282 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 282, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_283 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 283, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_284 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 284, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_285 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 285, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_286 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 286, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_287 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 287, self.input) - - raise nvae - - elif LA74 == 72: - LA74_288 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 288, self.input) - - raise nvae - - elif LA74 == 73: - LA74_289 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 289, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_290 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 290, self.input) - - raise nvae - - elif LA74 == 74: - LA74_291 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 291, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 12, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 0, self.input) - - raise nvae - - if alt74 == 1: - # C.g:458:4: lvalue assignment_operator assignment_expression - self.following.append(self.FOLLOW_lvalue_in_assignment_expression1744) - self.lvalue() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_operator_in_assignment_expression1746) - self.assignment_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_expression_in_assignment_expression1748) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - elif alt74 == 2: - # C.g:459:4: conditional_expression - self.following.append(self.FOLLOW_conditional_expression_in_assignment_expression1753) - self.conditional_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 48, assignment_expression_StartIndex) - - pass - - return - - # $ANTLR end assignment_expression - - - # $ANTLR start lvalue - # C.g:462:1: lvalue : unary_expression ; - def lvalue(self, ): - - lvalue_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 49): - return - - # C.g:463:2: ( unary_expression ) - # C.g:463:4: unary_expression - self.following.append(self.FOLLOW_unary_expression_in_lvalue1765) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 49, lvalue_StartIndex) - - pass - - return - - # $ANTLR end lvalue - - - # $ANTLR start assignment_operator - # C.g:466:1: assignment_operator : ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ); - def assignment_operator(self, ): - - assignment_operator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 50): - return - - # C.g:467:2: ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ) - # C.g: - if self.input.LA(1) == 28 or (80 <= self.input.LA(1) <= 89): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_assignment_operator0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 50, assignment_operator_StartIndex) - - pass - - return - - # $ANTLR end assignment_operator - - - # $ANTLR start conditional_expression - # C.g:480:1: conditional_expression : e= logical_or_expression ( '?' expression ':' conditional_expression )? ; - def conditional_expression(self, ): - - conditional_expression_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 51): - return - - # C.g:481:2: (e= logical_or_expression ( '?' expression ':' conditional_expression )? ) - # C.g:481:4: e= logical_or_expression ( '?' expression ':' conditional_expression )? - self.following.append(self.FOLLOW_logical_or_expression_in_conditional_expression1839) - e = self.logical_or_expression() - self.following.pop() - if self.failed: - return - # C.g:481:28: ( '?' expression ':' conditional_expression )? - alt75 = 2 - LA75_0 = self.input.LA(1) - - if (LA75_0 == 90) : - alt75 = 1 - if alt75 == 1: - # C.g:481:29: '?' expression ':' conditional_expression - self.match(self.input, 90, self.FOLLOW_90_in_conditional_expression1842) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_conditional_expression1844) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_conditional_expression1846) - if self.failed: - return - self.following.append(self.FOLLOW_conditional_expression_in_conditional_expression1848) - self.conditional_expression() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 51, conditional_expression_StartIndex) - - pass - - return - - # $ANTLR end conditional_expression - - class logical_or_expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start logical_or_expression - # C.g:484:1: logical_or_expression : logical_and_expression ( '||' logical_and_expression )* ; - def logical_or_expression(self, ): - - retval = self.logical_or_expression_return() - retval.start = self.input.LT(1) - logical_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 52): - return retval - - # C.g:485:2: ( logical_and_expression ( '||' logical_and_expression )* ) - # C.g:485:4: logical_and_expression ( '||' logical_and_expression )* - self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1863) - self.logical_and_expression() - self.following.pop() - if self.failed: - return retval - # C.g:485:27: ( '||' logical_and_expression )* - while True: #loop76 - alt76 = 2 - LA76_0 = self.input.LA(1) - - if (LA76_0 == 91) : - alt76 = 1 - - - if alt76 == 1: - # C.g:485:28: '||' logical_and_expression - self.match(self.input, 91, self.FOLLOW_91_in_logical_or_expression1866) - if self.failed: - return retval - self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1868) - self.logical_and_expression() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop76 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 52, logical_or_expression_StartIndex) - - pass - - return retval - - # $ANTLR end logical_or_expression - - - # $ANTLR start logical_and_expression - # C.g:488:1: logical_and_expression : inclusive_or_expression ( '&&' inclusive_or_expression )* ; - def logical_and_expression(self, ): - - logical_and_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 53): - return - - # C.g:489:2: ( inclusive_or_expression ( '&&' inclusive_or_expression )* ) - # C.g:489:4: inclusive_or_expression ( '&&' inclusive_or_expression )* - self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1881) - self.inclusive_or_expression() - self.following.pop() - if self.failed: - return - # C.g:489:28: ( '&&' inclusive_or_expression )* - while True: #loop77 - alt77 = 2 - LA77_0 = self.input.LA(1) - - if (LA77_0 == 92) : - alt77 = 1 - - - if alt77 == 1: - # C.g:489:29: '&&' inclusive_or_expression - self.match(self.input, 92, self.FOLLOW_92_in_logical_and_expression1884) - if self.failed: - return - self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1886) - self.inclusive_or_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop77 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 53, logical_and_expression_StartIndex) - - pass - - return - - # $ANTLR end logical_and_expression - - - # $ANTLR start inclusive_or_expression - # C.g:492:1: inclusive_or_expression : exclusive_or_expression ( '|' exclusive_or_expression )* ; - def inclusive_or_expression(self, ): - - inclusive_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 54): - return - - # C.g:493:2: ( exclusive_or_expression ( '|' exclusive_or_expression )* ) - # C.g:493:4: exclusive_or_expression ( '|' exclusive_or_expression )* - self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899) - self.exclusive_or_expression() - self.following.pop() - if self.failed: - return - # C.g:493:28: ( '|' exclusive_or_expression )* - while True: #loop78 - alt78 = 2 - LA78_0 = self.input.LA(1) - - if (LA78_0 == 93) : - alt78 = 1 - - - if alt78 == 1: - # C.g:493:29: '|' exclusive_or_expression - self.match(self.input, 93, self.FOLLOW_93_in_inclusive_or_expression1902) - if self.failed: - return - self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904) - self.exclusive_or_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop78 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 54, inclusive_or_expression_StartIndex) - - pass - - return - - # $ANTLR end inclusive_or_expression - - - # $ANTLR start exclusive_or_expression - # C.g:496:1: exclusive_or_expression : and_expression ( '^' and_expression )* ; - def exclusive_or_expression(self, ): - - exclusive_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 55): - return - - # C.g:497:2: ( and_expression ( '^' and_expression )* ) - # C.g:497:4: and_expression ( '^' and_expression )* - self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1917) - self.and_expression() - self.following.pop() - if self.failed: - return - # C.g:497:19: ( '^' and_expression )* - while True: #loop79 - alt79 = 2 - LA79_0 = self.input.LA(1) - - if (LA79_0 == 94) : - alt79 = 1 - - - if alt79 == 1: - # C.g:497:20: '^' and_expression - self.match(self.input, 94, self.FOLLOW_94_in_exclusive_or_expression1920) - if self.failed: - return - self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1922) - self.and_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop79 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 55, exclusive_or_expression_StartIndex) - - pass - - return - - # $ANTLR end exclusive_or_expression - - - # $ANTLR start and_expression - # C.g:500:1: and_expression : equality_expression ( '&' equality_expression )* ; - def and_expression(self, ): - - and_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 56): - return - - # C.g:501:2: ( equality_expression ( '&' equality_expression )* ) - # C.g:501:4: equality_expression ( '&' equality_expression )* - self.following.append(self.FOLLOW_equality_expression_in_and_expression1935) - self.equality_expression() - self.following.pop() - if self.failed: - return - # C.g:501:24: ( '&' equality_expression )* - while True: #loop80 - alt80 = 2 - LA80_0 = self.input.LA(1) - - if (LA80_0 == 77) : - alt80 = 1 - - - if alt80 == 1: - # C.g:501:25: '&' equality_expression - self.match(self.input, 77, self.FOLLOW_77_in_and_expression1938) - if self.failed: - return - self.following.append(self.FOLLOW_equality_expression_in_and_expression1940) - self.equality_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop80 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 56, and_expression_StartIndex) - - pass - - return - - # $ANTLR end and_expression - - - # $ANTLR start equality_expression - # C.g:503:1: equality_expression : relational_expression ( ( '==' | '!=' ) relational_expression )* ; - def equality_expression(self, ): - - equality_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 57): - return - - # C.g:504:2: ( relational_expression ( ( '==' | '!=' ) relational_expression )* ) - # C.g:504:4: relational_expression ( ( '==' | '!=' ) relational_expression )* - self.following.append(self.FOLLOW_relational_expression_in_equality_expression1952) - self.relational_expression() - self.following.pop() - if self.failed: - return - # C.g:504:26: ( ( '==' | '!=' ) relational_expression )* - while True: #loop81 - alt81 = 2 - LA81_0 = self.input.LA(1) - - if ((95 <= LA81_0 <= 96)) : - alt81 = 1 - - - if alt81 == 1: - # C.g:504:27: ( '==' | '!=' ) relational_expression - if (95 <= self.input.LA(1) <= 96): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_equality_expression1955 - ) - raise mse - - - self.following.append(self.FOLLOW_relational_expression_in_equality_expression1961) - self.relational_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop81 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 57, equality_expression_StartIndex) - - pass - - return - - # $ANTLR end equality_expression - - - # $ANTLR start relational_expression - # C.g:507:1: relational_expression : shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ; - def relational_expression(self, ): - - relational_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 58): - return - - # C.g:508:2: ( shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ) - # C.g:508:4: shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* - self.following.append(self.FOLLOW_shift_expression_in_relational_expression1975) - self.shift_expression() - self.following.pop() - if self.failed: - return - # C.g:508:21: ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* - while True: #loop82 - alt82 = 2 - LA82_0 = self.input.LA(1) - - if ((97 <= LA82_0 <= 100)) : - alt82 = 1 - - - if alt82 == 1: - # C.g:508:22: ( '<' | '>' | '<=' | '>=' ) shift_expression - if (97 <= self.input.LA(1) <= 100): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_relational_expression1978 - ) - raise mse - - - self.following.append(self.FOLLOW_shift_expression_in_relational_expression1988) - self.shift_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop82 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 58, relational_expression_StartIndex) - - pass - - return - - # $ANTLR end relational_expression - - - # $ANTLR start shift_expression - # C.g:511:1: shift_expression : additive_expression ( ( '<<' | '>>' ) additive_expression )* ; - def shift_expression(self, ): - - shift_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 59): - return - - # C.g:512:2: ( additive_expression ( ( '<<' | '>>' ) additive_expression )* ) - # C.g:512:4: additive_expression ( ( '<<' | '>>' ) additive_expression )* - self.following.append(self.FOLLOW_additive_expression_in_shift_expression2001) - self.additive_expression() - self.following.pop() - if self.failed: - return - # C.g:512:24: ( ( '<<' | '>>' ) additive_expression )* - while True: #loop83 - alt83 = 2 - LA83_0 = self.input.LA(1) - - if ((101 <= LA83_0 <= 102)) : - alt83 = 1 - - - if alt83 == 1: - # C.g:512:25: ( '<<' | '>>' ) additive_expression - if (101 <= self.input.LA(1) <= 102): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_shift_expression2004 - ) - raise mse - - - self.following.append(self.FOLLOW_additive_expression_in_shift_expression2010) - self.additive_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop83 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 59, shift_expression_StartIndex) - - pass - - return - - # $ANTLR end shift_expression - - - # $ANTLR start statement - # C.g:517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ); - def statement(self, ): - - statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 60): - return - - # C.g:518:2: ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ) - alt84 = 11 - LA84 = self.input.LA(1) - if LA84 == IDENTIFIER: - LA84 = self.input.LA(2) - if LA84 == 62: - LA84_43 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (self.synpred173()) : - alt84 = 7 - elif (self.synpred174()) : - alt84 = 8 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 43, self.input) - - raise nvae - - elif LA84 == 47: - alt84 = 1 - elif LA84 == STRING_LITERAL or LA84 == 27 or LA84 == 28 or LA84 == 64 or LA84 == 68 or LA84 == 69 or LA84 == 70 or LA84 == 71 or LA84 == 72 or LA84 == 73 or LA84 == 75 or LA84 == 76 or LA84 == 77 or LA84 == 80 or LA84 == 81 or LA84 == 82 or LA84 == 83 or LA84 == 84 or LA84 == 85 or LA84 == 86 or LA84 == 87 or LA84 == 88 or LA84 == 89 or LA84 == 90 or LA84 == 91 or LA84 == 92 or LA84 == 93 or LA84 == 94 or LA84 == 95 or LA84 == 96 or LA84 == 97 or LA84 == 98 or LA84 == 99 or LA84 == 100 or LA84 == 101 or LA84 == 102: - alt84 = 3 - elif LA84 == 66: - LA84_47 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 47, self.input) - - raise nvae - - elif LA84 == IDENTIFIER: - LA84_53 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 53, self.input) - - raise nvae - - elif LA84 == 25: - LA84_68 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 68, self.input) - - raise nvae - - elif LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 1, self.input) - - raise nvae - - elif LA84 == 106 or LA84 == 107: - alt84 = 1 - elif LA84 == 43: - alt84 = 2 - elif LA84 == HEX_LITERAL or LA84 == OCTAL_LITERAL or LA84 == DECIMAL_LITERAL or LA84 == CHARACTER_LITERAL or LA84 == STRING_LITERAL or LA84 == FLOATING_POINT_LITERAL or LA84 == 25 or LA84 == 62 or LA84 == 66 or LA84 == 68 or LA84 == 69 or LA84 == 72 or LA84 == 73 or LA84 == 74 or LA84 == 77 or LA84 == 78 or LA84 == 79: - alt84 = 3 - elif LA84 == 108 or LA84 == 110: - alt84 = 4 - elif LA84 == 111 or LA84 == 112 or LA84 == 113: - alt84 = 5 - elif LA84 == 114 or LA84 == 115 or LA84 == 116 or LA84 == 117: - alt84 = 6 - elif LA84 == 103: - alt84 = 8 - elif LA84 == 104: - alt84 = 9 - elif LA84 == 105: - alt84 = 10 - elif LA84 == 26 or LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 0, self.input) - - raise nvae - - if alt84 == 1: - # C.g:518:4: labeled_statement - self.following.append(self.FOLLOW_labeled_statement_in_statement2025) - self.labeled_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 2: - # C.g:519:4: compound_statement - self.following.append(self.FOLLOW_compound_statement_in_statement2030) - self.compound_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 3: - # C.g:520:4: expression_statement - self.following.append(self.FOLLOW_expression_statement_in_statement2035) - self.expression_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 4: - # C.g:521:4: selection_statement - self.following.append(self.FOLLOW_selection_statement_in_statement2040) - self.selection_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 5: - # C.g:522:4: iteration_statement - self.following.append(self.FOLLOW_iteration_statement_in_statement2045) - self.iteration_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 6: - # C.g:523:4: jump_statement - self.following.append(self.FOLLOW_jump_statement_in_statement2050) - self.jump_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 7: - # C.g:524:4: macro_statement - self.following.append(self.FOLLOW_macro_statement_in_statement2055) - self.macro_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 8: - # C.g:525:4: asm2_statement - self.following.append(self.FOLLOW_asm2_statement_in_statement2060) - self.asm2_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 9: - # C.g:526:4: asm1_statement - self.following.append(self.FOLLOW_asm1_statement_in_statement2065) - self.asm1_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 10: - # C.g:527:4: asm_statement - self.following.append(self.FOLLOW_asm_statement_in_statement2070) - self.asm_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 11: - # C.g:528:4: declaration - self.following.append(self.FOLLOW_declaration_in_statement2075) - self.declaration() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 60, statement_StartIndex) - - pass - - return - - # $ANTLR end statement - - - # $ANTLR start asm2_statement - # C.g:531:1: asm2_statement : ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ; - def asm2_statement(self, ): - - asm2_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 61): - return - - # C.g:532:2: ( ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ) - # C.g:532:4: ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' - # C.g:532:4: ( '__asm__' )? - alt85 = 2 - LA85_0 = self.input.LA(1) - - if (LA85_0 == 103) : - alt85 = 1 - if alt85 == 1: - # C.g:0:0: '__asm__' - self.match(self.input, 103, self.FOLLOW_103_in_asm2_statement2086) - if self.failed: - return - - - - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_asm2_statement2089) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_asm2_statement2091) - if self.failed: - return - # C.g:532:30: (~ ( ';' ) )* - while True: #loop86 - alt86 = 2 - LA86_0 = self.input.LA(1) - - if (LA86_0 == 63) : - LA86_1 = self.input.LA(2) - - if ((IDENTIFIER <= LA86_1 <= LINE_COMMAND) or (26 <= LA86_1 <= 117)) : - alt86 = 1 - - - elif ((IDENTIFIER <= LA86_0 <= LINE_COMMAND) or (26 <= LA86_0 <= 62) or (64 <= LA86_0 <= 117)) : - alt86 = 1 - - - if alt86 == 1: - # C.g:532:31: ~ ( ';' ) - if (IDENTIFIER <= self.input.LA(1) <= LINE_COMMAND) or (26 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm2_statement2094 - ) - raise mse - - - - - else: - break #loop86 - - - self.match(self.input, 63, self.FOLLOW_63_in_asm2_statement2101) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_asm2_statement2103) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 61, asm2_statement_StartIndex) - - pass - - return - - # $ANTLR end asm2_statement - - - # $ANTLR start asm1_statement - # C.g:535:1: asm1_statement : '_asm' '{' (~ ( '}' ) )* '}' ; - def asm1_statement(self, ): - - asm1_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 62): - return - - # C.g:536:2: ( '_asm' '{' (~ ( '}' ) )* '}' ) - # C.g:536:4: '_asm' '{' (~ ( '}' ) )* '}' - self.match(self.input, 104, self.FOLLOW_104_in_asm1_statement2115) - if self.failed: - return - self.match(self.input, 43, self.FOLLOW_43_in_asm1_statement2117) - if self.failed: - return - # C.g:536:15: (~ ( '}' ) )* - while True: #loop87 - alt87 = 2 - LA87_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA87_0 <= 43) or (45 <= LA87_0 <= 117)) : - alt87 = 1 - - - if alt87 == 1: - # C.g:536:16: ~ ( '}' ) - if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm1_statement2120 - ) - raise mse - - - - - else: - break #loop87 - - - self.match(self.input, 44, self.FOLLOW_44_in_asm1_statement2127) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 62, asm1_statement_StartIndex) - - pass - - return - - # $ANTLR end asm1_statement - - - # $ANTLR start asm_statement - # C.g:539:1: asm_statement : '__asm' '{' (~ ( '}' ) )* '}' ; - def asm_statement(self, ): - - asm_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 63): - return - - # C.g:540:2: ( '__asm' '{' (~ ( '}' ) )* '}' ) - # C.g:540:4: '__asm' '{' (~ ( '}' ) )* '}' - self.match(self.input, 105, self.FOLLOW_105_in_asm_statement2138) - if self.failed: - return - self.match(self.input, 43, self.FOLLOW_43_in_asm_statement2140) - if self.failed: - return - # C.g:540:16: (~ ( '}' ) )* - while True: #loop88 - alt88 = 2 - LA88_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA88_0 <= 43) or (45 <= LA88_0 <= 117)) : - alt88 = 1 - - - if alt88 == 1: - # C.g:540:17: ~ ( '}' ) - if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm_statement2143 - ) - raise mse - - - - - else: - break #loop88 - - - self.match(self.input, 44, self.FOLLOW_44_in_asm_statement2150) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 63, asm_statement_StartIndex) - - pass - - return - - # $ANTLR end asm_statement - - - # $ANTLR start macro_statement - # C.g:543:1: macro_statement : IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ; - def macro_statement(self, ): - - macro_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 64): - return - - # C.g:544:2: ( IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ) - # C.g:544:4: IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_macro_statement2162) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_macro_statement2164) - if self.failed: - return - # C.g:544:19: ( declaration )* - while True: #loop89 - alt89 = 2 - LA89 = self.input.LA(1) - if LA89 == IDENTIFIER: - LA89 = self.input.LA(2) - if LA89 == 62: - LA89_45 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_47 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 66: - LA89_50 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_68 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_71 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_72 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_73 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_74 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_75 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_76 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_77 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_78 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_79 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_80 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_81 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_82 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_83 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_84 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_85 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_86 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 26: - LA89 = self.input.LA(2) - if LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_87 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_88 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_89 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_90 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_91 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_92 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_93 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_94 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_95 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_96 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_97 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_98 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_99 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_100 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 66: - LA89_101 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_102 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_103 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_104 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_105 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_106 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_107 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_108 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_109 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_110 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_111 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_112 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_113 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_114 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_115 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_116 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_117 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_118 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_119 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_120 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_121 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_122 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_123 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_124 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_125 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 34: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_126 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_127 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_128 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_129 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_130 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_131 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_132 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_133 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_134 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_135 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_136 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_137 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_138 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_139 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_140 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_141 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_142 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_143 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_144 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_145 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 35: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_146 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_147 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_148 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_149 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_150 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_151 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_152 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_153 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_154 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_155 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_156 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_157 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_158 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_159 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_160 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_161 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_162 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_163 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_164 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_165 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 36: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_166 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_167 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_168 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_169 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_170 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_171 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_172 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_173 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_174 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_175 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_176 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_177 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_178 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_179 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_180 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_181 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_182 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_183 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_184 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_185 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 37: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_186 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_187 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_188 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_189 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_190 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_191 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_192 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_193 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_194 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_195 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_196 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_197 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_198 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_199 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_200 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_201 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_202 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_203 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_204 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_205 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 38: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_206 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_207 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_208 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_209 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_210 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_211 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_212 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_213 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_214 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_215 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_216 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_217 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_218 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_219 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_220 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_221 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_222 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_223 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_224 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_225 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 39: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_226 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_227 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_228 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_229 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_230 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_231 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_232 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_233 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_234 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_235 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_236 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_237 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_238 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_239 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_240 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_241 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_242 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_243 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_244 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_245 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 40: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_246 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_247 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_248 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_249 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_250 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_251 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_252 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_253 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_254 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_255 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_256 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_257 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_258 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_259 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_260 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_261 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_262 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_263 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_264 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_265 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 41: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_266 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_267 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_268 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_269 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_270 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_271 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_272 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_273 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_274 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_275 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_276 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_277 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_278 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_279 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_280 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_281 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_282 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_283 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_284 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_285 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 42: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_286 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_287 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_288 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_289 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_290 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_291 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_292 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_293 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_294 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_295 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_296 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_297 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_298 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_299 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_300 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_301 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_302 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_303 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_304 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_305 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 45 or LA89 == 46: - LA89_40 = self.input.LA(2) - - if (LA89_40 == IDENTIFIER) : - LA89_306 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif (LA89_40 == 43) : - LA89_307 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - elif LA89 == 48: - LA89_41 = self.input.LA(2) - - if (LA89_41 == 43) : - LA89_308 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif (LA89_41 == IDENTIFIER) : - LA89_309 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 58 or LA89 == 59 or LA89 == 60 or LA89 == 61: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_310 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_311 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_312 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_313 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_314 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_315 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_316 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_317 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_318 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_319 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_320 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_321 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_322 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_323 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_324 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_325 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_326 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_327 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_328 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_329 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - if alt89 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_macro_statement2166) - self.declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop89 - - - # C.g:544:33: ( statement_list )? - alt90 = 2 - LA90 = self.input.LA(1) - if LA90 == IDENTIFIER: - LA90 = self.input.LA(2) - if LA90 == 25 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 45 or LA90 == 46 or LA90 == 47 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: - alt90 = 1 - elif LA90 == 62: - LA90_45 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_46 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_47 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 64: - LA90_48 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_49 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_50 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_51 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_52 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_53 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_54 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_55 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_56 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_57 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_58 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_59 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_60 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_61 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_62 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_63 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_64 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_65 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_66 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_67 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_70 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25 or LA90 == 26 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 43 or LA90 == 45 or LA90 == 46 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61 or LA90 == 103 or LA90 == 104 or LA90 == 105 or LA90 == 106 or LA90 == 107 or LA90 == 108 or LA90 == 110 or LA90 == 111 or LA90 == 112 or LA90 == 113 or LA90 == 114 or LA90 == 115 or LA90 == 116 or LA90 == 117: - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_87 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_88 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_89 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_90 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_91 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_92 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_93 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_94 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_95 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_96 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_97 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_98 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_99 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_100 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_101 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_102 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_103 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_104 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_105 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_106 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_107 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_108 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_111 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_112 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_113 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_114 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_115 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_116 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_117 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_118 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_119 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_120 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_121 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_122 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_123 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_124 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_125 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_126 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_127 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_128 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_129 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_130 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_131 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_134 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_135 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_136 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_137 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_138 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_139 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_140 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_141 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_142 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_143 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_144 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_145 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_146 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_147 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_148 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_149 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_150 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_151 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_152 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_153 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_154 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_155 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_156 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_159 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_160 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_161 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_162 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_163 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_164 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_165 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_166 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_167 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_168 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_169 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_170 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_171 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_172 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_173 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_174 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_175 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_176 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_177 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_178 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_179 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_181 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_183 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 64: - LA90_184 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_185 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_186 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_187 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_188 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_189 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_190 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_191 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_192 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_193 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_194 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_195 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_196 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_197 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_198 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_199 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_200 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_201 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_202 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_203 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_204 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_205 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_206 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_209 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_210 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_211 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_212 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_213 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_214 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_215 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_216 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_217 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_218 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_219 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_220 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_221 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_222 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_223 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_224 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_225 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_226 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_227 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_228 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_229 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_230 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 62: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_233 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_234 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_235 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_236 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_237 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_238 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_239 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_240 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_241 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_242 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_243 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_244 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: - LA90_245 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 34: - LA90_246 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 35: - LA90_247 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 36: - LA90_248 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 37: - LA90_249 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 38: - LA90_250 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 39: - LA90_251 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 40: - LA90_252 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 41: - LA90_253 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 42: - LA90_254 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 45 or LA90 == 46: - LA90_255 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 48: - LA90_256 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_257 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_258 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_259 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_260 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_261 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_262 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_263 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_264 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_265 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_266 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_267 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_268 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_269 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_270 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_271 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_272 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_273 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_274 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_275 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_276 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_277 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_278 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_279 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_280 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90 = self.input.LA(2) - if LA90 == 62: - LA90_281 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_282 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_283 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_284 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_285 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_286 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_287 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_288 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_289 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_290 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_291 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_292 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90 = self.input.LA(2) - if LA90 == 62: - LA90_293 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_294 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_295 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_296 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_297 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_298 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_299 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_300 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_301 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_302 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_303 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_304 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - if alt90 == 1: - # C.g:0:0: statement_list - self.following.append(self.FOLLOW_statement_list_in_macro_statement2170) - self.statement_list() - self.following.pop() - if self.failed: - return - - - - # C.g:544:49: ( expression )? - alt91 = 2 - LA91_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA91_0 <= FLOATING_POINT_LITERAL) or LA91_0 == 62 or LA91_0 == 66 or (68 <= LA91_0 <= 69) or (72 <= LA91_0 <= 74) or (77 <= LA91_0 <= 79)) : - alt91 = 1 - if alt91 == 1: - # C.g:0:0: expression - self.following.append(self.FOLLOW_expression_in_macro_statement2173) - self.expression() - self.following.pop() - if self.failed: - return - - - - self.match(self.input, 63, self.FOLLOW_63_in_macro_statement2176) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 64, macro_statement_StartIndex) - - pass - - return - - # $ANTLR end macro_statement - - - # $ANTLR start labeled_statement - # C.g:547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ); - def labeled_statement(self, ): - - labeled_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 65): - return - - # C.g:548:2: ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ) - alt92 = 3 - LA92 = self.input.LA(1) - if LA92 == IDENTIFIER: - alt92 = 1 - elif LA92 == 106: - alt92 = 2 - elif LA92 == 107: - alt92 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement );", 92, 0, self.input) - - raise nvae - - if alt92 == 1: - # C.g:548:4: IDENTIFIER ':' statement - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_labeled_statement2188) - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2190) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2192) - self.statement() - self.following.pop() - if self.failed: - return - - - elif alt92 == 2: - # C.g:549:4: 'case' constant_expression ':' statement - self.match(self.input, 106, self.FOLLOW_106_in_labeled_statement2197) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_labeled_statement2199) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2201) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2203) - self.statement() - self.following.pop() - if self.failed: - return - - - elif alt92 == 3: - # C.g:550:4: 'default' ':' statement - self.match(self.input, 107, self.FOLLOW_107_in_labeled_statement2208) - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2210) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2212) - self.statement() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 65, labeled_statement_StartIndex) - - pass - - return - - # $ANTLR end labeled_statement - - class compound_statement_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start compound_statement - # C.g:553:1: compound_statement : '{' ( declaration )* ( statement_list )? '}' ; - def compound_statement(self, ): - - retval = self.compound_statement_return() - retval.start = self.input.LT(1) - compound_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 66): - return retval - - # C.g:554:2: ( '{' ( declaration )* ( statement_list )? '}' ) - # C.g:554:4: '{' ( declaration )* ( statement_list )? '}' - self.match(self.input, 43, self.FOLLOW_43_in_compound_statement2223) - if self.failed: - return retval - # C.g:554:8: ( declaration )* - while True: #loop93 - alt93 = 2 - LA93 = self.input.LA(1) - if LA93 == IDENTIFIER: - LA93 = self.input.LA(2) - if LA93 == 62: - LA93_44 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_47 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 66: - LA93_48 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_49 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_50 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_51 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_52 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_53 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_54 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_55 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_56 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_57 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_58 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_59 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_60 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_61 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_62 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_63 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_64 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_65 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 26: - LA93 = self.input.LA(2) - if LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_86 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_87 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_88 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_89 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_90 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_91 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_92 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_93 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_94 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_95 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_96 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_97 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_98 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_99 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 66: - LA93_100 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_101 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_102 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_103 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_104 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_105 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_106 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_107 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_108 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_109 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_110 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_111 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_112 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_113 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_114 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_115 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_116 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_117 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_118 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_119 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_120 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_121 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_122 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_123 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_124 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 34: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_125 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_126 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_127 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_128 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_129 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_130 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_131 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_132 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_133 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_134 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_135 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_136 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_137 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_138 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_139 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_140 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_141 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_142 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_143 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_144 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 35: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_145 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_146 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_147 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_148 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_149 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_150 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_151 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_152 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_153 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_154 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_155 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_156 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_157 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_158 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_159 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_160 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_161 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_162 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_163 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_164 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 36: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_165 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_166 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_167 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_168 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_169 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_170 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_171 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_172 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_173 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_174 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_175 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_176 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_177 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_178 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_179 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_180 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_181 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_182 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_183 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_184 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 37: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_185 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_186 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_187 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_188 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_189 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_190 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_191 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_192 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_193 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_194 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_195 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_196 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_197 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_198 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_199 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_200 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_201 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_202 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_203 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_204 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 38: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_205 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_206 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_207 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_208 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_209 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_210 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_211 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_212 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_213 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_214 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_215 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_216 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_217 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_218 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_219 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_220 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_221 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_222 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_223 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_224 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 39: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_225 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_226 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_227 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_228 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_229 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_230 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_231 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_232 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_233 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_234 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_235 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_236 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_237 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_238 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_239 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_240 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_241 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_242 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_243 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_244 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 40: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_245 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_246 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_247 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_248 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_249 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_250 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_251 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_252 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_253 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_254 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_255 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_256 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_257 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_258 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_259 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_260 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_261 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_262 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_263 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_264 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 41: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_265 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_266 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_267 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_268 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_269 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_270 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_271 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_272 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_273 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_274 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_275 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_276 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_277 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_278 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_279 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_280 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_281 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_282 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_283 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_284 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 42: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_285 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_286 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_287 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_288 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_289 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_290 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_291 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_292 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_293 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_294 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_295 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_296 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_297 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_298 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_299 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_300 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_301 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_302 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_303 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_304 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 45 or LA93 == 46: - LA93_40 = self.input.LA(2) - - if (LA93_40 == IDENTIFIER) : - LA93_305 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif (LA93_40 == 43) : - LA93_306 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - elif LA93 == 48: - LA93_41 = self.input.LA(2) - - if (LA93_41 == 43) : - LA93_307 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif (LA93_41 == IDENTIFIER) : - LA93_308 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 58 or LA93 == 59 or LA93 == 60 or LA93 == 61: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_309 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_310 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_311 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_312 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_313 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_314 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_315 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_316 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_317 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_318 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_319 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_320 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_321 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_322 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_323 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_324 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_325 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_326 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_327 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_328 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - if alt93 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_compound_statement2225) - self.declaration() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop93 - - - # C.g:554:21: ( statement_list )? - alt94 = 2 - LA94_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA94_0 <= FLOATING_POINT_LITERAL) or (25 <= LA94_0 <= 26) or (29 <= LA94_0 <= 43) or (45 <= LA94_0 <= 46) or (48 <= LA94_0 <= 62) or LA94_0 == 66 or (68 <= LA94_0 <= 69) or (72 <= LA94_0 <= 74) or (77 <= LA94_0 <= 79) or (103 <= LA94_0 <= 108) or (110 <= LA94_0 <= 117)) : - alt94 = 1 - if alt94 == 1: - # C.g:0:0: statement_list - self.following.append(self.FOLLOW_statement_list_in_compound_statement2228) - self.statement_list() - self.following.pop() - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_compound_statement2231) - if self.failed: - return retval - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 66, compound_statement_StartIndex) - - pass - - return retval - - # $ANTLR end compound_statement - - - # $ANTLR start statement_list - # C.g:557:1: statement_list : ( statement )+ ; - def statement_list(self, ): - - statement_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 67): - return - - # C.g:558:2: ( ( statement )+ ) - # C.g:558:4: ( statement )+ - # C.g:558:4: ( statement )+ - cnt95 = 0 - while True: #loop95 - alt95 = 2 - LA95 = self.input.LA(1) - if LA95 == IDENTIFIER: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_46 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 45 or LA95 == 46 or LA95 == 47 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: - alt95 = 1 - elif LA95 == STRING_LITERAL: - LA95_48 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_49 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 64: - LA95_50 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_51 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_52 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_53 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_54 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_55 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_56 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_57 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_58 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_59 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_60 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_61 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_62 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_63 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_64 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_65 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_66 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_67 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_68 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_69 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_88 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == HEX_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_89 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_90 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_91 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_92 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_93 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_94 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_95 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_96 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_97 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_98 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_99 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_100 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_101 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_102 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_103 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_104 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_105 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_106 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_107 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_108 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_109 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_110 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == OCTAL_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_113 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_114 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_115 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_116 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_117 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_118 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_119 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_120 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_121 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_122 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_123 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_124 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_125 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_126 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_127 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_128 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_129 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_130 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_131 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_132 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_133 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_135 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == DECIMAL_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_137 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_138 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_139 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_140 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_141 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_142 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_143 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_144 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_145 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_146 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_147 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_148 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_149 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_150 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_151 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_152 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_153 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_154 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_155 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_156 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_157 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_158 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == CHARACTER_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_161 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_162 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_163 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_164 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_165 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_166 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_167 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_168 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_169 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_170 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_171 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_172 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_173 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_174 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_175 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_176 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_177 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_178 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_179 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_180 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_181 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_182 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == STRING_LITERAL: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_185 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 64: - LA95_186 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_187 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_188 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_189 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_190 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_191 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_192 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_193 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_194 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_195 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_196 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_197 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_198 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_199 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_200 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_201 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_202 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_203 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_204 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_205 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_206 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - elif LA95 == STRING_LITERAL: - LA95_208 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_209 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_211 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_212 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_213 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_214 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_215 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_216 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_217 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_218 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_219 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_220 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_221 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_222 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_223 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_224 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_225 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_226 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_227 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_228 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_229 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_230 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_231 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_234 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 62: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_235 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_236 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_237 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_238 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_239 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_240 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_241 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_242 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_243 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_244 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_245 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_246 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: - LA95_247 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 34: - LA95_248 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 35: - LA95_249 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 36: - LA95_250 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 37: - LA95_251 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 38: - LA95_252 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 39: - LA95_253 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 40: - LA95_254 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 41: - LA95_255 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 42: - LA95_256 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 45 or LA95 == 46: - LA95_257 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 48: - LA95_258 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 72: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_259 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_260 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_261 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_262 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_263 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_264 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_265 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_266 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_267 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_268 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_269 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_270 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 73: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_271 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_272 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_273 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_274 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_275 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_276 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_277 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_278 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_279 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_280 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_281 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_282 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_283 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_284 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_285 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_286 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_287 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_288 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_289 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_290 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_291 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_292 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_293 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_294 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 74: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_295 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_296 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_297 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_298 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_299 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_300 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_301 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_302 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_303 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_304 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_305 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_306 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 25 or LA95 == 26 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 43 or LA95 == 45 or LA95 == 46 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61 or LA95 == 103 or LA95 == 104 or LA95 == 105 or LA95 == 106 or LA95 == 107 or LA95 == 108 or LA95 == 110 or LA95 == 111 or LA95 == 112 or LA95 == 113 or LA95 == 114 or LA95 == 115 or LA95 == 116 or LA95 == 117: - alt95 = 1 - - if alt95 == 1: - # C.g:0:0: statement - self.following.append(self.FOLLOW_statement_in_statement_list2242) - self.statement() - self.following.pop() - if self.failed: - return - - - else: - if cnt95 >= 1: - break #loop95 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(95, self.input) - raise eee - - cnt95 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 67, statement_list_StartIndex) - - pass - - return - - # $ANTLR end statement_list - - class expression_statement_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start expression_statement - # C.g:561:1: expression_statement : ( ';' | expression ';' ); - def expression_statement(self, ): - - retval = self.expression_statement_return() - retval.start = self.input.LT(1) - expression_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 68): - return retval - - # C.g:562:2: ( ';' | expression ';' ) - alt96 = 2 - LA96_0 = self.input.LA(1) - - if (LA96_0 == 25) : - alt96 = 1 - elif ((IDENTIFIER <= LA96_0 <= FLOATING_POINT_LITERAL) or LA96_0 == 62 or LA96_0 == 66 or (68 <= LA96_0 <= 69) or (72 <= LA96_0 <= 74) or (77 <= LA96_0 <= 79)) : - alt96 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("561:1: expression_statement : ( ';' | expression ';' );", 96, 0, self.input) - - raise nvae - - if alt96 == 1: - # C.g:562:4: ';' - self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2254) - if self.failed: - return retval - - - elif alt96 == 2: - # C.g:563:4: expression ';' - self.following.append(self.FOLLOW_expression_in_expression_statement2259) - self.expression() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2261) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 68, expression_statement_StartIndex) - - pass - - return retval - - # $ANTLR end expression_statement - - - # $ANTLR start selection_statement - # C.g:566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ); - def selection_statement(self, ): - - selection_statement_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 69): - return - - # C.g:567:2: ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ) - alt98 = 2 - LA98_0 = self.input.LA(1) - - if (LA98_0 == 108) : - alt98 = 1 - elif (LA98_0 == 110) : - alt98 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement );", 98, 0, self.input) - - raise nvae - - if alt98 == 1: - # C.g:567:4: 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? - self.match(self.input, 108, self.FOLLOW_108_in_selection_statement2272) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2274) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_selection_statement2278) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2280) - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - self.following.append(self.FOLLOW_statement_in_selection_statement2284) - self.statement() - self.following.pop() - if self.failed: - return - # C.g:567:167: ( options {k=1; backtrack=false; } : 'else' statement )? - alt97 = 2 - LA97_0 = self.input.LA(1) - - if (LA97_0 == 109) : - alt97 = 1 - if alt97 == 1: - # C.g:567:200: 'else' statement - self.match(self.input, 109, self.FOLLOW_109_in_selection_statement2299) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_selection_statement2301) - self.statement() - self.following.pop() - if self.failed: - return - - - - - - elif alt98 == 2: - # C.g:568:4: 'switch' '(' expression ')' statement - self.match(self.input, 110, self.FOLLOW_110_in_selection_statement2308) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2310) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_selection_statement2312) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2314) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_selection_statement2316) - self.statement() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 69, selection_statement_StartIndex) - - pass - - return - - # $ANTLR end selection_statement - - - # $ANTLR start iteration_statement - # C.g:571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ); - def iteration_statement(self, ): - - iteration_statement_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 70): - return - - # C.g:572:2: ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ) - alt100 = 3 - LA100 = self.input.LA(1) - if LA100 == 111: - alt100 = 1 - elif LA100 == 112: - alt100 = 2 - elif LA100 == 113: - alt100 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement );", 100, 0, self.input) - - raise nvae - - if alt100 == 1: - # C.g:572:4: 'while' '(' e= expression ')' statement - self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2327) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2329) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_iteration_statement2333) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2335) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2337) - self.statement() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - elif alt100 == 2: - # C.g:573:4: 'do' statement 'while' '(' e= expression ')' ';' - self.match(self.input, 112, self.FOLLOW_112_in_iteration_statement2344) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2346) - self.statement() - self.following.pop() - if self.failed: - return - self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2348) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2350) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_iteration_statement2354) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2356) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_iteration_statement2358) - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - elif alt100 == 3: - # C.g:574:4: 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement - self.match(self.input, 113, self.FOLLOW_113_in_iteration_statement2365) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2367) - if self.failed: - return - self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2369) - self.expression_statement() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2373) - e = self.expression_statement() - self.following.pop() - if self.failed: - return - # C.g:574:58: ( expression )? - alt99 = 2 - LA99_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA99_0 <= FLOATING_POINT_LITERAL) or LA99_0 == 62 or LA99_0 == 66 or (68 <= LA99_0 <= 69) or (72 <= LA99_0 <= 74) or (77 <= LA99_0 <= 79)) : - alt99 = 1 - if alt99 == 1: - # C.g:0:0: expression - self.following.append(self.FOLLOW_expression_in_iteration_statement2375) - self.expression() - self.following.pop() - if self.failed: - return - - - - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2378) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2380) - self.statement() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 70, iteration_statement_StartIndex) - - pass - - return - - # $ANTLR end iteration_statement - - - # $ANTLR start jump_statement - # C.g:577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ); - def jump_statement(self, ): - - jump_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 71): - return - - # C.g:578:2: ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ) - alt101 = 5 - LA101 = self.input.LA(1) - if LA101 == 114: - alt101 = 1 - elif LA101 == 115: - alt101 = 2 - elif LA101 == 116: - alt101 = 3 - elif LA101 == 117: - LA101_4 = self.input.LA(2) - - if (LA101_4 == 25) : - alt101 = 4 - elif ((IDENTIFIER <= LA101_4 <= FLOATING_POINT_LITERAL) or LA101_4 == 62 or LA101_4 == 66 or (68 <= LA101_4 <= 69) or (72 <= LA101_4 <= 74) or (77 <= LA101_4 <= 79)) : - alt101 = 5 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 4, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 0, self.input) - - raise nvae - - if alt101 == 1: - # C.g:578:4: 'goto' IDENTIFIER ';' - self.match(self.input, 114, self.FOLLOW_114_in_jump_statement2393) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_jump_statement2395) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2397) - if self.failed: - return - - - elif alt101 == 2: - # C.g:579:4: 'continue' ';' - self.match(self.input, 115, self.FOLLOW_115_in_jump_statement2402) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2404) - if self.failed: - return - - - elif alt101 == 3: - # C.g:580:4: 'break' ';' - self.match(self.input, 116, self.FOLLOW_116_in_jump_statement2409) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2411) - if self.failed: - return - - - elif alt101 == 4: - # C.g:581:4: 'return' ';' - self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2416) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2418) - if self.failed: - return - - - elif alt101 == 5: - # C.g:582:4: 'return' expression ';' - self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2423) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_jump_statement2425) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2427) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 71, jump_statement_StartIndex) - - pass - - return - - # $ANTLR end jump_statement - - # $ANTLR start synpred2 - def synpred2_fragment(self, ): - # C.g:119:6: ( declaration_specifiers ) - # C.g:119:6: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred2100) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred2 - - - - # $ANTLR start synpred4 - def synpred4_fragment(self, ): - # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' ) - # C.g:119:6: ( declaration_specifiers )? declarator ( declaration )* '{' - # C.g:119:6: ( declaration_specifiers )? - alt102 = 2 - LA102 = self.input.LA(1) - if LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33 or LA102 == 34 or LA102 == 35 or LA102 == 36 or LA102 == 37 or LA102 == 38 or LA102 == 39 or LA102 == 40 or LA102 == 41 or LA102 == 42 or LA102 == 45 or LA102 == 46 or LA102 == 48 or LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: - alt102 = 1 - elif LA102 == IDENTIFIER: - LA102 = self.input.LA(2) - if LA102 == 62: - LA102_21 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33: - LA102_23 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 34: - LA102_24 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 35: - LA102_25 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 36: - LA102_26 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 37: - LA102_27 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 38: - LA102_28 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 39: - LA102_29 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 40: - LA102_30 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 41: - LA102_31 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 42: - LA102_32 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 45 or LA102 == 46: - LA102_33 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 48: - LA102_34 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == IDENTIFIER: - LA102_35 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 58: - LA102_36 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 66: - alt102 = 1 - elif LA102 == 59: - LA102_39 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 60: - LA102_40 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: - LA102_41 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 58: - LA102_14 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 59: - LA102_16 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 60: - LA102_17 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - if alt102 == 1: - # C.g:0:0: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred4100) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - - self.following.append(self.FOLLOW_declarator_in_synpred4103) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:119:41: ( declaration )* - while True: #loop103 - alt103 = 2 - LA103_0 = self.input.LA(1) - - if (LA103_0 == IDENTIFIER or LA103_0 == 26 or (29 <= LA103_0 <= 42) or (45 <= LA103_0 <= 46) or (48 <= LA103_0 <= 61)) : - alt103 = 1 - - - if alt103 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_synpred4105) - self.declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop103 - - - self.match(self.input, 43, self.FOLLOW_43_in_synpred4108) - if self.failed: - return - - - # $ANTLR end synpred4 - - - - # $ANTLR start synpred5 - def synpred5_fragment(self, ): - # C.g:120:4: ( declaration ) - # C.g:120:4: declaration - self.following.append(self.FOLLOW_declaration_in_synpred5118) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred5 - - - - # $ANTLR start synpred7 - def synpred7_fragment(self, ): - # C.g:146:6: ( declaration_specifiers ) - # C.g:146:6: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred7157) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred7 - - - - # $ANTLR start synpred10 - def synpred10_fragment(self, ): - # C.g:167:18: ( declaration_specifiers ) - # C.g:167:18: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred10207) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred10 - - - - # $ANTLR start synpred14 - def synpred14_fragment(self, ): - # C.g:184:7: ( type_specifier ) - # C.g:184:7: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_synpred14272) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred14 - - - - # $ANTLR start synpred15 - def synpred15_fragment(self, ): - # C.g:185:13: ( type_qualifier ) - # C.g:185:13: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred15286) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred15 - - - - # $ANTLR start synpred33 - def synpred33_fragment(self, ): - # C.g:225:16: ( type_qualifier ) - # C.g:225:16: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred33444) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred33 - - - - # $ANTLR start synpred34 - def synpred34_fragment(self, ): - # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator ) - # C.g:225:5: IDENTIFIER ( type_qualifier )* declarator - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred34442) - if self.failed: - return - # C.g:225:16: ( type_qualifier )* - while True: #loop106 - alt106 = 2 - LA106 = self.input.LA(1) - if LA106 == 58: - LA106_2 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 59: - LA106_3 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 60: - LA106_4 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 49 or LA106 == 50 or LA106 == 51 or LA106 == 52 or LA106 == 53 or LA106 == 54 or LA106 == 55 or LA106 == 56 or LA106 == 57 or LA106 == 61: - alt106 = 1 - - if alt106 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred34444) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - break #loop106 - - - self.following.append(self.FOLLOW_declarator_in_synpred34447) - self.declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred34 - - - - # $ANTLR start synpred39 - def synpred39_fragment(self, ): - # C.g:253:6: ( type_qualifier ) - # C.g:253:6: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred39566) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred39 - - - - # $ANTLR start synpred40 - def synpred40_fragment(self, ): - # C.g:253:23: ( type_specifier ) - # C.g:253:23: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_synpred40570) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred40 - - - - # $ANTLR start synpred66 - def synpred66_fragment(self, ): - # C.g:297:4: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator ) - # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator - # C.g:297:4: ( pointer )? - alt111 = 2 - LA111_0 = self.input.LA(1) - - if (LA111_0 == 66) : - alt111 = 1 - if alt111 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_synpred66784) - self.pointer() - self.following.pop() - if self.failed: - return - - - - # C.g:297:13: ( 'EFIAPI' )? - alt112 = 2 - LA112_0 = self.input.LA(1) - - if (LA112_0 == 58) : - alt112 = 1 - if alt112 == 1: - # C.g:297:14: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_synpred66788) - if self.failed: - return - - - - # C.g:297:25: ( 'EFI_BOOTSERVICE' )? - alt113 = 2 - LA113_0 = self.input.LA(1) - - if (LA113_0 == 59) : - alt113 = 1 - if alt113 == 1: - # C.g:297:26: 'EFI_BOOTSERVICE' - self.match(self.input, 59, self.FOLLOW_59_in_synpred66793) - if self.failed: - return - - - - # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? - alt114 = 2 - LA114_0 = self.input.LA(1) - - if (LA114_0 == 60) : - alt114 = 1 - if alt114 == 1: - # C.g:297:47: 'EFI_RUNTIMESERVICE' - self.match(self.input, 60, self.FOLLOW_60_in_synpred66798) - if self.failed: - return - - - - self.following.append(self.FOLLOW_direct_declarator_in_synpred66802) - self.direct_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred66 - - - - # $ANTLR start synpred67 - def synpred67_fragment(self, ): - # C.g:303:15: ( declarator_suffix ) - # C.g:303:15: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_synpred67821) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred67 - - - - # $ANTLR start synpred69 - def synpred69_fragment(self, ): - # C.g:304:9: ( 'EFIAPI' ) - # C.g:304:9: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_synpred69830) - if self.failed: - return - - - # $ANTLR end synpred69 - - - - # $ANTLR start synpred70 - def synpred70_fragment(self, ): - # C.g:304:35: ( declarator_suffix ) - # C.g:304:35: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_synpred70838) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred70 - - - - # $ANTLR start synpred73 - def synpred73_fragment(self, ): - # C.g:310:9: ( '(' parameter_type_list ')' ) - # C.g:310:9: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred73878) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_synpred73880) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred73882) - if self.failed: - return - - - # $ANTLR end synpred73 - - - - # $ANTLR start synpred74 - def synpred74_fragment(self, ): - # C.g:311:9: ( '(' identifier_list ')' ) - # C.g:311:9: '(' identifier_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred74892) - if self.failed: - return - self.following.append(self.FOLLOW_identifier_list_in_synpred74894) - self.identifier_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred74896) - if self.failed: - return - - - # $ANTLR end synpred74 - - - - # $ANTLR start synpred75 - def synpred75_fragment(self, ): - # C.g:316:8: ( type_qualifier ) - # C.g:316:8: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred75921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred75 - - - - # $ANTLR start synpred76 - def synpred76_fragment(self, ): - # C.g:316:24: ( pointer ) - # C.g:316:24: pointer - self.following.append(self.FOLLOW_pointer_in_synpred76924) - self.pointer() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred76 - - - - # $ANTLR start synpred77 - def synpred77_fragment(self, ): - # C.g:316:4: ( '*' ( type_qualifier )+ ( pointer )? ) - # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? - self.match(self.input, 66, self.FOLLOW_66_in_synpred77919) - if self.failed: - return - # C.g:316:8: ( type_qualifier )+ - cnt116 = 0 - while True: #loop116 - alt116 = 2 - LA116_0 = self.input.LA(1) - - if ((49 <= LA116_0 <= 61)) : - alt116 = 1 - - - if alt116 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred77921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt116 >= 1: - break #loop116 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(116, self.input) - raise eee - - cnt116 += 1 - - - # C.g:316:24: ( pointer )? - alt117 = 2 - LA117_0 = self.input.LA(1) - - if (LA117_0 == 66) : - alt117 = 1 - if alt117 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_synpred77924) - self.pointer() - self.following.pop() - if self.failed: - return - - - - - - # $ANTLR end synpred77 - - - - # $ANTLR start synpred78 - def synpred78_fragment(self, ): - # C.g:317:4: ( '*' pointer ) - # C.g:317:4: '*' pointer - self.match(self.input, 66, self.FOLLOW_66_in_synpred78930) - if self.failed: - return - self.following.append(self.FOLLOW_pointer_in_synpred78932) - self.pointer() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred78 - - - - # $ANTLR start synpred81 - def synpred81_fragment(self, ): - # C.g:326:32: ( 'OPTIONAL' ) - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred81977) - if self.failed: - return - - - # $ANTLR end synpred81 - - - - # $ANTLR start synpred82 - def synpred82_fragment(self, ): - # C.g:326:27: ( ',' ( 'OPTIONAL' )? parameter_declaration ) - # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_synpred82974) - if self.failed: - return - # C.g:326:31: ( 'OPTIONAL' )? - alt119 = 2 - LA119_0 = self.input.LA(1) - - if (LA119_0 == 53) : - LA119_1 = self.input.LA(2) - - if (self.synpred81()) : - alt119 = 1 - if alt119 == 1: - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred82977) - if self.failed: - return - - - - self.following.append(self.FOLLOW_parameter_declaration_in_synpred82981) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred82 - - - - # $ANTLR start synpred83 - def synpred83_fragment(self, ): - # C.g:330:28: ( declarator ) - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_synpred83997) - self.declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred83 - - - - # $ANTLR start synpred84 - def synpred84_fragment(self, ): - # C.g:330:39: ( abstract_declarator ) - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred84999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred84 - - - - # $ANTLR start synpred86 - def synpred86_fragment(self, ): - # C.g:330:4: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? ) - # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred86994) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:330:27: ( declarator | abstract_declarator )* - while True: #loop120 - alt120 = 3 - LA120 = self.input.LA(1) - if LA120 == 66: - LA120_3 = self.input.LA(2) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == IDENTIFIER or LA120 == 58 or LA120 == 59 or LA120 == 60: - alt120 = 1 - elif LA120 == 62: - LA120 = self.input.LA(2) - if LA120 == 29 or LA120 == 30 or LA120 == 31 or LA120 == 32 or LA120 == 33 or LA120 == 34 or LA120 == 35 or LA120 == 36 or LA120 == 37 or LA120 == 38 or LA120 == 39 or LA120 == 40 or LA120 == 41 or LA120 == 42 or LA120 == 45 or LA120 == 46 or LA120 == 48 or LA120 == 49 or LA120 == 50 or LA120 == 51 or LA120 == 52 or LA120 == 53 or LA120 == 54 or LA120 == 55 or LA120 == 56 or LA120 == 57 or LA120 == 61 or LA120 == 63 or LA120 == 64: - alt120 = 2 - elif LA120 == 58: - LA120_21 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 66: - LA120_22 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 59: - LA120_23 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 60: - LA120_24 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == IDENTIFIER: - LA120_25 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 62: - LA120_26 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - - elif LA120 == 64: - alt120 = 2 - - if alt120 == 1: - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_synpred86997) - self.declarator() - self.following.pop() - if self.failed: - return - - - elif alt120 == 2: - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred86999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop120 - - - # C.g:330:61: ( 'OPTIONAL' )? - alt121 = 2 - LA121_0 = self.input.LA(1) - - if (LA121_0 == 53) : - alt121 = 1 - if alt121 == 1: - # C.g:330:62: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred861004) - if self.failed: - return - - - - - - # $ANTLR end synpred86 - - - - # $ANTLR start synpred90 - def synpred90_fragment(self, ): - # C.g:341:4: ( specifier_qualifier_list ( abstract_declarator )? ) - # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? - self.following.append(self.FOLLOW_specifier_qualifier_list_in_synpred901046) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - # C.g:341:29: ( abstract_declarator )? - alt122 = 2 - LA122_0 = self.input.LA(1) - - if (LA122_0 == 62 or LA122_0 == 64 or LA122_0 == 66) : - alt122 = 1 - if alt122 == 1: - # C.g:0:0: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred901048) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - # $ANTLR end synpred90 - - - - # $ANTLR start synpred91 - def synpred91_fragment(self, ): - # C.g:346:12: ( direct_abstract_declarator ) - # C.g:346:12: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_synpred911067) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred91 - - - - # $ANTLR start synpred93 - def synpred93_fragment(self, ): - # C.g:351:6: ( '(' abstract_declarator ')' ) - # C.g:351:6: '(' abstract_declarator ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred931086) - if self.failed: - return - self.following.append(self.FOLLOW_abstract_declarator_in_synpred931088) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred931090) - if self.failed: - return - - - # $ANTLR end synpred93 - - - - # $ANTLR start synpred94 - def synpred94_fragment(self, ): - # C.g:351:65: ( abstract_declarator_suffix ) - # C.g:351:65: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_synpred941098) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred94 - - - - # $ANTLR start synpred109 - def synpred109_fragment(self, ): - # C.g:386:4: ( '(' type_name ')' cast_expression ) - # C.g:386:4: '(' type_name ')' cast_expression - self.match(self.input, 62, self.FOLLOW_62_in_synpred1091282) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_synpred1091284) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1091286) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_synpred1091288) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred109 - - - - # $ANTLR start synpred114 - def synpred114_fragment(self, ): - # C.g:395:4: ( 'sizeof' unary_expression ) - # C.g:395:4: 'sizeof' unary_expression - self.match(self.input, 74, self.FOLLOW_74_in_synpred1141330) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_synpred1141332) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred114 - - - - # $ANTLR start synpred117 - def synpred117_fragment(self, ): - # C.g:409:13: ( '(' argument_expression_list ')' ) - # C.g:409:13: '(' argument_expression_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred1171420) - if self.failed: - return - self.following.append(self.FOLLOW_argument_expression_list_in_synpred1171424) - self.argument_expression_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1171428) - if self.failed: - return - - - # $ANTLR end synpred117 - - - - # $ANTLR start synpred118 - def synpred118_fragment(self, ): - # C.g:410:13: ( '(' macro_parameter_list ')' ) - # C.g:410:13: '(' macro_parameter_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred1181444) - if self.failed: - return - self.following.append(self.FOLLOW_macro_parameter_list_in_synpred1181446) - self.macro_parameter_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1181448) - if self.failed: - return - - - # $ANTLR end synpred118 - - - - # $ANTLR start synpred120 - def synpred120_fragment(self, ): - # C.g:412:13: ( '*' IDENTIFIER ) - # C.g:412:13: '*' IDENTIFIER - self.match(self.input, 66, self.FOLLOW_66_in_synpred1201482) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1201486) - if self.failed: - return - - - # $ANTLR end synpred120 - - - - # $ANTLR start synpred137 - def synpred137_fragment(self, ): - # C.g:443:20: ( STRING_LITERAL ) - # C.g:443:20: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1371683) - if self.failed: - return - - - # $ANTLR end synpred137 - - - - # $ANTLR start synpred138 - def synpred138_fragment(self, ): - # C.g:443:8: ( ( IDENTIFIER )* ( STRING_LITERAL )+ ) - # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ - # C.g:443:8: ( IDENTIFIER )* - while True: #loop125 - alt125 = 2 - LA125_0 = self.input.LA(1) - - if (LA125_0 == IDENTIFIER) : - alt125 = 1 - - - if alt125 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1381680) - if self.failed: - return - - - else: - break #loop125 - - - # C.g:443:20: ( STRING_LITERAL )+ - cnt126 = 0 - while True: #loop126 - alt126 = 2 - LA126_0 = self.input.LA(1) - - if (LA126_0 == STRING_LITERAL) : - alt126 = 1 - - - if alt126 == 1: - # C.g:0:0: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1381683) - if self.failed: - return - - - else: - if cnt126 >= 1: - break #loop126 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(126, self.input) - raise eee - - cnt126 += 1 - - - - - # $ANTLR end synpred138 - - - - # $ANTLR start synpred142 - def synpred142_fragment(self, ): - # C.g:458:4: ( lvalue assignment_operator assignment_expression ) - # C.g:458:4: lvalue assignment_operator assignment_expression - self.following.append(self.FOLLOW_lvalue_in_synpred1421744) - self.lvalue() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_operator_in_synpred1421746) - self.assignment_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_expression_in_synpred1421748) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred142 - - - - # $ANTLR start synpred169 - def synpred169_fragment(self, ): - # C.g:520:4: ( expression_statement ) - # C.g:520:4: expression_statement - self.following.append(self.FOLLOW_expression_statement_in_synpred1692035) - self.expression_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred169 - - - - # $ANTLR start synpred173 - def synpred173_fragment(self, ): - # C.g:524:4: ( macro_statement ) - # C.g:524:4: macro_statement - self.following.append(self.FOLLOW_macro_statement_in_synpred1732055) - self.macro_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred173 - - - - # $ANTLR start synpred174 - def synpred174_fragment(self, ): - # C.g:525:4: ( asm2_statement ) - # C.g:525:4: asm2_statement - self.following.append(self.FOLLOW_asm2_statement_in_synpred1742060) - self.asm2_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred174 - - - - # $ANTLR start synpred181 - def synpred181_fragment(self, ): - # C.g:544:19: ( declaration ) - # C.g:544:19: declaration - self.following.append(self.FOLLOW_declaration_in_synpred1812166) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred181 - - - - # $ANTLR start synpred182 - def synpred182_fragment(self, ): - # C.g:544:33: ( statement_list ) - # C.g:544:33: statement_list - self.following.append(self.FOLLOW_statement_list_in_synpred1822170) - self.statement_list() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred182 - - - - # $ANTLR start synpred186 - def synpred186_fragment(self, ): - # C.g:554:8: ( declaration ) - # C.g:554:8: declaration - self.following.append(self.FOLLOW_declaration_in_synpred1862225) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred186 - - - - # $ANTLR start synpred188 - def synpred188_fragment(self, ): - # C.g:558:4: ( statement ) - # C.g:558:4: statement - self.following.append(self.FOLLOW_statement_in_synpred1882242) - self.statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred188 - - - - def synpred69(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred69_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred81(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred81_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred82(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred82_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred66(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred66_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred83(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred83_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred84(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred84_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred67(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred67_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred86(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred86_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred120(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred120_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred40(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred40_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred142(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred142_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred182(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred182_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred109(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred109_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred181(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred181_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred186(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred186_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred188(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred188_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred169(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred169_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred117(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred117_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred70(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred70_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred118(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred118_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred34(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred34_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred33(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred33_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred94(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred94_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred39(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred39_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred74(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred74_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred114(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred114_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred93(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred93_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred75(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred75_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred137(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred137_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred90(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred90_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred138(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred138_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred91(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred91_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred73(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred73_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred5(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred5_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred78(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred78_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred7(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred7_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred76(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred76_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred77(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred77_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred2(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred2_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred4(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred4_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred174(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred174_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred173(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred173_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred14(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred14_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred15(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred15_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred10(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred10_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - - - - - FOLLOW_external_declaration_in_translation_unit74 = frozenset([1, 4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_function_definition_in_external_declaration113 = frozenset([1]) - FOLLOW_declaration_in_external_declaration118 = frozenset([1]) - FOLLOW_macro_statement_in_external_declaration123 = frozenset([1, 25]) - FOLLOW_25_in_external_declaration126 = frozenset([1]) - FOLLOW_declaration_specifiers_in_function_definition157 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_function_definition160 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_declaration_in_function_definition166 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_compound_statement_in_function_definition171 = frozenset([1]) - FOLLOW_compound_statement_in_function_definition180 = frozenset([1]) - FOLLOW_26_in_declaration203 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_declaration_specifiers_in_declaration207 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_list_in_declaration216 = frozenset([25]) - FOLLOW_25_in_declaration220 = frozenset([1]) - FOLLOW_declaration_specifiers_in_declaration234 = frozenset([4, 25, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_list_in_declaration238 = frozenset([25]) - FOLLOW_25_in_declaration243 = frozenset([1]) - FOLLOW_storage_class_specifier_in_declaration_specifiers264 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_specifier_in_declaration_specifiers272 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_declaration_specifiers286 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_init_declarator_in_init_declarator_list308 = frozenset([1, 27]) - FOLLOW_27_in_init_declarator_list311 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_in_init_declarator_list313 = frozenset([1, 27]) - FOLLOW_declarator_in_init_declarator326 = frozenset([1, 28]) - FOLLOW_28_in_init_declarator329 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_in_init_declarator331 = frozenset([1]) - FOLLOW_set_in_storage_class_specifier0 = frozenset([1]) - FOLLOW_34_in_type_specifier376 = frozenset([1]) - FOLLOW_35_in_type_specifier381 = frozenset([1]) - FOLLOW_36_in_type_specifier386 = frozenset([1]) - FOLLOW_37_in_type_specifier391 = frozenset([1]) - FOLLOW_38_in_type_specifier396 = frozenset([1]) - FOLLOW_39_in_type_specifier401 = frozenset([1]) - FOLLOW_40_in_type_specifier406 = frozenset([1]) - FOLLOW_41_in_type_specifier411 = frozenset([1]) - FOLLOW_42_in_type_specifier416 = frozenset([1]) - FOLLOW_struct_or_union_specifier_in_type_specifier423 = frozenset([1]) - FOLLOW_enum_specifier_in_type_specifier433 = frozenset([1]) - FOLLOW_type_id_in_type_specifier451 = frozenset([1]) - FOLLOW_IDENTIFIER_in_type_id467 = frozenset([1]) - FOLLOW_struct_or_union_in_struct_or_union_specifier494 = frozenset([4, 43]) - FOLLOW_IDENTIFIER_in_struct_or_union_specifier496 = frozenset([43]) - FOLLOW_43_in_struct_or_union_specifier499 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_struct_declaration_list_in_struct_or_union_specifier501 = frozenset([44]) - FOLLOW_44_in_struct_or_union_specifier503 = frozenset([1]) - FOLLOW_struct_or_union_in_struct_or_union_specifier508 = frozenset([4]) - FOLLOW_IDENTIFIER_in_struct_or_union_specifier510 = frozenset([1]) - FOLLOW_set_in_struct_or_union0 = frozenset([1]) - FOLLOW_struct_declaration_in_struct_declaration_list537 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_specifier_qualifier_list_in_struct_declaration549 = frozenset([4, 47, 58, 59, 60, 62, 66]) - FOLLOW_struct_declarator_list_in_struct_declaration551 = frozenset([25]) - FOLLOW_25_in_struct_declaration553 = frozenset([1]) - FOLLOW_type_qualifier_in_specifier_qualifier_list566 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_specifier_in_specifier_qualifier_list570 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_struct_declarator_in_struct_declarator_list584 = frozenset([1, 27]) - FOLLOW_27_in_struct_declarator_list587 = frozenset([4, 47, 58, 59, 60, 62, 66]) - FOLLOW_struct_declarator_in_struct_declarator_list589 = frozenset([1, 27]) - FOLLOW_declarator_in_struct_declarator602 = frozenset([1, 47]) - FOLLOW_47_in_struct_declarator605 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_struct_declarator607 = frozenset([1]) - FOLLOW_47_in_struct_declarator614 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_struct_declarator616 = frozenset([1]) - FOLLOW_48_in_enum_specifier634 = frozenset([43]) - FOLLOW_43_in_enum_specifier636 = frozenset([4]) - FOLLOW_enumerator_list_in_enum_specifier638 = frozenset([27, 44]) - FOLLOW_27_in_enum_specifier640 = frozenset([44]) - FOLLOW_44_in_enum_specifier643 = frozenset([1]) - FOLLOW_48_in_enum_specifier648 = frozenset([4]) - FOLLOW_IDENTIFIER_in_enum_specifier650 = frozenset([43]) - FOLLOW_43_in_enum_specifier652 = frozenset([4]) - FOLLOW_enumerator_list_in_enum_specifier654 = frozenset([27, 44]) - FOLLOW_27_in_enum_specifier656 = frozenset([44]) - FOLLOW_44_in_enum_specifier659 = frozenset([1]) - FOLLOW_48_in_enum_specifier664 = frozenset([4]) - FOLLOW_IDENTIFIER_in_enum_specifier666 = frozenset([1]) - FOLLOW_enumerator_in_enumerator_list677 = frozenset([1, 27]) - FOLLOW_27_in_enumerator_list680 = frozenset([4]) - FOLLOW_enumerator_in_enumerator_list682 = frozenset([1, 27]) - FOLLOW_IDENTIFIER_in_enumerator695 = frozenset([1, 28]) - FOLLOW_28_in_enumerator698 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_enumerator700 = frozenset([1]) - FOLLOW_set_in_type_qualifier0 = frozenset([1]) - FOLLOW_pointer_in_declarator784 = frozenset([4, 58, 59, 60, 62]) - FOLLOW_58_in_declarator788 = frozenset([4, 59, 60, 62]) - FOLLOW_59_in_declarator793 = frozenset([4, 60, 62]) - FOLLOW_60_in_declarator798 = frozenset([4, 62]) - FOLLOW_direct_declarator_in_declarator802 = frozenset([1]) - FOLLOW_pointer_in_declarator808 = frozenset([1]) - FOLLOW_IDENTIFIER_in_direct_declarator819 = frozenset([1, 62, 64]) - FOLLOW_declarator_suffix_in_direct_declarator821 = frozenset([1, 62, 64]) - FOLLOW_62_in_direct_declarator827 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_58_in_direct_declarator830 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_direct_declarator834 = frozenset([63]) - FOLLOW_63_in_direct_declarator836 = frozenset([62, 64]) - FOLLOW_declarator_suffix_in_direct_declarator838 = frozenset([1, 62, 64]) - FOLLOW_64_in_declarator_suffix852 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_declarator_suffix854 = frozenset([65]) - FOLLOW_65_in_declarator_suffix856 = frozenset([1]) - FOLLOW_64_in_declarator_suffix866 = frozenset([65]) - FOLLOW_65_in_declarator_suffix868 = frozenset([1]) - FOLLOW_62_in_declarator_suffix878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_declarator_suffix880 = frozenset([63]) - FOLLOW_63_in_declarator_suffix882 = frozenset([1]) - FOLLOW_62_in_declarator_suffix892 = frozenset([4]) - FOLLOW_identifier_list_in_declarator_suffix894 = frozenset([63]) - FOLLOW_63_in_declarator_suffix896 = frozenset([1]) - FOLLOW_62_in_declarator_suffix906 = frozenset([63]) - FOLLOW_63_in_declarator_suffix908 = frozenset([1]) - FOLLOW_66_in_pointer919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_pointer921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_pointer_in_pointer924 = frozenset([1]) - FOLLOW_66_in_pointer930 = frozenset([66]) - FOLLOW_pointer_in_pointer932 = frozenset([1]) - FOLLOW_66_in_pointer937 = frozenset([1]) - FOLLOW_parameter_list_in_parameter_type_list948 = frozenset([1, 27]) - FOLLOW_27_in_parameter_type_list951 = frozenset([53, 67]) - FOLLOW_53_in_parameter_type_list954 = frozenset([67]) - FOLLOW_67_in_parameter_type_list958 = frozenset([1]) - FOLLOW_parameter_declaration_in_parameter_list971 = frozenset([1, 27]) - FOLLOW_27_in_parameter_list974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_53_in_parameter_list977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_parameter_list981 = frozenset([1, 27]) - FOLLOW_declaration_specifiers_in_parameter_declaration994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_declarator_in_parameter_declaration997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_abstract_declarator_in_parameter_declaration999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_53_in_parameter_declaration1004 = frozenset([1]) - FOLLOW_pointer_in_parameter_declaration1013 = frozenset([4, 66]) - FOLLOW_IDENTIFIER_in_parameter_declaration1016 = frozenset([1]) - FOLLOW_IDENTIFIER_in_identifier_list1027 = frozenset([1, 27]) - FOLLOW_27_in_identifier_list1031 = frozenset([4]) - FOLLOW_IDENTIFIER_in_identifier_list1033 = frozenset([1, 27]) - FOLLOW_specifier_qualifier_list_in_type_name1046 = frozenset([1, 62, 64, 66]) - FOLLOW_abstract_declarator_in_type_name1048 = frozenset([1]) - FOLLOW_type_id_in_type_name1054 = frozenset([1]) - FOLLOW_pointer_in_abstract_declarator1065 = frozenset([1, 62, 64]) - FOLLOW_direct_abstract_declarator_in_abstract_declarator1067 = frozenset([1]) - FOLLOW_direct_abstract_declarator_in_abstract_declarator1073 = frozenset([1]) - FOLLOW_62_in_direct_abstract_declarator1086 = frozenset([62, 64, 66]) - FOLLOW_abstract_declarator_in_direct_abstract_declarator1088 = frozenset([63]) - FOLLOW_63_in_direct_abstract_declarator1090 = frozenset([1, 62, 64]) - FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094 = frozenset([1, 62, 64]) - FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098 = frozenset([1, 62, 64]) - FOLLOW_64_in_abstract_declarator_suffix1110 = frozenset([65]) - FOLLOW_65_in_abstract_declarator_suffix1112 = frozenset([1]) - FOLLOW_64_in_abstract_declarator_suffix1117 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_abstract_declarator_suffix1119 = frozenset([65]) - FOLLOW_65_in_abstract_declarator_suffix1121 = frozenset([1]) - FOLLOW_62_in_abstract_declarator_suffix1126 = frozenset([63]) - FOLLOW_63_in_abstract_declarator_suffix1128 = frozenset([1]) - FOLLOW_62_in_abstract_declarator_suffix1133 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135 = frozenset([63]) - FOLLOW_63_in_abstract_declarator_suffix1137 = frozenset([1]) - FOLLOW_assignment_expression_in_initializer1150 = frozenset([1]) - FOLLOW_43_in_initializer1155 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_list_in_initializer1157 = frozenset([27, 44]) - FOLLOW_27_in_initializer1159 = frozenset([44]) - FOLLOW_44_in_initializer1162 = frozenset([1]) - FOLLOW_initializer_in_initializer_list1173 = frozenset([1, 27]) - FOLLOW_27_in_initializer_list1176 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_in_initializer_list1178 = frozenset([1, 27]) - FOLLOW_assignment_expression_in_argument_expression_list1196 = frozenset([1, 27, 53]) - FOLLOW_53_in_argument_expression_list1199 = frozenset([1, 27]) - FOLLOW_27_in_argument_expression_list1204 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_argument_expression_list1206 = frozenset([1, 27, 53]) - FOLLOW_53_in_argument_expression_list1209 = frozenset([1, 27]) - FOLLOW_multiplicative_expression_in_additive_expression1225 = frozenset([1, 68, 69]) - FOLLOW_68_in_additive_expression1229 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_multiplicative_expression_in_additive_expression1231 = frozenset([1, 68, 69]) - FOLLOW_69_in_additive_expression1235 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_multiplicative_expression_in_additive_expression1237 = frozenset([1, 68, 69]) - FOLLOW_cast_expression_in_multiplicative_expression1251 = frozenset([1, 66, 70, 71]) - FOLLOW_66_in_multiplicative_expression1255 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1257 = frozenset([1, 66, 70, 71]) - FOLLOW_70_in_multiplicative_expression1261 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1263 = frozenset([1, 66, 70, 71]) - FOLLOW_71_in_multiplicative_expression1267 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1269 = frozenset([1, 66, 70, 71]) - FOLLOW_62_in_cast_expression1282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_cast_expression1284 = frozenset([63]) - FOLLOW_63_in_cast_expression1286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_cast_expression1288 = frozenset([1]) - FOLLOW_unary_expression_in_cast_expression1293 = frozenset([1]) - FOLLOW_postfix_expression_in_unary_expression1304 = frozenset([1]) - FOLLOW_72_in_unary_expression1309 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1311 = frozenset([1]) - FOLLOW_73_in_unary_expression1316 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1318 = frozenset([1]) - FOLLOW_unary_operator_in_unary_expression1323 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_unary_expression1325 = frozenset([1]) - FOLLOW_74_in_unary_expression1330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1332 = frozenset([1]) - FOLLOW_74_in_unary_expression1337 = frozenset([62]) - FOLLOW_62_in_unary_expression1339 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_unary_expression1341 = frozenset([63]) - FOLLOW_63_in_unary_expression1343 = frozenset([1]) - FOLLOW_primary_expression_in_postfix_expression1367 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_64_in_postfix_expression1383 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_postfix_expression1385 = frozenset([65]) - FOLLOW_65_in_postfix_expression1387 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1401 = frozenset([63]) - FOLLOW_63_in_postfix_expression1405 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_argument_expression_list_in_postfix_expression1424 = frozenset([63]) - FOLLOW_63_in_postfix_expression1428 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_macro_parameter_list_in_postfix_expression1446 = frozenset([63]) - FOLLOW_63_in_postfix_expression1448 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_75_in_postfix_expression1462 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1466 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_66_in_postfix_expression1482 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1486 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_76_in_postfix_expression1502 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1506 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_72_in_postfix_expression1522 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_73_in_postfix_expression1536 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_parameter_declaration_in_macro_parameter_list1559 = frozenset([1, 27]) - FOLLOW_27_in_macro_parameter_list1562 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_macro_parameter_list1564 = frozenset([1, 27]) - FOLLOW_set_in_unary_operator0 = frozenset([1]) - FOLLOW_IDENTIFIER_in_primary_expression1613 = frozenset([1]) - FOLLOW_constant_in_primary_expression1618 = frozenset([1]) - FOLLOW_62_in_primary_expression1623 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_primary_expression1625 = frozenset([63]) - FOLLOW_63_in_primary_expression1627 = frozenset([1]) - FOLLOW_HEX_LITERAL_in_constant1643 = frozenset([1]) - FOLLOW_OCTAL_LITERAL_in_constant1653 = frozenset([1]) - FOLLOW_DECIMAL_LITERAL_in_constant1663 = frozenset([1]) - FOLLOW_CHARACTER_LITERAL_in_constant1671 = frozenset([1]) - FOLLOW_IDENTIFIER_in_constant1680 = frozenset([4, 9]) - FOLLOW_STRING_LITERAL_in_constant1683 = frozenset([1, 4, 9]) - FOLLOW_IDENTIFIER_in_constant1688 = frozenset([1, 4]) - FOLLOW_FLOATING_POINT_LITERAL_in_constant1699 = frozenset([1]) - FOLLOW_assignment_expression_in_expression1715 = frozenset([1, 27]) - FOLLOW_27_in_expression1718 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_expression1720 = frozenset([1, 27]) - FOLLOW_conditional_expression_in_constant_expression1733 = frozenset([1]) - FOLLOW_lvalue_in_assignment_expression1744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) - FOLLOW_assignment_operator_in_assignment_expression1746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_assignment_expression1748 = frozenset([1]) - FOLLOW_conditional_expression_in_assignment_expression1753 = frozenset([1]) - FOLLOW_unary_expression_in_lvalue1765 = frozenset([1]) - FOLLOW_set_in_assignment_operator0 = frozenset([1]) - FOLLOW_logical_or_expression_in_conditional_expression1839 = frozenset([1, 90]) - FOLLOW_90_in_conditional_expression1842 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_conditional_expression1844 = frozenset([47]) - FOLLOW_47_in_conditional_expression1846 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_conditional_expression_in_conditional_expression1848 = frozenset([1]) - FOLLOW_logical_and_expression_in_logical_or_expression1863 = frozenset([1, 91]) - FOLLOW_91_in_logical_or_expression1866 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_logical_and_expression_in_logical_or_expression1868 = frozenset([1, 91]) - FOLLOW_inclusive_or_expression_in_logical_and_expression1881 = frozenset([1, 92]) - FOLLOW_92_in_logical_and_expression1884 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_inclusive_or_expression_in_logical_and_expression1886 = frozenset([1, 92]) - FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899 = frozenset([1, 93]) - FOLLOW_93_in_inclusive_or_expression1902 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904 = frozenset([1, 93]) - FOLLOW_and_expression_in_exclusive_or_expression1917 = frozenset([1, 94]) - FOLLOW_94_in_exclusive_or_expression1920 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_and_expression_in_exclusive_or_expression1922 = frozenset([1, 94]) - FOLLOW_equality_expression_in_and_expression1935 = frozenset([1, 77]) - FOLLOW_77_in_and_expression1938 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_equality_expression_in_and_expression1940 = frozenset([1, 77]) - FOLLOW_relational_expression_in_equality_expression1952 = frozenset([1, 95, 96]) - FOLLOW_set_in_equality_expression1955 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_relational_expression_in_equality_expression1961 = frozenset([1, 95, 96]) - FOLLOW_shift_expression_in_relational_expression1975 = frozenset([1, 97, 98, 99, 100]) - FOLLOW_set_in_relational_expression1978 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_shift_expression_in_relational_expression1988 = frozenset([1, 97, 98, 99, 100]) - FOLLOW_additive_expression_in_shift_expression2001 = frozenset([1, 101, 102]) - FOLLOW_set_in_shift_expression2004 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_additive_expression_in_shift_expression2010 = frozenset([1, 101, 102]) - FOLLOW_labeled_statement_in_statement2025 = frozenset([1]) - FOLLOW_compound_statement_in_statement2030 = frozenset([1]) - FOLLOW_expression_statement_in_statement2035 = frozenset([1]) - FOLLOW_selection_statement_in_statement2040 = frozenset([1]) - FOLLOW_iteration_statement_in_statement2045 = frozenset([1]) - FOLLOW_jump_statement_in_statement2050 = frozenset([1]) - FOLLOW_macro_statement_in_statement2055 = frozenset([1]) - FOLLOW_asm2_statement_in_statement2060 = frozenset([1]) - FOLLOW_asm1_statement_in_statement2065 = frozenset([1]) - FOLLOW_asm_statement_in_statement2070 = frozenset([1]) - FOLLOW_declaration_in_statement2075 = frozenset([1]) - FOLLOW_103_in_asm2_statement2086 = frozenset([4]) - FOLLOW_IDENTIFIER_in_asm2_statement2089 = frozenset([62]) - FOLLOW_62_in_asm2_statement2091 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm2_statement2094 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_63_in_asm2_statement2101 = frozenset([25]) - FOLLOW_25_in_asm2_statement2103 = frozenset([1]) - FOLLOW_104_in_asm1_statement2115 = frozenset([43]) - FOLLOW_43_in_asm1_statement2117 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm1_statement2120 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_44_in_asm1_statement2127 = frozenset([1]) - FOLLOW_105_in_asm_statement2138 = frozenset([43]) - FOLLOW_43_in_asm_statement2140 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm_statement2143 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_44_in_asm_statement2150 = frozenset([1]) - FOLLOW_IDENTIFIER_in_macro_statement2162 = frozenset([62]) - FOLLOW_62_in_macro_statement2164 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_declaration_in_macro_statement2166 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_list_in_macro_statement2170 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_macro_statement2173 = frozenset([63]) - FOLLOW_63_in_macro_statement2176 = frozenset([1]) - FOLLOW_IDENTIFIER_in_labeled_statement2188 = frozenset([47]) - FOLLOW_47_in_labeled_statement2190 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2192 = frozenset([1]) - FOLLOW_106_in_labeled_statement2197 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_labeled_statement2199 = frozenset([47]) - FOLLOW_47_in_labeled_statement2201 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2203 = frozenset([1]) - FOLLOW_107_in_labeled_statement2208 = frozenset([47]) - FOLLOW_47_in_labeled_statement2210 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2212 = frozenset([1]) - FOLLOW_43_in_compound_statement2223 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_declaration_in_compound_statement2225 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_list_in_compound_statement2228 = frozenset([44]) - FOLLOW_44_in_compound_statement2231 = frozenset([1]) - FOLLOW_statement_in_statement_list2242 = frozenset([1, 4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_25_in_expression_statement2254 = frozenset([1]) - FOLLOW_expression_in_expression_statement2259 = frozenset([25]) - FOLLOW_25_in_expression_statement2261 = frozenset([1]) - FOLLOW_108_in_selection_statement2272 = frozenset([62]) - FOLLOW_62_in_selection_statement2274 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_selection_statement2278 = frozenset([63]) - FOLLOW_63_in_selection_statement2280 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2284 = frozenset([1, 109]) - FOLLOW_109_in_selection_statement2299 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2301 = frozenset([1]) - FOLLOW_110_in_selection_statement2308 = frozenset([62]) - FOLLOW_62_in_selection_statement2310 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_selection_statement2312 = frozenset([63]) - FOLLOW_63_in_selection_statement2314 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2316 = frozenset([1]) - FOLLOW_111_in_iteration_statement2327 = frozenset([62]) - FOLLOW_62_in_iteration_statement2329 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2333 = frozenset([63]) - FOLLOW_63_in_iteration_statement2335 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2337 = frozenset([1]) - FOLLOW_112_in_iteration_statement2344 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2346 = frozenset([111]) - FOLLOW_111_in_iteration_statement2348 = frozenset([62]) - FOLLOW_62_in_iteration_statement2350 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2354 = frozenset([63]) - FOLLOW_63_in_iteration_statement2356 = frozenset([25]) - FOLLOW_25_in_iteration_statement2358 = frozenset([1]) - FOLLOW_113_in_iteration_statement2365 = frozenset([62]) - FOLLOW_62_in_iteration_statement2367 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_statement_in_iteration_statement2369 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_statement_in_iteration_statement2373 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2375 = frozenset([63]) - FOLLOW_63_in_iteration_statement2378 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2380 = frozenset([1]) - FOLLOW_114_in_jump_statement2393 = frozenset([4]) - FOLLOW_IDENTIFIER_in_jump_statement2395 = frozenset([25]) - FOLLOW_25_in_jump_statement2397 = frozenset([1]) - FOLLOW_115_in_jump_statement2402 = frozenset([25]) - FOLLOW_25_in_jump_statement2404 = frozenset([1]) - FOLLOW_116_in_jump_statement2409 = frozenset([25]) - FOLLOW_25_in_jump_statement2411 = frozenset([1]) - FOLLOW_117_in_jump_statement2416 = frozenset([25]) - FOLLOW_25_in_jump_statement2418 = frozenset([1]) - FOLLOW_117_in_jump_statement2423 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_jump_statement2425 = frozenset([25]) - FOLLOW_25_in_jump_statement2427 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred2100 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred4100 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_synpred4103 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_declaration_in_synpred4105 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_43_in_synpred4108 = frozenset([1]) - FOLLOW_declaration_in_synpred5118 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred7157 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred10207 = frozenset([1]) - FOLLOW_type_specifier_in_synpred14272 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred15286 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred33444 = frozenset([1]) - FOLLOW_IDENTIFIER_in_synpred34442 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_type_qualifier_in_synpred34444 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_declarator_in_synpred34447 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred39566 = frozenset([1]) - FOLLOW_type_specifier_in_synpred40570 = frozenset([1]) - FOLLOW_pointer_in_synpred66784 = frozenset([4, 58, 59, 60, 62]) - FOLLOW_58_in_synpred66788 = frozenset([4, 59, 60, 62]) - FOLLOW_59_in_synpred66793 = frozenset([4, 60, 62]) - FOLLOW_60_in_synpred66798 = frozenset([4, 62]) - FOLLOW_direct_declarator_in_synpred66802 = frozenset([1]) - FOLLOW_declarator_suffix_in_synpred67821 = frozenset([1]) - FOLLOW_58_in_synpred69830 = frozenset([1]) - FOLLOW_declarator_suffix_in_synpred70838 = frozenset([1]) - FOLLOW_62_in_synpred73878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_synpred73880 = frozenset([63]) - FOLLOW_63_in_synpred73882 = frozenset([1]) - FOLLOW_62_in_synpred74892 = frozenset([4]) - FOLLOW_identifier_list_in_synpred74894 = frozenset([63]) - FOLLOW_63_in_synpred74896 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred75921 = frozenset([1]) - FOLLOW_pointer_in_synpred76924 = frozenset([1]) - FOLLOW_66_in_synpred77919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_synpred77921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_pointer_in_synpred77924 = frozenset([1]) - FOLLOW_66_in_synpred78930 = frozenset([66]) - FOLLOW_pointer_in_synpred78932 = frozenset([1]) - FOLLOW_53_in_synpred81977 = frozenset([1]) - FOLLOW_27_in_synpred82974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_53_in_synpred82977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_synpred82981 = frozenset([1]) - FOLLOW_declarator_in_synpred83997 = frozenset([1]) - FOLLOW_abstract_declarator_in_synpred84999 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred86994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_declarator_in_synpred86997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred86999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_53_in_synpred861004 = frozenset([1]) - FOLLOW_specifier_qualifier_list_in_synpred901046 = frozenset([1, 62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred901048 = frozenset([1]) - FOLLOW_direct_abstract_declarator_in_synpred911067 = frozenset([1]) - FOLLOW_62_in_synpred931086 = frozenset([62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred931088 = frozenset([63]) - FOLLOW_63_in_synpred931090 = frozenset([1]) - FOLLOW_abstract_declarator_suffix_in_synpred941098 = frozenset([1]) - FOLLOW_62_in_synpred1091282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_synpred1091284 = frozenset([63]) - FOLLOW_63_in_synpred1091286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_synpred1091288 = frozenset([1]) - FOLLOW_74_in_synpred1141330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_synpred1141332 = frozenset([1]) - FOLLOW_62_in_synpred1171420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_argument_expression_list_in_synpred1171424 = frozenset([63]) - FOLLOW_63_in_synpred1171428 = frozenset([1]) - FOLLOW_62_in_synpred1181444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_macro_parameter_list_in_synpred1181446 = frozenset([63]) - FOLLOW_63_in_synpred1181448 = frozenset([1]) - FOLLOW_66_in_synpred1201482 = frozenset([4]) - FOLLOW_IDENTIFIER_in_synpred1201486 = frozenset([1]) - FOLLOW_STRING_LITERAL_in_synpred1371683 = frozenset([1]) - FOLLOW_IDENTIFIER_in_synpred1381680 = frozenset([4, 9]) - FOLLOW_STRING_LITERAL_in_synpred1381683 = frozenset([1, 9]) - FOLLOW_lvalue_in_synpred1421744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) - FOLLOW_assignment_operator_in_synpred1421746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_synpred1421748 = frozenset([1]) - FOLLOW_expression_statement_in_synpred1692035 = frozenset([1]) - FOLLOW_macro_statement_in_synpred1732055 = frozenset([1]) - FOLLOW_asm2_statement_in_synpred1742060 = frozenset([1]) - FOLLOW_declaration_in_synpred1812166 = frozenset([1]) - FOLLOW_statement_list_in_synpred1822170 = frozenset([1]) - FOLLOW_declaration_in_synpred1862225 = frozenset([1]) - FOLLOW_statement_in_synpred1882242 = frozenset([1]) - + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 4, declaration_StartIndex) + + pass + + return + + # $ANTLR end declaration + + class declaration_specifiers_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start declaration_specifiers + # C.g:182:1: declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ; + def declaration_specifiers(self, ): + + retval = self.declaration_specifiers_return() + retval.start = self.input.LT(1) + declaration_specifiers_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 5): + return retval + + # C.g:183:2: ( ( storage_class_specifier | type_specifier | type_qualifier )+ ) + # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ + # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ + cnt10 = 0 + while True: #loop10 + alt10 = 4 + LA10 = self.input.LA(1) + if LA10 == 58: + LA10_2 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 59: + LA10_3 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 60: + LA10_4 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == IDENTIFIER: + LA10_5 = self.input.LA(2) + + if (self.synpred14()) : + alt10 = 2 + + + elif LA10 == 53: + LA10_9 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 29 or LA10 == 30 or LA10 == 31 or LA10 == 32 or LA10 == 33: + alt10 = 1 + elif LA10 == 34 or LA10 == 35 or LA10 == 36 or LA10 == 37 or LA10 == 38 or LA10 == 39 or LA10 == 40 or LA10 == 41 or LA10 == 42 or LA10 == 45 or LA10 == 46 or LA10 == 48: + alt10 = 2 + elif LA10 == 49 or LA10 == 50 or LA10 == 51 or LA10 == 52 or LA10 == 54 or LA10 == 55 or LA10 == 56 or LA10 == 57 or LA10 == 61: + alt10 = 3 + + if alt10 == 1: + # C.g:183:10: storage_class_specifier + self.following.append(self.FOLLOW_storage_class_specifier_in_declaration_specifiers264) + self.storage_class_specifier() + self.following.pop() + if self.failed: + return retval + + + elif alt10 == 2: + # C.g:184:7: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_declaration_specifiers272) + self.type_specifier() + self.following.pop() + if self.failed: + return retval + + + elif alt10 == 3: + # C.g:185:13: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_declaration_specifiers286) + self.type_qualifier() + self.following.pop() + if self.failed: + return retval + + + else: + if cnt10 >= 1: + break #loop10 + + if self.backtracking > 0: + self.failed = True + return retval + + eee = EarlyExitException(10, self.input) + raise eee + + cnt10 += 1 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 5, declaration_specifiers_StartIndex) + + pass + + return retval + + # $ANTLR end declaration_specifiers + + class init_declarator_list_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start init_declarator_list + # C.g:189:1: init_declarator_list : init_declarator ( ',' init_declarator )* ; + def init_declarator_list(self, ): + + retval = self.init_declarator_list_return() + retval.start = self.input.LT(1) + init_declarator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 6): + return retval + + # C.g:190:2: ( init_declarator ( ',' init_declarator )* ) + # C.g:190:4: init_declarator ( ',' init_declarator )* + self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list308) + self.init_declarator() + self.following.pop() + if self.failed: + return retval + # C.g:190:20: ( ',' init_declarator )* + while True: #loop11 + alt11 = 2 + LA11_0 = self.input.LA(1) + + if (LA11_0 == 27) : + alt11 = 1 + + + if alt11 == 1: + # C.g:190:21: ',' init_declarator + self.match(self.input, 27, self.FOLLOW_27_in_init_declarator_list311) + if self.failed: + return retval + self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list313) + self.init_declarator() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop11 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 6, init_declarator_list_StartIndex) + + pass + + return retval + + # $ANTLR end init_declarator_list + + + # $ANTLR start init_declarator + # C.g:193:1: init_declarator : declarator ( '=' initializer )? ; + def init_declarator(self, ): + + init_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 7): + return + + # C.g:194:2: ( declarator ( '=' initializer )? ) + # C.g:194:4: declarator ( '=' initializer )? + self.following.append(self.FOLLOW_declarator_in_init_declarator326) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:194:15: ( '=' initializer )? + alt12 = 2 + LA12_0 = self.input.LA(1) + + if (LA12_0 == 28) : + alt12 = 1 + if alt12 == 1: + # C.g:194:16: '=' initializer + self.match(self.input, 28, self.FOLLOW_28_in_init_declarator329) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_in_init_declarator331) + self.initializer() + self.following.pop() + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 7, init_declarator_StartIndex) + + pass + + return + + # $ANTLR end init_declarator + + + # $ANTLR start storage_class_specifier + # C.g:197:1: storage_class_specifier : ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ); + def storage_class_specifier(self, ): + + storage_class_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 8): + return + + # C.g:198:2: ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ) + # C.g: + if (29 <= self.input.LA(1) <= 33): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_storage_class_specifier0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 8, storage_class_specifier_StartIndex) + + pass + + return + + # $ANTLR end storage_class_specifier + + + # $ANTLR start type_specifier + # C.g:205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ); + def type_specifier(self, ): + + type_specifier_StartIndex = self.input.index() + s = None + + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 9): + return + + # C.g:206:2: ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ) + alt13 = 12 + LA13_0 = self.input.LA(1) + + if (LA13_0 == 34) : + alt13 = 1 + elif (LA13_0 == 35) : + alt13 = 2 + elif (LA13_0 == 36) : + alt13 = 3 + elif (LA13_0 == 37) : + alt13 = 4 + elif (LA13_0 == 38) : + alt13 = 5 + elif (LA13_0 == 39) : + alt13 = 6 + elif (LA13_0 == 40) : + alt13 = 7 + elif (LA13_0 == 41) : + alt13 = 8 + elif (LA13_0 == 42) : + alt13 = 9 + elif ((45 <= LA13_0 <= 46)) : + alt13 = 10 + elif (LA13_0 == 48) : + alt13 = 11 + elif (LA13_0 == IDENTIFIER) and (self.synpred34()): + alt13 = 12 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id );", 13, 0, self.input) + + raise nvae + + if alt13 == 1: + # C.g:206:4: 'void' + self.match(self.input, 34, self.FOLLOW_34_in_type_specifier376) + if self.failed: + return + + + elif alt13 == 2: + # C.g:207:4: 'char' + self.match(self.input, 35, self.FOLLOW_35_in_type_specifier381) + if self.failed: + return + + + elif alt13 == 3: + # C.g:208:4: 'short' + self.match(self.input, 36, self.FOLLOW_36_in_type_specifier386) + if self.failed: + return + + + elif alt13 == 4: + # C.g:209:4: 'int' + self.match(self.input, 37, self.FOLLOW_37_in_type_specifier391) + if self.failed: + return + + + elif alt13 == 5: + # C.g:210:4: 'long' + self.match(self.input, 38, self.FOLLOW_38_in_type_specifier396) + if self.failed: + return + + + elif alt13 == 6: + # C.g:211:4: 'float' + self.match(self.input, 39, self.FOLLOW_39_in_type_specifier401) + if self.failed: + return + + + elif alt13 == 7: + # C.g:212:4: 'double' + self.match(self.input, 40, self.FOLLOW_40_in_type_specifier406) + if self.failed: + return + + + elif alt13 == 8: + # C.g:213:4: 'signed' + self.match(self.input, 41, self.FOLLOW_41_in_type_specifier411) + if self.failed: + return + + + elif alt13 == 9: + # C.g:214:4: 'unsigned' + self.match(self.input, 42, self.FOLLOW_42_in_type_specifier416) + if self.failed: + return + + + elif alt13 == 10: + # C.g:215:4: s= struct_or_union_specifier + self.following.append(self.FOLLOW_struct_or_union_specifier_in_type_specifier423) + s = self.struct_or_union_specifier() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + + if s.stop != None: + self.StoreStructUnionDefinition(s.start.line, s.start.charPositionInLine, s.stop.line, s.stop.charPositionInLine, self.input.toString(s.start,s.stop)) + + + + + elif alt13 == 11: + # C.g:220:4: e= enum_specifier + self.following.append(self.FOLLOW_enum_specifier_in_type_specifier433) + e = self.enum_specifier() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + + if e.stop != None: + self.StoreEnumerationDefinition(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + elif alt13 == 12: + # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator )=> type_id + self.following.append(self.FOLLOW_type_id_in_type_specifier451) + self.type_id() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 9, type_specifier_StartIndex) + + pass + + return + + # $ANTLR end type_specifier + + + # $ANTLR start type_id + # C.g:228:1: type_id : IDENTIFIER ; + def type_id(self, ): + + type_id_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 10): + return + + # C.g:229:5: ( IDENTIFIER ) + # C.g:229:9: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_type_id467) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 10, type_id_StartIndex) + + pass + + return + + # $ANTLR end type_id + + class struct_or_union_specifier_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start struct_or_union_specifier + # C.g:233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ); + def struct_or_union_specifier(self, ): + + retval = self.struct_or_union_specifier_return() + retval.start = self.input.LT(1) + struct_or_union_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 11): + return retval + + # C.g:235:2: ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ) + alt15 = 2 + LA15_0 = self.input.LA(1) + + if ((45 <= LA15_0 <= 46)) : + LA15_1 = self.input.LA(2) + + if (LA15_1 == IDENTIFIER) : + LA15_2 = self.input.LA(3) + + if (LA15_2 == 43) : + alt15 = 1 + elif (LA15_2 == EOF or LA15_2 == IDENTIFIER or LA15_2 == 25 or LA15_2 == 27 or (29 <= LA15_2 <= 42) or (45 <= LA15_2 <= 64) or LA15_2 == 66) : + alt15 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 2, self.input) + + raise nvae + + elif (LA15_1 == 43) : + alt15 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 0, self.input) + + raise nvae + + if alt15 == 1: + # C.g:235:4: struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' + self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier494) + self.struct_or_union() + self.following.pop() + if self.failed: + return retval + # C.g:235:20: ( IDENTIFIER )? + alt14 = 2 + LA14_0 = self.input.LA(1) + + if (LA14_0 == IDENTIFIER) : + alt14 = 1 + if alt14 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier496) + if self.failed: + return retval + + + + self.match(self.input, 43, self.FOLLOW_43_in_struct_or_union_specifier499) + if self.failed: + return retval + self.following.append(self.FOLLOW_struct_declaration_list_in_struct_or_union_specifier501) + self.struct_declaration_list() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 44, self.FOLLOW_44_in_struct_or_union_specifier503) + if self.failed: + return retval + + + elif alt15 == 2: + # C.g:236:4: struct_or_union IDENTIFIER + self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier508) + self.struct_or_union() + self.following.pop() + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier510) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 11, struct_or_union_specifier_StartIndex) + + pass + + return retval + + # $ANTLR end struct_or_union_specifier + + + # $ANTLR start struct_or_union + # C.g:239:1: struct_or_union : ( 'struct' | 'union' ); + def struct_or_union(self, ): + + struct_or_union_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 12): + return + + # C.g:240:2: ( 'struct' | 'union' ) + # C.g: + if (45 <= self.input.LA(1) <= 46): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_struct_or_union0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 12, struct_or_union_StartIndex) + + pass + + return + + # $ANTLR end struct_or_union + + + # $ANTLR start struct_declaration_list + # C.g:244:1: struct_declaration_list : ( struct_declaration )+ ; + def struct_declaration_list(self, ): + + struct_declaration_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 13): + return + + # C.g:245:2: ( ( struct_declaration )+ ) + # C.g:245:4: ( struct_declaration )+ + # C.g:245:4: ( struct_declaration )+ + cnt16 = 0 + while True: #loop16 + alt16 = 2 + LA16_0 = self.input.LA(1) + + if (LA16_0 == IDENTIFIER or (34 <= LA16_0 <= 42) or (45 <= LA16_0 <= 46) or (48 <= LA16_0 <= 61)) : + alt16 = 1 + + + if alt16 == 1: + # C.g:0:0: struct_declaration + self.following.append(self.FOLLOW_struct_declaration_in_struct_declaration_list537) + self.struct_declaration() + self.following.pop() + if self.failed: + return + + + else: + if cnt16 >= 1: + break #loop16 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(16, self.input) + raise eee + + cnt16 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 13, struct_declaration_list_StartIndex) + + pass + + return + + # $ANTLR end struct_declaration_list + + + # $ANTLR start struct_declaration + # C.g:248:1: struct_declaration : specifier_qualifier_list struct_declarator_list ';' ; + def struct_declaration(self, ): + + struct_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 14): + return + + # C.g:249:2: ( specifier_qualifier_list struct_declarator_list ';' ) + # C.g:249:4: specifier_qualifier_list struct_declarator_list ';' + self.following.append(self.FOLLOW_specifier_qualifier_list_in_struct_declaration549) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_struct_declarator_list_in_struct_declaration551) + self.struct_declarator_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_struct_declaration553) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 14, struct_declaration_StartIndex) + + pass + + return + + # $ANTLR end struct_declaration + + + # $ANTLR start specifier_qualifier_list + # C.g:252:1: specifier_qualifier_list : ( type_qualifier | type_specifier )+ ; + def specifier_qualifier_list(self, ): + + specifier_qualifier_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 15): + return + + # C.g:253:2: ( ( type_qualifier | type_specifier )+ ) + # C.g:253:4: ( type_qualifier | type_specifier )+ + # C.g:253:4: ( type_qualifier | type_specifier )+ + cnt17 = 0 + while True: #loop17 + alt17 = 3 + LA17 = self.input.LA(1) + if LA17 == 58: + LA17_2 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == 59: + LA17_3 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == 60: + LA17_4 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == IDENTIFIER: + LA17 = self.input.LA(2) + if LA17 == EOF or LA17 == IDENTIFIER or LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48 or LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 58 or LA17 == 59 or LA17 == 60 or LA17 == 61 or LA17 == 63 or LA17 == 66: + alt17 = 2 + elif LA17 == 62: + LA17_94 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + elif LA17 == 47: + LA17_95 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + elif LA17 == 64: + LA17_96 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + + elif LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 61: + alt17 = 1 + elif LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48: + alt17 = 2 + + if alt17 == 1: + # C.g:253:6: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_specifier_qualifier_list566) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + elif alt17 == 2: + # C.g:253:23: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_specifier_qualifier_list570) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt17 >= 1: + break #loop17 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(17, self.input) + raise eee + + cnt17 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 15, specifier_qualifier_list_StartIndex) + + pass + + return + + # $ANTLR end specifier_qualifier_list + + + # $ANTLR start struct_declarator_list + # C.g:256:1: struct_declarator_list : struct_declarator ( ',' struct_declarator )* ; + def struct_declarator_list(self, ): + + struct_declarator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 16): + return + + # C.g:257:2: ( struct_declarator ( ',' struct_declarator )* ) + # C.g:257:4: struct_declarator ( ',' struct_declarator )* + self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list584) + self.struct_declarator() + self.following.pop() + if self.failed: + return + # C.g:257:22: ( ',' struct_declarator )* + while True: #loop18 + alt18 = 2 + LA18_0 = self.input.LA(1) + + if (LA18_0 == 27) : + alt18 = 1 + + + if alt18 == 1: + # C.g:257:23: ',' struct_declarator + self.match(self.input, 27, self.FOLLOW_27_in_struct_declarator_list587) + if self.failed: + return + self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list589) + self.struct_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop18 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 16, struct_declarator_list_StartIndex) + + pass + + return + + # $ANTLR end struct_declarator_list + + + # $ANTLR start struct_declarator + # C.g:260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression ); + def struct_declarator(self, ): + + struct_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 17): + return + + # C.g:261:2: ( declarator ( ':' constant_expression )? | ':' constant_expression ) + alt20 = 2 + LA20_0 = self.input.LA(1) + + if (LA20_0 == IDENTIFIER or (58 <= LA20_0 <= 60) or LA20_0 == 62 or LA20_0 == 66) : + alt20 = 1 + elif (LA20_0 == 47) : + alt20 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression );", 20, 0, self.input) + + raise nvae + + if alt20 == 1: + # C.g:261:4: declarator ( ':' constant_expression )? + self.following.append(self.FOLLOW_declarator_in_struct_declarator602) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:261:15: ( ':' constant_expression )? + alt19 = 2 + LA19_0 = self.input.LA(1) + + if (LA19_0 == 47) : + alt19 = 1 + if alt19 == 1: + # C.g:261:16: ':' constant_expression + self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator605) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_struct_declarator607) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + + + elif alt20 == 2: + # C.g:262:4: ':' constant_expression + self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator614) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_struct_declarator616) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 17, struct_declarator_StartIndex) + + pass + + return + + # $ANTLR end struct_declarator + + class enum_specifier_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start enum_specifier + # C.g:265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ); + def enum_specifier(self, ): + + retval = self.enum_specifier_return() + retval.start = self.input.LT(1) + enum_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 18): + return retval + + # C.g:267:2: ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ) + alt23 = 3 + LA23_0 = self.input.LA(1) + + if (LA23_0 == 48) : + LA23_1 = self.input.LA(2) + + if (LA23_1 == IDENTIFIER) : + LA23_2 = self.input.LA(3) + + if (LA23_2 == 43) : + alt23 = 2 + elif (LA23_2 == EOF or LA23_2 == IDENTIFIER or LA23_2 == 25 or LA23_2 == 27 or (29 <= LA23_2 <= 42) or (45 <= LA23_2 <= 64) or LA23_2 == 66) : + alt23 = 3 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 2, self.input) + + raise nvae + + elif (LA23_1 == 43) : + alt23 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 0, self.input) + + raise nvae + + if alt23 == 1: + # C.g:267:4: 'enum' '{' enumerator_list ( ',' )? '}' + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier634) + if self.failed: + return retval + self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier636) + if self.failed: + return retval + self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier638) + self.enumerator_list() + self.following.pop() + if self.failed: + return retval + # C.g:267:31: ( ',' )? + alt21 = 2 + LA21_0 = self.input.LA(1) + + if (LA21_0 == 27) : + alt21 = 1 + if alt21 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier640) + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier643) + if self.failed: + return retval + + + elif alt23 == 2: + # C.g:268:4: 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier648) + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier650) + if self.failed: + return retval + self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier652) + if self.failed: + return retval + self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier654) + self.enumerator_list() + self.following.pop() + if self.failed: + return retval + # C.g:268:42: ( ',' )? + alt22 = 2 + LA22_0 = self.input.LA(1) + + if (LA22_0 == 27) : + alt22 = 1 + if alt22 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier656) + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier659) + if self.failed: + return retval + + + elif alt23 == 3: + # C.g:269:4: 'enum' IDENTIFIER + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier664) + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier666) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 18, enum_specifier_StartIndex) + + pass + + return retval + + # $ANTLR end enum_specifier + + + # $ANTLR start enumerator_list + # C.g:272:1: enumerator_list : enumerator ( ',' enumerator )* ; + def enumerator_list(self, ): + + enumerator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 19): + return + + # C.g:273:2: ( enumerator ( ',' enumerator )* ) + # C.g:273:4: enumerator ( ',' enumerator )* + self.following.append(self.FOLLOW_enumerator_in_enumerator_list677) + self.enumerator() + self.following.pop() + if self.failed: + return + # C.g:273:15: ( ',' enumerator )* + while True: #loop24 + alt24 = 2 + LA24_0 = self.input.LA(1) + + if (LA24_0 == 27) : + LA24_1 = self.input.LA(2) + + if (LA24_1 == IDENTIFIER) : + alt24 = 1 + + + + + if alt24 == 1: + # C.g:273:16: ',' enumerator + self.match(self.input, 27, self.FOLLOW_27_in_enumerator_list680) + if self.failed: + return + self.following.append(self.FOLLOW_enumerator_in_enumerator_list682) + self.enumerator() + self.following.pop() + if self.failed: + return + + + else: + break #loop24 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 19, enumerator_list_StartIndex) + + pass + + return + + # $ANTLR end enumerator_list + + + # $ANTLR start enumerator + # C.g:276:1: enumerator : IDENTIFIER ( '=' constant_expression )? ; + def enumerator(self, ): + + enumerator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 20): + return + + # C.g:277:2: ( IDENTIFIER ( '=' constant_expression )? ) + # C.g:277:4: IDENTIFIER ( '=' constant_expression )? + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enumerator695) + if self.failed: + return + # C.g:277:15: ( '=' constant_expression )? + alt25 = 2 + LA25_0 = self.input.LA(1) + + if (LA25_0 == 28) : + alt25 = 1 + if alt25 == 1: + # C.g:277:16: '=' constant_expression + self.match(self.input, 28, self.FOLLOW_28_in_enumerator698) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_enumerator700) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 20, enumerator_StartIndex) + + pass + + return + + # $ANTLR end enumerator + + + # $ANTLR start type_qualifier + # C.g:280:1: type_qualifier : ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ); + def type_qualifier(self, ): + + type_qualifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 21): + return + + # C.g:281:2: ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ) + # C.g: + if (49 <= self.input.LA(1) <= 61): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_type_qualifier0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 21, type_qualifier_StartIndex) + + pass + + return + + # $ANTLR end type_qualifier + + class declarator_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start declarator + # C.g:296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ); + def declarator(self, ): + + retval = self.declarator_return() + retval.start = self.input.LT(1) + declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 22): + return retval + + # C.g:297:2: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ) + alt30 = 2 + LA30_0 = self.input.LA(1) + + if (LA30_0 == 66) : + LA30_1 = self.input.LA(2) + + if (self.synpred66()) : + alt30 = 1 + elif (True) : + alt30 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 1, self.input) + + raise nvae + + elif (LA30_0 == IDENTIFIER or (58 <= LA30_0 <= 60) or LA30_0 == 62) : + alt30 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 0, self.input) + + raise nvae + + if alt30 == 1: + # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator + # C.g:297:4: ( pointer )? + alt26 = 2 + LA26_0 = self.input.LA(1) + + if (LA26_0 == 66) : + alt26 = 1 + if alt26 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_declarator784) + self.pointer() + self.following.pop() + if self.failed: + return retval + + + + # C.g:297:13: ( 'EFIAPI' )? + alt27 = 2 + LA27_0 = self.input.LA(1) + + if (LA27_0 == 58) : + alt27 = 1 + if alt27 == 1: + # C.g:297:14: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_declarator788) + if self.failed: + return retval + + + + # C.g:297:25: ( 'EFI_BOOTSERVICE' )? + alt28 = 2 + LA28_0 = self.input.LA(1) + + if (LA28_0 == 59) : + alt28 = 1 + if alt28 == 1: + # C.g:297:26: 'EFI_BOOTSERVICE' + self.match(self.input, 59, self.FOLLOW_59_in_declarator793) + if self.failed: + return retval + + + + # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? + alt29 = 2 + LA29_0 = self.input.LA(1) + + if (LA29_0 == 60) : + alt29 = 1 + if alt29 == 1: + # C.g:297:47: 'EFI_RUNTIMESERVICE' + self.match(self.input, 60, self.FOLLOW_60_in_declarator798) + if self.failed: + return retval + + + + self.following.append(self.FOLLOW_direct_declarator_in_declarator802) + self.direct_declarator() + self.following.pop() + if self.failed: + return retval + + + elif alt30 == 2: + # C.g:299:4: pointer + self.following.append(self.FOLLOW_pointer_in_declarator808) + self.pointer() + self.following.pop() + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 22, declarator_StartIndex) + + pass + + return retval + + # $ANTLR end declarator + + + # $ANTLR start direct_declarator + # C.g:302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ); + def direct_declarator(self, ): + + direct_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 23): + return + + # C.g:303:2: ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ) + alt34 = 2 + LA34_0 = self.input.LA(1) + + if (LA34_0 == IDENTIFIER) : + alt34 = 1 + elif (LA34_0 == 62) : + alt34 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ );", 34, 0, self.input) + + raise nvae + + if alt34 == 1: + # C.g:303:4: IDENTIFIER ( declarator_suffix )* + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_direct_declarator819) + if self.failed: + return + # C.g:303:15: ( declarator_suffix )* + while True: #loop31 + alt31 = 2 + LA31_0 = self.input.LA(1) + + if (LA31_0 == 62) : + LA31 = self.input.LA(2) + if LA31 == 63: + LA31_30 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 58: + LA31_31 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 66: + LA31_32 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 59: + LA31_33 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 60: + LA31_34 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == IDENTIFIER: + LA31_35 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 29 or LA31 == 30 or LA31 == 31 or LA31 == 32 or LA31 == 33: + LA31_37 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 34: + LA31_38 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 35: + LA31_39 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 36: + LA31_40 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 37: + LA31_41 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 38: + LA31_42 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 39: + LA31_43 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 40: + LA31_44 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 41: + LA31_45 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 42: + LA31_46 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 45 or LA31 == 46: + LA31_47 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 48: + LA31_48 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 49 or LA31 == 50 or LA31 == 51 or LA31 == 52 or LA31 == 53 or LA31 == 54 or LA31 == 55 or LA31 == 56 or LA31 == 57 or LA31 == 61: + LA31_49 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + + elif (LA31_0 == 64) : + LA31 = self.input.LA(2) + if LA31 == 65: + LA31_51 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 62: + LA31_52 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == IDENTIFIER: + LA31_53 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == HEX_LITERAL: + LA31_54 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == OCTAL_LITERAL: + LA31_55 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == DECIMAL_LITERAL: + LA31_56 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == CHARACTER_LITERAL: + LA31_57 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == STRING_LITERAL: + LA31_58 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == FLOATING_POINT_LITERAL: + LA31_59 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 72: + LA31_60 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 73: + LA31_61 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 66 or LA31 == 68 or LA31 == 69 or LA31 == 77 or LA31 == 78 or LA31 == 79: + LA31_62 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 74: + LA31_63 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + + + + if alt31 == 1: + # C.g:0:0: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator821) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + break #loop31 + + + + + elif alt34 == 2: + # C.g:304:4: '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ + self.match(self.input, 62, self.FOLLOW_62_in_direct_declarator827) + if self.failed: + return + # C.g:304:8: ( 'EFIAPI' )? + alt32 = 2 + LA32_0 = self.input.LA(1) + + if (LA32_0 == 58) : + LA32_1 = self.input.LA(2) + + if (self.synpred69()) : + alt32 = 1 + if alt32 == 1: + # C.g:304:9: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_direct_declarator830) + if self.failed: + return + + + + self.following.append(self.FOLLOW_declarator_in_direct_declarator834) + self.declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_direct_declarator836) + if self.failed: + return + # C.g:304:35: ( declarator_suffix )+ + cnt33 = 0 + while True: #loop33 + alt33 = 2 + LA33_0 = self.input.LA(1) + + if (LA33_0 == 62) : + LA33 = self.input.LA(2) + if LA33 == 63: + LA33_30 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 58: + LA33_31 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 66: + LA33_32 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 59: + LA33_33 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 60: + LA33_34 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == IDENTIFIER: + LA33_35 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 29 or LA33 == 30 or LA33 == 31 or LA33 == 32 or LA33 == 33: + LA33_37 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 34: + LA33_38 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 35: + LA33_39 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 36: + LA33_40 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 37: + LA33_41 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 38: + LA33_42 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 39: + LA33_43 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 40: + LA33_44 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 41: + LA33_45 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 42: + LA33_46 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 45 or LA33 == 46: + LA33_47 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 48: + LA33_48 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 49 or LA33 == 50 or LA33 == 51 or LA33 == 52 or LA33 == 53 or LA33 == 54 or LA33 == 55 or LA33 == 56 or LA33 == 57 or LA33 == 61: + LA33_49 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + + elif (LA33_0 == 64) : + LA33 = self.input.LA(2) + if LA33 == 65: + LA33_51 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 62: + LA33_52 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == IDENTIFIER: + LA33_53 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == HEX_LITERAL: + LA33_54 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == OCTAL_LITERAL: + LA33_55 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == DECIMAL_LITERAL: + LA33_56 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == CHARACTER_LITERAL: + LA33_57 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == STRING_LITERAL: + LA33_58 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == FLOATING_POINT_LITERAL: + LA33_59 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 72: + LA33_60 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 73: + LA33_61 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 66 or LA33 == 68 or LA33 == 69 or LA33 == 77 or LA33 == 78 or LA33 == 79: + LA33_62 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 74: + LA33_63 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + + + + if alt33 == 1: + # C.g:0:0: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator838) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + if cnt33 >= 1: + break #loop33 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(33, self.input) + raise eee + + cnt33 += 1 + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 23, direct_declarator_StartIndex) + + pass + + return + + # $ANTLR end direct_declarator + + + # $ANTLR start declarator_suffix + # C.g:307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ); + def declarator_suffix(self, ): + + declarator_suffix_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 24): + return + + # C.g:308:2: ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ) + alt35 = 5 + LA35_0 = self.input.LA(1) + + if (LA35_0 == 64) : + LA35_1 = self.input.LA(2) + + if (LA35_1 == 65) : + alt35 = 2 + elif ((IDENTIFIER <= LA35_1 <= FLOATING_POINT_LITERAL) or LA35_1 == 62 or LA35_1 == 66 or (68 <= LA35_1 <= 69) or (72 <= LA35_1 <= 74) or (77 <= LA35_1 <= 79)) : + alt35 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 1, self.input) + + raise nvae + + elif (LA35_0 == 62) : + LA35 = self.input.LA(2) + if LA35 == 63: + alt35 = 5 + elif LA35 == 29 or LA35 == 30 or LA35 == 31 or LA35 == 32 or LA35 == 33 or LA35 == 34 or LA35 == 35 or LA35 == 36 or LA35 == 37 or LA35 == 38 or LA35 == 39 or LA35 == 40 or LA35 == 41 or LA35 == 42 or LA35 == 45 or LA35 == 46 or LA35 == 48 or LA35 == 49 or LA35 == 50 or LA35 == 51 or LA35 == 52 or LA35 == 53 or LA35 == 54 or LA35 == 55 or LA35 == 56 or LA35 == 57 or LA35 == 58 or LA35 == 59 or LA35 == 60 or LA35 == 61 or LA35 == 66: + alt35 = 3 + elif LA35 == IDENTIFIER: + LA35_29 = self.input.LA(3) + + if (self.synpred73()) : + alt35 = 3 + elif (self.synpred74()) : + alt35 = 4 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 29, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 2, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 0, self.input) + + raise nvae + + if alt35 == 1: + # C.g:308:6: '[' constant_expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix852) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_declarator_suffix854) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix856) + if self.failed: + return + + + elif alt35 == 2: + # C.g:309:9: '[' ']' + self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix866) + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix868) + if self.failed: + return + + + elif alt35 == 3: + # C.g:310:9: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix878) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_declarator_suffix880) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix882) + if self.failed: + return + + + elif alt35 == 4: + # C.g:311:9: '(' identifier_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix892) + if self.failed: + return + self.following.append(self.FOLLOW_identifier_list_in_declarator_suffix894) + self.identifier_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix896) + if self.failed: + return + + + elif alt35 == 5: + # C.g:312:9: '(' ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix906) + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix908) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 24, declarator_suffix_StartIndex) + + pass + + return + + # $ANTLR end declarator_suffix + + + # $ANTLR start pointer + # C.g:315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ); + def pointer(self, ): + + pointer_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 25): + return + + # C.g:316:2: ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ) + alt38 = 3 + LA38_0 = self.input.LA(1) + + if (LA38_0 == 66) : + LA38 = self.input.LA(2) + if LA38 == 66: + LA38_2 = self.input.LA(3) + + if (self.synpred78()) : + alt38 = 2 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 2, self.input) + + raise nvae + + elif LA38 == 58: + LA38_3 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 3, self.input) + + raise nvae + + elif LA38 == 59: + LA38_4 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 4, self.input) + + raise nvae + + elif LA38 == 60: + LA38_5 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 5, self.input) + + raise nvae + + elif LA38 == EOF or LA38 == IDENTIFIER or LA38 == 25 or LA38 == 26 or LA38 == 27 or LA38 == 28 or LA38 == 29 or LA38 == 30 or LA38 == 31 or LA38 == 32 or LA38 == 33 or LA38 == 34 or LA38 == 35 or LA38 == 36 or LA38 == 37 or LA38 == 38 or LA38 == 39 or LA38 == 40 or LA38 == 41 or LA38 == 42 or LA38 == 43 or LA38 == 45 or LA38 == 46 or LA38 == 47 or LA38 == 48 or LA38 == 62 or LA38 == 63 or LA38 == 64: + alt38 = 3 + elif LA38 == 53: + LA38_21 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 21, self.input) + + raise nvae + + elif LA38 == 49 or LA38 == 50 or LA38 == 51 or LA38 == 52 or LA38 == 54 or LA38 == 55 or LA38 == 56 or LA38 == 57 or LA38 == 61: + LA38_29 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 29, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 0, self.input) + + raise nvae + + if alt38 == 1: + # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? + self.match(self.input, 66, self.FOLLOW_66_in_pointer919) + if self.failed: + return + # C.g:316:8: ( type_qualifier )+ + cnt36 = 0 + while True: #loop36 + alt36 = 2 + LA36 = self.input.LA(1) + if LA36 == 58: + LA36_2 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 59: + LA36_3 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 60: + LA36_4 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 53: + LA36_20 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 49 or LA36 == 50 or LA36 == 51 or LA36 == 52 or LA36 == 54 or LA36 == 55 or LA36 == 56 or LA36 == 57 or LA36 == 61: + LA36_28 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + + if alt36 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_pointer921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt36 >= 1: + break #loop36 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(36, self.input) + raise eee + + cnt36 += 1 + + + # C.g:316:24: ( pointer )? + alt37 = 2 + LA37_0 = self.input.LA(1) + + if (LA37_0 == 66) : + LA37_1 = self.input.LA(2) + + if (self.synpred76()) : + alt37 = 1 + if alt37 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_pointer924) + self.pointer() + self.following.pop() + if self.failed: + return + + + + + + elif alt38 == 2: + # C.g:317:4: '*' pointer + self.match(self.input, 66, self.FOLLOW_66_in_pointer930) + if self.failed: + return + self.following.append(self.FOLLOW_pointer_in_pointer932) + self.pointer() + self.following.pop() + if self.failed: + return + + + elif alt38 == 3: + # C.g:318:4: '*' + self.match(self.input, 66, self.FOLLOW_66_in_pointer937) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 25, pointer_StartIndex) + + pass + + return + + # $ANTLR end pointer + + + # $ANTLR start parameter_type_list + # C.g:321:1: parameter_type_list : parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ; + def parameter_type_list(self, ): + + parameter_type_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 26): + return + + # C.g:322:2: ( parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ) + # C.g:322:4: parameter_list ( ',' ( 'OPTIONAL' )? '...' )? + self.following.append(self.FOLLOW_parameter_list_in_parameter_type_list948) + self.parameter_list() + self.following.pop() + if self.failed: + return + # C.g:322:19: ( ',' ( 'OPTIONAL' )? '...' )? + alt40 = 2 + LA40_0 = self.input.LA(1) + + if (LA40_0 == 27) : + alt40 = 1 + if alt40 == 1: + # C.g:322:20: ',' ( 'OPTIONAL' )? '...' + self.match(self.input, 27, self.FOLLOW_27_in_parameter_type_list951) + if self.failed: + return + # C.g:322:24: ( 'OPTIONAL' )? + alt39 = 2 + LA39_0 = self.input.LA(1) + + if (LA39_0 == 53) : + alt39 = 1 + if alt39 == 1: + # C.g:322:25: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_type_list954) + if self.failed: + return + + + + self.match(self.input, 67, self.FOLLOW_67_in_parameter_type_list958) + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 26, parameter_type_list_StartIndex) + + pass + + return + + # $ANTLR end parameter_type_list + + + # $ANTLR start parameter_list + # C.g:325:1: parameter_list : parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ; + def parameter_list(self, ): + + parameter_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 27): + return + + # C.g:326:2: ( parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ) + # C.g:326:4: parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* + self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list971) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + # C.g:326:26: ( ',' ( 'OPTIONAL' )? parameter_declaration )* + while True: #loop42 + alt42 = 2 + LA42_0 = self.input.LA(1) + + if (LA42_0 == 27) : + LA42_1 = self.input.LA(2) + + if (LA42_1 == 53) : + LA42_3 = self.input.LA(3) + + if (self.synpred82()) : + alt42 = 1 + + + elif (LA42_1 == IDENTIFIER or (29 <= LA42_1 <= 42) or (45 <= LA42_1 <= 46) or (48 <= LA42_1 <= 52) or (54 <= LA42_1 <= 61) or LA42_1 == 66) : + alt42 = 1 + + + + + if alt42 == 1: + # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_parameter_list974) + if self.failed: + return + # C.g:326:31: ( 'OPTIONAL' )? + alt41 = 2 + LA41_0 = self.input.LA(1) + + if (LA41_0 == 53) : + LA41_1 = self.input.LA(2) + + if (self.synpred81()) : + alt41 = 1 + if alt41 == 1: + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_list977) + if self.failed: + return + + + + self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list981) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop42 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 27, parameter_list_StartIndex) + + pass + + return + + # $ANTLR end parameter_list + + + # $ANTLR start parameter_declaration + # C.g:329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ); + def parameter_declaration(self, ): + + parameter_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 28): + return + + # C.g:330:2: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ) + alt46 = 2 + LA46 = self.input.LA(1) + if LA46 == 29 or LA46 == 30 or LA46 == 31 or LA46 == 32 or LA46 == 33 or LA46 == 34 or LA46 == 35 or LA46 == 36 or LA46 == 37 or LA46 == 38 or LA46 == 39 or LA46 == 40 or LA46 == 41 or LA46 == 42 or LA46 == 45 or LA46 == 46 or LA46 == 48 or LA46 == 49 or LA46 == 50 or LA46 == 51 or LA46 == 52 or LA46 == 53 or LA46 == 54 or LA46 == 55 or LA46 == 56 or LA46 == 57 or LA46 == 58 or LA46 == 59 or LA46 == 60 or LA46 == 61: + alt46 = 1 + elif LA46 == IDENTIFIER: + LA46_13 = self.input.LA(2) + + if (self.synpred86()) : + alt46 = 1 + elif (True) : + alt46 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 13, self.input) + + raise nvae + + elif LA46 == 66: + alt46 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 0, self.input) + + raise nvae + + if alt46 == 1: + # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? + self.following.append(self.FOLLOW_declaration_specifiers_in_parameter_declaration994) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:330:27: ( declarator | abstract_declarator )* + while True: #loop43 + alt43 = 3 + LA43 = self.input.LA(1) + if LA43 == 66: + LA43_5 = self.input.LA(2) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == IDENTIFIER or LA43 == 58 or LA43 == 59 or LA43 == 60: + alt43 = 1 + elif LA43 == 62: + LA43 = self.input.LA(2) + if LA43 == 29 or LA43 == 30 or LA43 == 31 or LA43 == 32 or LA43 == 33 or LA43 == 34 or LA43 == 35 or LA43 == 36 or LA43 == 37 or LA43 == 38 or LA43 == 39 or LA43 == 40 or LA43 == 41 or LA43 == 42 or LA43 == 45 or LA43 == 46 or LA43 == 48 or LA43 == 49 or LA43 == 50 or LA43 == 51 or LA43 == 52 or LA43 == 53 or LA43 == 54 or LA43 == 55 or LA43 == 56 or LA43 == 57 or LA43 == 61 or LA43 == 63 or LA43 == 64: + alt43 = 2 + elif LA43 == IDENTIFIER: + LA43_37 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 58: + LA43_38 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 66: + LA43_39 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 59: + LA43_40 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 60: + LA43_41 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 62: + LA43_43 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + + elif LA43 == 64: + alt43 = 2 + + if alt43 == 1: + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_parameter_declaration997) + self.declarator() + self.following.pop() + if self.failed: + return + + + elif alt43 == 2: + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_parameter_declaration999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop43 + + + # C.g:330:61: ( 'OPTIONAL' )? + alt44 = 2 + LA44_0 = self.input.LA(1) + + if (LA44_0 == 53) : + alt44 = 1 + if alt44 == 1: + # C.g:330:62: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_declaration1004) + if self.failed: + return + + + + + + elif alt46 == 2: + # C.g:332:4: ( pointer )* IDENTIFIER + # C.g:332:4: ( pointer )* + while True: #loop45 + alt45 = 2 + LA45_0 = self.input.LA(1) + + if (LA45_0 == 66) : + alt45 = 1 + + + if alt45 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_parameter_declaration1013) + self.pointer() + self.following.pop() + if self.failed: + return + + + else: + break #loop45 + + + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_parameter_declaration1016) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 28, parameter_declaration_StartIndex) + + pass + + return + + # $ANTLR end parameter_declaration + + + # $ANTLR start identifier_list + # C.g:335:1: identifier_list : IDENTIFIER ( ',' IDENTIFIER )* ; + def identifier_list(self, ): + + identifier_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 29): + return + + # C.g:336:2: ( IDENTIFIER ( ',' IDENTIFIER )* ) + # C.g:336:4: IDENTIFIER ( ',' IDENTIFIER )* + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1027) + if self.failed: + return + # C.g:337:2: ( ',' IDENTIFIER )* + while True: #loop47 + alt47 = 2 + LA47_0 = self.input.LA(1) + + if (LA47_0 == 27) : + alt47 = 1 + + + if alt47 == 1: + # C.g:337:3: ',' IDENTIFIER + self.match(self.input, 27, self.FOLLOW_27_in_identifier_list1031) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1033) + if self.failed: + return + + + else: + break #loop47 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 29, identifier_list_StartIndex) + + pass + + return + + # $ANTLR end identifier_list + + + # $ANTLR start type_name + # C.g:340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id ); + def type_name(self, ): + + type_name_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 30): + return + + # C.g:341:2: ( specifier_qualifier_list ( abstract_declarator )? | type_id ) + alt49 = 2 + LA49_0 = self.input.LA(1) + + if ((34 <= LA49_0 <= 42) or (45 <= LA49_0 <= 46) or (48 <= LA49_0 <= 61)) : + alt49 = 1 + elif (LA49_0 == IDENTIFIER) : + LA49_13 = self.input.LA(2) + + if (self.synpred90()) : + alt49 = 1 + elif (True) : + alt49 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 13, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 0, self.input) + + raise nvae + + if alt49 == 1: + # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? + self.following.append(self.FOLLOW_specifier_qualifier_list_in_type_name1046) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + # C.g:341:29: ( abstract_declarator )? + alt48 = 2 + LA48_0 = self.input.LA(1) + + if (LA48_0 == 62 or LA48_0 == 64 or LA48_0 == 66) : + alt48 = 1 + if alt48 == 1: + # C.g:0:0: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_type_name1048) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + elif alt49 == 2: + # C.g:342:4: type_id + self.following.append(self.FOLLOW_type_id_in_type_name1054) + self.type_id() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 30, type_name_StartIndex) + + pass + + return + + # $ANTLR end type_name + + + # $ANTLR start abstract_declarator + # C.g:345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ); + def abstract_declarator(self, ): + + abstract_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 31): + return + + # C.g:346:2: ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ) + alt51 = 2 + LA51_0 = self.input.LA(1) + + if (LA51_0 == 66) : + alt51 = 1 + elif (LA51_0 == 62 or LA51_0 == 64) : + alt51 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator );", 51, 0, self.input) + + raise nvae + + if alt51 == 1: + # C.g:346:4: pointer ( direct_abstract_declarator )? + self.following.append(self.FOLLOW_pointer_in_abstract_declarator1065) + self.pointer() + self.following.pop() + if self.failed: + return + # C.g:346:12: ( direct_abstract_declarator )? + alt50 = 2 + LA50_0 = self.input.LA(1) + + if (LA50_0 == 62) : + LA50 = self.input.LA(2) + if LA50 == 63: + LA50_12 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 58: + LA50_13 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 66: + LA50_14 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 59: + LA50_15 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 60: + LA50_16 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == IDENTIFIER: + LA50_17 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 62: + LA50_18 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 64: + LA50_19 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 29 or LA50 == 30 or LA50 == 31 or LA50 == 32 or LA50 == 33: + LA50_20 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 34: + LA50_21 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 35: + LA50_22 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 36: + LA50_23 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 37: + LA50_24 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 38: + LA50_25 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 39: + LA50_26 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 40: + LA50_27 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 41: + LA50_28 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 42: + LA50_29 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 45 or LA50 == 46: + LA50_30 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 48: + LA50_31 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 49 or LA50 == 50 or LA50 == 51 or LA50 == 52 or LA50 == 53 or LA50 == 54 or LA50 == 55 or LA50 == 56 or LA50 == 57 or LA50 == 61: + LA50_32 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif (LA50_0 == 64) : + LA50 = self.input.LA(2) + if LA50 == 65: + LA50_33 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 62: + LA50_34 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == IDENTIFIER: + LA50_35 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == HEX_LITERAL: + LA50_36 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == OCTAL_LITERAL: + LA50_37 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == DECIMAL_LITERAL: + LA50_38 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == CHARACTER_LITERAL: + LA50_39 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == STRING_LITERAL: + LA50_40 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == FLOATING_POINT_LITERAL: + LA50_41 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 72: + LA50_42 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 73: + LA50_43 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 66 or LA50 == 68 or LA50 == 69 or LA50 == 77 or LA50 == 78 or LA50 == 79: + LA50_44 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 74: + LA50_45 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + if alt50 == 1: + # C.g:0:0: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1067) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + elif alt51 == 2: + # C.g:347:4: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1073) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 31, abstract_declarator_StartIndex) + + pass + + return + + # $ANTLR end abstract_declarator + + + # $ANTLR start direct_abstract_declarator + # C.g:350:1: direct_abstract_declarator : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ; + def direct_abstract_declarator(self, ): + + direct_abstract_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 32): + return + + # C.g:351:2: ( ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ) + # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* + # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) + alt52 = 2 + LA52_0 = self.input.LA(1) + + if (LA52_0 == 62) : + LA52 = self.input.LA(2) + if LA52 == IDENTIFIER or LA52 == 29 or LA52 == 30 or LA52 == 31 or LA52 == 32 or LA52 == 33 or LA52 == 34 or LA52 == 35 or LA52 == 36 or LA52 == 37 or LA52 == 38 or LA52 == 39 or LA52 == 40 or LA52 == 41 or LA52 == 42 or LA52 == 45 or LA52 == 46 or LA52 == 48 or LA52 == 49 or LA52 == 50 or LA52 == 51 or LA52 == 52 or LA52 == 53 or LA52 == 54 or LA52 == 55 or LA52 == 56 or LA52 == 57 or LA52 == 58 or LA52 == 59 or LA52 == 60 or LA52 == 61 or LA52 == 63: + alt52 = 2 + elif LA52 == 66: + LA52_18 = self.input.LA(3) + + if (self.synpred93()) : + alt52 = 1 + elif (True) : + alt52 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 18, self.input) + + raise nvae + + elif LA52 == 62 or LA52 == 64: + alt52 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 1, self.input) + + raise nvae + + elif (LA52_0 == 64) : + alt52 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 0, self.input) + + raise nvae + + if alt52 == 1: + # C.g:351:6: '(' abstract_declarator ')' + self.match(self.input, 62, self.FOLLOW_62_in_direct_abstract_declarator1086) + if self.failed: + return + self.following.append(self.FOLLOW_abstract_declarator_in_direct_abstract_declarator1088) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_direct_abstract_declarator1090) + if self.failed: + return + + + elif alt52 == 2: + # C.g:351:36: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + + # C.g:351:65: ( abstract_declarator_suffix )* + while True: #loop53 + alt53 = 2 + LA53_0 = self.input.LA(1) + + if (LA53_0 == 62) : + LA53 = self.input.LA(2) + if LA53 == 63: + LA53_12 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 58: + LA53_13 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 66: + LA53_14 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 59: + LA53_15 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 60: + LA53_16 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == IDENTIFIER: + LA53_17 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 29 or LA53 == 30 or LA53 == 31 or LA53 == 32 or LA53 == 33: + LA53_19 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 34: + LA53_20 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 35: + LA53_21 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 36: + LA53_22 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 37: + LA53_23 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 38: + LA53_24 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 39: + LA53_25 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 40: + LA53_26 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 41: + LA53_27 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 42: + LA53_28 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 45 or LA53 == 46: + LA53_29 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 48: + LA53_30 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 49 or LA53 == 50 or LA53 == 51 or LA53 == 52 or LA53 == 53 or LA53 == 54 or LA53 == 55 or LA53 == 56 or LA53 == 57 or LA53 == 61: + LA53_31 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + + elif (LA53_0 == 64) : + LA53 = self.input.LA(2) + if LA53 == 65: + LA53_33 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 62: + LA53_34 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == IDENTIFIER: + LA53_35 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == HEX_LITERAL: + LA53_36 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == OCTAL_LITERAL: + LA53_37 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == DECIMAL_LITERAL: + LA53_38 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == CHARACTER_LITERAL: + LA53_39 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == STRING_LITERAL: + LA53_40 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == FLOATING_POINT_LITERAL: + LA53_41 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 72: + LA53_42 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 73: + LA53_43 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 66 or LA53 == 68 or LA53 == 69 or LA53 == 77 or LA53 == 78 or LA53 == 79: + LA53_44 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 74: + LA53_45 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + + + + if alt53 == 1: + # C.g:0:0: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + break #loop53 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 32, direct_abstract_declarator_StartIndex) + + pass + + return + + # $ANTLR end direct_abstract_declarator + + + # $ANTLR start abstract_declarator_suffix + # C.g:354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ); + def abstract_declarator_suffix(self, ): + + abstract_declarator_suffix_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 33): + return + + # C.g:355:2: ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ) + alt54 = 4 + LA54_0 = self.input.LA(1) + + if (LA54_0 == 64) : + LA54_1 = self.input.LA(2) + + if (LA54_1 == 65) : + alt54 = 1 + elif ((IDENTIFIER <= LA54_1 <= FLOATING_POINT_LITERAL) or LA54_1 == 62 or LA54_1 == 66 or (68 <= LA54_1 <= 69) or (72 <= LA54_1 <= 74) or (77 <= LA54_1 <= 79)) : + alt54 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 1, self.input) + + raise nvae + + elif (LA54_0 == 62) : + LA54_2 = self.input.LA(2) + + if (LA54_2 == 63) : + alt54 = 3 + elif (LA54_2 == IDENTIFIER or (29 <= LA54_2 <= 42) or (45 <= LA54_2 <= 46) or (48 <= LA54_2 <= 61) or LA54_2 == 66) : + alt54 = 4 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 2, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 0, self.input) + + raise nvae + + if alt54 == 1: + # C.g:355:4: '[' ']' + self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1110) + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1112) + if self.failed: + return + + + elif alt54 == 2: + # C.g:356:4: '[' constant_expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1117) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_abstract_declarator_suffix1119) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1121) + if self.failed: + return + + + elif alt54 == 3: + # C.g:357:4: '(' ')' + self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1126) + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1128) + if self.failed: + return + + + elif alt54 == 4: + # C.g:358:4: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1133) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1137) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 33, abstract_declarator_suffix_StartIndex) + + pass + + return + + # $ANTLR end abstract_declarator_suffix + + + # $ANTLR start initializer + # C.g:361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' ); + def initializer(self, ): + + initializer_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 34): + return + + # C.g:363:2: ( assignment_expression | '{' initializer_list ( ',' )? '}' ) + alt56 = 2 + LA56_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA56_0 <= FLOATING_POINT_LITERAL) or LA56_0 == 62 or LA56_0 == 66 or (68 <= LA56_0 <= 69) or (72 <= LA56_0 <= 74) or (77 <= LA56_0 <= 79)) : + alt56 = 1 + elif (LA56_0 == 43) : + alt56 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' );", 56, 0, self.input) + + raise nvae + + if alt56 == 1: + # C.g:363:4: assignment_expression + self.following.append(self.FOLLOW_assignment_expression_in_initializer1150) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + elif alt56 == 2: + # C.g:364:4: '{' initializer_list ( ',' )? '}' + self.match(self.input, 43, self.FOLLOW_43_in_initializer1155) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_list_in_initializer1157) + self.initializer_list() + self.following.pop() + if self.failed: + return + # C.g:364:25: ( ',' )? + alt55 = 2 + LA55_0 = self.input.LA(1) + + if (LA55_0 == 27) : + alt55 = 1 + if alt55 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_initializer1159) + if self.failed: + return + + + + self.match(self.input, 44, self.FOLLOW_44_in_initializer1162) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 34, initializer_StartIndex) + + pass + + return + + # $ANTLR end initializer + + + # $ANTLR start initializer_list + # C.g:367:1: initializer_list : initializer ( ',' initializer )* ; + def initializer_list(self, ): + + initializer_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 35): + return + + # C.g:368:2: ( initializer ( ',' initializer )* ) + # C.g:368:4: initializer ( ',' initializer )* + self.following.append(self.FOLLOW_initializer_in_initializer_list1173) + self.initializer() + self.following.pop() + if self.failed: + return + # C.g:368:16: ( ',' initializer )* + while True: #loop57 + alt57 = 2 + LA57_0 = self.input.LA(1) + + if (LA57_0 == 27) : + LA57_1 = self.input.LA(2) + + if ((IDENTIFIER <= LA57_1 <= FLOATING_POINT_LITERAL) or LA57_1 == 43 or LA57_1 == 62 or LA57_1 == 66 or (68 <= LA57_1 <= 69) or (72 <= LA57_1 <= 74) or (77 <= LA57_1 <= 79)) : + alt57 = 1 + + + + + if alt57 == 1: + # C.g:368:17: ',' initializer + self.match(self.input, 27, self.FOLLOW_27_in_initializer_list1176) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_in_initializer_list1178) + self.initializer() + self.following.pop() + if self.failed: + return + + + else: + break #loop57 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 35, initializer_list_StartIndex) + + pass + + return + + # $ANTLR end initializer_list + + class argument_expression_list_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start argument_expression_list + # C.g:373:1: argument_expression_list : assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ; + def argument_expression_list(self, ): + + retval = self.argument_expression_list_return() + retval.start = self.input.LT(1) + argument_expression_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 36): + return retval + + # C.g:374:2: ( assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ) + # C.g:374:6: assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* + self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1196) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:374:28: ( 'OPTIONAL' )? + alt58 = 2 + LA58_0 = self.input.LA(1) + + if (LA58_0 == 53) : + alt58 = 1 + if alt58 == 1: + # C.g:374:29: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1199) + if self.failed: + return retval + + + + # C.g:374:42: ( ',' assignment_expression ( 'OPTIONAL' )? )* + while True: #loop60 + alt60 = 2 + LA60_0 = self.input.LA(1) + + if (LA60_0 == 27) : + alt60 = 1 + + + if alt60 == 1: + # C.g:374:43: ',' assignment_expression ( 'OPTIONAL' )? + self.match(self.input, 27, self.FOLLOW_27_in_argument_expression_list1204) + if self.failed: + return retval + self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1206) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:374:69: ( 'OPTIONAL' )? + alt59 = 2 + LA59_0 = self.input.LA(1) + + if (LA59_0 == 53) : + alt59 = 1 + if alt59 == 1: + # C.g:374:70: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1209) + if self.failed: + return retval + + + + + + else: + break #loop60 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 36, argument_expression_list_StartIndex) + + pass + + return retval + + # $ANTLR end argument_expression_list + + + # $ANTLR start additive_expression + # C.g:377:1: additive_expression : ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ; + def additive_expression(self, ): + + additive_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 37): + return + + # C.g:378:2: ( ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ) + # C.g:378:4: ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* + # C.g:378:4: ( multiplicative_expression ) + # C.g:378:5: multiplicative_expression + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1225) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + + # C.g:378:32: ( '+' multiplicative_expression | '-' multiplicative_expression )* + while True: #loop61 + alt61 = 3 + LA61_0 = self.input.LA(1) + + if (LA61_0 == 68) : + alt61 = 1 + elif (LA61_0 == 69) : + alt61 = 2 + + + if alt61 == 1: + # C.g:378:33: '+' multiplicative_expression + self.match(self.input, 68, self.FOLLOW_68_in_additive_expression1229) + if self.failed: + return + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1231) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + elif alt61 == 2: + # C.g:378:65: '-' multiplicative_expression + self.match(self.input, 69, self.FOLLOW_69_in_additive_expression1235) + if self.failed: + return + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1237) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop61 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 37, additive_expression_StartIndex) + + pass + + return + + # $ANTLR end additive_expression + + + # $ANTLR start multiplicative_expression + # C.g:381:1: multiplicative_expression : ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ; + def multiplicative_expression(self, ): + + multiplicative_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 38): + return + + # C.g:382:2: ( ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ) + # C.g:382:4: ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* + # C.g:382:4: ( cast_expression ) + # C.g:382:5: cast_expression + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1251) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + + # C.g:382:22: ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* + while True: #loop62 + alt62 = 4 + LA62 = self.input.LA(1) + if LA62 == 66: + alt62 = 1 + elif LA62 == 70: + alt62 = 2 + elif LA62 == 71: + alt62 = 3 + + if alt62 == 1: + # C.g:382:23: '*' cast_expression + self.match(self.input, 66, self.FOLLOW_66_in_multiplicative_expression1255) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1257) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt62 == 2: + # C.g:382:45: '/' cast_expression + self.match(self.input, 70, self.FOLLOW_70_in_multiplicative_expression1261) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1263) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt62 == 3: + # C.g:382:67: '%' cast_expression + self.match(self.input, 71, self.FOLLOW_71_in_multiplicative_expression1267) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1269) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop62 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 38, multiplicative_expression_StartIndex) + + pass + + return + + # $ANTLR end multiplicative_expression + + + # $ANTLR start cast_expression + # C.g:385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression ); + def cast_expression(self, ): + + cast_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 39): + return + + # C.g:386:2: ( '(' type_name ')' cast_expression | unary_expression ) + alt63 = 2 + LA63_0 = self.input.LA(1) + + if (LA63_0 == 62) : + LA63 = self.input.LA(2) + if LA63 == 34 or LA63 == 35 or LA63 == 36 or LA63 == 37 or LA63 == 38 or LA63 == 39 or LA63 == 40 or LA63 == 41 or LA63 == 42 or LA63 == 45 or LA63 == 46 or LA63 == 48 or LA63 == 49 or LA63 == 50 or LA63 == 51 or LA63 == 52 or LA63 == 53 or LA63 == 54 or LA63 == 55 or LA63 == 56 or LA63 == 57 or LA63 == 58 or LA63 == 59 or LA63 == 60 or LA63 == 61: + alt63 = 1 + elif LA63 == IDENTIFIER: + LA63_25 = self.input.LA(3) + + if (self.synpred109()) : + alt63 = 1 + elif (True) : + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 25, self.input) + + raise nvae + + elif LA63 == HEX_LITERAL or LA63 == OCTAL_LITERAL or LA63 == DECIMAL_LITERAL or LA63 == CHARACTER_LITERAL or LA63 == STRING_LITERAL or LA63 == FLOATING_POINT_LITERAL or LA63 == 62 or LA63 == 66 or LA63 == 68 or LA63 == 69 or LA63 == 72 or LA63 == 73 or LA63 == 74 or LA63 == 77 or LA63 == 78 or LA63 == 79: + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 1, self.input) + + raise nvae + + elif ((IDENTIFIER <= LA63_0 <= FLOATING_POINT_LITERAL) or LA63_0 == 66 or (68 <= LA63_0 <= 69) or (72 <= LA63_0 <= 74) or (77 <= LA63_0 <= 79)) : + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 0, self.input) + + raise nvae + + if alt63 == 1: + # C.g:386:4: '(' type_name ')' cast_expression + self.match(self.input, 62, self.FOLLOW_62_in_cast_expression1282) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_cast_expression1284) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_cast_expression1286) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_cast_expression1288) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt63 == 2: + # C.g:387:4: unary_expression + self.following.append(self.FOLLOW_unary_expression_in_cast_expression1293) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 39, cast_expression_StartIndex) + + pass + + return + + # $ANTLR end cast_expression + + + # $ANTLR start unary_expression + # C.g:390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ); + def unary_expression(self, ): + + unary_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 40): + return + + # C.g:391:2: ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ) + alt64 = 6 + LA64 = self.input.LA(1) + if LA64 == IDENTIFIER or LA64 == HEX_LITERAL or LA64 == OCTAL_LITERAL or LA64 == DECIMAL_LITERAL or LA64 == CHARACTER_LITERAL or LA64 == STRING_LITERAL or LA64 == FLOATING_POINT_LITERAL or LA64 == 62: + alt64 = 1 + elif LA64 == 72: + alt64 = 2 + elif LA64 == 73: + alt64 = 3 + elif LA64 == 66 or LA64 == 68 or LA64 == 69 or LA64 == 77 or LA64 == 78 or LA64 == 79: + alt64 = 4 + elif LA64 == 74: + LA64_12 = self.input.LA(2) + + if (LA64_12 == 62) : + LA64_13 = self.input.LA(3) + + if (self.synpred114()) : + alt64 = 5 + elif (True) : + alt64 = 6 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 13, self.input) + + raise nvae + + elif ((IDENTIFIER <= LA64_12 <= FLOATING_POINT_LITERAL) or LA64_12 == 66 or (68 <= LA64_12 <= 69) or (72 <= LA64_12 <= 74) or (77 <= LA64_12 <= 79)) : + alt64 = 5 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 12, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 0, self.input) + + raise nvae + + if alt64 == 1: + # C.g:391:4: postfix_expression + self.following.append(self.FOLLOW_postfix_expression_in_unary_expression1304) + self.postfix_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 2: + # C.g:392:4: '++' unary_expression + self.match(self.input, 72, self.FOLLOW_72_in_unary_expression1309) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1311) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 3: + # C.g:393:4: '--' unary_expression + self.match(self.input, 73, self.FOLLOW_73_in_unary_expression1316) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1318) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 4: + # C.g:394:4: unary_operator cast_expression + self.following.append(self.FOLLOW_unary_operator_in_unary_expression1323) + self.unary_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_unary_expression1325) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 5: + # C.g:395:4: 'sizeof' unary_expression + self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1330) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1332) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 6: + # C.g:396:4: 'sizeof' '(' type_name ')' + self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1337) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_unary_expression1339) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_unary_expression1341) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_unary_expression1343) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 40, unary_expression_StartIndex) + + pass + + return + + # $ANTLR end unary_expression + + + # $ANTLR start postfix_expression + # C.g:399:1: postfix_expression : p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ; + def postfix_expression(self, ): + self.postfix_expression_stack.append(postfix_expression_scope()) + postfix_expression_StartIndex = self.input.index() + a = None + b = None + x = None + y = None + z = None + p = None + + c = None + + + + self.postfix_expression_stack[-1].FuncCallText = '' + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 41): + return + + # C.g:406:2: (p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ) + # C.g:406:6: p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* + self.following.append(self.FOLLOW_primary_expression_in_postfix_expression1367) + p = self.primary_expression() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += self.input.toString(p.start,p.stop) + + # C.g:407:9: ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* + while True: #loop65 + alt65 = 10 + LA65 = self.input.LA(1) + if LA65 == 66: + LA65_1 = self.input.LA(2) + + if (LA65_1 == IDENTIFIER) : + LA65_30 = self.input.LA(3) + + if (self.synpred120()) : + alt65 = 6 + + + + + elif LA65 == 64: + alt65 = 1 + elif LA65 == 62: + LA65 = self.input.LA(2) + if LA65 == 63: + alt65 = 2 + elif LA65 == 29 or LA65 == 30 or LA65 == 31 or LA65 == 32 or LA65 == 33 or LA65 == 34 or LA65 == 35 or LA65 == 36 or LA65 == 37 or LA65 == 38 or LA65 == 39 or LA65 == 40 or LA65 == 41 or LA65 == 42 or LA65 == 45 or LA65 == 46 or LA65 == 48 or LA65 == 49 or LA65 == 50 or LA65 == 51 or LA65 == 52 or LA65 == 53 or LA65 == 54 or LA65 == 55 or LA65 == 56 or LA65 == 57 or LA65 == 58 or LA65 == 59 or LA65 == 60 or LA65 == 61: + alt65 = 4 + elif LA65 == IDENTIFIER: + LA65_55 = self.input.LA(3) + + if (self.synpred117()) : + alt65 = 3 + elif (self.synpred118()) : + alt65 = 4 + + + elif LA65 == 66: + LA65_57 = self.input.LA(3) + + if (self.synpred117()) : + alt65 = 3 + elif (self.synpred118()) : + alt65 = 4 + + + elif LA65 == HEX_LITERAL or LA65 == OCTAL_LITERAL or LA65 == DECIMAL_LITERAL or LA65 == CHARACTER_LITERAL or LA65 == STRING_LITERAL or LA65 == FLOATING_POINT_LITERAL or LA65 == 62 or LA65 == 68 or LA65 == 69 or LA65 == 72 or LA65 == 73 or LA65 == 74 or LA65 == 77 or LA65 == 78 or LA65 == 79: + alt65 = 3 + + elif LA65 == 75: + alt65 = 5 + elif LA65 == 76: + alt65 = 7 + elif LA65 == 72: + alt65 = 8 + elif LA65 == 73: + alt65 = 9 + + if alt65 == 1: + # C.g:407:13: '[' expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_postfix_expression1383) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_postfix_expression1385) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_postfix_expression1387) + if self.failed: + return + + + elif alt65 == 2: + # C.g:408:13: '(' a= ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1401) + if self.failed: + return + a = self.input.LT(1) + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1405) + if self.failed: + return + if self.backtracking == 0: + self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, a.line, a.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, '') + + + + elif alt65 == 3: + # C.g:409:13: '(' c= argument_expression_list b= ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1420) + if self.failed: + return + self.following.append(self.FOLLOW_argument_expression_list_in_postfix_expression1424) + c = self.argument_expression_list() + self.following.pop() + if self.failed: + return + b = self.input.LT(1) + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1428) + if self.failed: + return + if self.backtracking == 0: + self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, b.line, b.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, self.input.toString(c.start,c.stop)) + + + + elif alt65 == 4: + # C.g:410:13: '(' macro_parameter_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1444) + if self.failed: + return + self.following.append(self.FOLLOW_macro_parameter_list_in_postfix_expression1446) + self.macro_parameter_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1448) + if self.failed: + return + + + elif alt65 == 5: + # C.g:411:13: '.' x= IDENTIFIER + self.match(self.input, 75, self.FOLLOW_75_in_postfix_expression1462) + if self.failed: + return + x = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1466) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += '.' + x.text + + + + elif alt65 == 6: + # C.g:412:13: '*' y= IDENTIFIER + self.match(self.input, 66, self.FOLLOW_66_in_postfix_expression1482) + if self.failed: + return + y = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1486) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText = y.text + + + + elif alt65 == 7: + # C.g:413:13: '->' z= IDENTIFIER + self.match(self.input, 76, self.FOLLOW_76_in_postfix_expression1502) + if self.failed: + return + z = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1506) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += '->' + z.text + + + + elif alt65 == 8: + # C.g:414:13: '++' + self.match(self.input, 72, self.FOLLOW_72_in_postfix_expression1522) + if self.failed: + return + + + elif alt65 == 9: + # C.g:415:13: '--' + self.match(self.input, 73, self.FOLLOW_73_in_postfix_expression1536) + if self.failed: + return + + + else: + break #loop65 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 41, postfix_expression_StartIndex) + + self.postfix_expression_stack.pop() + pass + + return + + # $ANTLR end postfix_expression + + + # $ANTLR start macro_parameter_list + # C.g:419:1: macro_parameter_list : parameter_declaration ( ',' parameter_declaration )* ; + def macro_parameter_list(self, ): + + macro_parameter_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 42): + return + + # C.g:420:2: ( parameter_declaration ( ',' parameter_declaration )* ) + # C.g:420:4: parameter_declaration ( ',' parameter_declaration )* + self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1559) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + # C.g:420:26: ( ',' parameter_declaration )* + while True: #loop66 + alt66 = 2 + LA66_0 = self.input.LA(1) + + if (LA66_0 == 27) : + alt66 = 1 + + + if alt66 == 1: + # C.g:420:27: ',' parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_macro_parameter_list1562) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1564) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop66 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 42, macro_parameter_list_StartIndex) + + pass + + return + + # $ANTLR end macro_parameter_list + + + # $ANTLR start unary_operator + # C.g:423:1: unary_operator : ( '&' | '*' | '+' | '-' | '~' | '!' ); + def unary_operator(self, ): + + unary_operator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 43): + return + + # C.g:424:2: ( '&' | '*' | '+' | '-' | '~' | '!' ) + # C.g: + if self.input.LA(1) == 66 or (68 <= self.input.LA(1) <= 69) or (77 <= self.input.LA(1) <= 79): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_unary_operator0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 43, unary_operator_StartIndex) + + pass + + return + + # $ANTLR end unary_operator + + class primary_expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start primary_expression + # C.g:432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' ); + def primary_expression(self, ): + + retval = self.primary_expression_return() + retval.start = self.input.LT(1) + primary_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 44): + return retval + + # C.g:433:2: ( IDENTIFIER | constant | '(' expression ')' ) + alt67 = 3 + LA67 = self.input.LA(1) + if LA67 == IDENTIFIER: + LA67_1 = self.input.LA(2) + + if (LA67_1 == EOF or LA67_1 == 25 or (27 <= LA67_1 <= 28) or LA67_1 == 44 or LA67_1 == 47 or LA67_1 == 53 or (62 <= LA67_1 <= 66) or (68 <= LA67_1 <= 73) or (75 <= LA67_1 <= 77) or (80 <= LA67_1 <= 102)) : + alt67 = 1 + elif (LA67_1 == IDENTIFIER or LA67_1 == STRING_LITERAL) : + alt67 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 1, self.input) + + raise nvae + + elif LA67 == HEX_LITERAL or LA67 == OCTAL_LITERAL or LA67 == DECIMAL_LITERAL or LA67 == CHARACTER_LITERAL or LA67 == STRING_LITERAL or LA67 == FLOATING_POINT_LITERAL: + alt67 = 2 + elif LA67 == 62: + alt67 = 3 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 0, self.input) + + raise nvae + + if alt67 == 1: + # C.g:433:4: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_primary_expression1613) + if self.failed: + return retval + + + elif alt67 == 2: + # C.g:434:4: constant + self.following.append(self.FOLLOW_constant_in_primary_expression1618) + self.constant() + self.following.pop() + if self.failed: + return retval + + + elif alt67 == 3: + # C.g:435:4: '(' expression ')' + self.match(self.input, 62, self.FOLLOW_62_in_primary_expression1623) + if self.failed: + return retval + self.following.append(self.FOLLOW_expression_in_primary_expression1625) + self.expression() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 63, self.FOLLOW_63_in_primary_expression1627) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 44, primary_expression_StartIndex) + + pass + + return retval + + # $ANTLR end primary_expression + + + # $ANTLR start constant + # C.g:438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ); + def constant(self, ): + + constant_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 45): + return + + # C.g:439:5: ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ) + alt72 = 6 + LA72 = self.input.LA(1) + if LA72 == HEX_LITERAL: + alt72 = 1 + elif LA72 == OCTAL_LITERAL: + alt72 = 2 + elif LA72 == DECIMAL_LITERAL: + alt72 = 3 + elif LA72 == CHARACTER_LITERAL: + alt72 = 4 + elif LA72 == IDENTIFIER or LA72 == STRING_LITERAL: + alt72 = 5 + elif LA72 == FLOATING_POINT_LITERAL: + alt72 = 6 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL );", 72, 0, self.input) + + raise nvae + + if alt72 == 1: + # C.g:439:9: HEX_LITERAL + self.match(self.input, HEX_LITERAL, self.FOLLOW_HEX_LITERAL_in_constant1643) + if self.failed: + return + + + elif alt72 == 2: + # C.g:440:9: OCTAL_LITERAL + self.match(self.input, OCTAL_LITERAL, self.FOLLOW_OCTAL_LITERAL_in_constant1653) + if self.failed: + return + + + elif alt72 == 3: + # C.g:441:9: DECIMAL_LITERAL + self.match(self.input, DECIMAL_LITERAL, self.FOLLOW_DECIMAL_LITERAL_in_constant1663) + if self.failed: + return + + + elif alt72 == 4: + # C.g:442:7: CHARACTER_LITERAL + self.match(self.input, CHARACTER_LITERAL, self.FOLLOW_CHARACTER_LITERAL_in_constant1671) + if self.failed: + return + + + elif alt72 == 5: + # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* + # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ + cnt70 = 0 + while True: #loop70 + alt70 = 2 + LA70_0 = self.input.LA(1) + + if (LA70_0 == IDENTIFIER) : + LA70_1 = self.input.LA(2) + + if (LA70_1 == STRING_LITERAL) : + alt70 = 1 + elif (LA70_1 == IDENTIFIER) : + LA70_33 = self.input.LA(3) + + if (self.synpred138()) : + alt70 = 1 + + + + + elif (LA70_0 == STRING_LITERAL) : + alt70 = 1 + + + if alt70 == 1: + # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ + # C.g:443:8: ( IDENTIFIER )* + while True: #loop68 + alt68 = 2 + LA68_0 = self.input.LA(1) + + if (LA68_0 == IDENTIFIER) : + alt68 = 1 + + + if alt68 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1680) + if self.failed: + return + + + else: + break #loop68 + + + # C.g:443:20: ( STRING_LITERAL )+ + cnt69 = 0 + while True: #loop69 + alt69 = 2 + LA69_0 = self.input.LA(1) + + if (LA69_0 == STRING_LITERAL) : + LA69_31 = self.input.LA(2) + + if (self.synpred137()) : + alt69 = 1 + + + + + if alt69 == 1: + # C.g:0:0: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_constant1683) + if self.failed: + return + + + else: + if cnt69 >= 1: + break #loop69 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(69, self.input) + raise eee + + cnt69 += 1 + + + + + else: + if cnt70 >= 1: + break #loop70 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(70, self.input) + raise eee + + cnt70 += 1 + + + # C.g:443:38: ( IDENTIFIER )* + while True: #loop71 + alt71 = 2 + LA71_0 = self.input.LA(1) + + if (LA71_0 == IDENTIFIER) : + alt71 = 1 + + + if alt71 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1688) + if self.failed: + return + + + else: + break #loop71 + + + + + elif alt72 == 6: + # C.g:444:9: FLOATING_POINT_LITERAL + self.match(self.input, FLOATING_POINT_LITERAL, self.FOLLOW_FLOATING_POINT_LITERAL_in_constant1699) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 45, constant_StartIndex) + + pass + + return + + # $ANTLR end constant + + class expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start expression + # C.g:449:1: expression : assignment_expression ( ',' assignment_expression )* ; + def expression(self, ): + + retval = self.expression_return() + retval.start = self.input.LT(1) + expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 46): + return retval + + # C.g:450:2: ( assignment_expression ( ',' assignment_expression )* ) + # C.g:450:4: assignment_expression ( ',' assignment_expression )* + self.following.append(self.FOLLOW_assignment_expression_in_expression1715) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:450:26: ( ',' assignment_expression )* + while True: #loop73 + alt73 = 2 + LA73_0 = self.input.LA(1) + + if (LA73_0 == 27) : + alt73 = 1 + + + if alt73 == 1: + # C.g:450:27: ',' assignment_expression + self.match(self.input, 27, self.FOLLOW_27_in_expression1718) + if self.failed: + return retval + self.following.append(self.FOLLOW_assignment_expression_in_expression1720) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop73 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 46, expression_StartIndex) + + pass + + return retval + + # $ANTLR end expression + + + # $ANTLR start constant_expression + # C.g:453:1: constant_expression : conditional_expression ; + def constant_expression(self, ): + + constant_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 47): + return + + # C.g:454:2: ( conditional_expression ) + # C.g:454:4: conditional_expression + self.following.append(self.FOLLOW_conditional_expression_in_constant_expression1733) + self.conditional_expression() + self.following.pop() + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 47, constant_expression_StartIndex) + + pass + + return + + # $ANTLR end constant_expression + + + # $ANTLR start assignment_expression + # C.g:457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression ); + def assignment_expression(self, ): + + assignment_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 48): + return + + # C.g:458:2: ( lvalue assignment_operator assignment_expression | conditional_expression ) + alt74 = 2 + LA74 = self.input.LA(1) + if LA74 == IDENTIFIER: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_13 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 13, self.input) + + raise nvae + + elif LA74 == 62: + LA74_14 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 14, self.input) + + raise nvae + + elif LA74 == 75: + LA74_15 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 15, self.input) + + raise nvae + + elif LA74 == 66: + LA74_16 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 16, self.input) + + raise nvae + + elif LA74 == 76: + LA74_17 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 17, self.input) + + raise nvae + + elif LA74 == 72: + LA74_18 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 18, self.input) + + raise nvae + + elif LA74 == 73: + LA74_19 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 19, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + elif LA74 == STRING_LITERAL: + LA74_21 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 21, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_22 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 22, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 1, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_44 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 44, self.input) + + raise nvae + + elif LA74 == 62: + LA74_45 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 45, self.input) + + raise nvae + + elif LA74 == 75: + LA74_46 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 46, self.input) + + raise nvae + + elif LA74 == 66: + LA74_47 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 47, self.input) + + raise nvae + + elif LA74 == 76: + LA74_48 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 48, self.input) + + raise nvae + + elif LA74 == 72: + LA74_49 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 49, self.input) + + raise nvae + + elif LA74 == 73: + LA74_50 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 50, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 2, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_73 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 73, self.input) + + raise nvae + + elif LA74 == 62: + LA74_74 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 74, self.input) + + raise nvae + + elif LA74 == 75: + LA74_75 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 75, self.input) + + raise nvae + + elif LA74 == 66: + LA74_76 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 76, self.input) + + raise nvae + + elif LA74 == 76: + LA74_77 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 77, self.input) + + raise nvae + + elif LA74 == 72: + LA74_78 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 78, self.input) + + raise nvae + + elif LA74 == 73: + LA74_79 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 79, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 3, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_102 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 102, self.input) + + raise nvae + + elif LA74 == 62: + LA74_103 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 103, self.input) + + raise nvae + + elif LA74 == 75: + LA74_104 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 104, self.input) + + raise nvae + + elif LA74 == 66: + LA74_105 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 105, self.input) + + raise nvae + + elif LA74 == 76: + LA74_106 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 106, self.input) + + raise nvae + + elif LA74 == 72: + LA74_107 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 107, self.input) + + raise nvae + + elif LA74 == 73: + LA74_108 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 108, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 4, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_131 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 131, self.input) + + raise nvae + + elif LA74 == 62: + LA74_132 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 132, self.input) + + raise nvae + + elif LA74 == 75: + LA74_133 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 133, self.input) + + raise nvae + + elif LA74 == 66: + LA74_134 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 134, self.input) + + raise nvae + + elif LA74 == 76: + LA74_135 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 135, self.input) + + raise nvae + + elif LA74 == 72: + LA74_136 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 136, self.input) + + raise nvae + + elif LA74 == 73: + LA74_137 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 137, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 5, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_160 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 160, self.input) + + raise nvae + + elif LA74 == 64: + LA74_161 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 161, self.input) + + raise nvae + + elif LA74 == 62: + LA74_162 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 162, self.input) + + raise nvae + + elif LA74 == 75: + LA74_163 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 163, self.input) + + raise nvae + + elif LA74 == 66: + LA74_164 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 164, self.input) + + raise nvae + + elif LA74 == 76: + LA74_165 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 165, self.input) + + raise nvae + + elif LA74 == 72: + LA74_166 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 166, self.input) + + raise nvae + + elif LA74 == 73: + LA74_167 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 167, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == STRING_LITERAL: + LA74_189 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 189, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 6, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_191 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 191, self.input) + + raise nvae + + elif LA74 == 62: + LA74_192 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 192, self.input) + + raise nvae + + elif LA74 == 75: + LA74_193 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 193, self.input) + + raise nvae + + elif LA74 == 66: + LA74_194 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 194, self.input) + + raise nvae + + elif LA74 == 76: + LA74_195 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 195, self.input) + + raise nvae + + elif LA74 == 72: + LA74_196 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 196, self.input) + + raise nvae + + elif LA74 == 73: + LA74_197 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 197, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 7, self.input) + + raise nvae + + elif LA74 == 62: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_220 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 220, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_221 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 221, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_222 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 222, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_223 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 223, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_224 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 224, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_225 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 225, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_226 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 226, self.input) + + raise nvae + + elif LA74 == 62: + LA74_227 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 227, self.input) + + raise nvae + + elif LA74 == 72: + LA74_228 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 228, self.input) + + raise nvae + + elif LA74 == 73: + LA74_229 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 229, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_230 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 230, self.input) + + raise nvae + + elif LA74 == 74: + LA74_231 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 231, self.input) + + raise nvae + + elif LA74 == 34 or LA74 == 35 or LA74 == 36 or LA74 == 37 or LA74 == 38 or LA74 == 39 or LA74 == 40 or LA74 == 41 or LA74 == 42 or LA74 == 45 or LA74 == 46 or LA74 == 48 or LA74 == 49 or LA74 == 50 or LA74 == 51 or LA74 == 52 or LA74 == 53 or LA74 == 54 or LA74 == 55 or LA74 == 56 or LA74 == 57 or LA74 == 58 or LA74 == 59 or LA74 == 60 or LA74 == 61: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 8, self.input) + + raise nvae + + elif LA74 == 72: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_244 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 244, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_245 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 245, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_246 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 246, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_247 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 247, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_248 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 248, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_249 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 249, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_250 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 250, self.input) + + raise nvae + + elif LA74 == 62: + LA74_251 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 251, self.input) + + raise nvae + + elif LA74 == 72: + LA74_252 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 252, self.input) + + raise nvae + + elif LA74 == 73: + LA74_253 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 253, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_254 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 254, self.input) + + raise nvae + + elif LA74 == 74: + LA74_255 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 255, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 9, self.input) + + raise nvae + + elif LA74 == 73: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_256 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 256, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_257 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 257, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_258 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 258, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_259 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 259, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_260 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 260, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_261 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 261, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_262 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 262, self.input) + + raise nvae + + elif LA74 == 62: + LA74_263 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 263, self.input) + + raise nvae + + elif LA74 == 72: + LA74_264 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 264, self.input) + + raise nvae + + elif LA74 == 73: + LA74_265 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 265, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_266 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 266, self.input) + + raise nvae + + elif LA74 == 74: + LA74_267 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 267, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 10, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74 = self.input.LA(2) + if LA74 == 62: + LA74_268 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 268, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_269 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 269, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_270 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 270, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_271 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 271, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_272 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 272, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_273 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 273, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_274 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 274, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_275 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 275, self.input) + + raise nvae + + elif LA74 == 72: + LA74_276 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 276, self.input) + + raise nvae + + elif LA74 == 73: + LA74_277 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 277, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_278 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 278, self.input) + + raise nvae + + elif LA74 == 74: + LA74_279 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 279, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 11, self.input) + + raise nvae + + elif LA74 == 74: + LA74 = self.input.LA(2) + if LA74 == 62: + LA74_280 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 280, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_281 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 281, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_282 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 282, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_283 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 283, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_284 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 284, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_285 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 285, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_286 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 286, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_287 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 287, self.input) + + raise nvae + + elif LA74 == 72: + LA74_288 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 288, self.input) + + raise nvae + + elif LA74 == 73: + LA74_289 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 289, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_290 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 290, self.input) + + raise nvae + + elif LA74 == 74: + LA74_291 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 291, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 12, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 0, self.input) + + raise nvae + + if alt74 == 1: + # C.g:458:4: lvalue assignment_operator assignment_expression + self.following.append(self.FOLLOW_lvalue_in_assignment_expression1744) + self.lvalue() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_operator_in_assignment_expression1746) + self.assignment_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_expression_in_assignment_expression1748) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + elif alt74 == 2: + # C.g:459:4: conditional_expression + self.following.append(self.FOLLOW_conditional_expression_in_assignment_expression1753) + self.conditional_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 48, assignment_expression_StartIndex) + + pass + + return + + # $ANTLR end assignment_expression + + + # $ANTLR start lvalue + # C.g:462:1: lvalue : unary_expression ; + def lvalue(self, ): + + lvalue_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 49): + return + + # C.g:463:2: ( unary_expression ) + # C.g:463:4: unary_expression + self.following.append(self.FOLLOW_unary_expression_in_lvalue1765) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 49, lvalue_StartIndex) + + pass + + return + + # $ANTLR end lvalue + + + # $ANTLR start assignment_operator + # C.g:466:1: assignment_operator : ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ); + def assignment_operator(self, ): + + assignment_operator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 50): + return + + # C.g:467:2: ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ) + # C.g: + if self.input.LA(1) == 28 or (80 <= self.input.LA(1) <= 89): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_assignment_operator0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 50, assignment_operator_StartIndex) + + pass + + return + + # $ANTLR end assignment_operator + + + # $ANTLR start conditional_expression + # C.g:480:1: conditional_expression : e= logical_or_expression ( '?' expression ':' conditional_expression )? ; + def conditional_expression(self, ): + + conditional_expression_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 51): + return + + # C.g:481:2: (e= logical_or_expression ( '?' expression ':' conditional_expression )? ) + # C.g:481:4: e= logical_or_expression ( '?' expression ':' conditional_expression )? + self.following.append(self.FOLLOW_logical_or_expression_in_conditional_expression1839) + e = self.logical_or_expression() + self.following.pop() + if self.failed: + return + # C.g:481:28: ( '?' expression ':' conditional_expression )? + alt75 = 2 + LA75_0 = self.input.LA(1) + + if (LA75_0 == 90) : + alt75 = 1 + if alt75 == 1: + # C.g:481:29: '?' expression ':' conditional_expression + self.match(self.input, 90, self.FOLLOW_90_in_conditional_expression1842) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_conditional_expression1844) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_conditional_expression1846) + if self.failed: + return + self.following.append(self.FOLLOW_conditional_expression_in_conditional_expression1848) + self.conditional_expression() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 51, conditional_expression_StartIndex) + + pass + + return + + # $ANTLR end conditional_expression + + class logical_or_expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start logical_or_expression + # C.g:484:1: logical_or_expression : logical_and_expression ( '||' logical_and_expression )* ; + def logical_or_expression(self, ): + + retval = self.logical_or_expression_return() + retval.start = self.input.LT(1) + logical_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 52): + return retval + + # C.g:485:2: ( logical_and_expression ( '||' logical_and_expression )* ) + # C.g:485:4: logical_and_expression ( '||' logical_and_expression )* + self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1863) + self.logical_and_expression() + self.following.pop() + if self.failed: + return retval + # C.g:485:27: ( '||' logical_and_expression )* + while True: #loop76 + alt76 = 2 + LA76_0 = self.input.LA(1) + + if (LA76_0 == 91) : + alt76 = 1 + + + if alt76 == 1: + # C.g:485:28: '||' logical_and_expression + self.match(self.input, 91, self.FOLLOW_91_in_logical_or_expression1866) + if self.failed: + return retval + self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1868) + self.logical_and_expression() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop76 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 52, logical_or_expression_StartIndex) + + pass + + return retval + + # $ANTLR end logical_or_expression + + + # $ANTLR start logical_and_expression + # C.g:488:1: logical_and_expression : inclusive_or_expression ( '&&' inclusive_or_expression )* ; + def logical_and_expression(self, ): + + logical_and_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 53): + return + + # C.g:489:2: ( inclusive_or_expression ( '&&' inclusive_or_expression )* ) + # C.g:489:4: inclusive_or_expression ( '&&' inclusive_or_expression )* + self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1881) + self.inclusive_or_expression() + self.following.pop() + if self.failed: + return + # C.g:489:28: ( '&&' inclusive_or_expression )* + while True: #loop77 + alt77 = 2 + LA77_0 = self.input.LA(1) + + if (LA77_0 == 92) : + alt77 = 1 + + + if alt77 == 1: + # C.g:489:29: '&&' inclusive_or_expression + self.match(self.input, 92, self.FOLLOW_92_in_logical_and_expression1884) + if self.failed: + return + self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1886) + self.inclusive_or_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop77 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 53, logical_and_expression_StartIndex) + + pass + + return + + # $ANTLR end logical_and_expression + + + # $ANTLR start inclusive_or_expression + # C.g:492:1: inclusive_or_expression : exclusive_or_expression ( '|' exclusive_or_expression )* ; + def inclusive_or_expression(self, ): + + inclusive_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 54): + return + + # C.g:493:2: ( exclusive_or_expression ( '|' exclusive_or_expression )* ) + # C.g:493:4: exclusive_or_expression ( '|' exclusive_or_expression )* + self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899) + self.exclusive_or_expression() + self.following.pop() + if self.failed: + return + # C.g:493:28: ( '|' exclusive_or_expression )* + while True: #loop78 + alt78 = 2 + LA78_0 = self.input.LA(1) + + if (LA78_0 == 93) : + alt78 = 1 + + + if alt78 == 1: + # C.g:493:29: '|' exclusive_or_expression + self.match(self.input, 93, self.FOLLOW_93_in_inclusive_or_expression1902) + if self.failed: + return + self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904) + self.exclusive_or_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop78 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 54, inclusive_or_expression_StartIndex) + + pass + + return + + # $ANTLR end inclusive_or_expression + + + # $ANTLR start exclusive_or_expression + # C.g:496:1: exclusive_or_expression : and_expression ( '^' and_expression )* ; + def exclusive_or_expression(self, ): + + exclusive_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 55): + return + + # C.g:497:2: ( and_expression ( '^' and_expression )* ) + # C.g:497:4: and_expression ( '^' and_expression )* + self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1917) + self.and_expression() + self.following.pop() + if self.failed: + return + # C.g:497:19: ( '^' and_expression )* + while True: #loop79 + alt79 = 2 + LA79_0 = self.input.LA(1) + + if (LA79_0 == 94) : + alt79 = 1 + + + if alt79 == 1: + # C.g:497:20: '^' and_expression + self.match(self.input, 94, self.FOLLOW_94_in_exclusive_or_expression1920) + if self.failed: + return + self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1922) + self.and_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop79 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 55, exclusive_or_expression_StartIndex) + + pass + + return + + # $ANTLR end exclusive_or_expression + + + # $ANTLR start and_expression + # C.g:500:1: and_expression : equality_expression ( '&' equality_expression )* ; + def and_expression(self, ): + + and_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 56): + return + + # C.g:501:2: ( equality_expression ( '&' equality_expression )* ) + # C.g:501:4: equality_expression ( '&' equality_expression )* + self.following.append(self.FOLLOW_equality_expression_in_and_expression1935) + self.equality_expression() + self.following.pop() + if self.failed: + return + # C.g:501:24: ( '&' equality_expression )* + while True: #loop80 + alt80 = 2 + LA80_0 = self.input.LA(1) + + if (LA80_0 == 77) : + alt80 = 1 + + + if alt80 == 1: + # C.g:501:25: '&' equality_expression + self.match(self.input, 77, self.FOLLOW_77_in_and_expression1938) + if self.failed: + return + self.following.append(self.FOLLOW_equality_expression_in_and_expression1940) + self.equality_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop80 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 56, and_expression_StartIndex) + + pass + + return + + # $ANTLR end and_expression + + + # $ANTLR start equality_expression + # C.g:503:1: equality_expression : relational_expression ( ( '==' | '!=' ) relational_expression )* ; + def equality_expression(self, ): + + equality_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 57): + return + + # C.g:504:2: ( relational_expression ( ( '==' | '!=' ) relational_expression )* ) + # C.g:504:4: relational_expression ( ( '==' | '!=' ) relational_expression )* + self.following.append(self.FOLLOW_relational_expression_in_equality_expression1952) + self.relational_expression() + self.following.pop() + if self.failed: + return + # C.g:504:26: ( ( '==' | '!=' ) relational_expression )* + while True: #loop81 + alt81 = 2 + LA81_0 = self.input.LA(1) + + if ((95 <= LA81_0 <= 96)) : + alt81 = 1 + + + if alt81 == 1: + # C.g:504:27: ( '==' | '!=' ) relational_expression + if (95 <= self.input.LA(1) <= 96): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_equality_expression1955 + ) + raise mse + + + self.following.append(self.FOLLOW_relational_expression_in_equality_expression1961) + self.relational_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop81 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 57, equality_expression_StartIndex) + + pass + + return + + # $ANTLR end equality_expression + + + # $ANTLR start relational_expression + # C.g:507:1: relational_expression : shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ; + def relational_expression(self, ): + + relational_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 58): + return + + # C.g:508:2: ( shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ) + # C.g:508:4: shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* + self.following.append(self.FOLLOW_shift_expression_in_relational_expression1975) + self.shift_expression() + self.following.pop() + if self.failed: + return + # C.g:508:21: ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* + while True: #loop82 + alt82 = 2 + LA82_0 = self.input.LA(1) + + if ((97 <= LA82_0 <= 100)) : + alt82 = 1 + + + if alt82 == 1: + # C.g:508:22: ( '<' | '>' | '<=' | '>=' ) shift_expression + if (97 <= self.input.LA(1) <= 100): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_relational_expression1978 + ) + raise mse + + + self.following.append(self.FOLLOW_shift_expression_in_relational_expression1988) + self.shift_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop82 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 58, relational_expression_StartIndex) + + pass + + return + + # $ANTLR end relational_expression + + + # $ANTLR start shift_expression + # C.g:511:1: shift_expression : additive_expression ( ( '<<' | '>>' ) additive_expression )* ; + def shift_expression(self, ): + + shift_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 59): + return + + # C.g:512:2: ( additive_expression ( ( '<<' | '>>' ) additive_expression )* ) + # C.g:512:4: additive_expression ( ( '<<' | '>>' ) additive_expression )* + self.following.append(self.FOLLOW_additive_expression_in_shift_expression2001) + self.additive_expression() + self.following.pop() + if self.failed: + return + # C.g:512:24: ( ( '<<' | '>>' ) additive_expression )* + while True: #loop83 + alt83 = 2 + LA83_0 = self.input.LA(1) + + if ((101 <= LA83_0 <= 102)) : + alt83 = 1 + + + if alt83 == 1: + # C.g:512:25: ( '<<' | '>>' ) additive_expression + if (101 <= self.input.LA(1) <= 102): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_shift_expression2004 + ) + raise mse + + + self.following.append(self.FOLLOW_additive_expression_in_shift_expression2010) + self.additive_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop83 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 59, shift_expression_StartIndex) + + pass + + return + + # $ANTLR end shift_expression + + + # $ANTLR start statement + # C.g:517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ); + def statement(self, ): + + statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 60): + return + + # C.g:518:2: ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ) + alt84 = 11 + LA84 = self.input.LA(1) + if LA84 == IDENTIFIER: + LA84 = self.input.LA(2) + if LA84 == 62: + LA84_43 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (self.synpred173()) : + alt84 = 7 + elif (self.synpred174()) : + alt84 = 8 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 43, self.input) + + raise nvae + + elif LA84 == 47: + alt84 = 1 + elif LA84 == STRING_LITERAL or LA84 == 27 or LA84 == 28 or LA84 == 64 or LA84 == 68 or LA84 == 69 or LA84 == 70 or LA84 == 71 or LA84 == 72 or LA84 == 73 or LA84 == 75 or LA84 == 76 or LA84 == 77 or LA84 == 80 or LA84 == 81 or LA84 == 82 or LA84 == 83 or LA84 == 84 or LA84 == 85 or LA84 == 86 or LA84 == 87 or LA84 == 88 or LA84 == 89 or LA84 == 90 or LA84 == 91 or LA84 == 92 or LA84 == 93 or LA84 == 94 or LA84 == 95 or LA84 == 96 or LA84 == 97 or LA84 == 98 or LA84 == 99 or LA84 == 100 or LA84 == 101 or LA84 == 102: + alt84 = 3 + elif LA84 == 66: + LA84_47 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 47, self.input) + + raise nvae + + elif LA84 == IDENTIFIER: + LA84_53 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 53, self.input) + + raise nvae + + elif LA84 == 25: + LA84_68 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 68, self.input) + + raise nvae + + elif LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 1, self.input) + + raise nvae + + elif LA84 == 106 or LA84 == 107: + alt84 = 1 + elif LA84 == 43: + alt84 = 2 + elif LA84 == HEX_LITERAL or LA84 == OCTAL_LITERAL or LA84 == DECIMAL_LITERAL or LA84 == CHARACTER_LITERAL or LA84 == STRING_LITERAL or LA84 == FLOATING_POINT_LITERAL or LA84 == 25 or LA84 == 62 or LA84 == 66 or LA84 == 68 or LA84 == 69 or LA84 == 72 or LA84 == 73 or LA84 == 74 or LA84 == 77 or LA84 == 78 or LA84 == 79: + alt84 = 3 + elif LA84 == 108 or LA84 == 110: + alt84 = 4 + elif LA84 == 111 or LA84 == 112 or LA84 == 113: + alt84 = 5 + elif LA84 == 114 or LA84 == 115 or LA84 == 116 or LA84 == 117: + alt84 = 6 + elif LA84 == 103: + alt84 = 8 + elif LA84 == 104: + alt84 = 9 + elif LA84 == 105: + alt84 = 10 + elif LA84 == 26 or LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 0, self.input) + + raise nvae + + if alt84 == 1: + # C.g:518:4: labeled_statement + self.following.append(self.FOLLOW_labeled_statement_in_statement2025) + self.labeled_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 2: + # C.g:519:4: compound_statement + self.following.append(self.FOLLOW_compound_statement_in_statement2030) + self.compound_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 3: + # C.g:520:4: expression_statement + self.following.append(self.FOLLOW_expression_statement_in_statement2035) + self.expression_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 4: + # C.g:521:4: selection_statement + self.following.append(self.FOLLOW_selection_statement_in_statement2040) + self.selection_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 5: + # C.g:522:4: iteration_statement + self.following.append(self.FOLLOW_iteration_statement_in_statement2045) + self.iteration_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 6: + # C.g:523:4: jump_statement + self.following.append(self.FOLLOW_jump_statement_in_statement2050) + self.jump_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 7: + # C.g:524:4: macro_statement + self.following.append(self.FOLLOW_macro_statement_in_statement2055) + self.macro_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 8: + # C.g:525:4: asm2_statement + self.following.append(self.FOLLOW_asm2_statement_in_statement2060) + self.asm2_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 9: + # C.g:526:4: asm1_statement + self.following.append(self.FOLLOW_asm1_statement_in_statement2065) + self.asm1_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 10: + # C.g:527:4: asm_statement + self.following.append(self.FOLLOW_asm_statement_in_statement2070) + self.asm_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 11: + # C.g:528:4: declaration + self.following.append(self.FOLLOW_declaration_in_statement2075) + self.declaration() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 60, statement_StartIndex) + + pass + + return + + # $ANTLR end statement + + + # $ANTLR start asm2_statement + # C.g:531:1: asm2_statement : ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ; + def asm2_statement(self, ): + + asm2_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 61): + return + + # C.g:532:2: ( ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ) + # C.g:532:4: ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' + # C.g:532:4: ( '__asm__' )? + alt85 = 2 + LA85_0 = self.input.LA(1) + + if (LA85_0 == 103) : + alt85 = 1 + if alt85 == 1: + # C.g:0:0: '__asm__' + self.match(self.input, 103, self.FOLLOW_103_in_asm2_statement2086) + if self.failed: + return + + + + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_asm2_statement2089) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_asm2_statement2091) + if self.failed: + return + # C.g:532:30: (~ ( ';' ) )* + while True: #loop86 + alt86 = 2 + LA86_0 = self.input.LA(1) + + if (LA86_0 == 63) : + LA86_1 = self.input.LA(2) + + if ((IDENTIFIER <= LA86_1 <= LINE_COMMAND) or (26 <= LA86_1 <= 117)) : + alt86 = 1 + + + elif ((IDENTIFIER <= LA86_0 <= LINE_COMMAND) or (26 <= LA86_0 <= 62) or (64 <= LA86_0 <= 117)) : + alt86 = 1 + + + if alt86 == 1: + # C.g:532:31: ~ ( ';' ) + if (IDENTIFIER <= self.input.LA(1) <= LINE_COMMAND) or (26 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm2_statement2094 + ) + raise mse + + + + + else: + break #loop86 + + + self.match(self.input, 63, self.FOLLOW_63_in_asm2_statement2101) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_asm2_statement2103) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 61, asm2_statement_StartIndex) + + pass + + return + + # $ANTLR end asm2_statement + + + # $ANTLR start asm1_statement + # C.g:535:1: asm1_statement : '_asm' '{' (~ ( '}' ) )* '}' ; + def asm1_statement(self, ): + + asm1_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 62): + return + + # C.g:536:2: ( '_asm' '{' (~ ( '}' ) )* '}' ) + # C.g:536:4: '_asm' '{' (~ ( '}' ) )* '}' + self.match(self.input, 104, self.FOLLOW_104_in_asm1_statement2115) + if self.failed: + return + self.match(self.input, 43, self.FOLLOW_43_in_asm1_statement2117) + if self.failed: + return + # C.g:536:15: (~ ( '}' ) )* + while True: #loop87 + alt87 = 2 + LA87_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA87_0 <= 43) or (45 <= LA87_0 <= 117)) : + alt87 = 1 + + + if alt87 == 1: + # C.g:536:16: ~ ( '}' ) + if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm1_statement2120 + ) + raise mse + + + + + else: + break #loop87 + + + self.match(self.input, 44, self.FOLLOW_44_in_asm1_statement2127) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 62, asm1_statement_StartIndex) + + pass + + return + + # $ANTLR end asm1_statement + + + # $ANTLR start asm_statement + # C.g:539:1: asm_statement : '__asm' '{' (~ ( '}' ) )* '}' ; + def asm_statement(self, ): + + asm_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 63): + return + + # C.g:540:2: ( '__asm' '{' (~ ( '}' ) )* '}' ) + # C.g:540:4: '__asm' '{' (~ ( '}' ) )* '}' + self.match(self.input, 105, self.FOLLOW_105_in_asm_statement2138) + if self.failed: + return + self.match(self.input, 43, self.FOLLOW_43_in_asm_statement2140) + if self.failed: + return + # C.g:540:16: (~ ( '}' ) )* + while True: #loop88 + alt88 = 2 + LA88_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA88_0 <= 43) or (45 <= LA88_0 <= 117)) : + alt88 = 1 + + + if alt88 == 1: + # C.g:540:17: ~ ( '}' ) + if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm_statement2143 + ) + raise mse + + + + + else: + break #loop88 + + + self.match(self.input, 44, self.FOLLOW_44_in_asm_statement2150) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 63, asm_statement_StartIndex) + + pass + + return + + # $ANTLR end asm_statement + + + # $ANTLR start macro_statement + # C.g:543:1: macro_statement : IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ; + def macro_statement(self, ): + + macro_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 64): + return + + # C.g:544:2: ( IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ) + # C.g:544:4: IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_macro_statement2162) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_macro_statement2164) + if self.failed: + return + # C.g:544:19: ( declaration )* + while True: #loop89 + alt89 = 2 + LA89 = self.input.LA(1) + if LA89 == IDENTIFIER: + LA89 = self.input.LA(2) + if LA89 == 62: + LA89_45 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_47 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 66: + LA89_50 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_68 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_71 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_72 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_73 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_74 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_75 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_76 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_77 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_78 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_79 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_80 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_81 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_82 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_83 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_84 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_85 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_86 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 26: + LA89 = self.input.LA(2) + if LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_87 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_88 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_89 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_90 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_91 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_92 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_93 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_94 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_95 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_96 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_97 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_98 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_99 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_100 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 66: + LA89_101 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_102 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_103 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_104 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_105 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_106 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_107 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_108 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_109 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_110 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_111 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_112 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_113 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_114 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_115 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_116 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_117 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_118 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_119 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_120 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_121 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_122 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_123 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_124 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_125 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 34: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_126 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_127 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_128 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_129 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_130 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_131 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_132 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_133 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_134 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_135 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_136 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_137 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_138 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_139 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_140 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_141 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_142 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_143 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_144 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_145 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 35: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_146 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_147 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_148 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_149 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_150 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_151 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_152 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_153 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_154 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_155 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_156 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_157 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_158 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_159 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_160 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_161 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_162 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_163 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_164 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_165 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 36: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_166 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_167 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_168 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_169 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_170 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_171 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_172 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_173 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_174 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_175 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_176 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_177 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_178 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_179 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_180 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_181 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_182 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_183 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_184 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_185 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 37: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_186 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_187 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_188 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_189 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_190 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_191 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_192 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_193 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_194 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_195 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_196 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_197 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_198 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_199 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_200 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_201 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_202 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_203 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_204 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_205 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 38: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_206 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_207 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_208 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_209 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_210 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_211 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_212 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_213 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_214 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_215 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_216 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_217 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_218 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_219 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_220 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_221 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_222 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_223 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_224 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_225 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 39: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_226 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_227 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_228 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_229 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_230 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_231 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_232 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_233 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_234 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_235 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_236 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_237 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_238 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_239 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_240 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_241 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_242 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_243 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_244 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_245 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 40: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_246 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_247 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_248 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_249 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_250 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_251 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_252 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_253 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_254 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_255 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_256 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_257 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_258 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_259 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_260 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_261 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_262 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_263 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_264 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_265 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 41: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_266 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_267 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_268 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_269 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_270 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_271 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_272 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_273 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_274 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_275 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_276 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_277 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_278 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_279 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_280 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_281 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_282 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_283 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_284 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_285 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 42: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_286 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_287 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_288 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_289 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_290 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_291 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_292 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_293 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_294 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_295 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_296 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_297 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_298 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_299 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_300 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_301 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_302 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_303 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_304 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_305 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 45 or LA89 == 46: + LA89_40 = self.input.LA(2) + + if (LA89_40 == IDENTIFIER) : + LA89_306 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif (LA89_40 == 43) : + LA89_307 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + elif LA89 == 48: + LA89_41 = self.input.LA(2) + + if (LA89_41 == 43) : + LA89_308 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif (LA89_41 == IDENTIFIER) : + LA89_309 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 58 or LA89 == 59 or LA89 == 60 or LA89 == 61: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_310 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_311 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_312 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_313 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_314 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_315 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_316 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_317 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_318 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_319 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_320 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_321 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_322 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_323 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_324 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_325 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_326 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_327 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_328 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_329 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + if alt89 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_macro_statement2166) + self.declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop89 + + + # C.g:544:33: ( statement_list )? + alt90 = 2 + LA90 = self.input.LA(1) + if LA90 == IDENTIFIER: + LA90 = self.input.LA(2) + if LA90 == 25 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 45 or LA90 == 46 or LA90 == 47 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: + alt90 = 1 + elif LA90 == 62: + LA90_45 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_46 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_47 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 64: + LA90_48 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_49 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_50 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_51 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_52 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_53 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_54 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_55 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_56 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_57 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_58 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_59 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_60 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_61 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_62 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_63 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_64 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_65 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_66 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_67 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_70 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25 or LA90 == 26 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 43 or LA90 == 45 or LA90 == 46 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61 or LA90 == 103 or LA90 == 104 or LA90 == 105 or LA90 == 106 or LA90 == 107 or LA90 == 108 or LA90 == 110 or LA90 == 111 or LA90 == 112 or LA90 == 113 or LA90 == 114 or LA90 == 115 or LA90 == 116 or LA90 == 117: + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_87 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_88 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_89 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_90 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_91 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_92 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_93 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_94 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_95 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_96 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_97 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_98 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_99 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_100 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_101 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_102 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_103 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_104 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_105 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_106 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_107 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_108 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_111 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_112 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_113 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_114 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_115 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_116 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_117 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_118 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_119 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_120 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_121 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_122 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_123 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_124 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_125 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_126 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_127 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_128 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_129 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_130 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_131 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_134 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_135 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_136 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_137 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_138 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_139 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_140 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_141 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_142 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_143 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_144 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_145 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_146 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_147 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_148 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_149 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_150 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_151 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_152 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_153 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_154 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_155 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_156 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_159 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_160 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_161 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_162 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_163 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_164 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_165 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_166 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_167 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_168 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_169 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_170 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_171 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_172 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_173 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_174 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_175 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_176 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_177 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_178 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_179 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_181 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_183 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 64: + LA90_184 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_185 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_186 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_187 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_188 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_189 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_190 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_191 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_192 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_193 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_194 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_195 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_196 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_197 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_198 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_199 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_200 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_201 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_202 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_203 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_204 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_205 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_206 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_209 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_210 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_211 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_212 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_213 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_214 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_215 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_216 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_217 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_218 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_219 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_220 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_221 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_222 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_223 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_224 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_225 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_226 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_227 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_228 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_229 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_230 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 62: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_233 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_234 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_235 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_236 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_237 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_238 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_239 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_240 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_241 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_242 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_243 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_244 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: + LA90_245 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 34: + LA90_246 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 35: + LA90_247 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 36: + LA90_248 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 37: + LA90_249 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 38: + LA90_250 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 39: + LA90_251 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 40: + LA90_252 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 41: + LA90_253 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 42: + LA90_254 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 45 or LA90 == 46: + LA90_255 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 48: + LA90_256 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_257 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_258 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_259 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_260 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_261 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_262 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_263 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_264 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_265 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_266 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_267 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_268 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_269 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_270 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_271 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_272 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_273 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_274 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_275 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_276 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_277 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_278 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_279 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_280 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90 = self.input.LA(2) + if LA90 == 62: + LA90_281 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_282 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_283 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_284 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_285 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_286 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_287 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_288 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_289 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_290 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_291 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_292 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90 = self.input.LA(2) + if LA90 == 62: + LA90_293 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_294 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_295 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_296 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_297 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_298 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_299 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_300 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_301 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_302 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_303 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_304 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + if alt90 == 1: + # C.g:0:0: statement_list + self.following.append(self.FOLLOW_statement_list_in_macro_statement2170) + self.statement_list() + self.following.pop() + if self.failed: + return + + + + # C.g:544:49: ( expression )? + alt91 = 2 + LA91_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA91_0 <= FLOATING_POINT_LITERAL) or LA91_0 == 62 or LA91_0 == 66 or (68 <= LA91_0 <= 69) or (72 <= LA91_0 <= 74) or (77 <= LA91_0 <= 79)) : + alt91 = 1 + if alt91 == 1: + # C.g:0:0: expression + self.following.append(self.FOLLOW_expression_in_macro_statement2173) + self.expression() + self.following.pop() + if self.failed: + return + + + + self.match(self.input, 63, self.FOLLOW_63_in_macro_statement2176) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 64, macro_statement_StartIndex) + + pass + + return + + # $ANTLR end macro_statement + + + # $ANTLR start labeled_statement + # C.g:547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ); + def labeled_statement(self, ): + + labeled_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 65): + return + + # C.g:548:2: ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ) + alt92 = 3 + LA92 = self.input.LA(1) + if LA92 == IDENTIFIER: + alt92 = 1 + elif LA92 == 106: + alt92 = 2 + elif LA92 == 107: + alt92 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement );", 92, 0, self.input) + + raise nvae + + if alt92 == 1: + # C.g:548:4: IDENTIFIER ':' statement + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_labeled_statement2188) + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2190) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2192) + self.statement() + self.following.pop() + if self.failed: + return + + + elif alt92 == 2: + # C.g:549:4: 'case' constant_expression ':' statement + self.match(self.input, 106, self.FOLLOW_106_in_labeled_statement2197) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_labeled_statement2199) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2201) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2203) + self.statement() + self.following.pop() + if self.failed: + return + + + elif alt92 == 3: + # C.g:550:4: 'default' ':' statement + self.match(self.input, 107, self.FOLLOW_107_in_labeled_statement2208) + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2210) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2212) + self.statement() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 65, labeled_statement_StartIndex) + + pass + + return + + # $ANTLR end labeled_statement + + class compound_statement_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start compound_statement + # C.g:553:1: compound_statement : '{' ( declaration )* ( statement_list )? '}' ; + def compound_statement(self, ): + + retval = self.compound_statement_return() + retval.start = self.input.LT(1) + compound_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 66): + return retval + + # C.g:554:2: ( '{' ( declaration )* ( statement_list )? '}' ) + # C.g:554:4: '{' ( declaration )* ( statement_list )? '}' + self.match(self.input, 43, self.FOLLOW_43_in_compound_statement2223) + if self.failed: + return retval + # C.g:554:8: ( declaration )* + while True: #loop93 + alt93 = 2 + LA93 = self.input.LA(1) + if LA93 == IDENTIFIER: + LA93 = self.input.LA(2) + if LA93 == 62: + LA93_44 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_47 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 66: + LA93_48 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_49 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_50 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_51 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_52 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_53 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_54 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_55 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_56 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_57 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_58 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_59 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_60 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_61 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_62 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_63 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_64 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_65 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 26: + LA93 = self.input.LA(2) + if LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_86 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_87 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_88 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_89 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_90 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_91 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_92 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_93 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_94 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_95 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_96 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_97 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_98 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_99 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 66: + LA93_100 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_101 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_102 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_103 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_104 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_105 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_106 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_107 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_108 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_109 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_110 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_111 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_112 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_113 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_114 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_115 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_116 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_117 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_118 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_119 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_120 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_121 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_122 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_123 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_124 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 34: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_125 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_126 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_127 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_128 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_129 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_130 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_131 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_132 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_133 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_134 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_135 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_136 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_137 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_138 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_139 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_140 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_141 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_142 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_143 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_144 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 35: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_145 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_146 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_147 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_148 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_149 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_150 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_151 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_152 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_153 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_154 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_155 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_156 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_157 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_158 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_159 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_160 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_161 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_162 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_163 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_164 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 36: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_165 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_166 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_167 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_168 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_169 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_170 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_171 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_172 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_173 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_174 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_175 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_176 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_177 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_178 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_179 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_180 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_181 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_182 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_183 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_184 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 37: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_185 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_186 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_187 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_188 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_189 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_190 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_191 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_192 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_193 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_194 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_195 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_196 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_197 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_198 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_199 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_200 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_201 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_202 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_203 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_204 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 38: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_205 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_206 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_207 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_208 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_209 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_210 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_211 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_212 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_213 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_214 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_215 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_216 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_217 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_218 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_219 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_220 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_221 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_222 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_223 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_224 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 39: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_225 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_226 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_227 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_228 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_229 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_230 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_231 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_232 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_233 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_234 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_235 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_236 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_237 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_238 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_239 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_240 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_241 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_242 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_243 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_244 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 40: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_245 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_246 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_247 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_248 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_249 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_250 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_251 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_252 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_253 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_254 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_255 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_256 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_257 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_258 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_259 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_260 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_261 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_262 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_263 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_264 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 41: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_265 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_266 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_267 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_268 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_269 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_270 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_271 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_272 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_273 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_274 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_275 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_276 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_277 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_278 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_279 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_280 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_281 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_282 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_283 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_284 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 42: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_285 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_286 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_287 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_288 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_289 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_290 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_291 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_292 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_293 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_294 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_295 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_296 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_297 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_298 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_299 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_300 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_301 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_302 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_303 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_304 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 45 or LA93 == 46: + LA93_40 = self.input.LA(2) + + if (LA93_40 == IDENTIFIER) : + LA93_305 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif (LA93_40 == 43) : + LA93_306 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + elif LA93 == 48: + LA93_41 = self.input.LA(2) + + if (LA93_41 == 43) : + LA93_307 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif (LA93_41 == IDENTIFIER) : + LA93_308 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 58 or LA93 == 59 or LA93 == 60 or LA93 == 61: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_309 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_310 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_311 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_312 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_313 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_314 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_315 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_316 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_317 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_318 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_319 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_320 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_321 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_322 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_323 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_324 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_325 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_326 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_327 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_328 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + if alt93 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_compound_statement2225) + self.declaration() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop93 + + + # C.g:554:21: ( statement_list )? + alt94 = 2 + LA94_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA94_0 <= FLOATING_POINT_LITERAL) or (25 <= LA94_0 <= 26) or (29 <= LA94_0 <= 43) or (45 <= LA94_0 <= 46) or (48 <= LA94_0 <= 62) or LA94_0 == 66 or (68 <= LA94_0 <= 69) or (72 <= LA94_0 <= 74) or (77 <= LA94_0 <= 79) or (103 <= LA94_0 <= 108) or (110 <= LA94_0 <= 117)) : + alt94 = 1 + if alt94 == 1: + # C.g:0:0: statement_list + self.following.append(self.FOLLOW_statement_list_in_compound_statement2228) + self.statement_list() + self.following.pop() + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_compound_statement2231) + if self.failed: + return retval + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 66, compound_statement_StartIndex) + + pass + + return retval + + # $ANTLR end compound_statement + + + # $ANTLR start statement_list + # C.g:557:1: statement_list : ( statement )+ ; + def statement_list(self, ): + + statement_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 67): + return + + # C.g:558:2: ( ( statement )+ ) + # C.g:558:4: ( statement )+ + # C.g:558:4: ( statement )+ + cnt95 = 0 + while True: #loop95 + alt95 = 2 + LA95 = self.input.LA(1) + if LA95 == IDENTIFIER: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_46 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 45 or LA95 == 46 or LA95 == 47 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: + alt95 = 1 + elif LA95 == STRING_LITERAL: + LA95_48 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_49 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 64: + LA95_50 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_51 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_52 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_53 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_54 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_55 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_56 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_57 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_58 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_59 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_60 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_61 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_62 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_63 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_64 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_65 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_66 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_67 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_68 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_69 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_88 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == HEX_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_89 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_90 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_91 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_92 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_93 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_94 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_95 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_96 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_97 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_98 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_99 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_100 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_101 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_102 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_103 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_104 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_105 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_106 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_107 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_108 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_109 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_110 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == OCTAL_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_113 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_114 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_115 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_116 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_117 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_118 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_119 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_120 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_121 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_122 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_123 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_124 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_125 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_126 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_127 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_128 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_129 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_130 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_131 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_132 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_133 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_135 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == DECIMAL_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_137 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_138 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_139 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_140 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_141 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_142 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_143 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_144 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_145 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_146 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_147 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_148 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_149 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_150 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_151 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_152 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_153 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_154 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_155 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_156 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_157 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_158 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == CHARACTER_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_161 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_162 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_163 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_164 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_165 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_166 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_167 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_168 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_169 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_170 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_171 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_172 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_173 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_174 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_175 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_176 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_177 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_178 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_179 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_180 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_181 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_182 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == STRING_LITERAL: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_185 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 64: + LA95_186 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_187 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_188 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_189 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_190 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_191 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_192 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_193 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_194 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_195 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_196 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_197 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_198 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_199 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_200 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_201 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_202 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_203 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_204 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_205 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_206 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + elif LA95 == STRING_LITERAL: + LA95_208 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_209 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_211 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_212 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_213 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_214 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_215 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_216 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_217 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_218 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_219 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_220 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_221 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_222 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_223 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_224 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_225 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_226 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_227 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_228 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_229 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_230 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_231 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_234 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 62: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_235 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_236 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_237 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_238 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_239 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_240 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_241 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_242 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_243 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_244 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_245 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_246 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: + LA95_247 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 34: + LA95_248 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 35: + LA95_249 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 36: + LA95_250 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 37: + LA95_251 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 38: + LA95_252 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 39: + LA95_253 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 40: + LA95_254 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 41: + LA95_255 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 42: + LA95_256 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 45 or LA95 == 46: + LA95_257 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 48: + LA95_258 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 72: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_259 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_260 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_261 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_262 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_263 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_264 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_265 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_266 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_267 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_268 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_269 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_270 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 73: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_271 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_272 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_273 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_274 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_275 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_276 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_277 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_278 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_279 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_280 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_281 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_282 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_283 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_284 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_285 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_286 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_287 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_288 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_289 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_290 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_291 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_292 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_293 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_294 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 74: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_295 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_296 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_297 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_298 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_299 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_300 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_301 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_302 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_303 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_304 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_305 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_306 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 25 or LA95 == 26 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 43 or LA95 == 45 or LA95 == 46 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61 or LA95 == 103 or LA95 == 104 or LA95 == 105 or LA95 == 106 or LA95 == 107 or LA95 == 108 or LA95 == 110 or LA95 == 111 or LA95 == 112 or LA95 == 113 or LA95 == 114 or LA95 == 115 or LA95 == 116 or LA95 == 117: + alt95 = 1 + + if alt95 == 1: + # C.g:0:0: statement + self.following.append(self.FOLLOW_statement_in_statement_list2242) + self.statement() + self.following.pop() + if self.failed: + return + + + else: + if cnt95 >= 1: + break #loop95 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(95, self.input) + raise eee + + cnt95 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 67, statement_list_StartIndex) + + pass + + return + + # $ANTLR end statement_list + + class expression_statement_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start expression_statement + # C.g:561:1: expression_statement : ( ';' | expression ';' ); + def expression_statement(self, ): + + retval = self.expression_statement_return() + retval.start = self.input.LT(1) + expression_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 68): + return retval + + # C.g:562:2: ( ';' | expression ';' ) + alt96 = 2 + LA96_0 = self.input.LA(1) + + if (LA96_0 == 25) : + alt96 = 1 + elif ((IDENTIFIER <= LA96_0 <= FLOATING_POINT_LITERAL) or LA96_0 == 62 or LA96_0 == 66 or (68 <= LA96_0 <= 69) or (72 <= LA96_0 <= 74) or (77 <= LA96_0 <= 79)) : + alt96 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("561:1: expression_statement : ( ';' | expression ';' );", 96, 0, self.input) + + raise nvae + + if alt96 == 1: + # C.g:562:4: ';' + self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2254) + if self.failed: + return retval + + + elif alt96 == 2: + # C.g:563:4: expression ';' + self.following.append(self.FOLLOW_expression_in_expression_statement2259) + self.expression() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2261) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 68, expression_statement_StartIndex) + + pass + + return retval + + # $ANTLR end expression_statement + + + # $ANTLR start selection_statement + # C.g:566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ); + def selection_statement(self, ): + + selection_statement_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 69): + return + + # C.g:567:2: ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ) + alt98 = 2 + LA98_0 = self.input.LA(1) + + if (LA98_0 == 108) : + alt98 = 1 + elif (LA98_0 == 110) : + alt98 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement );", 98, 0, self.input) + + raise nvae + + if alt98 == 1: + # C.g:567:4: 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? + self.match(self.input, 108, self.FOLLOW_108_in_selection_statement2272) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2274) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_selection_statement2278) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2280) + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + self.following.append(self.FOLLOW_statement_in_selection_statement2284) + self.statement() + self.following.pop() + if self.failed: + return + # C.g:567:167: ( options {k=1; backtrack=false; } : 'else' statement )? + alt97 = 2 + LA97_0 = self.input.LA(1) + + if (LA97_0 == 109) : + alt97 = 1 + if alt97 == 1: + # C.g:567:200: 'else' statement + self.match(self.input, 109, self.FOLLOW_109_in_selection_statement2299) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_selection_statement2301) + self.statement() + self.following.pop() + if self.failed: + return + + + + + + elif alt98 == 2: + # C.g:568:4: 'switch' '(' expression ')' statement + self.match(self.input, 110, self.FOLLOW_110_in_selection_statement2308) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2310) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_selection_statement2312) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2314) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_selection_statement2316) + self.statement() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 69, selection_statement_StartIndex) + + pass + + return + + # $ANTLR end selection_statement + + + # $ANTLR start iteration_statement + # C.g:571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ); + def iteration_statement(self, ): + + iteration_statement_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 70): + return + + # C.g:572:2: ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ) + alt100 = 3 + LA100 = self.input.LA(1) + if LA100 == 111: + alt100 = 1 + elif LA100 == 112: + alt100 = 2 + elif LA100 == 113: + alt100 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement );", 100, 0, self.input) + + raise nvae + + if alt100 == 1: + # C.g:572:4: 'while' '(' e= expression ')' statement + self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2327) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2329) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_iteration_statement2333) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2335) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2337) + self.statement() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + elif alt100 == 2: + # C.g:573:4: 'do' statement 'while' '(' e= expression ')' ';' + self.match(self.input, 112, self.FOLLOW_112_in_iteration_statement2344) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2346) + self.statement() + self.following.pop() + if self.failed: + return + self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2348) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2350) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_iteration_statement2354) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2356) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_iteration_statement2358) + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + elif alt100 == 3: + # C.g:574:4: 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement + self.match(self.input, 113, self.FOLLOW_113_in_iteration_statement2365) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2367) + if self.failed: + return + self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2369) + self.expression_statement() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2373) + e = self.expression_statement() + self.following.pop() + if self.failed: + return + # C.g:574:58: ( expression )? + alt99 = 2 + LA99_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA99_0 <= FLOATING_POINT_LITERAL) or LA99_0 == 62 or LA99_0 == 66 or (68 <= LA99_0 <= 69) or (72 <= LA99_0 <= 74) or (77 <= LA99_0 <= 79)) : + alt99 = 1 + if alt99 == 1: + # C.g:0:0: expression + self.following.append(self.FOLLOW_expression_in_iteration_statement2375) + self.expression() + self.following.pop() + if self.failed: + return + + + + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2378) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2380) + self.statement() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 70, iteration_statement_StartIndex) + + pass + + return + + # $ANTLR end iteration_statement + + + # $ANTLR start jump_statement + # C.g:577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ); + def jump_statement(self, ): + + jump_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 71): + return + + # C.g:578:2: ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ) + alt101 = 5 + LA101 = self.input.LA(1) + if LA101 == 114: + alt101 = 1 + elif LA101 == 115: + alt101 = 2 + elif LA101 == 116: + alt101 = 3 + elif LA101 == 117: + LA101_4 = self.input.LA(2) + + if (LA101_4 == 25) : + alt101 = 4 + elif ((IDENTIFIER <= LA101_4 <= FLOATING_POINT_LITERAL) or LA101_4 == 62 or LA101_4 == 66 or (68 <= LA101_4 <= 69) or (72 <= LA101_4 <= 74) or (77 <= LA101_4 <= 79)) : + alt101 = 5 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 4, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 0, self.input) + + raise nvae + + if alt101 == 1: + # C.g:578:4: 'goto' IDENTIFIER ';' + self.match(self.input, 114, self.FOLLOW_114_in_jump_statement2393) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_jump_statement2395) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2397) + if self.failed: + return + + + elif alt101 == 2: + # C.g:579:4: 'continue' ';' + self.match(self.input, 115, self.FOLLOW_115_in_jump_statement2402) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2404) + if self.failed: + return + + + elif alt101 == 3: + # C.g:580:4: 'break' ';' + self.match(self.input, 116, self.FOLLOW_116_in_jump_statement2409) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2411) + if self.failed: + return + + + elif alt101 == 4: + # C.g:581:4: 'return' ';' + self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2416) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2418) + if self.failed: + return + + + elif alt101 == 5: + # C.g:582:4: 'return' expression ';' + self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2423) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_jump_statement2425) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2427) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 71, jump_statement_StartIndex) + + pass + + return + + # $ANTLR end jump_statement + + # $ANTLR start synpred2 + def synpred2_fragment(self, ): + # C.g:119:6: ( declaration_specifiers ) + # C.g:119:6: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred2100) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred2 + + + + # $ANTLR start synpred4 + def synpred4_fragment(self, ): + # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' ) + # C.g:119:6: ( declaration_specifiers )? declarator ( declaration )* '{' + # C.g:119:6: ( declaration_specifiers )? + alt102 = 2 + LA102 = self.input.LA(1) + if LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33 or LA102 == 34 or LA102 == 35 or LA102 == 36 or LA102 == 37 or LA102 == 38 or LA102 == 39 or LA102 == 40 or LA102 == 41 or LA102 == 42 or LA102 == 45 or LA102 == 46 or LA102 == 48 or LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: + alt102 = 1 + elif LA102 == IDENTIFIER: + LA102 = self.input.LA(2) + if LA102 == 62: + LA102_21 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33: + LA102_23 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 34: + LA102_24 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 35: + LA102_25 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 36: + LA102_26 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 37: + LA102_27 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 38: + LA102_28 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 39: + LA102_29 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 40: + LA102_30 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 41: + LA102_31 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 42: + LA102_32 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 45 or LA102 == 46: + LA102_33 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 48: + LA102_34 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == IDENTIFIER: + LA102_35 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 58: + LA102_36 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 66: + alt102 = 1 + elif LA102 == 59: + LA102_39 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 60: + LA102_40 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: + LA102_41 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 58: + LA102_14 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 59: + LA102_16 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 60: + LA102_17 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + if alt102 == 1: + # C.g:0:0: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred4100) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + + self.following.append(self.FOLLOW_declarator_in_synpred4103) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:119:41: ( declaration )* + while True: #loop103 + alt103 = 2 + LA103_0 = self.input.LA(1) + + if (LA103_0 == IDENTIFIER or LA103_0 == 26 or (29 <= LA103_0 <= 42) or (45 <= LA103_0 <= 46) or (48 <= LA103_0 <= 61)) : + alt103 = 1 + + + if alt103 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_synpred4105) + self.declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop103 + + + self.match(self.input, 43, self.FOLLOW_43_in_synpred4108) + if self.failed: + return + + + # $ANTLR end synpred4 + + + + # $ANTLR start synpred5 + def synpred5_fragment(self, ): + # C.g:120:4: ( declaration ) + # C.g:120:4: declaration + self.following.append(self.FOLLOW_declaration_in_synpred5118) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred5 + + + + # $ANTLR start synpred7 + def synpred7_fragment(self, ): + # C.g:146:6: ( declaration_specifiers ) + # C.g:146:6: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred7157) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred7 + + + + # $ANTLR start synpred10 + def synpred10_fragment(self, ): + # C.g:167:18: ( declaration_specifiers ) + # C.g:167:18: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred10207) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred10 + + + + # $ANTLR start synpred14 + def synpred14_fragment(self, ): + # C.g:184:7: ( type_specifier ) + # C.g:184:7: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_synpred14272) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred14 + + + + # $ANTLR start synpred15 + def synpred15_fragment(self, ): + # C.g:185:13: ( type_qualifier ) + # C.g:185:13: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred15286) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred15 + + + + # $ANTLR start synpred33 + def synpred33_fragment(self, ): + # C.g:225:16: ( type_qualifier ) + # C.g:225:16: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred33444) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred33 + + + + # $ANTLR start synpred34 + def synpred34_fragment(self, ): + # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator ) + # C.g:225:5: IDENTIFIER ( type_qualifier )* declarator + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred34442) + if self.failed: + return + # C.g:225:16: ( type_qualifier )* + while True: #loop106 + alt106 = 2 + LA106 = self.input.LA(1) + if LA106 == 58: + LA106_2 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 59: + LA106_3 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 60: + LA106_4 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 49 or LA106 == 50 or LA106 == 51 or LA106 == 52 or LA106 == 53 or LA106 == 54 or LA106 == 55 or LA106 == 56 or LA106 == 57 or LA106 == 61: + alt106 = 1 + + if alt106 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred34444) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + break #loop106 + + + self.following.append(self.FOLLOW_declarator_in_synpred34447) + self.declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred34 + + + + # $ANTLR start synpred39 + def synpred39_fragment(self, ): + # C.g:253:6: ( type_qualifier ) + # C.g:253:6: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred39566) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred39 + + + + # $ANTLR start synpred40 + def synpred40_fragment(self, ): + # C.g:253:23: ( type_specifier ) + # C.g:253:23: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_synpred40570) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred40 + + + + # $ANTLR start synpred66 + def synpred66_fragment(self, ): + # C.g:297:4: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator ) + # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator + # C.g:297:4: ( pointer )? + alt111 = 2 + LA111_0 = self.input.LA(1) + + if (LA111_0 == 66) : + alt111 = 1 + if alt111 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_synpred66784) + self.pointer() + self.following.pop() + if self.failed: + return + + + + # C.g:297:13: ( 'EFIAPI' )? + alt112 = 2 + LA112_0 = self.input.LA(1) + + if (LA112_0 == 58) : + alt112 = 1 + if alt112 == 1: + # C.g:297:14: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_synpred66788) + if self.failed: + return + + + + # C.g:297:25: ( 'EFI_BOOTSERVICE' )? + alt113 = 2 + LA113_0 = self.input.LA(1) + + if (LA113_0 == 59) : + alt113 = 1 + if alt113 == 1: + # C.g:297:26: 'EFI_BOOTSERVICE' + self.match(self.input, 59, self.FOLLOW_59_in_synpred66793) + if self.failed: + return + + + + # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? + alt114 = 2 + LA114_0 = self.input.LA(1) + + if (LA114_0 == 60) : + alt114 = 1 + if alt114 == 1: + # C.g:297:47: 'EFI_RUNTIMESERVICE' + self.match(self.input, 60, self.FOLLOW_60_in_synpred66798) + if self.failed: + return + + + + self.following.append(self.FOLLOW_direct_declarator_in_synpred66802) + self.direct_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred66 + + + + # $ANTLR start synpred67 + def synpred67_fragment(self, ): + # C.g:303:15: ( declarator_suffix ) + # C.g:303:15: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_synpred67821) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred67 + + + + # $ANTLR start synpred69 + def synpred69_fragment(self, ): + # C.g:304:9: ( 'EFIAPI' ) + # C.g:304:9: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_synpred69830) + if self.failed: + return + + + # $ANTLR end synpred69 + + + + # $ANTLR start synpred70 + def synpred70_fragment(self, ): + # C.g:304:35: ( declarator_suffix ) + # C.g:304:35: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_synpred70838) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred70 + + + + # $ANTLR start synpred73 + def synpred73_fragment(self, ): + # C.g:310:9: ( '(' parameter_type_list ')' ) + # C.g:310:9: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred73878) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_synpred73880) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred73882) + if self.failed: + return + + + # $ANTLR end synpred73 + + + + # $ANTLR start synpred74 + def synpred74_fragment(self, ): + # C.g:311:9: ( '(' identifier_list ')' ) + # C.g:311:9: '(' identifier_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred74892) + if self.failed: + return + self.following.append(self.FOLLOW_identifier_list_in_synpred74894) + self.identifier_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred74896) + if self.failed: + return + + + # $ANTLR end synpred74 + + + + # $ANTLR start synpred75 + def synpred75_fragment(self, ): + # C.g:316:8: ( type_qualifier ) + # C.g:316:8: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred75921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred75 + + + + # $ANTLR start synpred76 + def synpred76_fragment(self, ): + # C.g:316:24: ( pointer ) + # C.g:316:24: pointer + self.following.append(self.FOLLOW_pointer_in_synpred76924) + self.pointer() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred76 + + + + # $ANTLR start synpred77 + def synpred77_fragment(self, ): + # C.g:316:4: ( '*' ( type_qualifier )+ ( pointer )? ) + # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? + self.match(self.input, 66, self.FOLLOW_66_in_synpred77919) + if self.failed: + return + # C.g:316:8: ( type_qualifier )+ + cnt116 = 0 + while True: #loop116 + alt116 = 2 + LA116_0 = self.input.LA(1) + + if ((49 <= LA116_0 <= 61)) : + alt116 = 1 + + + if alt116 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred77921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt116 >= 1: + break #loop116 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(116, self.input) + raise eee + + cnt116 += 1 + + + # C.g:316:24: ( pointer )? + alt117 = 2 + LA117_0 = self.input.LA(1) + + if (LA117_0 == 66) : + alt117 = 1 + if alt117 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_synpred77924) + self.pointer() + self.following.pop() + if self.failed: + return + + + + + + # $ANTLR end synpred77 + + + + # $ANTLR start synpred78 + def synpred78_fragment(self, ): + # C.g:317:4: ( '*' pointer ) + # C.g:317:4: '*' pointer + self.match(self.input, 66, self.FOLLOW_66_in_synpred78930) + if self.failed: + return + self.following.append(self.FOLLOW_pointer_in_synpred78932) + self.pointer() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred78 + + + + # $ANTLR start synpred81 + def synpred81_fragment(self, ): + # C.g:326:32: ( 'OPTIONAL' ) + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred81977) + if self.failed: + return + + + # $ANTLR end synpred81 + + + + # $ANTLR start synpred82 + def synpred82_fragment(self, ): + # C.g:326:27: ( ',' ( 'OPTIONAL' )? parameter_declaration ) + # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_synpred82974) + if self.failed: + return + # C.g:326:31: ( 'OPTIONAL' )? + alt119 = 2 + LA119_0 = self.input.LA(1) + + if (LA119_0 == 53) : + LA119_1 = self.input.LA(2) + + if (self.synpred81()) : + alt119 = 1 + if alt119 == 1: + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred82977) + if self.failed: + return + + + + self.following.append(self.FOLLOW_parameter_declaration_in_synpred82981) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred82 + + + + # $ANTLR start synpred83 + def synpred83_fragment(self, ): + # C.g:330:28: ( declarator ) + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_synpred83997) + self.declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred83 + + + + # $ANTLR start synpred84 + def synpred84_fragment(self, ): + # C.g:330:39: ( abstract_declarator ) + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred84999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred84 + + + + # $ANTLR start synpred86 + def synpred86_fragment(self, ): + # C.g:330:4: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? ) + # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred86994) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:330:27: ( declarator | abstract_declarator )* + while True: #loop120 + alt120 = 3 + LA120 = self.input.LA(1) + if LA120 == 66: + LA120_3 = self.input.LA(2) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == IDENTIFIER or LA120 == 58 or LA120 == 59 or LA120 == 60: + alt120 = 1 + elif LA120 == 62: + LA120 = self.input.LA(2) + if LA120 == 29 or LA120 == 30 or LA120 == 31 or LA120 == 32 or LA120 == 33 or LA120 == 34 or LA120 == 35 or LA120 == 36 or LA120 == 37 or LA120 == 38 or LA120 == 39 or LA120 == 40 or LA120 == 41 or LA120 == 42 or LA120 == 45 or LA120 == 46 or LA120 == 48 or LA120 == 49 or LA120 == 50 or LA120 == 51 or LA120 == 52 or LA120 == 53 or LA120 == 54 or LA120 == 55 or LA120 == 56 or LA120 == 57 or LA120 == 61 or LA120 == 63 or LA120 == 64: + alt120 = 2 + elif LA120 == 58: + LA120_21 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 66: + LA120_22 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 59: + LA120_23 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 60: + LA120_24 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == IDENTIFIER: + LA120_25 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 62: + LA120_26 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + + elif LA120 == 64: + alt120 = 2 + + if alt120 == 1: + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_synpred86997) + self.declarator() + self.following.pop() + if self.failed: + return + + + elif alt120 == 2: + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred86999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop120 + + + # C.g:330:61: ( 'OPTIONAL' )? + alt121 = 2 + LA121_0 = self.input.LA(1) + + if (LA121_0 == 53) : + alt121 = 1 + if alt121 == 1: + # C.g:330:62: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred861004) + if self.failed: + return + + + + + + # $ANTLR end synpred86 + + + + # $ANTLR start synpred90 + def synpred90_fragment(self, ): + # C.g:341:4: ( specifier_qualifier_list ( abstract_declarator )? ) + # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? + self.following.append(self.FOLLOW_specifier_qualifier_list_in_synpred901046) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + # C.g:341:29: ( abstract_declarator )? + alt122 = 2 + LA122_0 = self.input.LA(1) + + if (LA122_0 == 62 or LA122_0 == 64 or LA122_0 == 66) : + alt122 = 1 + if alt122 == 1: + # C.g:0:0: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred901048) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + # $ANTLR end synpred90 + + + + # $ANTLR start synpred91 + def synpred91_fragment(self, ): + # C.g:346:12: ( direct_abstract_declarator ) + # C.g:346:12: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_synpred911067) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred91 + + + + # $ANTLR start synpred93 + def synpred93_fragment(self, ): + # C.g:351:6: ( '(' abstract_declarator ')' ) + # C.g:351:6: '(' abstract_declarator ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred931086) + if self.failed: + return + self.following.append(self.FOLLOW_abstract_declarator_in_synpred931088) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred931090) + if self.failed: + return + + + # $ANTLR end synpred93 + + + + # $ANTLR start synpred94 + def synpred94_fragment(self, ): + # C.g:351:65: ( abstract_declarator_suffix ) + # C.g:351:65: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_synpred941098) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred94 + + + + # $ANTLR start synpred109 + def synpred109_fragment(self, ): + # C.g:386:4: ( '(' type_name ')' cast_expression ) + # C.g:386:4: '(' type_name ')' cast_expression + self.match(self.input, 62, self.FOLLOW_62_in_synpred1091282) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_synpred1091284) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1091286) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_synpred1091288) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred109 + + + + # $ANTLR start synpred114 + def synpred114_fragment(self, ): + # C.g:395:4: ( 'sizeof' unary_expression ) + # C.g:395:4: 'sizeof' unary_expression + self.match(self.input, 74, self.FOLLOW_74_in_synpred1141330) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_synpred1141332) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred114 + + + + # $ANTLR start synpred117 + def synpred117_fragment(self, ): + # C.g:409:13: ( '(' argument_expression_list ')' ) + # C.g:409:13: '(' argument_expression_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred1171420) + if self.failed: + return + self.following.append(self.FOLLOW_argument_expression_list_in_synpred1171424) + self.argument_expression_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1171428) + if self.failed: + return + + + # $ANTLR end synpred117 + + + + # $ANTLR start synpred118 + def synpred118_fragment(self, ): + # C.g:410:13: ( '(' macro_parameter_list ')' ) + # C.g:410:13: '(' macro_parameter_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred1181444) + if self.failed: + return + self.following.append(self.FOLLOW_macro_parameter_list_in_synpred1181446) + self.macro_parameter_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1181448) + if self.failed: + return + + + # $ANTLR end synpred118 + + + + # $ANTLR start synpred120 + def synpred120_fragment(self, ): + # C.g:412:13: ( '*' IDENTIFIER ) + # C.g:412:13: '*' IDENTIFIER + self.match(self.input, 66, self.FOLLOW_66_in_synpred1201482) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1201486) + if self.failed: + return + + + # $ANTLR end synpred120 + + + + # $ANTLR start synpred137 + def synpred137_fragment(self, ): + # C.g:443:20: ( STRING_LITERAL ) + # C.g:443:20: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1371683) + if self.failed: + return + + + # $ANTLR end synpred137 + + + + # $ANTLR start synpred138 + def synpred138_fragment(self, ): + # C.g:443:8: ( ( IDENTIFIER )* ( STRING_LITERAL )+ ) + # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ + # C.g:443:8: ( IDENTIFIER )* + while True: #loop125 + alt125 = 2 + LA125_0 = self.input.LA(1) + + if (LA125_0 == IDENTIFIER) : + alt125 = 1 + + + if alt125 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1381680) + if self.failed: + return + + + else: + break #loop125 + + + # C.g:443:20: ( STRING_LITERAL )+ + cnt126 = 0 + while True: #loop126 + alt126 = 2 + LA126_0 = self.input.LA(1) + + if (LA126_0 == STRING_LITERAL) : + alt126 = 1 + + + if alt126 == 1: + # C.g:0:0: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1381683) + if self.failed: + return + + + else: + if cnt126 >= 1: + break #loop126 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(126, self.input) + raise eee + + cnt126 += 1 + + + + + # $ANTLR end synpred138 + + + + # $ANTLR start synpred142 + def synpred142_fragment(self, ): + # C.g:458:4: ( lvalue assignment_operator assignment_expression ) + # C.g:458:4: lvalue assignment_operator assignment_expression + self.following.append(self.FOLLOW_lvalue_in_synpred1421744) + self.lvalue() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_operator_in_synpred1421746) + self.assignment_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_expression_in_synpred1421748) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred142 + + + + # $ANTLR start synpred169 + def synpred169_fragment(self, ): + # C.g:520:4: ( expression_statement ) + # C.g:520:4: expression_statement + self.following.append(self.FOLLOW_expression_statement_in_synpred1692035) + self.expression_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred169 + + + + # $ANTLR start synpred173 + def synpred173_fragment(self, ): + # C.g:524:4: ( macro_statement ) + # C.g:524:4: macro_statement + self.following.append(self.FOLLOW_macro_statement_in_synpred1732055) + self.macro_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred173 + + + + # $ANTLR start synpred174 + def synpred174_fragment(self, ): + # C.g:525:4: ( asm2_statement ) + # C.g:525:4: asm2_statement + self.following.append(self.FOLLOW_asm2_statement_in_synpred1742060) + self.asm2_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred174 + + + + # $ANTLR start synpred181 + def synpred181_fragment(self, ): + # C.g:544:19: ( declaration ) + # C.g:544:19: declaration + self.following.append(self.FOLLOW_declaration_in_synpred1812166) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred181 + + + + # $ANTLR start synpred182 + def synpred182_fragment(self, ): + # C.g:544:33: ( statement_list ) + # C.g:544:33: statement_list + self.following.append(self.FOLLOW_statement_list_in_synpred1822170) + self.statement_list() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred182 + + + + # $ANTLR start synpred186 + def synpred186_fragment(self, ): + # C.g:554:8: ( declaration ) + # C.g:554:8: declaration + self.following.append(self.FOLLOW_declaration_in_synpred1862225) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred186 + + + + # $ANTLR start synpred188 + def synpred188_fragment(self, ): + # C.g:558:4: ( statement ) + # C.g:558:4: statement + self.following.append(self.FOLLOW_statement_in_synpred1882242) + self.statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred188 + + + + def synpred69(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred69_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred81(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred81_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred82(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred82_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred66(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred66_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred83(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred83_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred84(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred84_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred67(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred67_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred86(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred86_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred120(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred120_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred40(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred40_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred142(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred142_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred182(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred182_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred109(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred109_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred181(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred181_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred186(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred186_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred188(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred188_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred169(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred169_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred117(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred117_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred70(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred70_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred118(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred118_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred34(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred34_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred33(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred33_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred94(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred94_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred39(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred39_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred74(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred74_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred114(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred114_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred93(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred93_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred75(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred75_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred137(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred137_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred90(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred90_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred138(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred138_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred91(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred91_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred73(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred73_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred5(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred5_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred78(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred78_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred7(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred7_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred76(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred76_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred77(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred77_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred2(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred2_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred4(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred4_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred174(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred174_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred173(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred173_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred14(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred14_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred15(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred15_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred10(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred10_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + + + + + FOLLOW_external_declaration_in_translation_unit74 = frozenset([1, 4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_function_definition_in_external_declaration113 = frozenset([1]) + FOLLOW_declaration_in_external_declaration118 = frozenset([1]) + FOLLOW_macro_statement_in_external_declaration123 = frozenset([1, 25]) + FOLLOW_25_in_external_declaration126 = frozenset([1]) + FOLLOW_declaration_specifiers_in_function_definition157 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_function_definition160 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_declaration_in_function_definition166 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_compound_statement_in_function_definition171 = frozenset([1]) + FOLLOW_compound_statement_in_function_definition180 = frozenset([1]) + FOLLOW_26_in_declaration203 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_declaration_specifiers_in_declaration207 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_list_in_declaration216 = frozenset([25]) + FOLLOW_25_in_declaration220 = frozenset([1]) + FOLLOW_declaration_specifiers_in_declaration234 = frozenset([4, 25, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_list_in_declaration238 = frozenset([25]) + FOLLOW_25_in_declaration243 = frozenset([1]) + FOLLOW_storage_class_specifier_in_declaration_specifiers264 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_specifier_in_declaration_specifiers272 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_declaration_specifiers286 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_init_declarator_in_init_declarator_list308 = frozenset([1, 27]) + FOLLOW_27_in_init_declarator_list311 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_in_init_declarator_list313 = frozenset([1, 27]) + FOLLOW_declarator_in_init_declarator326 = frozenset([1, 28]) + FOLLOW_28_in_init_declarator329 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_in_init_declarator331 = frozenset([1]) + FOLLOW_set_in_storage_class_specifier0 = frozenset([1]) + FOLLOW_34_in_type_specifier376 = frozenset([1]) + FOLLOW_35_in_type_specifier381 = frozenset([1]) + FOLLOW_36_in_type_specifier386 = frozenset([1]) + FOLLOW_37_in_type_specifier391 = frozenset([1]) + FOLLOW_38_in_type_specifier396 = frozenset([1]) + FOLLOW_39_in_type_specifier401 = frozenset([1]) + FOLLOW_40_in_type_specifier406 = frozenset([1]) + FOLLOW_41_in_type_specifier411 = frozenset([1]) + FOLLOW_42_in_type_specifier416 = frozenset([1]) + FOLLOW_struct_or_union_specifier_in_type_specifier423 = frozenset([1]) + FOLLOW_enum_specifier_in_type_specifier433 = frozenset([1]) + FOLLOW_type_id_in_type_specifier451 = frozenset([1]) + FOLLOW_IDENTIFIER_in_type_id467 = frozenset([1]) + FOLLOW_struct_or_union_in_struct_or_union_specifier494 = frozenset([4, 43]) + FOLLOW_IDENTIFIER_in_struct_or_union_specifier496 = frozenset([43]) + FOLLOW_43_in_struct_or_union_specifier499 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_struct_declaration_list_in_struct_or_union_specifier501 = frozenset([44]) + FOLLOW_44_in_struct_or_union_specifier503 = frozenset([1]) + FOLLOW_struct_or_union_in_struct_or_union_specifier508 = frozenset([4]) + FOLLOW_IDENTIFIER_in_struct_or_union_specifier510 = frozenset([1]) + FOLLOW_set_in_struct_or_union0 = frozenset([1]) + FOLLOW_struct_declaration_in_struct_declaration_list537 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_specifier_qualifier_list_in_struct_declaration549 = frozenset([4, 47, 58, 59, 60, 62, 66]) + FOLLOW_struct_declarator_list_in_struct_declaration551 = frozenset([25]) + FOLLOW_25_in_struct_declaration553 = frozenset([1]) + FOLLOW_type_qualifier_in_specifier_qualifier_list566 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_specifier_in_specifier_qualifier_list570 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_struct_declarator_in_struct_declarator_list584 = frozenset([1, 27]) + FOLLOW_27_in_struct_declarator_list587 = frozenset([4, 47, 58, 59, 60, 62, 66]) + FOLLOW_struct_declarator_in_struct_declarator_list589 = frozenset([1, 27]) + FOLLOW_declarator_in_struct_declarator602 = frozenset([1, 47]) + FOLLOW_47_in_struct_declarator605 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_struct_declarator607 = frozenset([1]) + FOLLOW_47_in_struct_declarator614 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_struct_declarator616 = frozenset([1]) + FOLLOW_48_in_enum_specifier634 = frozenset([43]) + FOLLOW_43_in_enum_specifier636 = frozenset([4]) + FOLLOW_enumerator_list_in_enum_specifier638 = frozenset([27, 44]) + FOLLOW_27_in_enum_specifier640 = frozenset([44]) + FOLLOW_44_in_enum_specifier643 = frozenset([1]) + FOLLOW_48_in_enum_specifier648 = frozenset([4]) + FOLLOW_IDENTIFIER_in_enum_specifier650 = frozenset([43]) + FOLLOW_43_in_enum_specifier652 = frozenset([4]) + FOLLOW_enumerator_list_in_enum_specifier654 = frozenset([27, 44]) + FOLLOW_27_in_enum_specifier656 = frozenset([44]) + FOLLOW_44_in_enum_specifier659 = frozenset([1]) + FOLLOW_48_in_enum_specifier664 = frozenset([4]) + FOLLOW_IDENTIFIER_in_enum_specifier666 = frozenset([1]) + FOLLOW_enumerator_in_enumerator_list677 = frozenset([1, 27]) + FOLLOW_27_in_enumerator_list680 = frozenset([4]) + FOLLOW_enumerator_in_enumerator_list682 = frozenset([1, 27]) + FOLLOW_IDENTIFIER_in_enumerator695 = frozenset([1, 28]) + FOLLOW_28_in_enumerator698 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_enumerator700 = frozenset([1]) + FOLLOW_set_in_type_qualifier0 = frozenset([1]) + FOLLOW_pointer_in_declarator784 = frozenset([4, 58, 59, 60, 62]) + FOLLOW_58_in_declarator788 = frozenset([4, 59, 60, 62]) + FOLLOW_59_in_declarator793 = frozenset([4, 60, 62]) + FOLLOW_60_in_declarator798 = frozenset([4, 62]) + FOLLOW_direct_declarator_in_declarator802 = frozenset([1]) + FOLLOW_pointer_in_declarator808 = frozenset([1]) + FOLLOW_IDENTIFIER_in_direct_declarator819 = frozenset([1, 62, 64]) + FOLLOW_declarator_suffix_in_direct_declarator821 = frozenset([1, 62, 64]) + FOLLOW_62_in_direct_declarator827 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_58_in_direct_declarator830 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_direct_declarator834 = frozenset([63]) + FOLLOW_63_in_direct_declarator836 = frozenset([62, 64]) + FOLLOW_declarator_suffix_in_direct_declarator838 = frozenset([1, 62, 64]) + FOLLOW_64_in_declarator_suffix852 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_declarator_suffix854 = frozenset([65]) + FOLLOW_65_in_declarator_suffix856 = frozenset([1]) + FOLLOW_64_in_declarator_suffix866 = frozenset([65]) + FOLLOW_65_in_declarator_suffix868 = frozenset([1]) + FOLLOW_62_in_declarator_suffix878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_declarator_suffix880 = frozenset([63]) + FOLLOW_63_in_declarator_suffix882 = frozenset([1]) + FOLLOW_62_in_declarator_suffix892 = frozenset([4]) + FOLLOW_identifier_list_in_declarator_suffix894 = frozenset([63]) + FOLLOW_63_in_declarator_suffix896 = frozenset([1]) + FOLLOW_62_in_declarator_suffix906 = frozenset([63]) + FOLLOW_63_in_declarator_suffix908 = frozenset([1]) + FOLLOW_66_in_pointer919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_pointer921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_pointer_in_pointer924 = frozenset([1]) + FOLLOW_66_in_pointer930 = frozenset([66]) + FOLLOW_pointer_in_pointer932 = frozenset([1]) + FOLLOW_66_in_pointer937 = frozenset([1]) + FOLLOW_parameter_list_in_parameter_type_list948 = frozenset([1, 27]) + FOLLOW_27_in_parameter_type_list951 = frozenset([53, 67]) + FOLLOW_53_in_parameter_type_list954 = frozenset([67]) + FOLLOW_67_in_parameter_type_list958 = frozenset([1]) + FOLLOW_parameter_declaration_in_parameter_list971 = frozenset([1, 27]) + FOLLOW_27_in_parameter_list974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_53_in_parameter_list977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_parameter_list981 = frozenset([1, 27]) + FOLLOW_declaration_specifiers_in_parameter_declaration994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_declarator_in_parameter_declaration997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_abstract_declarator_in_parameter_declaration999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_53_in_parameter_declaration1004 = frozenset([1]) + FOLLOW_pointer_in_parameter_declaration1013 = frozenset([4, 66]) + FOLLOW_IDENTIFIER_in_parameter_declaration1016 = frozenset([1]) + FOLLOW_IDENTIFIER_in_identifier_list1027 = frozenset([1, 27]) + FOLLOW_27_in_identifier_list1031 = frozenset([4]) + FOLLOW_IDENTIFIER_in_identifier_list1033 = frozenset([1, 27]) + FOLLOW_specifier_qualifier_list_in_type_name1046 = frozenset([1, 62, 64, 66]) + FOLLOW_abstract_declarator_in_type_name1048 = frozenset([1]) + FOLLOW_type_id_in_type_name1054 = frozenset([1]) + FOLLOW_pointer_in_abstract_declarator1065 = frozenset([1, 62, 64]) + FOLLOW_direct_abstract_declarator_in_abstract_declarator1067 = frozenset([1]) + FOLLOW_direct_abstract_declarator_in_abstract_declarator1073 = frozenset([1]) + FOLLOW_62_in_direct_abstract_declarator1086 = frozenset([62, 64, 66]) + FOLLOW_abstract_declarator_in_direct_abstract_declarator1088 = frozenset([63]) + FOLLOW_63_in_direct_abstract_declarator1090 = frozenset([1, 62, 64]) + FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094 = frozenset([1, 62, 64]) + FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098 = frozenset([1, 62, 64]) + FOLLOW_64_in_abstract_declarator_suffix1110 = frozenset([65]) + FOLLOW_65_in_abstract_declarator_suffix1112 = frozenset([1]) + FOLLOW_64_in_abstract_declarator_suffix1117 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_abstract_declarator_suffix1119 = frozenset([65]) + FOLLOW_65_in_abstract_declarator_suffix1121 = frozenset([1]) + FOLLOW_62_in_abstract_declarator_suffix1126 = frozenset([63]) + FOLLOW_63_in_abstract_declarator_suffix1128 = frozenset([1]) + FOLLOW_62_in_abstract_declarator_suffix1133 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135 = frozenset([63]) + FOLLOW_63_in_abstract_declarator_suffix1137 = frozenset([1]) + FOLLOW_assignment_expression_in_initializer1150 = frozenset([1]) + FOLLOW_43_in_initializer1155 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_list_in_initializer1157 = frozenset([27, 44]) + FOLLOW_27_in_initializer1159 = frozenset([44]) + FOLLOW_44_in_initializer1162 = frozenset([1]) + FOLLOW_initializer_in_initializer_list1173 = frozenset([1, 27]) + FOLLOW_27_in_initializer_list1176 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_in_initializer_list1178 = frozenset([1, 27]) + FOLLOW_assignment_expression_in_argument_expression_list1196 = frozenset([1, 27, 53]) + FOLLOW_53_in_argument_expression_list1199 = frozenset([1, 27]) + FOLLOW_27_in_argument_expression_list1204 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_argument_expression_list1206 = frozenset([1, 27, 53]) + FOLLOW_53_in_argument_expression_list1209 = frozenset([1, 27]) + FOLLOW_multiplicative_expression_in_additive_expression1225 = frozenset([1, 68, 69]) + FOLLOW_68_in_additive_expression1229 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_multiplicative_expression_in_additive_expression1231 = frozenset([1, 68, 69]) + FOLLOW_69_in_additive_expression1235 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_multiplicative_expression_in_additive_expression1237 = frozenset([1, 68, 69]) + FOLLOW_cast_expression_in_multiplicative_expression1251 = frozenset([1, 66, 70, 71]) + FOLLOW_66_in_multiplicative_expression1255 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1257 = frozenset([1, 66, 70, 71]) + FOLLOW_70_in_multiplicative_expression1261 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1263 = frozenset([1, 66, 70, 71]) + FOLLOW_71_in_multiplicative_expression1267 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1269 = frozenset([1, 66, 70, 71]) + FOLLOW_62_in_cast_expression1282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_cast_expression1284 = frozenset([63]) + FOLLOW_63_in_cast_expression1286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_cast_expression1288 = frozenset([1]) + FOLLOW_unary_expression_in_cast_expression1293 = frozenset([1]) + FOLLOW_postfix_expression_in_unary_expression1304 = frozenset([1]) + FOLLOW_72_in_unary_expression1309 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1311 = frozenset([1]) + FOLLOW_73_in_unary_expression1316 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1318 = frozenset([1]) + FOLLOW_unary_operator_in_unary_expression1323 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_unary_expression1325 = frozenset([1]) + FOLLOW_74_in_unary_expression1330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1332 = frozenset([1]) + FOLLOW_74_in_unary_expression1337 = frozenset([62]) + FOLLOW_62_in_unary_expression1339 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_unary_expression1341 = frozenset([63]) + FOLLOW_63_in_unary_expression1343 = frozenset([1]) + FOLLOW_primary_expression_in_postfix_expression1367 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_64_in_postfix_expression1383 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_postfix_expression1385 = frozenset([65]) + FOLLOW_65_in_postfix_expression1387 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1401 = frozenset([63]) + FOLLOW_63_in_postfix_expression1405 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_argument_expression_list_in_postfix_expression1424 = frozenset([63]) + FOLLOW_63_in_postfix_expression1428 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_macro_parameter_list_in_postfix_expression1446 = frozenset([63]) + FOLLOW_63_in_postfix_expression1448 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_75_in_postfix_expression1462 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1466 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_66_in_postfix_expression1482 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1486 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_76_in_postfix_expression1502 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1506 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_72_in_postfix_expression1522 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_73_in_postfix_expression1536 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_parameter_declaration_in_macro_parameter_list1559 = frozenset([1, 27]) + FOLLOW_27_in_macro_parameter_list1562 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_macro_parameter_list1564 = frozenset([1, 27]) + FOLLOW_set_in_unary_operator0 = frozenset([1]) + FOLLOW_IDENTIFIER_in_primary_expression1613 = frozenset([1]) + FOLLOW_constant_in_primary_expression1618 = frozenset([1]) + FOLLOW_62_in_primary_expression1623 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_primary_expression1625 = frozenset([63]) + FOLLOW_63_in_primary_expression1627 = frozenset([1]) + FOLLOW_HEX_LITERAL_in_constant1643 = frozenset([1]) + FOLLOW_OCTAL_LITERAL_in_constant1653 = frozenset([1]) + FOLLOW_DECIMAL_LITERAL_in_constant1663 = frozenset([1]) + FOLLOW_CHARACTER_LITERAL_in_constant1671 = frozenset([1]) + FOLLOW_IDENTIFIER_in_constant1680 = frozenset([4, 9]) + FOLLOW_STRING_LITERAL_in_constant1683 = frozenset([1, 4, 9]) + FOLLOW_IDENTIFIER_in_constant1688 = frozenset([1, 4]) + FOLLOW_FLOATING_POINT_LITERAL_in_constant1699 = frozenset([1]) + FOLLOW_assignment_expression_in_expression1715 = frozenset([1, 27]) + FOLLOW_27_in_expression1718 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_expression1720 = frozenset([1, 27]) + FOLLOW_conditional_expression_in_constant_expression1733 = frozenset([1]) + FOLLOW_lvalue_in_assignment_expression1744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) + FOLLOW_assignment_operator_in_assignment_expression1746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_assignment_expression1748 = frozenset([1]) + FOLLOW_conditional_expression_in_assignment_expression1753 = frozenset([1]) + FOLLOW_unary_expression_in_lvalue1765 = frozenset([1]) + FOLLOW_set_in_assignment_operator0 = frozenset([1]) + FOLLOW_logical_or_expression_in_conditional_expression1839 = frozenset([1, 90]) + FOLLOW_90_in_conditional_expression1842 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_conditional_expression1844 = frozenset([47]) + FOLLOW_47_in_conditional_expression1846 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_conditional_expression_in_conditional_expression1848 = frozenset([1]) + FOLLOW_logical_and_expression_in_logical_or_expression1863 = frozenset([1, 91]) + FOLLOW_91_in_logical_or_expression1866 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_logical_and_expression_in_logical_or_expression1868 = frozenset([1, 91]) + FOLLOW_inclusive_or_expression_in_logical_and_expression1881 = frozenset([1, 92]) + FOLLOW_92_in_logical_and_expression1884 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_inclusive_or_expression_in_logical_and_expression1886 = frozenset([1, 92]) + FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899 = frozenset([1, 93]) + FOLLOW_93_in_inclusive_or_expression1902 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904 = frozenset([1, 93]) + FOLLOW_and_expression_in_exclusive_or_expression1917 = frozenset([1, 94]) + FOLLOW_94_in_exclusive_or_expression1920 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_and_expression_in_exclusive_or_expression1922 = frozenset([1, 94]) + FOLLOW_equality_expression_in_and_expression1935 = frozenset([1, 77]) + FOLLOW_77_in_and_expression1938 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_equality_expression_in_and_expression1940 = frozenset([1, 77]) + FOLLOW_relational_expression_in_equality_expression1952 = frozenset([1, 95, 96]) + FOLLOW_set_in_equality_expression1955 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_relational_expression_in_equality_expression1961 = frozenset([1, 95, 96]) + FOLLOW_shift_expression_in_relational_expression1975 = frozenset([1, 97, 98, 99, 100]) + FOLLOW_set_in_relational_expression1978 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_shift_expression_in_relational_expression1988 = frozenset([1, 97, 98, 99, 100]) + FOLLOW_additive_expression_in_shift_expression2001 = frozenset([1, 101, 102]) + FOLLOW_set_in_shift_expression2004 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_additive_expression_in_shift_expression2010 = frozenset([1, 101, 102]) + FOLLOW_labeled_statement_in_statement2025 = frozenset([1]) + FOLLOW_compound_statement_in_statement2030 = frozenset([1]) + FOLLOW_expression_statement_in_statement2035 = frozenset([1]) + FOLLOW_selection_statement_in_statement2040 = frozenset([1]) + FOLLOW_iteration_statement_in_statement2045 = frozenset([1]) + FOLLOW_jump_statement_in_statement2050 = frozenset([1]) + FOLLOW_macro_statement_in_statement2055 = frozenset([1]) + FOLLOW_asm2_statement_in_statement2060 = frozenset([1]) + FOLLOW_asm1_statement_in_statement2065 = frozenset([1]) + FOLLOW_asm_statement_in_statement2070 = frozenset([1]) + FOLLOW_declaration_in_statement2075 = frozenset([1]) + FOLLOW_103_in_asm2_statement2086 = frozenset([4]) + FOLLOW_IDENTIFIER_in_asm2_statement2089 = frozenset([62]) + FOLLOW_62_in_asm2_statement2091 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm2_statement2094 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_63_in_asm2_statement2101 = frozenset([25]) + FOLLOW_25_in_asm2_statement2103 = frozenset([1]) + FOLLOW_104_in_asm1_statement2115 = frozenset([43]) + FOLLOW_43_in_asm1_statement2117 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm1_statement2120 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_44_in_asm1_statement2127 = frozenset([1]) + FOLLOW_105_in_asm_statement2138 = frozenset([43]) + FOLLOW_43_in_asm_statement2140 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm_statement2143 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_44_in_asm_statement2150 = frozenset([1]) + FOLLOW_IDENTIFIER_in_macro_statement2162 = frozenset([62]) + FOLLOW_62_in_macro_statement2164 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_declaration_in_macro_statement2166 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_list_in_macro_statement2170 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_macro_statement2173 = frozenset([63]) + FOLLOW_63_in_macro_statement2176 = frozenset([1]) + FOLLOW_IDENTIFIER_in_labeled_statement2188 = frozenset([47]) + FOLLOW_47_in_labeled_statement2190 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2192 = frozenset([1]) + FOLLOW_106_in_labeled_statement2197 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_labeled_statement2199 = frozenset([47]) + FOLLOW_47_in_labeled_statement2201 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2203 = frozenset([1]) + FOLLOW_107_in_labeled_statement2208 = frozenset([47]) + FOLLOW_47_in_labeled_statement2210 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2212 = frozenset([1]) + FOLLOW_43_in_compound_statement2223 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_declaration_in_compound_statement2225 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_list_in_compound_statement2228 = frozenset([44]) + FOLLOW_44_in_compound_statement2231 = frozenset([1]) + FOLLOW_statement_in_statement_list2242 = frozenset([1, 4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_25_in_expression_statement2254 = frozenset([1]) + FOLLOW_expression_in_expression_statement2259 = frozenset([25]) + FOLLOW_25_in_expression_statement2261 = frozenset([1]) + FOLLOW_108_in_selection_statement2272 = frozenset([62]) + FOLLOW_62_in_selection_statement2274 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_selection_statement2278 = frozenset([63]) + FOLLOW_63_in_selection_statement2280 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2284 = frozenset([1, 109]) + FOLLOW_109_in_selection_statement2299 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2301 = frozenset([1]) + FOLLOW_110_in_selection_statement2308 = frozenset([62]) + FOLLOW_62_in_selection_statement2310 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_selection_statement2312 = frozenset([63]) + FOLLOW_63_in_selection_statement2314 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2316 = frozenset([1]) + FOLLOW_111_in_iteration_statement2327 = frozenset([62]) + FOLLOW_62_in_iteration_statement2329 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2333 = frozenset([63]) + FOLLOW_63_in_iteration_statement2335 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2337 = frozenset([1]) + FOLLOW_112_in_iteration_statement2344 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2346 = frozenset([111]) + FOLLOW_111_in_iteration_statement2348 = frozenset([62]) + FOLLOW_62_in_iteration_statement2350 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2354 = frozenset([63]) + FOLLOW_63_in_iteration_statement2356 = frozenset([25]) + FOLLOW_25_in_iteration_statement2358 = frozenset([1]) + FOLLOW_113_in_iteration_statement2365 = frozenset([62]) + FOLLOW_62_in_iteration_statement2367 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_statement_in_iteration_statement2369 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_statement_in_iteration_statement2373 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2375 = frozenset([63]) + FOLLOW_63_in_iteration_statement2378 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2380 = frozenset([1]) + FOLLOW_114_in_jump_statement2393 = frozenset([4]) + FOLLOW_IDENTIFIER_in_jump_statement2395 = frozenset([25]) + FOLLOW_25_in_jump_statement2397 = frozenset([1]) + FOLLOW_115_in_jump_statement2402 = frozenset([25]) + FOLLOW_25_in_jump_statement2404 = frozenset([1]) + FOLLOW_116_in_jump_statement2409 = frozenset([25]) + FOLLOW_25_in_jump_statement2411 = frozenset([1]) + FOLLOW_117_in_jump_statement2416 = frozenset([25]) + FOLLOW_25_in_jump_statement2418 = frozenset([1]) + FOLLOW_117_in_jump_statement2423 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_jump_statement2425 = frozenset([25]) + FOLLOW_25_in_jump_statement2427 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred2100 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred4100 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_synpred4103 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_declaration_in_synpred4105 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_43_in_synpred4108 = frozenset([1]) + FOLLOW_declaration_in_synpred5118 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred7157 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred10207 = frozenset([1]) + FOLLOW_type_specifier_in_synpred14272 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred15286 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred33444 = frozenset([1]) + FOLLOW_IDENTIFIER_in_synpred34442 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_type_qualifier_in_synpred34444 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_declarator_in_synpred34447 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred39566 = frozenset([1]) + FOLLOW_type_specifier_in_synpred40570 = frozenset([1]) + FOLLOW_pointer_in_synpred66784 = frozenset([4, 58, 59, 60, 62]) + FOLLOW_58_in_synpred66788 = frozenset([4, 59, 60, 62]) + FOLLOW_59_in_synpred66793 = frozenset([4, 60, 62]) + FOLLOW_60_in_synpred66798 = frozenset([4, 62]) + FOLLOW_direct_declarator_in_synpred66802 = frozenset([1]) + FOLLOW_declarator_suffix_in_synpred67821 = frozenset([1]) + FOLLOW_58_in_synpred69830 = frozenset([1]) + FOLLOW_declarator_suffix_in_synpred70838 = frozenset([1]) + FOLLOW_62_in_synpred73878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_synpred73880 = frozenset([63]) + FOLLOW_63_in_synpred73882 = frozenset([1]) + FOLLOW_62_in_synpred74892 = frozenset([4]) + FOLLOW_identifier_list_in_synpred74894 = frozenset([63]) + FOLLOW_63_in_synpred74896 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred75921 = frozenset([1]) + FOLLOW_pointer_in_synpred76924 = frozenset([1]) + FOLLOW_66_in_synpred77919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_synpred77921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_pointer_in_synpred77924 = frozenset([1]) + FOLLOW_66_in_synpred78930 = frozenset([66]) + FOLLOW_pointer_in_synpred78932 = frozenset([1]) + FOLLOW_53_in_synpred81977 = frozenset([1]) + FOLLOW_27_in_synpred82974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_53_in_synpred82977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_synpred82981 = frozenset([1]) + FOLLOW_declarator_in_synpred83997 = frozenset([1]) + FOLLOW_abstract_declarator_in_synpred84999 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred86994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_declarator_in_synpred86997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred86999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_53_in_synpred861004 = frozenset([1]) + FOLLOW_specifier_qualifier_list_in_synpred901046 = frozenset([1, 62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred901048 = frozenset([1]) + FOLLOW_direct_abstract_declarator_in_synpred911067 = frozenset([1]) + FOLLOW_62_in_synpred931086 = frozenset([62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred931088 = frozenset([63]) + FOLLOW_63_in_synpred931090 = frozenset([1]) + FOLLOW_abstract_declarator_suffix_in_synpred941098 = frozenset([1]) + FOLLOW_62_in_synpred1091282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_synpred1091284 = frozenset([63]) + FOLLOW_63_in_synpred1091286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_synpred1091288 = frozenset([1]) + FOLLOW_74_in_synpred1141330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_synpred1141332 = frozenset([1]) + FOLLOW_62_in_synpred1171420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_argument_expression_list_in_synpred1171424 = frozenset([63]) + FOLLOW_63_in_synpred1171428 = frozenset([1]) + FOLLOW_62_in_synpred1181444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_macro_parameter_list_in_synpred1181446 = frozenset([63]) + FOLLOW_63_in_synpred1181448 = frozenset([1]) + FOLLOW_66_in_synpred1201482 = frozenset([4]) + FOLLOW_IDENTIFIER_in_synpred1201486 = frozenset([1]) + FOLLOW_STRING_LITERAL_in_synpred1371683 = frozenset([1]) + FOLLOW_IDENTIFIER_in_synpred1381680 = frozenset([4, 9]) + FOLLOW_STRING_LITERAL_in_synpred1381683 = frozenset([1, 9]) + FOLLOW_lvalue_in_synpred1421744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) + FOLLOW_assignment_operator_in_synpred1421746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_synpred1421748 = frozenset([1]) + FOLLOW_expression_statement_in_synpred1692035 = frozenset([1]) + FOLLOW_macro_statement_in_synpred1732055 = frozenset([1]) + FOLLOW_asm2_statement_in_synpred1742060 = frozenset([1]) + FOLLOW_declaration_in_synpred1812166 = frozenset([1]) + FOLLOW_statement_list_in_synpred1822170 = frozenset([1]) + FOLLOW_declaration_in_synpred1862225 = frozenset([1]) + FOLLOW_statement_in_synpred1882242 = frozenset([1]) + diff --git a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py index 98a899e76b..6da2b6babe 100644 --- a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py @@ -1,1853 +1,1853 @@ -## @file -# This file is used to parse meta files -# -# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import re -import time -import copy - -import Common.EdkLogger as EdkLogger -import Common.GlobalData as GlobalData -import EccGlobalData - -from CommonDataClass.DataClass import * -from Common.DataType import * -from Common.String import * -from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData -from Common.Expression import * -from CommonDataClass.Exceptions import * - -from MetaFileTable import MetaFileStorage -from GenFds.FdfParser import FdfParser - -## A decorator used to parse macro definition -def ParseMacro(Parser): - def MacroParser(self): - Match = gMacroDefPattern.match(self._CurrentLine) - if not Match: - # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method - Parser(self) - return - - TokenList = GetSplitValueList(self._CurrentLine[Match.end(1):], TAB_EQUAL_SPLIT, 1) - # Syntax check - if not TokenList[0]: - EdkLogger.error('Parser', FORMAT_INVALID, "No macro name given", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - if len(TokenList) < 2: - TokenList.append('') - - Type = Match.group(1) - Name, Value = TokenList - # Global macros can be only defined via environment variable - if Name in GlobalData.gGlobalDefines: - EdkLogger.error('Parser', FORMAT_INVALID, "%s can only be defined via environment variable" % Name, - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - # Only upper case letters, digit and '_' are allowed - if not gMacroNamePattern.match(Name): - EdkLogger.error('Parser', FORMAT_INVALID, "The macro name must be in the pattern [A-Z][A-Z0-9_]*", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - - Value = ReplaceMacro(Value, self._Macros) - self._ItemType = MODEL_META_DATA_DEFINE - # DEFINE defined macros - if Type == TAB_DSC_DEFINES_DEFINE: - if type(self) == DecParser: - if MODEL_META_DATA_HEADER in self._SectionType: - self._FileLocalMacros[Name] = Value - else: - for Scope in self._Scope: - self._SectionsMacroDict.setdefault((Scope[2], Scope[0], Scope[1]), {})[Name] = Value - elif self._SectionType == MODEL_META_DATA_HEADER: - self._FileLocalMacros[Name] = Value - else: - SectionDictKey = self._SectionType, self._Scope[0][0], self._Scope[0][1] - if SectionDictKey not in self._SectionsMacroDict: - self._SectionsMacroDict[SectionDictKey] = {} - SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] - SectionLocalMacros[Name] = Value - # EDK_GLOBAL defined macros - elif type(self) != DscParser: - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used in .dsc file", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - elif self._SectionType != MODEL_META_DATA_HEADER: - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used under [Defines] section", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - elif (Name in self._FileLocalMacros) and (self._FileLocalMacros[Name] != Value): - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL defined a macro with the same name and different value as one defined by 'DEFINE'", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - - self._ValueList = [Type, Name, Value] - - return MacroParser - -## Base class of parser -# -# This class is used for derivation purpose. The specific parser for one kind -# type file must derive this class and implement some public interfaces. -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# @param Owner Owner ID (for sub-section parsing) -# @param From ID from which the data comes (for !INCLUDE directive) -# -class MetaFileParser(object): - # data type (file content) for specific file type - DataType = {} - - # Parser objects used to implement singleton - MetaFiles = {} - - ## Factory method - # - # One file, one parser object. This factory method makes sure that there's - # only one object constructed for one meta file. - # - # @param Class class object of real AutoGen class - # (InfParser, DecParser or DscParser) - # @param FilePath The path of meta file - # @param *args The specific class related parameters - # @param **kwargs The specific class related dict parameters - # - def __new__(Class, FilePath, *args, **kwargs): - if FilePath in Class.MetaFiles: - return Class.MetaFiles[FilePath] - else: - ParserObject = super(MetaFileParser, Class).__new__(Class) - Class.MetaFiles[FilePath] = ParserObject - return ParserObject - - ## Constructor of MetaFileParser - # - # Initialize object of MetaFileParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # @param Owner Owner ID (for sub-section parsing) - # @param From ID from which the data comes (for !INCLUDE directive) - # - def __init__(self, FilePath, FileType, Table, Owner=-1, From=-1): - self._Table = Table - self._RawTable = Table - self._FileType = FileType - self.MetaFile = FilePath - self._Defines = {} - self._FileLocalMacros = {} - self._SectionsMacroDict = {} - - # for recursive parsing - self._Owner = [Owner] - self._From = From - - # parsr status for parsing - self._ValueList = ['', '', '', '', ''] - self._Scope = [] - self._LineIndex = 0 - self._CurrentLine = '' - self._SectionType = MODEL_UNKNOWN - self._SectionName = '' - self._InSubsection = False - self._SubsectionType = MODEL_UNKNOWN - self._SubsectionName = '' - self._ItemType = MODEL_UNKNOWN - self._LastItem = -1 - self._Enabled = 0 - self._Finished = False - self._PostProcessed = False - # Different version of meta-file has different way to parse. - self._Version = 0 - - ## Store the parsed data in table - def _Store(self, *Args): - return self._Table.Insert(*Args) - - ## Virtual method for starting parse - def Start(self): - raise NotImplementedError - - ## Notify a post-process is needed - def DoPostProcess(self): - self._PostProcessed = False - - ## Set parsing complete flag in both class and table - def _Done(self): - self._Finished = True - ## Do not set end flag when processing included files - if self._From == -1: - self._Table.SetEndFlag() - - def _PostProcess(self): - self._PostProcessed = True - - ## Get the parse complete flag - def _GetFinished(self): - return self._Finished - - ## Set the complete flag - def _SetFinished(self, Value): - self._Finished = Value - - ## Use [] style to query data in table, just for readability - # - # DataInfo = [data_type, scope1(arch), scope2(platform/moduletype)] - # - def __getitem__(self, DataInfo): - if type(DataInfo) != type(()): - DataInfo = (DataInfo,) - - # Parse the file first, if necessary - if not self._Finished: - if self._RawTable.IsIntegrity(): - self._Finished = True - else: - self._Table = self._RawTable - self._PostProcessed = False - self.Start() - - # No specific ARCH or Platform given, use raw data - if self._RawTable and (len(DataInfo) == 1 or DataInfo[1] == None): - return self._RawTable.Query(*DataInfo) - - # Do post-process if necessary - if not self._PostProcessed: - self._PostProcess() - - return self._Table.Query(*DataInfo) - - ## Data parser for the common format in different type of file - # - # The common format in the meatfile is like - # - # xxx1 | xxx2 | xxx3 - # - @ParseMacro - def _CommonParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - - ## Data parser for the format in which there's path - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _PathParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - # Don't do macro replacement for dsc file at this point - if type(self) != DscParser: - Macros = self._Macros - self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] - - ## Skip unsupported data - def _Skip(self): - EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile, - Line=self._LineIndex+1, ExtraData=self._CurrentLine); - self._ValueList[0:1] = [self._CurrentLine] - - ## Section header parser - # - # The section header is always in following format: - # - # [section_name.arch<.platform|module_type>] - # - def _SectionHeaderParser(self): - self._Scope = [] - self._SectionName = '' - ArchList = set() - for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): - if Item == '': - continue - ItemList = GetSplitValueList(Item, TAB_SPLIT) - # different section should not mix in one section - if self._SectionName != '' and self._SectionName != ItemList[0].upper(): - EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section", - File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) - self._SectionName = ItemList[0].upper() - if self._SectionName in self.DataType: - self._SectionType = self.DataType[self._SectionName] - else: - self._SectionType = MODEL_UNKNOWN - EdkLogger.warn("Parser", "Unrecognized section", File=self.MetaFile, - Line=self._LineIndex+1, ExtraData=self._CurrentLine) - # S1 is always Arch - if len(ItemList) > 1: - S1 = ItemList[1].upper() - else: - S1 = 'COMMON' - ArchList.add(S1) - # S2 may be Platform or ModuleType - if len(ItemList) > 2: - S2 = ItemList[2].upper() - else: - S2 = 'COMMON' - self._Scope.append([S1, S2]) - - # 'COMMON' must not be used with specific ARCHs at the same section - if 'COMMON' in ArchList and len(ArchList) > 1: - EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", - File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) - # If the section information is needed later, it should be stored in database - self._ValueList[0] = self._SectionName - - ## [defines] section parser - @ParseMacro - def _DefineParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[1:len(TokenList)] = TokenList - if not self._ValueList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - if not self._ValueList[2]: - EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - - self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] - Name, Value = self._ValueList[1], self._ValueList[2] - # Sometimes, we need to make differences between EDK and EDK2 modules - if Name == 'INF_VERSION': - try: - self._Version = int(Value, 0) - except: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - - if type(self) == InfParser and self._Version < 0x00010005: - # EDK module allows using defines as macros - self._FileLocalMacros[Name] = Value - self._Defines[Name] = Value - - ## [BuildOptions] section parser - @ParseMacro - def _BuildOptionParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - TokenList2 = GetSplitValueList(TokenList[0], ':', 1) - if len(TokenList2) == 2: - self._ValueList[0] = TokenList2[0] # toolchain family - self._ValueList[1] = TokenList2[1] # keys - else: - self._ValueList[1] = TokenList[0] - if len(TokenList) == 2 and type(self) != DscParser: # value - self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros) - - if self._ValueList[1].count('_') != 4: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "'%s' must be in format of ____FLAGS" % self._ValueList[1], - ExtraData=self._CurrentLine, - File=self.MetaFile, - Line=self._LineIndex+1 - ) - - def _GetMacros(self): - Macros = {} - Macros.update(self._FileLocalMacros) - Macros.update(self._GetApplicableSectionMacro()) - return Macros - - - ## Get section Macros that are applicable to current line, which may come from other sections - ## that share the same name while scope is wider - def _GetApplicableSectionMacro(self): - Macros = {} - for Scope1, Scope2 in [("COMMON", "COMMON"), ("COMMON", self._Scope[0][1]), - (self._Scope[0][0], "COMMON"), (self._Scope[0][0], self._Scope[0][1])]: - if (self._SectionType, Scope1, Scope2) in self._SectionsMacroDict: - Macros.update(self._SectionsMacroDict[(self._SectionType, Scope1, Scope2)]) - return Macros - - _SectionParser = {} - Finished = property(_GetFinished, _SetFinished) - _Macros = property(_GetMacros) - - -## INF file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# -class InfParser(MetaFileParser): - # INF file supported data types (one type per section) - DataType = { - TAB_UNKNOWN.upper() : MODEL_UNKNOWN, - TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE, - TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE, - TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX, - TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC, - TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_DEPEX.upper() : MODEL_EFI_DEPEX, - TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE, - TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION - } - - ## Constructor of InfParser - # - # Initialize object of InfParser - # - # @param FilePath The path of module description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # - def __init__(self, FilePath, FileType, Table): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table) - self.TblFile = EccGlobalData.gDb.TblFile - self.FileID = -1 - - ## Parser starter - def Start(self): - NmakeLine = '' - Content = '' - try: - Content = open(str(self.MetaFile), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - # - # Insert a record for file - # - Filename = NormPath(self.MetaFile) - FileID = self.TblFile.GetFileId(Filename) - if FileID: - self.FileID = FileID - else: - self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_INF) - - # parse the file line by line - IsFindBlockComment = False - - for Index in range(0, len(Content)): - # skip empty, commented, block commented lines - Line = CleanString(Content[Index], AllowCppStyleComment=True) - NextLine = '' - if Index + 1 < len(Content): - NextLine = CleanString(Content[Index + 1]) - if Line == '': - continue - if Line.find(DataType.TAB_COMMENT_EDK_START) > -1: - IsFindBlockComment = True - continue - if Line.find(DataType.TAB_COMMENT_EDK_END) > -1: - IsFindBlockComment = False - continue - if IsFindBlockComment: - continue - - self._LineIndex = Index - self._CurrentLine = Line - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - self._SectionHeaderParser() - # Check invalid sections - if self._Version < 0x00010005: - if self._SectionType in [MODEL_META_DATA_BUILD_OPTION, - MODEL_EFI_LIBRARY_CLASS, - MODEL_META_DATA_PACKAGE, - MODEL_PCD_FIXED_AT_BUILD, - MODEL_PCD_PATCHABLE_IN_MODULE, - MODEL_PCD_FEATURE_FLAG, - MODEL_PCD_DYNAMIC_EX, - MODEL_PCD_DYNAMIC, - MODEL_EFI_GUID, - MODEL_EFI_PROTOCOL, - MODEL_EFI_PPI, - MODEL_META_DATA_USER_EXTENSION]: - EdkLogger.error('Parser', FORMAT_INVALID, - "Section [%s] is not allowed in inf file without version" % (self._SectionName), - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - elif self._SectionType in [MODEL_EFI_INCLUDE, - MODEL_EFI_LIBRARY_INSTANCE, - MODEL_META_DATA_NMAKE]: - EdkLogger.error('Parser', FORMAT_INVALID, - "Section [%s] is not allowed in inf file with version 0x%08x" % (self._SectionName, self._Version), - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - continue - # merge two lines specified by '\' in section NMAKE - elif self._SectionType == MODEL_META_DATA_NMAKE: - if Line[-1] == '\\': - if NextLine == '': - self._CurrentLine = NmakeLine + Line[0:-1] - NmakeLine = '' - else: - if NextLine[0] == TAB_SECTION_START and NextLine[-1] == TAB_SECTION_END: - self._CurrentLine = NmakeLine + Line[0:-1] - NmakeLine = '' - else: - NmakeLine = NmakeLine + ' ' + Line[0:-1] - continue - else: - self._CurrentLine = NmakeLine + Line - NmakeLine = '' - - # section content - self._ValueList = ['','',''] - # parse current line, result will be put in self._ValueList - self._SectionParser[self._SectionType](self) - if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: - self._ItemType = -1 - continue - # - # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - self._ValueList[0] = self._ValueList[0].replace('/', '\\') - for Arch, Platform in self._Scope: - self._Store(self._SectionType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - Platform, - self._Owner[-1], - self.FileID, - self._LineIndex+1, - -1, - self._LineIndex+1, - -1, - 0 - ) - if IsFindBlockComment: - EdkLogger.error("Parser", FORMAT_INVALID, "Open block comments (starting with /*) are expected to end with */", - File=self.MetaFile) - self._Done() - - ## Data parser for the format in which there's path - # - # Only path can have macro used. So we need to replace them before use. - # - def _IncludeParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - Macros = self._Macros - if Macros: - for Index in range(0, len(self._ValueList)): - Value = self._ValueList[Index] - if not Value: - continue - - if Value.upper().find('$(EFI_SOURCE)\Edk'.upper()) > -1 or Value.upper().find('$(EFI_SOURCE)/Edk'.upper()) > -1: - Value = '$(EDK_SOURCE)' + Value[17:] - if Value.find('$(EFI_SOURCE)') > -1 or Value.find('$(EDK_SOURCE)') > -1: - pass - elif Value.startswith('.'): - pass - elif Value.startswith('$('): - pass - else: - Value = '$(EFI_SOURCE)/' + Value - - self._ValueList[Index] = ReplaceMacro(Value, Macros) - - ## Parse [Sources] section - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _SourceFileParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - Macros = self._Macros - # For Acpi tables, remove macro like ' TABLE_NAME=Sata1' - if 'COMPONENT_TYPE' in Macros: - if self._Defines['COMPONENT_TYPE'].upper() == 'ACPITABLE': - self._ValueList[0] = GetSplitValueList(self._ValueList[0], ' ', 1)[0] - if self._Defines['BASE_NAME'] == 'Microcode': - pass - self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] - - ## Parse [Binaries] section - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _BinaryFileParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 2) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No file type or path specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex+1) - if not TokenList[0]: - EdkLogger.error('Parser', FORMAT_INVALID, "No file type specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex+1) - if not TokenList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No file path specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex+1) - self._ValueList[0:len(TokenList)] = TokenList - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) - - ## [nmake] section parser (Edk.x style only) - def _NmakeParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[0:len(TokenList)] = TokenList - # remove macros - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) - # remove self-reference in macro setting - #self._ValueList[1] = ReplaceMacro(self._ValueList[1], {self._ValueList[0]:''}) - - ## [FixedPcd], [FeaturePcd], [PatchPcd], [Pcd] and [PcdEx] sections parser - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - ValueList = GetSplitValueList(TokenList[0], TAB_SPLIT) - if len(ValueList) != 2: - EdkLogger.error('Parser', FORMAT_INVALID, "Illegal token space GUID and PCD name format", - ExtraData=self._CurrentLine + " (.)", - File=self.MetaFile, Line=self._LineIndex+1) - self._ValueList[0:1] = ValueList - if len(TokenList) > 1: - self._ValueList[2] = TokenList[1] - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + " (.)", - File=self.MetaFile, Line=self._LineIndex+1) - - # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. - if self._ValueList[2] != '': - InfPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) - if InfPcdValueList[0] in ['True', 'true', 'TRUE']: - self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1); - elif InfPcdValueList[0] in ['False', 'false', 'FALSE']: - self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1); - - ## [depex] section parser - @ParseMacro - def _DepexParser(self): - self._ValueList[0:1] = [self._CurrentLine] - - _SectionParser = { - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, - MODEL_META_DATA_BUILD_OPTION : MetaFileParser._BuildOptionParser, - MODEL_EFI_INCLUDE : _IncludeParser, # for Edk.x modules - MODEL_EFI_LIBRARY_INSTANCE : MetaFileParser._CommonParser, # for Edk.x modules - MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, - MODEL_META_DATA_PACKAGE : MetaFileParser._PathParser, - MODEL_META_DATA_NMAKE : _NmakeParser, # for Edk.x modules - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC_EX : _PcdParser, - MODEL_PCD_DYNAMIC : _PcdParser, - MODEL_EFI_SOURCE_FILE : _SourceFileParser, - MODEL_EFI_GUID : MetaFileParser._CommonParser, - MODEL_EFI_PROTOCOL : MetaFileParser._CommonParser, - MODEL_EFI_PPI : MetaFileParser._CommonParser, - MODEL_EFI_DEPEX : _DepexParser, - MODEL_EFI_BINARY_FILE : _BinaryFileParser, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - } - -## DSC file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# @param Owner Owner ID (for sub-section parsing) -# @param From ID from which the data comes (for !INCLUDE directive) -# -class DscParser(MetaFileParser): - # DSC file supported data types (one type per section) - DataType = { - TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID, - TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, - TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_PCDS_DYNAMIC_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_DEFAULT, - TAB_PCDS_DYNAMIC_HII_NULL.upper() : MODEL_PCD_DYNAMIC_HII, - TAB_PCDS_DYNAMIC_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_VPD, - TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_EX_DEFAULT, - TAB_PCDS_DYNAMIC_EX_HII_NULL.upper() : MODEL_PCD_DYNAMIC_EX_HII, - TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_EX_VPD, - TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT, - TAB_COMPONENTS_SOURCE_OVERRIDE_PATH.upper() : MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, - TAB_DSC_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_DSC_DEFINES_EDKGLOBAL : MODEL_META_DATA_GLOBAL_DEFINE, - TAB_INCLUDE.upper() : MODEL_META_DATA_INCLUDE, - TAB_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - TAB_IF_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - TAB_IF_N_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF, - TAB_ELSE_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF, - TAB_ELSE.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, - TAB_END_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF, - } - - # Valid names in define section - DefineKeywords = [ - "DSC_SPECIFICATION", - "PLATFORM_NAME", - "PLATFORM_GUID", - "PLATFORM_VERSION", - "SKUID_IDENTIFIER", - "PCD_INFO_GENERATION", - "SUPPORTED_ARCHITECTURES", - "BUILD_TARGETS", - "OUTPUT_DIRECTORY", - "FLASH_DEFINITION", - "BUILD_NUMBER", - "RFC_LANGUAGES", - "ISO_LANGUAGES", - "TIME_STAMP_FILE", - "VPD_TOOL_GUID", - "FIX_LOAD_TOP_MEMORY_ADDRESS" - ] - - SymbolPattern = ValueExpression.SymbolPattern - - ## Constructor of DscParser - # - # Initialize object of DscParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # @param Owner Owner ID (for sub-section parsing) - # @param From ID from which the data comes (for !INCLUDE directive) - # - def __init__(self, FilePath, FileType, Table, Owner=-1, From=-1): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table, Owner, From) - self._Version = 0x00010005 # Only EDK2 dsc file is supported - # to store conditional directive evaluation result - self._DirectiveStack = [] - self._DirectiveEvalStack = [] - self._Enabled = 1 - - # Final valid replacable symbols - self._Symbols = {} - # - # Map the ID between the original table and new table to track - # the owner item - # - self._IdMapping = {-1:-1} - - self.TblFile = EccGlobalData.gDb.TblFile - self.FileID = -1 - - ## Parser starter - def Start(self): - Content = '' - try: - Content = open(str(self.MetaFile.Path), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - # - # Insert a record for file - # - Filename = NormPath(self.MetaFile.Path) - FileID = self.TblFile.GetFileId(Filename) - if FileID: - self.FileID = FileID - else: - self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DSC) - - - for Index in range(0, len(Content)): - Line = CleanString(Content[Index]) - # skip empty line - if Line == '': - continue - - self._CurrentLine = Line - self._LineIndex = Index - if self._InSubsection and self._Owner[-1] == -1: - self._Owner.append(self._LastItem) - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - self._SectionType = MODEL_META_DATA_SECTION_HEADER - # subsection ending - elif Line[0] == '}' and self._InSubsection: - self._InSubsection = False - self._SubsectionType = MODEL_UNKNOWN - self._SubsectionName = '' - self._Owner[-1] = -1 - continue - # subsection header - elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END: - self._SubsectionType = MODEL_META_DATA_SUBSECTION_HEADER - # directive line - elif Line[0] == '!': - self._DirectiveParser() - continue - - if self._InSubsection: - SectionType = self._SubsectionType - else: - SectionType = self._SectionType - self._ItemType = SectionType - - self._ValueList = ['', '', ''] - self._SectionParser[SectionType](self) - if self._ValueList == None: - continue - # - # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - for Arch, ModuleType in self._Scope: - self._LastItem = self._Store( - self._ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - ModuleType, - self._Owner[-1], - self.FileID, - self._From, - self._LineIndex+1, - -1, - self._LineIndex+1, - -1, - self._Enabled - ) - - if self._DirectiveStack: - Type, Line, Text = self._DirectiveStack[-1] - EdkLogger.error('Parser', FORMAT_INVALID, "No matching '!endif' found", - ExtraData=Text, File=self.MetaFile, Line=Line) - self._Done() - - ## parser - def _SubsectionHeaderParser(self): - self._SubsectionName = self._CurrentLine[1:-1].upper() - if self._SubsectionName in self.DataType: - self._SubsectionType = self.DataType[self._SubsectionName] - else: - self._SubsectionType = MODEL_UNKNOWN - EdkLogger.warn("Parser", "Unrecognized sub-section", File=self.MetaFile, - Line=self._LineIndex+1, ExtraData=self._CurrentLine) - self._ValueList[0] = self._SubsectionName - - ## Directive statement parser - def _DirectiveParser(self): - self._ValueList = ['','',''] - TokenList = GetSplitValueList(self._CurrentLine, ' ', 1) - self._ValueList[0:len(TokenList)] = TokenList - - # Syntax check - DirectiveName = self._ValueList[0].upper() - if DirectiveName not in self.DataType: - EdkLogger.error("Parser", FORMAT_INVALID, "Unknown directive [%s]" % DirectiveName, - File=self.MetaFile, Line=self._LineIndex+1) - if DirectiveName in ['!IF', '!IFDEF', '!INCLUDE', '!IFNDEF', '!ELSEIF'] and self._ValueList[1] == '': - EdkLogger.error("Parser", FORMAT_INVALID, "Missing expression", - File=self.MetaFile, Line=self._LineIndex+1, - ExtraData=self._CurrentLine) - - ItemType = self.DataType[DirectiveName] - if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: - # Remove all directives between !if and !endif, including themselves - while self._DirectiveStack: - # Remove any !else or !elseif - DirectiveInfo = self._DirectiveStack.pop() - if DirectiveInfo[0] in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - break - else: - EdkLogger.error("Parser", FORMAT_INVALID, "Redundant '!endif'", - File=self.MetaFile, Line=self._LineIndex+1, - ExtraData=self._CurrentLine) - elif ItemType != MODEL_META_DATA_INCLUDE: - # Break if there's a !else is followed by a !elseif - if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF and \ - self._DirectiveStack and \ - self._DirectiveStack[-1][0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: - EdkLogger.error("Parser", FORMAT_INVALID, "'!elseif' after '!else'", - File=self.MetaFile, Line=self._LineIndex+1, - ExtraData=self._CurrentLine) - self._DirectiveStack.append((ItemType, self._LineIndex+1, self._CurrentLine)) - elif self._From > 0: - EdkLogger.error('Parser', FORMAT_INVALID, - "No '!include' allowed in included file", - ExtraData=self._CurrentLine, File=self.MetaFile, - Line=self._LineIndex+1) - - # - # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - self._LastItem = self._Store( - ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - 'COMMON', - 'COMMON', - self._Owner[-1], - self.FileID, - self._From, - self._LineIndex+1, - -1, - self._LineIndex+1, - -1, - 0 - ) - - ## [defines] section parser - @ParseMacro - def _DefineParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[1:len(TokenList)] = TokenList - - # Syntax check - if not self._ValueList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - if not self._ValueList[2]: - EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - if not self._ValueList[1] in self.DefineKeywords: - EdkLogger.error('Parser', FORMAT_INVALID, - "Unknown keyword found: %s. " - "If this is a macro you must " - "add it as a DEFINE in the DSC" % self._ValueList[1], - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - self._Defines[self._ValueList[1]] = self._ValueList[2] - self._ItemType = self.DataType[TAB_DSC_DEFINES.upper()] - - @ParseMacro - def _SkuIdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - if len(TokenList) != 2: - EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '|'", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) - self._ValueList[0:len(TokenList)] = TokenList - - ## Parse Edk style of library modules - def _LibraryInstanceParser(self): - self._ValueList[0] = self._CurrentLine - - ## PCD sections parser - # - # [PcdsFixedAtBuild] - # [PcdsPatchableInModule] - # [PcdsFeatureFlag] - # [PcdsDynamicEx - # [PcdsDynamicExDefault] - # [PcdsDynamicExVpd] - # [PcdsDynamicExHii] - # [PcdsDynamic] - # [PcdsDynamicDefault] - # [PcdsDynamicVpd] - # [PcdsDynamicHii] - # - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) - if len(TokenList) == 2: - self._ValueList[2] = TokenList[1] - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + " (.|)", - File=self.MetaFile, Line=self._LineIndex+1) - if self._ValueList[2] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given", - ExtraData=self._CurrentLine + " (.|)", - File=self.MetaFile, Line=self._LineIndex+1) - # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. - DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) - if DscPcdValueList[0] in ['True', 'true', 'TRUE']: - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '1', 1); - elif DscPcdValueList[0] in ['False', 'false', 'FALSE']: - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '0', 1); - - ## [components] section parser - @ParseMacro - def _ComponentParser(self): - if self._CurrentLine[-1] == '{': - self._ValueList[0] = self._CurrentLine[0:-1].strip() - self._InSubsection = True - else: - self._ValueList[0] = self._CurrentLine - - ## [LibraryClasses] section - @ParseMacro - def _LibraryClassParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No library class or instance specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex+1) - if TokenList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No library class specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex+1) - if TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No library instance specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex+1) - - self._ValueList[0:len(TokenList)] = TokenList - - def _CompponentSourceOverridePathParser(self): - self._ValueList[0] = self._CurrentLine - - ## [BuildOptions] section parser - @ParseMacro - def _BuildOptionParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - TokenList2 = GetSplitValueList(TokenList[0], ':', 1) - if len(TokenList2) == 2: - self._ValueList[0] = TokenList2[0] # toolchain family - self._ValueList[1] = TokenList2[1] # keys - else: - self._ValueList[1] = TokenList[0] - if len(TokenList) == 2: # value - self._ValueList[2] = TokenList[1] - - if self._ValueList[1].count('_') != 4: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "'%s' must be in format of ____FLAGS" % self._ValueList[1], - ExtraData=self._CurrentLine, - File=self.MetaFile, - Line=self._LineIndex+1 - ) - - ## Override parent's method since we'll do all macro replacements in parser - def _GetMacros(self): - Macros = {} - Macros.update(self._FileLocalMacros) - Macros.update(self._GetApplicableSectionMacro()) - Macros.update(GlobalData.gEdkGlobal) - Macros.update(GlobalData.gPlatformDefines) - Macros.update(GlobalData.gCommandLineDefines) - # PCD cannot be referenced in macro definition - if self._ItemType not in [MODEL_META_DATA_DEFINE, MODEL_META_DATA_GLOBAL_DEFINE]: - Macros.update(self._Symbols) - return Macros - - def _PostProcess(self): - Processer = { - MODEL_META_DATA_SECTION_HEADER : self.__ProcessSectionHeader, - MODEL_META_DATA_SUBSECTION_HEADER : self.__ProcessSubsectionHeader, - MODEL_META_DATA_HEADER : self.__ProcessDefine, - MODEL_META_DATA_DEFINE : self.__ProcessDefine, - MODEL_META_DATA_GLOBAL_DEFINE : self.__ProcessDefine, - MODEL_META_DATA_INCLUDE : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective, - MODEL_EFI_SKU_ID : self.__ProcessSkuId, - MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance, - MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass, - MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd, - MODEL_PCD_PATCHABLE_IN_MODULE : self.__ProcessPcd, - MODEL_PCD_FEATURE_FLAG : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_DEFAULT : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_HII : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_VPD : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_DEFAULT : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_HII : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_VPD : self.__ProcessPcd, - MODEL_META_DATA_COMPONENT : self.__ProcessComponent, - MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : self.__ProcessSourceOverridePath, - MODEL_META_DATA_BUILD_OPTION : self.__ProcessBuildOption, - MODEL_UNKNOWN : self._Skip, - MODEL_META_DATA_USER_EXTENSION : self._Skip, - } - - self._RawTable = self._Table - self._Table = MetaFileStorage(self._RawTable.Cur, self.MetaFile, MODEL_FILE_DSC, True) - self._DirectiveStack = [] - self._DirectiveEvalStack = [] - self._FileWithError = self.MetaFile - self._FileLocalMacros = {} - self._SectionsMacroDict = {} - GlobalData.gPlatformDefines = {} - - # Get all macro and PCD which has straitforward value - self.__RetrievePcdValue() - self._Content = self._RawTable.GetAll() - self._ContentIndex = 0 - while self._ContentIndex < len(self._Content) : - Id, self._ItemType, V1, V2, V3, S1, S2, Owner, BelongsToFile, self._From, \ - LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex] - - if self._From < 0: - self._FileWithError = self.MetaFile - - self._ContentIndex += 1 - - self._Scope = [[S1, S2]] - self._LineIndex = LineStart - 1 - self._ValueList = [V1, V2, V3] - - try: - Processer[self._ItemType]() - except EvaluationException, Excpt: - # - # Only catch expression evaluation error here. We need to report - # the precise number of line on which the error occurred - # - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex+1) - except MacroException, Excpt: - EdkLogger.error('Parser', FORMAT_INVALID, str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex+1) - - if self._ValueList == None: - continue - - NewOwner = self._IdMapping.get(Owner, -1) - self._Enabled = int((not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack)) - self._LastItem = self._Store( - self._ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - S1, - S2, - NewOwner, - BelongsToFile, - self._From, - self._LineIndex+1, - -1, - self._LineIndex+1, - -1, - self._Enabled - ) - self._IdMapping[Id] = self._LastItem - - RecordList = self._Table.GetAll() - - self._RawTable.Drop() - self._Table.Drop() - for Record in RecordList: - EccGlobalData.gDb.TblDsc.Insert(Record[1],Record[2],Record[3],Record[4],Record[5],Record[6],Record[7],Record[8],Record[9],Record[10],Record[11],Record[12],Record[13],Record[14]) - GlobalData.gPlatformDefines.update(self._FileLocalMacros) - self._PostProcessed = True - self._Content = None - - def __ProcessSectionHeader(self): - self._SectionName = self._ValueList[0] - if self._SectionName in self.DataType: - self._SectionType = self.DataType[self._SectionName] - else: - self._SectionType = MODEL_UNKNOWN - - def __ProcessSubsectionHeader(self): - self._SubsectionName = self._ValueList[0] - if self._SubsectionName in self.DataType: - self._SubsectionType = self.DataType[self._SubsectionName] - else: - self._SubsectionType = MODEL_UNKNOWN - - def __RetrievePcdValue(self): - Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem=-1.0) - for TokenSpaceGuid,PcdName,Value,Dummy2,Dummy3,ID,Line in Records: - Value, DatumType, MaxDatumSize = AnalyzePcdData(Value) - # Only use PCD whose value is straitforward (no macro and PCD) - if self.SymbolPattern.findall(Value): - continue - Name = TokenSpaceGuid + '.' + PcdName - # Don't use PCD with different values. - if Name in self._Symbols and self._Symbols[Name] != Value: - self._Symbols.pop(Name) - continue - self._Symbols[Name] = Value - - Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem=-1.0) - for TokenSpaceGuid,PcdName,Value,Dummy2,Dummy3,ID,Line in Records: - Value, DatumType, MaxDatumSize = AnalyzePcdData(Value) - # Only use PCD whose value is straitforward (no macro and PCD) - if self.SymbolPattern.findall(Value): - continue - Name = TokenSpaceGuid+'.'+PcdName - # Don't use PCD with different values. - if Name in self._Symbols and self._Symbols[Name] != Value: - self._Symbols.pop(Name) - continue - self._Symbols[Name] = Value - - def __ProcessDefine(self): - if not self._Enabled: - return - - Type, Name, Value = self._ValueList - Value = ReplaceMacro(Value, self._Macros, False) - if self._ItemType == MODEL_META_DATA_DEFINE: - if self._SectionType == MODEL_META_DATA_HEADER: - self._FileLocalMacros[Name] = Value - else: - SectionDictKey = self._SectionType, self._Scope[0][0], self._Scope[0][1] - if SectionDictKey not in self._SectionsMacroDict: - self._SectionsMacroDict[SectionDictKey] = {} - SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] - SectionLocalMacros[Name] = Value - elif self._ItemType == MODEL_META_DATA_GLOBAL_DEFINE: - GlobalData.gEdkGlobal[Name] = Value - - # - # Keyword in [Defines] section can be used as Macros - # - if (self._ItemType == MODEL_META_DATA_HEADER) and (self._SectionType == MODEL_META_DATA_HEADER): - self._FileLocalMacros[Name] = Value - - self._ValueList = [Type, Name, Value] - - def __ProcessDirective(self): - Result = None - if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF]: - Macros = self._Macros - Macros.update(GlobalData.gGlobalDefines) - try: - Result = ValueExpression(self._ValueList[1], Macros)() - except SymbolNotFound, Exc: - EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc), self._ValueList[1]) - Result = False - except WrnExpression, Excpt: - # - # Catch expression evaluation warning here. We need to report - # the precise number of line and return the evaluation result - # - EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex+1) - Result = Excpt.result - - if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - self._DirectiveStack.append(self._ItemType) - if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IF: - Result = bool(Result) - else: - Macro = self._ValueList[1] - Macro = Macro[2:-1] if (Macro.startswith("$(") and Macro.endswith(")")) else Macro - Result = Macro in self._Macros - if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF: - Result = not Result - self._DirectiveEvalStack.append(Result) - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF: - self._DirectiveStack.append(self._ItemType) - self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] - self._DirectiveEvalStack.append(bool(Result)) - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: - self._DirectiveStack[-1] = self._ItemType - self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: - # Back to the nearest !if/!ifdef/!ifndef - while self._DirectiveStack: - self._DirectiveEvalStack.pop() - Directive = self._DirectiveStack.pop() - if Directive in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - break - elif self._ItemType == MODEL_META_DATA_INCLUDE: - # The included file must be relative to workspace or same directory as DSC file - __IncludeMacros = {} - # - # Allow using system environment variables in path after !include - # - __IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE'] - if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys(): - __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE'] - # - # During GenFds phase call DSC parser, will go into this branch. - # - elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys(): - __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE'] - - __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE'] - __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE'] - # - # Allow using MACROs comes from [Defines] section to keep compatible. - # - __IncludeMacros.update(self._Macros) - - IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True)) - # - # First search the include file under the same directory as DSC file - # - IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir) - ErrorCode, ErrorInfo1 = IncludedFile1.Validate() - if ErrorCode != 0: - # - # Also search file under the WORKSPACE directory - # - IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) - ErrorCode, ErrorInfo2 = IncludedFile1.Validate() - if ErrorCode != 0: - EdkLogger.error('parser', ErrorCode, File=self._FileWithError, - Line=self._LineIndex+1, ExtraData=ErrorInfo1 + "\n"+ ErrorInfo2) - - self._FileWithError = IncludedFile1 - - IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, True) - Owner = self._Content[self._ContentIndex-1][0] - Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable, - Owner=Owner, From=Owner) - - # set the parser status with current status - Parser._SectionName = self._SectionName - Parser._SectionType = self._SectionType - Parser._Scope = self._Scope - Parser._Enabled = self._Enabled - # Parse the included file - Parser.Start() - - # update current status with sub-parser's status - self._SectionName = Parser._SectionName - self._SectionType = Parser._SectionType - self._Scope = Parser._Scope - self._Enabled = Parser._Enabled - - # Insert all records in the table for the included file into dsc file table - Records = IncludedFileTable.GetAll() - if Records: - self._Content[self._ContentIndex:self._ContentIndex] = Records - self._Content.pop(self._ContentIndex-1) - self._ValueList = None - self._ContentIndex -= 1 - - def __ProcessSkuId(self): - self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) - for Value in self._ValueList] - - def __ProcessLibraryInstance(self): - self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] - - def __ProcessLibraryClass(self): - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True) - - def __ProcessPcd(self): - ValueList = GetSplitValueList(self._ValueList[2]) - # - # PCD value can be an expression - # - if len(ValueList) > 1 and ValueList[1] == 'VOID*': - PcdValue = ValueList[0] - try: - ValueList[0] = ValueExpression(PcdValue, self._Macros)(True) - except WrnExpression, Value: - ValueList[0] = Value.result - else: - PcdValue = ValueList[-1] - try: - ValueList[-1] = ValueExpression(PcdValue, self._Macros)(True) - except WrnExpression, Value: - ValueList[-1] = Value.result - - if ValueList[-1] == 'True': - ValueList[-1] = '1' - if ValueList[-1] == 'False': - ValueList[-1] = '0' - - self._ValueList[2] = '|'.join(ValueList) - - def __ProcessComponent(self): - self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) - - def __ProcessSourceOverridePath(self): - self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) - - def __ProcessBuildOption(self): - self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False) - for Value in self._ValueList] - - _SectionParser = { - MODEL_META_DATA_HEADER : _DefineParser, - MODEL_EFI_SKU_ID : _SkuIdParser, - MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser, - MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser, - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC_DEFAULT : _PcdParser, - MODEL_PCD_DYNAMIC_HII : _PcdParser, - MODEL_PCD_DYNAMIC_VPD : _PcdParser, - MODEL_PCD_DYNAMIC_EX_DEFAULT : _PcdParser, - MODEL_PCD_DYNAMIC_EX_HII : _PcdParser, - MODEL_PCD_DYNAMIC_EX_VPD : _PcdParser, - MODEL_META_DATA_COMPONENT : _ComponentParser, - MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : _CompponentSourceOverridePathParser, - MODEL_META_DATA_BUILD_OPTION : _BuildOptionParser, - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - MODEL_META_DATA_SECTION_HEADER : MetaFileParser._SectionHeaderParser, - MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHeaderParser, - } - - _Macros = property(_GetMacros) - -## DEC file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# -class DecParser(MetaFileParser): - # DEC file supported data types (one type per section) - DataType = { - TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC, - TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX, - } - - ## Constructor of DecParser - # - # Initialize object of DecParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # - def __init__(self, FilePath, FileType, Table): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table) - self._Comments = [] - self._Version = 0x00010005 # Only EDK2 dec file is supported - self.TblFile = EccGlobalData.gDb.TblFile - self.FileID = -1 - - ## Parser starter - def Start(self): - Content = '' - try: - Content = open(str(self.MetaFile), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - - # - # Insert a record for file - # - Filename = NormPath(self.MetaFile) - FileID = self.TblFile.GetFileId(Filename) - if FileID: - self.FileID = FileID - else: - self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DEC) - - for Index in range(0, len(Content)): - Line, Comment = CleanString2(Content[Index]) - self._CurrentLine = Line - self._LineIndex = Index - - # save comment for later use - if Comment: - self._Comments.append((Comment, self._LineIndex+1)) - # skip empty line - if Line == '': - continue - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - self._SectionHeaderParser() - self._Comments = [] - continue - elif len(self._SectionType) == 0: - self._Comments = [] - continue - - # section content - self._ValueList = ['','',''] - self._SectionParser[self._SectionType[0]](self) - if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: - self._ItemType = -1 - self._Comments = [] - continue - - # - # Model, Value1, Value2, Value3, Arch, BelongsToItem=-1, LineBegin=-1, - # ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, FeatureFlag='', Enabled=-1 - # - for Arch, ModuleType, Type in self._Scope: - self._LastItem = self._Store( - Type, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - ModuleType, - self._Owner[-1], - self.FileID, - self._LineIndex+1, - -1, - self._LineIndex+1, - -1, - 0 - ) - for Comment, LineNo in self._Comments: - self._Store( - MODEL_META_DATA_COMMENT, - Comment, - self._ValueList[0], - self._ValueList[1], - Arch, - ModuleType, - self._LastItem, - self.FileID, - LineNo, - -1, - LineNo, - -1, - 0 - ) - self._Comments = [] - self._Done() - - def _GetApplicableSectionMacro(self): - Macros = {} - for S1, S2, SectionType in self._Scope: - for Scope1, Scope2 in [("COMMON", "COMMON"), ("COMMON", S2), (S1, "COMMON"), (S1, S2)]: - if (SectionType, Scope1, Scope2) in self._SectionsMacroDict: - Macros.update(self._SectionsMacroDict[(SectionType, Scope1, Scope2)]) - return Macros - - ## Section header parser - # - # The section header is always in following format: - # - # [section_name.arch<.platform|module_type>] - # - def _SectionHeaderParser(self): - self._Scope = [] - self._SectionName = '' - self._SectionType = [] - ArchList = set() - for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): - if Item == '': - continue - ItemList = GetSplitValueList(Item, TAB_SPLIT) - - # different types of PCD are permissible in one section - self._SectionName = ItemList[0].upper() - if self._SectionName in self.DataType: - if self.DataType[self._SectionName] not in self._SectionType: - self._SectionType.append(self.DataType[self._SectionName]) - else: - EdkLogger.warn("Parser", "Unrecognized section", File=self.MetaFile, - Line=self._LineIndex+1, ExtraData=self._CurrentLine) - continue - - if MODEL_PCD_FEATURE_FLAG in self._SectionType and len(self._SectionType) > 1: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "%s must not be in the same section of other types of PCD" % TAB_PCDS_FEATURE_FLAG_NULL, - File=self.MetaFile, - Line=self._LineIndex+1, - ExtraData=self._CurrentLine - ) - # S1 is always Arch - if len(ItemList) > 1: - S1 = ItemList[1].upper() - else: - S1 = 'COMMON' - ArchList.add(S1) - # S2 may be Platform or ModuleType - if len(ItemList) > 2: - S2 = ItemList[2].upper() - else: - S2 = 'COMMON' - if [S1, S2, self.DataType[self._SectionName]] not in self._Scope: - self._Scope.append([S1, S2, self.DataType[self._SectionName]]) - - # 'COMMON' must not be used with specific ARCHs at the same section - if 'COMMON' in ArchList and len(ArchList) > 1: - EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", - File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) - - ## [guids], [ppis] and [protocols] section parser - @ParseMacro - def _GuidParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name or value specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex+1) - if TokenList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex+1) - if TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID value specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex+1) - if TokenList[1][0] != '{' or TokenList[1][-1] != '}' or GuidStructureStringToGuidString(TokenList[1]) == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", - ExtraData=self._CurrentLine + \ - " ( = )", - File=self.MetaFile, Line=self._LineIndex+1) - self._ValueList[0] = TokenList[0] - #Parse the Guid value format - GuidValueList = TokenList[1].strip(' {}').split(',') - Index = 0 - HexList = [] - if len(GuidValueList) == 11: - for GuidValue in GuidValueList: - GuidValue = GuidValue.strip() - if GuidValue.startswith('0x') or GuidValue.startswith('0X'): - HexList.append('0x' + str(GuidValue[2:])) - Index += 1 - continue - else: - if GuidValue.startswith('{'): - HexList.append('0x' + str(GuidValue[3:])) - Index += 1 - self._ValueList[1] = "{ %s, %s, %s, { %s, %s, %s, %s, %s, %s, %s, %s }}" % (HexList[0], HexList[1], HexList[2],HexList[3],HexList[4],HexList[5],HexList[6],HexList[7],HexList[8],HexList[9],HexList[10]) - else: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", - ExtraData=self._CurrentLine + \ - " ( = )", - File=self.MetaFile, Line=self._LineIndex+1) - self._ValueList[0] = '' - - ## PCD sections parser - # - # [PcdsFixedAtBuild] - # [PcdsPatchableInModule] - # [PcdsFeatureFlag] - # [PcdsDynamicEx - # [PcdsDynamic] - # - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) - # check PCD information - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - # check PCD datum information - if len(TokenList) < 2 or TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - - - ValueRe = re.compile(r'^\s*L?\".*\|.*\"') - PtrValue = ValueRe.findall(TokenList[1]) - - # Has VOID* type string, may contain "|" character in the string. - if len(PtrValue) != 0: - ptrValueList = re.sub(ValueRe, '', TokenList[1]) - ValueList = GetSplitValueList(ptrValueList) - ValueList[0] = PtrValue[0] - else: - ValueList = GetSplitValueList(TokenList[1]) - - - # check if there's enough datum information given - if len(ValueList) != 3: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - # check default value - if ValueList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - # check datum type - if ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - # check token of the PCD - if ValueList[2] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex+1) - # check format of default value against the datum type - IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) - if not IsValid: - EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine, - File=self.MetaFile, Line=self._LineIndex+1) - - if ValueList[0] in ['True', 'true', 'TRUE']: - ValueList[0] = '1' - elif ValueList[0] in ['False', 'false', 'FALSE']: - ValueList[0] = '0' - - self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip() - - _SectionParser = { - MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, - MODEL_EFI_INCLUDE : MetaFileParser._PathParser, - MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, - MODEL_EFI_GUID : _GuidParser, - MODEL_EFI_PPI : _GuidParser, - MODEL_EFI_PROTOCOL : _GuidParser, - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC : _PcdParser, - MODEL_PCD_DYNAMIC_EX : _PcdParser, - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - } - - -## FdfObject -# -# This class defined basic Fdf object which is used by inheriting -# -# @param object: Inherited from object class -# -class FdfObject(object): - def __init__(self): - object.__init__() - -## Fdf -# -# This class defined the structure used in Fdf object -# -# @param FdfObject: Inherited from FdfObject class -# @param Filename: Input value for Ffilename of Fdf file, default is None -# @param WorkspaceDir: Input value for current workspace directory, default is None -# -class Fdf(FdfObject): - def __init__(self, Filename = None, IsToDatabase = False, WorkspaceDir = None, Database = None): - self.WorkspaceDir = WorkspaceDir - self.IsToDatabase = IsToDatabase - - self.Cur = Database.Cur - self.TblFile = Database.TblFile - self.TblFdf = Database.TblFdf - self.FileID = -1 - self.FileList = {} - - # - # Load Fdf file if filename is not None - # - if Filename != None: - self.LoadFdfFile(Filename) - - # - # Insert a FDF file record into database - # - def InsertFile(self, Filename): - FileID = -1 - Filename = NormPath(Filename) - if Filename not in self.FileList: - FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_FDF) - self.FileList[Filename] = FileID - - return self.FileList[Filename] - - - ## Load Fdf file - # - # Load the file if it exists - # - # @param Filename: Input value for filename of Fdf file - # - def LoadFdfFile(self, Filename): - FileList = [] - # - # Parse Fdf file - # - Filename = NormPath(Filename) - Fdf = FdfParser(Filename) - Fdf.ParseFile() - - # - # Insert inf file and pcd information - # - if self.IsToDatabase: - (Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) = \ - (0, '', '', '', 'COMMON', 'COMMON', -1, -1, -1, -1, -1, -1, 0) - for Index in range(0, len(Fdf.Profile.PcdDict)): - pass - for Key in Fdf.Profile.PcdDict.keys(): - Model = MODEL_PCD - Value1 = Key[1] - Value2 = Key[0] - FileName = Fdf.Profile.PcdFileLineDict[Key][0] - StartLine = Fdf.Profile.PcdFileLineDict[Key][1] - BelongsToFile = self.InsertFile(FileName) - self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) - for Index in range(0, len(Fdf.Profile.InfList)): - Model = MODEL_META_DATA_COMPONENT - Value1 = Fdf.Profile.InfList[Index] - Value2 = '' - FileName = Fdf.Profile.InfFileLineList[Index][0] - StartLine = Fdf.Profile.InfFileLineList[Index][1] - BelongsToFile = self.InsertFile(FileName) - self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - pass - +## @file +# This file is used to parse meta files +# +# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import re +import time +import copy + +import Common.EdkLogger as EdkLogger +import Common.GlobalData as GlobalData +import EccGlobalData + +from CommonDataClass.DataClass import * +from Common.DataType import * +from Common.String import * +from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData +from Common.Expression import * +from CommonDataClass.Exceptions import * + +from MetaFileTable import MetaFileStorage +from GenFds.FdfParser import FdfParser + +## A decorator used to parse macro definition +def ParseMacro(Parser): + def MacroParser(self): + Match = gMacroDefPattern.match(self._CurrentLine) + if not Match: + # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method + Parser(self) + return + + TokenList = GetSplitValueList(self._CurrentLine[Match.end(1):], TAB_EQUAL_SPLIT, 1) + # Syntax check + if not TokenList[0]: + EdkLogger.error('Parser', FORMAT_INVALID, "No macro name given", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + if len(TokenList) < 2: + TokenList.append('') + + Type = Match.group(1) + Name, Value = TokenList + # Global macros can be only defined via environment variable + if Name in GlobalData.gGlobalDefines: + EdkLogger.error('Parser', FORMAT_INVALID, "%s can only be defined via environment variable" % Name, + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + # Only upper case letters, digit and '_' are allowed + if not gMacroNamePattern.match(Name): + EdkLogger.error('Parser', FORMAT_INVALID, "The macro name must be in the pattern [A-Z][A-Z0-9_]*", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + + Value = ReplaceMacro(Value, self._Macros) + self._ItemType = MODEL_META_DATA_DEFINE + # DEFINE defined macros + if Type == TAB_DSC_DEFINES_DEFINE: + if type(self) == DecParser: + if MODEL_META_DATA_HEADER in self._SectionType: + self._FileLocalMacros[Name] = Value + else: + for Scope in self._Scope: + self._SectionsMacroDict.setdefault((Scope[2], Scope[0], Scope[1]), {})[Name] = Value + elif self._SectionType == MODEL_META_DATA_HEADER: + self._FileLocalMacros[Name] = Value + else: + SectionDictKey = self._SectionType, self._Scope[0][0], self._Scope[0][1] + if SectionDictKey not in self._SectionsMacroDict: + self._SectionsMacroDict[SectionDictKey] = {} + SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] + SectionLocalMacros[Name] = Value + # EDK_GLOBAL defined macros + elif type(self) != DscParser: + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used in .dsc file", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + elif self._SectionType != MODEL_META_DATA_HEADER: + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used under [Defines] section", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + elif (Name in self._FileLocalMacros) and (self._FileLocalMacros[Name] != Value): + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL defined a macro with the same name and different value as one defined by 'DEFINE'", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + + self._ValueList = [Type, Name, Value] + + return MacroParser + +## Base class of parser +# +# This class is used for derivation purpose. The specific parser for one kind +# type file must derive this class and implement some public interfaces. +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# @param Owner Owner ID (for sub-section parsing) +# @param From ID from which the data comes (for !INCLUDE directive) +# +class MetaFileParser(object): + # data type (file content) for specific file type + DataType = {} + + # Parser objects used to implement singleton + MetaFiles = {} + + ## Factory method + # + # One file, one parser object. This factory method makes sure that there's + # only one object constructed for one meta file. + # + # @param Class class object of real AutoGen class + # (InfParser, DecParser or DscParser) + # @param FilePath The path of meta file + # @param *args The specific class related parameters + # @param **kwargs The specific class related dict parameters + # + def __new__(Class, FilePath, *args, **kwargs): + if FilePath in Class.MetaFiles: + return Class.MetaFiles[FilePath] + else: + ParserObject = super(MetaFileParser, Class).__new__(Class) + Class.MetaFiles[FilePath] = ParserObject + return ParserObject + + ## Constructor of MetaFileParser + # + # Initialize object of MetaFileParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # @param Owner Owner ID (for sub-section parsing) + # @param From ID from which the data comes (for !INCLUDE directive) + # + def __init__(self, FilePath, FileType, Table, Owner=-1, From=-1): + self._Table = Table + self._RawTable = Table + self._FileType = FileType + self.MetaFile = FilePath + self._Defines = {} + self._FileLocalMacros = {} + self._SectionsMacroDict = {} + + # for recursive parsing + self._Owner = [Owner] + self._From = From + + # parsr status for parsing + self._ValueList = ['', '', '', '', ''] + self._Scope = [] + self._LineIndex = 0 + self._CurrentLine = '' + self._SectionType = MODEL_UNKNOWN + self._SectionName = '' + self._InSubsection = False + self._SubsectionType = MODEL_UNKNOWN + self._SubsectionName = '' + self._ItemType = MODEL_UNKNOWN + self._LastItem = -1 + self._Enabled = 0 + self._Finished = False + self._PostProcessed = False + # Different version of meta-file has different way to parse. + self._Version = 0 + + ## Store the parsed data in table + def _Store(self, *Args): + return self._Table.Insert(*Args) + + ## Virtual method for starting parse + def Start(self): + raise NotImplementedError + + ## Notify a post-process is needed + def DoPostProcess(self): + self._PostProcessed = False + + ## Set parsing complete flag in both class and table + def _Done(self): + self._Finished = True + ## Do not set end flag when processing included files + if self._From == -1: + self._Table.SetEndFlag() + + def _PostProcess(self): + self._PostProcessed = True + + ## Get the parse complete flag + def _GetFinished(self): + return self._Finished + + ## Set the complete flag + def _SetFinished(self, Value): + self._Finished = Value + + ## Use [] style to query data in table, just for readability + # + # DataInfo = [data_type, scope1(arch), scope2(platform/moduletype)] + # + def __getitem__(self, DataInfo): + if type(DataInfo) != type(()): + DataInfo = (DataInfo,) + + # Parse the file first, if necessary + if not self._Finished: + if self._RawTable.IsIntegrity(): + self._Finished = True + else: + self._Table = self._RawTable + self._PostProcessed = False + self.Start() + + # No specific ARCH or Platform given, use raw data + if self._RawTable and (len(DataInfo) == 1 or DataInfo[1] == None): + return self._RawTable.Query(*DataInfo) + + # Do post-process if necessary + if not self._PostProcessed: + self._PostProcess() + + return self._Table.Query(*DataInfo) + + ## Data parser for the common format in different type of file + # + # The common format in the meatfile is like + # + # xxx1 | xxx2 | xxx3 + # + @ParseMacro + def _CommonParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + + ## Data parser for the format in which there's path + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _PathParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + # Don't do macro replacement for dsc file at this point + if type(self) != DscParser: + Macros = self._Macros + self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] + + ## Skip unsupported data + def _Skip(self): + EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile, + Line=self._LineIndex+1, ExtraData=self._CurrentLine); + self._ValueList[0:1] = [self._CurrentLine] + + ## Section header parser + # + # The section header is always in following format: + # + # [section_name.arch<.platform|module_type>] + # + def _SectionHeaderParser(self): + self._Scope = [] + self._SectionName = '' + ArchList = set() + for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): + if Item == '': + continue + ItemList = GetSplitValueList(Item, TAB_SPLIT) + # different section should not mix in one section + if self._SectionName != '' and self._SectionName != ItemList[0].upper(): + EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section", + File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) + self._SectionName = ItemList[0].upper() + if self._SectionName in self.DataType: + self._SectionType = self.DataType[self._SectionName] + else: + self._SectionType = MODEL_UNKNOWN + EdkLogger.warn("Parser", "Unrecognized section", File=self.MetaFile, + Line=self._LineIndex+1, ExtraData=self._CurrentLine) + # S1 is always Arch + if len(ItemList) > 1: + S1 = ItemList[1].upper() + else: + S1 = 'COMMON' + ArchList.add(S1) + # S2 may be Platform or ModuleType + if len(ItemList) > 2: + S2 = ItemList[2].upper() + else: + S2 = 'COMMON' + self._Scope.append([S1, S2]) + + # 'COMMON' must not be used with specific ARCHs at the same section + if 'COMMON' in ArchList and len(ArchList) > 1: + EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", + File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) + # If the section information is needed later, it should be stored in database + self._ValueList[0] = self._SectionName + + ## [defines] section parser + @ParseMacro + def _DefineParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[1:len(TokenList)] = TokenList + if not self._ValueList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + if not self._ValueList[2]: + EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + + self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] + Name, Value = self._ValueList[1], self._ValueList[2] + # Sometimes, we need to make differences between EDK and EDK2 modules + if Name == 'INF_VERSION': + try: + self._Version = int(Value, 0) + except: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + + if type(self) == InfParser and self._Version < 0x00010005: + # EDK module allows using defines as macros + self._FileLocalMacros[Name] = Value + self._Defines[Name] = Value + + ## [BuildOptions] section parser + @ParseMacro + def _BuildOptionParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + TokenList2 = GetSplitValueList(TokenList[0], ':', 1) + if len(TokenList2) == 2: + self._ValueList[0] = TokenList2[0] # toolchain family + self._ValueList[1] = TokenList2[1] # keys + else: + self._ValueList[1] = TokenList[0] + if len(TokenList) == 2 and type(self) != DscParser: # value + self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros) + + if self._ValueList[1].count('_') != 4: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "'%s' must be in format of ____FLAGS" % self._ValueList[1], + ExtraData=self._CurrentLine, + File=self.MetaFile, + Line=self._LineIndex+1 + ) + + def _GetMacros(self): + Macros = {} + Macros.update(self._FileLocalMacros) + Macros.update(self._GetApplicableSectionMacro()) + return Macros + + + ## Get section Macros that are applicable to current line, which may come from other sections + ## that share the same name while scope is wider + def _GetApplicableSectionMacro(self): + Macros = {} + for Scope1, Scope2 in [("COMMON", "COMMON"), ("COMMON", self._Scope[0][1]), + (self._Scope[0][0], "COMMON"), (self._Scope[0][0], self._Scope[0][1])]: + if (self._SectionType, Scope1, Scope2) in self._SectionsMacroDict: + Macros.update(self._SectionsMacroDict[(self._SectionType, Scope1, Scope2)]) + return Macros + + _SectionParser = {} + Finished = property(_GetFinished, _SetFinished) + _Macros = property(_GetMacros) + + +## INF file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# +class InfParser(MetaFileParser): + # INF file supported data types (one type per section) + DataType = { + TAB_UNKNOWN.upper() : MODEL_UNKNOWN, + TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, + TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, + TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE, + TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE, + TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX, + TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC, + TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE, + TAB_GUIDS.upper() : MODEL_EFI_GUID, + TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, + TAB_PPIS.upper() : MODEL_EFI_PPI, + TAB_DEPEX.upper() : MODEL_EFI_DEPEX, + TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE, + TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION + } + + ## Constructor of InfParser + # + # Initialize object of InfParser + # + # @param FilePath The path of module description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # + def __init__(self, FilePath, FileType, Table): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table) + self.TblFile = EccGlobalData.gDb.TblFile + self.FileID = -1 + + ## Parser starter + def Start(self): + NmakeLine = '' + Content = '' + try: + Content = open(str(self.MetaFile), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + # + # Insert a record for file + # + Filename = NormPath(self.MetaFile) + FileID = self.TblFile.GetFileId(Filename) + if FileID: + self.FileID = FileID + else: + self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_INF) + + # parse the file line by line + IsFindBlockComment = False + + for Index in range(0, len(Content)): + # skip empty, commented, block commented lines + Line = CleanString(Content[Index], AllowCppStyleComment=True) + NextLine = '' + if Index + 1 < len(Content): + NextLine = CleanString(Content[Index + 1]) + if Line == '': + continue + if Line.find(DataType.TAB_COMMENT_EDK_START) > -1: + IsFindBlockComment = True + continue + if Line.find(DataType.TAB_COMMENT_EDK_END) > -1: + IsFindBlockComment = False + continue + if IsFindBlockComment: + continue + + self._LineIndex = Index + self._CurrentLine = Line + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + self._SectionHeaderParser() + # Check invalid sections + if self._Version < 0x00010005: + if self._SectionType in [MODEL_META_DATA_BUILD_OPTION, + MODEL_EFI_LIBRARY_CLASS, + MODEL_META_DATA_PACKAGE, + MODEL_PCD_FIXED_AT_BUILD, + MODEL_PCD_PATCHABLE_IN_MODULE, + MODEL_PCD_FEATURE_FLAG, + MODEL_PCD_DYNAMIC_EX, + MODEL_PCD_DYNAMIC, + MODEL_EFI_GUID, + MODEL_EFI_PROTOCOL, + MODEL_EFI_PPI, + MODEL_META_DATA_USER_EXTENSION]: + EdkLogger.error('Parser', FORMAT_INVALID, + "Section [%s] is not allowed in inf file without version" % (self._SectionName), + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + elif self._SectionType in [MODEL_EFI_INCLUDE, + MODEL_EFI_LIBRARY_INSTANCE, + MODEL_META_DATA_NMAKE]: + EdkLogger.error('Parser', FORMAT_INVALID, + "Section [%s] is not allowed in inf file with version 0x%08x" % (self._SectionName, self._Version), + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + continue + # merge two lines specified by '\' in section NMAKE + elif self._SectionType == MODEL_META_DATA_NMAKE: + if Line[-1] == '\\': + if NextLine == '': + self._CurrentLine = NmakeLine + Line[0:-1] + NmakeLine = '' + else: + if NextLine[0] == TAB_SECTION_START and NextLine[-1] == TAB_SECTION_END: + self._CurrentLine = NmakeLine + Line[0:-1] + NmakeLine = '' + else: + NmakeLine = NmakeLine + ' ' + Line[0:-1] + continue + else: + self._CurrentLine = NmakeLine + Line + NmakeLine = '' + + # section content + self._ValueList = ['','',''] + # parse current line, result will be put in self._ValueList + self._SectionParser[self._SectionType](self) + if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: + self._ItemType = -1 + continue + # + # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + self._ValueList[0] = self._ValueList[0].replace('/', '\\') + for Arch, Platform in self._Scope: + self._Store(self._SectionType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + Platform, + self._Owner[-1], + self.FileID, + self._LineIndex+1, + -1, + self._LineIndex+1, + -1, + 0 + ) + if IsFindBlockComment: + EdkLogger.error("Parser", FORMAT_INVALID, "Open block comments (starting with /*) are expected to end with */", + File=self.MetaFile) + self._Done() + + ## Data parser for the format in which there's path + # + # Only path can have macro used. So we need to replace them before use. + # + def _IncludeParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + Macros = self._Macros + if Macros: + for Index in range(0, len(self._ValueList)): + Value = self._ValueList[Index] + if not Value: + continue + + if Value.upper().find('$(EFI_SOURCE)\Edk'.upper()) > -1 or Value.upper().find('$(EFI_SOURCE)/Edk'.upper()) > -1: + Value = '$(EDK_SOURCE)' + Value[17:] + if Value.find('$(EFI_SOURCE)') > -1 or Value.find('$(EDK_SOURCE)') > -1: + pass + elif Value.startswith('.'): + pass + elif Value.startswith('$('): + pass + else: + Value = '$(EFI_SOURCE)/' + Value + + self._ValueList[Index] = ReplaceMacro(Value, Macros) + + ## Parse [Sources] section + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _SourceFileParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + Macros = self._Macros + # For Acpi tables, remove macro like ' TABLE_NAME=Sata1' + if 'COMPONENT_TYPE' in Macros: + if self._Defines['COMPONENT_TYPE'].upper() == 'ACPITABLE': + self._ValueList[0] = GetSplitValueList(self._ValueList[0], ' ', 1)[0] + if self._Defines['BASE_NAME'] == 'Microcode': + pass + self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] + + ## Parse [Binaries] section + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _BinaryFileParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 2) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No file type or path specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex+1) + if not TokenList[0]: + EdkLogger.error('Parser', FORMAT_INVALID, "No file type specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex+1) + if not TokenList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No file path specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex+1) + self._ValueList[0:len(TokenList)] = TokenList + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) + + ## [nmake] section parser (Edk.x style only) + def _NmakeParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[0:len(TokenList)] = TokenList + # remove macros + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) + # remove self-reference in macro setting + #self._ValueList[1] = ReplaceMacro(self._ValueList[1], {self._ValueList[0]:''}) + + ## [FixedPcd], [FeaturePcd], [PatchPcd], [Pcd] and [PcdEx] sections parser + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + ValueList = GetSplitValueList(TokenList[0], TAB_SPLIT) + if len(ValueList) != 2: + EdkLogger.error('Parser', FORMAT_INVALID, "Illegal token space GUID and PCD name format", + ExtraData=self._CurrentLine + " (.)", + File=self.MetaFile, Line=self._LineIndex+1) + self._ValueList[0:1] = ValueList + if len(TokenList) > 1: + self._ValueList[2] = TokenList[1] + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + " (.)", + File=self.MetaFile, Line=self._LineIndex+1) + + # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. + if self._ValueList[2] != '': + InfPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) + if InfPcdValueList[0] in ['True', 'true', 'TRUE']: + self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1); + elif InfPcdValueList[0] in ['False', 'false', 'FALSE']: + self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1); + + ## [depex] section parser + @ParseMacro + def _DepexParser(self): + self._ValueList[0:1] = [self._CurrentLine] + + _SectionParser = { + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, + MODEL_META_DATA_BUILD_OPTION : MetaFileParser._BuildOptionParser, + MODEL_EFI_INCLUDE : _IncludeParser, # for Edk.x modules + MODEL_EFI_LIBRARY_INSTANCE : MetaFileParser._CommonParser, # for Edk.x modules + MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, + MODEL_META_DATA_PACKAGE : MetaFileParser._PathParser, + MODEL_META_DATA_NMAKE : _NmakeParser, # for Edk.x modules + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC_EX : _PcdParser, + MODEL_PCD_DYNAMIC : _PcdParser, + MODEL_EFI_SOURCE_FILE : _SourceFileParser, + MODEL_EFI_GUID : MetaFileParser._CommonParser, + MODEL_EFI_PROTOCOL : MetaFileParser._CommonParser, + MODEL_EFI_PPI : MetaFileParser._CommonParser, + MODEL_EFI_DEPEX : _DepexParser, + MODEL_EFI_BINARY_FILE : _BinaryFileParser, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + } + +## DSC file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# @param Owner Owner ID (for sub-section parsing) +# @param From ID from which the data comes (for !INCLUDE directive) +# +class DscParser(MetaFileParser): + # DSC file supported data types (one type per section) + DataType = { + TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID, + TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, + TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_PCDS_DYNAMIC_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_DEFAULT, + TAB_PCDS_DYNAMIC_HII_NULL.upper() : MODEL_PCD_DYNAMIC_HII, + TAB_PCDS_DYNAMIC_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_VPD, + TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_EX_DEFAULT, + TAB_PCDS_DYNAMIC_EX_HII_NULL.upper() : MODEL_PCD_DYNAMIC_EX_HII, + TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_EX_VPD, + TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT, + TAB_COMPONENTS_SOURCE_OVERRIDE_PATH.upper() : MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, + TAB_DSC_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_DSC_DEFINES_EDKGLOBAL : MODEL_META_DATA_GLOBAL_DEFINE, + TAB_INCLUDE.upper() : MODEL_META_DATA_INCLUDE, + TAB_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + TAB_IF_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + TAB_IF_N_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF, + TAB_ELSE_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF, + TAB_ELSE.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, + TAB_END_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF, + } + + # Valid names in define section + DefineKeywords = [ + "DSC_SPECIFICATION", + "PLATFORM_NAME", + "PLATFORM_GUID", + "PLATFORM_VERSION", + "SKUID_IDENTIFIER", + "PCD_INFO_GENERATION", + "SUPPORTED_ARCHITECTURES", + "BUILD_TARGETS", + "OUTPUT_DIRECTORY", + "FLASH_DEFINITION", + "BUILD_NUMBER", + "RFC_LANGUAGES", + "ISO_LANGUAGES", + "TIME_STAMP_FILE", + "VPD_TOOL_GUID", + "FIX_LOAD_TOP_MEMORY_ADDRESS" + ] + + SymbolPattern = ValueExpression.SymbolPattern + + ## Constructor of DscParser + # + # Initialize object of DscParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # @param Owner Owner ID (for sub-section parsing) + # @param From ID from which the data comes (for !INCLUDE directive) + # + def __init__(self, FilePath, FileType, Table, Owner=-1, From=-1): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table, Owner, From) + self._Version = 0x00010005 # Only EDK2 dsc file is supported + # to store conditional directive evaluation result + self._DirectiveStack = [] + self._DirectiveEvalStack = [] + self._Enabled = 1 + + # Final valid replacable symbols + self._Symbols = {} + # + # Map the ID between the original table and new table to track + # the owner item + # + self._IdMapping = {-1:-1} + + self.TblFile = EccGlobalData.gDb.TblFile + self.FileID = -1 + + ## Parser starter + def Start(self): + Content = '' + try: + Content = open(str(self.MetaFile.Path), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + # + # Insert a record for file + # + Filename = NormPath(self.MetaFile.Path) + FileID = self.TblFile.GetFileId(Filename) + if FileID: + self.FileID = FileID + else: + self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DSC) + + + for Index in range(0, len(Content)): + Line = CleanString(Content[Index]) + # skip empty line + if Line == '': + continue + + self._CurrentLine = Line + self._LineIndex = Index + if self._InSubsection and self._Owner[-1] == -1: + self._Owner.append(self._LastItem) + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + self._SectionType = MODEL_META_DATA_SECTION_HEADER + # subsection ending + elif Line[0] == '}' and self._InSubsection: + self._InSubsection = False + self._SubsectionType = MODEL_UNKNOWN + self._SubsectionName = '' + self._Owner[-1] = -1 + continue + # subsection header + elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END: + self._SubsectionType = MODEL_META_DATA_SUBSECTION_HEADER + # directive line + elif Line[0] == '!': + self._DirectiveParser() + continue + + if self._InSubsection: + SectionType = self._SubsectionType + else: + SectionType = self._SectionType + self._ItemType = SectionType + + self._ValueList = ['', '', ''] + self._SectionParser[SectionType](self) + if self._ValueList == None: + continue + # + # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + for Arch, ModuleType in self._Scope: + self._LastItem = self._Store( + self._ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + ModuleType, + self._Owner[-1], + self.FileID, + self._From, + self._LineIndex+1, + -1, + self._LineIndex+1, + -1, + self._Enabled + ) + + if self._DirectiveStack: + Type, Line, Text = self._DirectiveStack[-1] + EdkLogger.error('Parser', FORMAT_INVALID, "No matching '!endif' found", + ExtraData=Text, File=self.MetaFile, Line=Line) + self._Done() + + ## parser + def _SubsectionHeaderParser(self): + self._SubsectionName = self._CurrentLine[1:-1].upper() + if self._SubsectionName in self.DataType: + self._SubsectionType = self.DataType[self._SubsectionName] + else: + self._SubsectionType = MODEL_UNKNOWN + EdkLogger.warn("Parser", "Unrecognized sub-section", File=self.MetaFile, + Line=self._LineIndex+1, ExtraData=self._CurrentLine) + self._ValueList[0] = self._SubsectionName + + ## Directive statement parser + def _DirectiveParser(self): + self._ValueList = ['','',''] + TokenList = GetSplitValueList(self._CurrentLine, ' ', 1) + self._ValueList[0:len(TokenList)] = TokenList + + # Syntax check + DirectiveName = self._ValueList[0].upper() + if DirectiveName not in self.DataType: + EdkLogger.error("Parser", FORMAT_INVALID, "Unknown directive [%s]" % DirectiveName, + File=self.MetaFile, Line=self._LineIndex+1) + if DirectiveName in ['!IF', '!IFDEF', '!INCLUDE', '!IFNDEF', '!ELSEIF'] and self._ValueList[1] == '': + EdkLogger.error("Parser", FORMAT_INVALID, "Missing expression", + File=self.MetaFile, Line=self._LineIndex+1, + ExtraData=self._CurrentLine) + + ItemType = self.DataType[DirectiveName] + if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: + # Remove all directives between !if and !endif, including themselves + while self._DirectiveStack: + # Remove any !else or !elseif + DirectiveInfo = self._DirectiveStack.pop() + if DirectiveInfo[0] in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + break + else: + EdkLogger.error("Parser", FORMAT_INVALID, "Redundant '!endif'", + File=self.MetaFile, Line=self._LineIndex+1, + ExtraData=self._CurrentLine) + elif ItemType != MODEL_META_DATA_INCLUDE: + # Break if there's a !else is followed by a !elseif + if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF and \ + self._DirectiveStack and \ + self._DirectiveStack[-1][0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: + EdkLogger.error("Parser", FORMAT_INVALID, "'!elseif' after '!else'", + File=self.MetaFile, Line=self._LineIndex+1, + ExtraData=self._CurrentLine) + self._DirectiveStack.append((ItemType, self._LineIndex+1, self._CurrentLine)) + elif self._From > 0: + EdkLogger.error('Parser', FORMAT_INVALID, + "No '!include' allowed in included file", + ExtraData=self._CurrentLine, File=self.MetaFile, + Line=self._LineIndex+1) + + # + # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + self._LastItem = self._Store( + ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + 'COMMON', + 'COMMON', + self._Owner[-1], + self.FileID, + self._From, + self._LineIndex+1, + -1, + self._LineIndex+1, + -1, + 0 + ) + + ## [defines] section parser + @ParseMacro + def _DefineParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[1:len(TokenList)] = TokenList + + # Syntax check + if not self._ValueList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + if not self._ValueList[2]: + EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + if not self._ValueList[1] in self.DefineKeywords: + EdkLogger.error('Parser', FORMAT_INVALID, + "Unknown keyword found: %s. " + "If this is a macro you must " + "add it as a DEFINE in the DSC" % self._ValueList[1], + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + self._Defines[self._ValueList[1]] = self._ValueList[2] + self._ItemType = self.DataType[TAB_DSC_DEFINES.upper()] + + @ParseMacro + def _SkuIdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + if len(TokenList) != 2: + EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '|'", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) + self._ValueList[0:len(TokenList)] = TokenList + + ## Parse Edk style of library modules + def _LibraryInstanceParser(self): + self._ValueList[0] = self._CurrentLine + + ## PCD sections parser + # + # [PcdsFixedAtBuild] + # [PcdsPatchableInModule] + # [PcdsFeatureFlag] + # [PcdsDynamicEx + # [PcdsDynamicExDefault] + # [PcdsDynamicExVpd] + # [PcdsDynamicExHii] + # [PcdsDynamic] + # [PcdsDynamicDefault] + # [PcdsDynamicVpd] + # [PcdsDynamicHii] + # + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) + if len(TokenList) == 2: + self._ValueList[2] = TokenList[1] + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + " (.|)", + File=self.MetaFile, Line=self._LineIndex+1) + if self._ValueList[2] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given", + ExtraData=self._CurrentLine + " (.|)", + File=self.MetaFile, Line=self._LineIndex+1) + # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. + DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) + if DscPcdValueList[0] in ['True', 'true', 'TRUE']: + self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '1', 1); + elif DscPcdValueList[0] in ['False', 'false', 'FALSE']: + self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '0', 1); + + ## [components] section parser + @ParseMacro + def _ComponentParser(self): + if self._CurrentLine[-1] == '{': + self._ValueList[0] = self._CurrentLine[0:-1].strip() + self._InSubsection = True + else: + self._ValueList[0] = self._CurrentLine + + ## [LibraryClasses] section + @ParseMacro + def _LibraryClassParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No library class or instance specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex+1) + if TokenList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No library class specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex+1) + if TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No library instance specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex+1) + + self._ValueList[0:len(TokenList)] = TokenList + + def _CompponentSourceOverridePathParser(self): + self._ValueList[0] = self._CurrentLine + + ## [BuildOptions] section parser + @ParseMacro + def _BuildOptionParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + TokenList2 = GetSplitValueList(TokenList[0], ':', 1) + if len(TokenList2) == 2: + self._ValueList[0] = TokenList2[0] # toolchain family + self._ValueList[1] = TokenList2[1] # keys + else: + self._ValueList[1] = TokenList[0] + if len(TokenList) == 2: # value + self._ValueList[2] = TokenList[1] + + if self._ValueList[1].count('_') != 4: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "'%s' must be in format of ____FLAGS" % self._ValueList[1], + ExtraData=self._CurrentLine, + File=self.MetaFile, + Line=self._LineIndex+1 + ) + + ## Override parent's method since we'll do all macro replacements in parser + def _GetMacros(self): + Macros = {} + Macros.update(self._FileLocalMacros) + Macros.update(self._GetApplicableSectionMacro()) + Macros.update(GlobalData.gEdkGlobal) + Macros.update(GlobalData.gPlatformDefines) + Macros.update(GlobalData.gCommandLineDefines) + # PCD cannot be referenced in macro definition + if self._ItemType not in [MODEL_META_DATA_DEFINE, MODEL_META_DATA_GLOBAL_DEFINE]: + Macros.update(self._Symbols) + return Macros + + def _PostProcess(self): + Processer = { + MODEL_META_DATA_SECTION_HEADER : self.__ProcessSectionHeader, + MODEL_META_DATA_SUBSECTION_HEADER : self.__ProcessSubsectionHeader, + MODEL_META_DATA_HEADER : self.__ProcessDefine, + MODEL_META_DATA_DEFINE : self.__ProcessDefine, + MODEL_META_DATA_GLOBAL_DEFINE : self.__ProcessDefine, + MODEL_META_DATA_INCLUDE : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective, + MODEL_EFI_SKU_ID : self.__ProcessSkuId, + MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance, + MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass, + MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd, + MODEL_PCD_PATCHABLE_IN_MODULE : self.__ProcessPcd, + MODEL_PCD_FEATURE_FLAG : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_DEFAULT : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_HII : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_VPD : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_DEFAULT : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_HII : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_VPD : self.__ProcessPcd, + MODEL_META_DATA_COMPONENT : self.__ProcessComponent, + MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : self.__ProcessSourceOverridePath, + MODEL_META_DATA_BUILD_OPTION : self.__ProcessBuildOption, + MODEL_UNKNOWN : self._Skip, + MODEL_META_DATA_USER_EXTENSION : self._Skip, + } + + self._RawTable = self._Table + self._Table = MetaFileStorage(self._RawTable.Cur, self.MetaFile, MODEL_FILE_DSC, True) + self._DirectiveStack = [] + self._DirectiveEvalStack = [] + self._FileWithError = self.MetaFile + self._FileLocalMacros = {} + self._SectionsMacroDict = {} + GlobalData.gPlatformDefines = {} + + # Get all macro and PCD which has straitforward value + self.__RetrievePcdValue() + self._Content = self._RawTable.GetAll() + self._ContentIndex = 0 + while self._ContentIndex < len(self._Content) : + Id, self._ItemType, V1, V2, V3, S1, S2, Owner, BelongsToFile, self._From, \ + LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex] + + if self._From < 0: + self._FileWithError = self.MetaFile + + self._ContentIndex += 1 + + self._Scope = [[S1, S2]] + self._LineIndex = LineStart - 1 + self._ValueList = [V1, V2, V3] + + try: + Processer[self._ItemType]() + except EvaluationException, Excpt: + # + # Only catch expression evaluation error here. We need to report + # the precise number of line on which the error occurred + # + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex+1) + except MacroException, Excpt: + EdkLogger.error('Parser', FORMAT_INVALID, str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex+1) + + if self._ValueList == None: + continue + + NewOwner = self._IdMapping.get(Owner, -1) + self._Enabled = int((not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack)) + self._LastItem = self._Store( + self._ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + S1, + S2, + NewOwner, + BelongsToFile, + self._From, + self._LineIndex+1, + -1, + self._LineIndex+1, + -1, + self._Enabled + ) + self._IdMapping[Id] = self._LastItem + + RecordList = self._Table.GetAll() + + self._RawTable.Drop() + self._Table.Drop() + for Record in RecordList: + EccGlobalData.gDb.TblDsc.Insert(Record[1],Record[2],Record[3],Record[4],Record[5],Record[6],Record[7],Record[8],Record[9],Record[10],Record[11],Record[12],Record[13],Record[14]) + GlobalData.gPlatformDefines.update(self._FileLocalMacros) + self._PostProcessed = True + self._Content = None + + def __ProcessSectionHeader(self): + self._SectionName = self._ValueList[0] + if self._SectionName in self.DataType: + self._SectionType = self.DataType[self._SectionName] + else: + self._SectionType = MODEL_UNKNOWN + + def __ProcessSubsectionHeader(self): + self._SubsectionName = self._ValueList[0] + if self._SubsectionName in self.DataType: + self._SubsectionType = self.DataType[self._SubsectionName] + else: + self._SubsectionType = MODEL_UNKNOWN + + def __RetrievePcdValue(self): + Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem=-1.0) + for TokenSpaceGuid,PcdName,Value,Dummy2,Dummy3,ID,Line in Records: + Value, DatumType, MaxDatumSize = AnalyzePcdData(Value) + # Only use PCD whose value is straitforward (no macro and PCD) + if self.SymbolPattern.findall(Value): + continue + Name = TokenSpaceGuid + '.' + PcdName + # Don't use PCD with different values. + if Name in self._Symbols and self._Symbols[Name] != Value: + self._Symbols.pop(Name) + continue + self._Symbols[Name] = Value + + Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem=-1.0) + for TokenSpaceGuid,PcdName,Value,Dummy2,Dummy3,ID,Line in Records: + Value, DatumType, MaxDatumSize = AnalyzePcdData(Value) + # Only use PCD whose value is straitforward (no macro and PCD) + if self.SymbolPattern.findall(Value): + continue + Name = TokenSpaceGuid+'.'+PcdName + # Don't use PCD with different values. + if Name in self._Symbols and self._Symbols[Name] != Value: + self._Symbols.pop(Name) + continue + self._Symbols[Name] = Value + + def __ProcessDefine(self): + if not self._Enabled: + return + + Type, Name, Value = self._ValueList + Value = ReplaceMacro(Value, self._Macros, False) + if self._ItemType == MODEL_META_DATA_DEFINE: + if self._SectionType == MODEL_META_DATA_HEADER: + self._FileLocalMacros[Name] = Value + else: + SectionDictKey = self._SectionType, self._Scope[0][0], self._Scope[0][1] + if SectionDictKey not in self._SectionsMacroDict: + self._SectionsMacroDict[SectionDictKey] = {} + SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] + SectionLocalMacros[Name] = Value + elif self._ItemType == MODEL_META_DATA_GLOBAL_DEFINE: + GlobalData.gEdkGlobal[Name] = Value + + # + # Keyword in [Defines] section can be used as Macros + # + if (self._ItemType == MODEL_META_DATA_HEADER) and (self._SectionType == MODEL_META_DATA_HEADER): + self._FileLocalMacros[Name] = Value + + self._ValueList = [Type, Name, Value] + + def __ProcessDirective(self): + Result = None + if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF]: + Macros = self._Macros + Macros.update(GlobalData.gGlobalDefines) + try: + Result = ValueExpression(self._ValueList[1], Macros)() + except SymbolNotFound, Exc: + EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc), self._ValueList[1]) + Result = False + except WrnExpression, Excpt: + # + # Catch expression evaluation warning here. We need to report + # the precise number of line and return the evaluation result + # + EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex+1) + Result = Excpt.result + + if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + self._DirectiveStack.append(self._ItemType) + if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IF: + Result = bool(Result) + else: + Macro = self._ValueList[1] + Macro = Macro[2:-1] if (Macro.startswith("$(") and Macro.endswith(")")) else Macro + Result = Macro in self._Macros + if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF: + Result = not Result + self._DirectiveEvalStack.append(Result) + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF: + self._DirectiveStack.append(self._ItemType) + self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] + self._DirectiveEvalStack.append(bool(Result)) + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: + self._DirectiveStack[-1] = self._ItemType + self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: + # Back to the nearest !if/!ifdef/!ifndef + while self._DirectiveStack: + self._DirectiveEvalStack.pop() + Directive = self._DirectiveStack.pop() + if Directive in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + break + elif self._ItemType == MODEL_META_DATA_INCLUDE: + # The included file must be relative to workspace or same directory as DSC file + __IncludeMacros = {} + # + # Allow using system environment variables in path after !include + # + __IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE'] + if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE'] + # + # During GenFds phase call DSC parser, will go into this branch. + # + elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE'] + + __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE'] + __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE'] + # + # Allow using MACROs comes from [Defines] section to keep compatible. + # + __IncludeMacros.update(self._Macros) + + IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True)) + # + # First search the include file under the same directory as DSC file + # + IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir) + ErrorCode, ErrorInfo1 = IncludedFile1.Validate() + if ErrorCode != 0: + # + # Also search file under the WORKSPACE directory + # + IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) + ErrorCode, ErrorInfo2 = IncludedFile1.Validate() + if ErrorCode != 0: + EdkLogger.error('parser', ErrorCode, File=self._FileWithError, + Line=self._LineIndex+1, ExtraData=ErrorInfo1 + "\n"+ ErrorInfo2) + + self._FileWithError = IncludedFile1 + + IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, True) + Owner = self._Content[self._ContentIndex-1][0] + Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable, + Owner=Owner, From=Owner) + + # set the parser status with current status + Parser._SectionName = self._SectionName + Parser._SectionType = self._SectionType + Parser._Scope = self._Scope + Parser._Enabled = self._Enabled + # Parse the included file + Parser.Start() + + # update current status with sub-parser's status + self._SectionName = Parser._SectionName + self._SectionType = Parser._SectionType + self._Scope = Parser._Scope + self._Enabled = Parser._Enabled + + # Insert all records in the table for the included file into dsc file table + Records = IncludedFileTable.GetAll() + if Records: + self._Content[self._ContentIndex:self._ContentIndex] = Records + self._Content.pop(self._ContentIndex-1) + self._ValueList = None + self._ContentIndex -= 1 + + def __ProcessSkuId(self): + self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) + for Value in self._ValueList] + + def __ProcessLibraryInstance(self): + self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] + + def __ProcessLibraryClass(self): + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True) + + def __ProcessPcd(self): + ValueList = GetSplitValueList(self._ValueList[2]) + # + # PCD value can be an expression + # + if len(ValueList) > 1 and ValueList[1] == 'VOID*': + PcdValue = ValueList[0] + try: + ValueList[0] = ValueExpression(PcdValue, self._Macros)(True) + except WrnExpression, Value: + ValueList[0] = Value.result + else: + PcdValue = ValueList[-1] + try: + ValueList[-1] = ValueExpression(PcdValue, self._Macros)(True) + except WrnExpression, Value: + ValueList[-1] = Value.result + + if ValueList[-1] == 'True': + ValueList[-1] = '1' + if ValueList[-1] == 'False': + ValueList[-1] = '0' + + self._ValueList[2] = '|'.join(ValueList) + + def __ProcessComponent(self): + self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) + + def __ProcessSourceOverridePath(self): + self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) + + def __ProcessBuildOption(self): + self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False) + for Value in self._ValueList] + + _SectionParser = { + MODEL_META_DATA_HEADER : _DefineParser, + MODEL_EFI_SKU_ID : _SkuIdParser, + MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser, + MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser, + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC_DEFAULT : _PcdParser, + MODEL_PCD_DYNAMIC_HII : _PcdParser, + MODEL_PCD_DYNAMIC_VPD : _PcdParser, + MODEL_PCD_DYNAMIC_EX_DEFAULT : _PcdParser, + MODEL_PCD_DYNAMIC_EX_HII : _PcdParser, + MODEL_PCD_DYNAMIC_EX_VPD : _PcdParser, + MODEL_META_DATA_COMPONENT : _ComponentParser, + MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : _CompponentSourceOverridePathParser, + MODEL_META_DATA_BUILD_OPTION : _BuildOptionParser, + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + MODEL_META_DATA_SECTION_HEADER : MetaFileParser._SectionHeaderParser, + MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHeaderParser, + } + + _Macros = property(_GetMacros) + +## DEC file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# +class DecParser(MetaFileParser): + # DEC file supported data types (one type per section) + DataType = { + TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_GUIDS.upper() : MODEL_EFI_GUID, + TAB_PPIS.upper() : MODEL_EFI_PPI, + TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, + TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC, + TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX, + } + + ## Constructor of DecParser + # + # Initialize object of DecParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # + def __init__(self, FilePath, FileType, Table): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table) + self._Comments = [] + self._Version = 0x00010005 # Only EDK2 dec file is supported + self.TblFile = EccGlobalData.gDb.TblFile + self.FileID = -1 + + ## Parser starter + def Start(self): + Content = '' + try: + Content = open(str(self.MetaFile), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + + # + # Insert a record for file + # + Filename = NormPath(self.MetaFile) + FileID = self.TblFile.GetFileId(Filename) + if FileID: + self.FileID = FileID + else: + self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DEC) + + for Index in range(0, len(Content)): + Line, Comment = CleanString2(Content[Index]) + self._CurrentLine = Line + self._LineIndex = Index + + # save comment for later use + if Comment: + self._Comments.append((Comment, self._LineIndex+1)) + # skip empty line + if Line == '': + continue + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + self._SectionHeaderParser() + self._Comments = [] + continue + elif len(self._SectionType) == 0: + self._Comments = [] + continue + + # section content + self._ValueList = ['','',''] + self._SectionParser[self._SectionType[0]](self) + if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: + self._ItemType = -1 + self._Comments = [] + continue + + # + # Model, Value1, Value2, Value3, Arch, BelongsToItem=-1, LineBegin=-1, + # ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, FeatureFlag='', Enabled=-1 + # + for Arch, ModuleType, Type in self._Scope: + self._LastItem = self._Store( + Type, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + ModuleType, + self._Owner[-1], + self.FileID, + self._LineIndex+1, + -1, + self._LineIndex+1, + -1, + 0 + ) + for Comment, LineNo in self._Comments: + self._Store( + MODEL_META_DATA_COMMENT, + Comment, + self._ValueList[0], + self._ValueList[1], + Arch, + ModuleType, + self._LastItem, + self.FileID, + LineNo, + -1, + LineNo, + -1, + 0 + ) + self._Comments = [] + self._Done() + + def _GetApplicableSectionMacro(self): + Macros = {} + for S1, S2, SectionType in self._Scope: + for Scope1, Scope2 in [("COMMON", "COMMON"), ("COMMON", S2), (S1, "COMMON"), (S1, S2)]: + if (SectionType, Scope1, Scope2) in self._SectionsMacroDict: + Macros.update(self._SectionsMacroDict[(SectionType, Scope1, Scope2)]) + return Macros + + ## Section header parser + # + # The section header is always in following format: + # + # [section_name.arch<.platform|module_type>] + # + def _SectionHeaderParser(self): + self._Scope = [] + self._SectionName = '' + self._SectionType = [] + ArchList = set() + for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): + if Item == '': + continue + ItemList = GetSplitValueList(Item, TAB_SPLIT) + + # different types of PCD are permissible in one section + self._SectionName = ItemList[0].upper() + if self._SectionName in self.DataType: + if self.DataType[self._SectionName] not in self._SectionType: + self._SectionType.append(self.DataType[self._SectionName]) + else: + EdkLogger.warn("Parser", "Unrecognized section", File=self.MetaFile, + Line=self._LineIndex+1, ExtraData=self._CurrentLine) + continue + + if MODEL_PCD_FEATURE_FLAG in self._SectionType and len(self._SectionType) > 1: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "%s must not be in the same section of other types of PCD" % TAB_PCDS_FEATURE_FLAG_NULL, + File=self.MetaFile, + Line=self._LineIndex+1, + ExtraData=self._CurrentLine + ) + # S1 is always Arch + if len(ItemList) > 1: + S1 = ItemList[1].upper() + else: + S1 = 'COMMON' + ArchList.add(S1) + # S2 may be Platform or ModuleType + if len(ItemList) > 2: + S2 = ItemList[2].upper() + else: + S2 = 'COMMON' + if [S1, S2, self.DataType[self._SectionName]] not in self._Scope: + self._Scope.append([S1, S2, self.DataType[self._SectionName]]) + + # 'COMMON' must not be used with specific ARCHs at the same section + if 'COMMON' in ArchList and len(ArchList) > 1: + EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", + File=self.MetaFile, Line=self._LineIndex+1, ExtraData=self._CurrentLine) + + ## [guids], [ppis] and [protocols] section parser + @ParseMacro + def _GuidParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name or value specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex+1) + if TokenList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex+1) + if TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID value specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex+1) + if TokenList[1][0] != '{' or TokenList[1][-1] != '}' or GuidStructureStringToGuidString(TokenList[1]) == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", + ExtraData=self._CurrentLine + \ + " ( = )", + File=self.MetaFile, Line=self._LineIndex+1) + self._ValueList[0] = TokenList[0] + #Parse the Guid value format + GuidValueList = TokenList[1].strip(' {}').split(',') + Index = 0 + HexList = [] + if len(GuidValueList) == 11: + for GuidValue in GuidValueList: + GuidValue = GuidValue.strip() + if GuidValue.startswith('0x') or GuidValue.startswith('0X'): + HexList.append('0x' + str(GuidValue[2:])) + Index += 1 + continue + else: + if GuidValue.startswith('{'): + HexList.append('0x' + str(GuidValue[3:])) + Index += 1 + self._ValueList[1] = "{ %s, %s, %s, { %s, %s, %s, %s, %s, %s, %s, %s }}" % (HexList[0], HexList[1], HexList[2],HexList[3],HexList[4],HexList[5],HexList[6],HexList[7],HexList[8],HexList[9],HexList[10]) + else: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", + ExtraData=self._CurrentLine + \ + " ( = )", + File=self.MetaFile, Line=self._LineIndex+1) + self._ValueList[0] = '' + + ## PCD sections parser + # + # [PcdsFixedAtBuild] + # [PcdsPatchableInModule] + # [PcdsFeatureFlag] + # [PcdsDynamicEx + # [PcdsDynamic] + # + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) + # check PCD information + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + # check PCD datum information + if len(TokenList) < 2 or TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + + + ValueRe = re.compile(r'^\s*L?\".*\|.*\"') + PtrValue = ValueRe.findall(TokenList[1]) + + # Has VOID* type string, may contain "|" character in the string. + if len(PtrValue) != 0: + ptrValueList = re.sub(ValueRe, '', TokenList[1]) + ValueList = GetSplitValueList(ptrValueList) + ValueList[0] = PtrValue[0] + else: + ValueList = GetSplitValueList(TokenList[1]) + + + # check if there's enough datum information given + if len(ValueList) != 3: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + # check default value + if ValueList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + # check datum type + if ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + # check token of the PCD + if ValueList[2] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex+1) + # check format of default value against the datum type + IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) + if not IsValid: + EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine, + File=self.MetaFile, Line=self._LineIndex+1) + + if ValueList[0] in ['True', 'true', 'TRUE']: + ValueList[0] = '1' + elif ValueList[0] in ['False', 'false', 'FALSE']: + ValueList[0] = '0' + + self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip() + + _SectionParser = { + MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, + MODEL_EFI_INCLUDE : MetaFileParser._PathParser, + MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, + MODEL_EFI_GUID : _GuidParser, + MODEL_EFI_PPI : _GuidParser, + MODEL_EFI_PROTOCOL : _GuidParser, + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC : _PcdParser, + MODEL_PCD_DYNAMIC_EX : _PcdParser, + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + } + + +## FdfObject +# +# This class defined basic Fdf object which is used by inheriting +# +# @param object: Inherited from object class +# +class FdfObject(object): + def __init__(self): + object.__init__() + +## Fdf +# +# This class defined the structure used in Fdf object +# +# @param FdfObject: Inherited from FdfObject class +# @param Filename: Input value for Ffilename of Fdf file, default is None +# @param WorkspaceDir: Input value for current workspace directory, default is None +# +class Fdf(FdfObject): + def __init__(self, Filename = None, IsToDatabase = False, WorkspaceDir = None, Database = None): + self.WorkspaceDir = WorkspaceDir + self.IsToDatabase = IsToDatabase + + self.Cur = Database.Cur + self.TblFile = Database.TblFile + self.TblFdf = Database.TblFdf + self.FileID = -1 + self.FileList = {} + + # + # Load Fdf file if filename is not None + # + if Filename != None: + self.LoadFdfFile(Filename) + + # + # Insert a FDF file record into database + # + def InsertFile(self, Filename): + FileID = -1 + Filename = NormPath(Filename) + if Filename not in self.FileList: + FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_FDF) + self.FileList[Filename] = FileID + + return self.FileList[Filename] + + + ## Load Fdf file + # + # Load the file if it exists + # + # @param Filename: Input value for filename of Fdf file + # + def LoadFdfFile(self, Filename): + FileList = [] + # + # Parse Fdf file + # + Filename = NormPath(Filename) + Fdf = FdfParser(Filename) + Fdf.ParseFile() + + # + # Insert inf file and pcd information + # + if self.IsToDatabase: + (Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) = \ + (0, '', '', '', 'COMMON', 'COMMON', -1, -1, -1, -1, -1, -1, 0) + for Index in range(0, len(Fdf.Profile.PcdDict)): + pass + for Key in Fdf.Profile.PcdDict.keys(): + Model = MODEL_PCD + Value1 = Key[1] + Value2 = Key[0] + FileName = Fdf.Profile.PcdFileLineDict[Key][0] + StartLine = Fdf.Profile.PcdFileLineDict[Key][1] + BelongsToFile = self.InsertFile(FileName) + self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) + for Index in range(0, len(Fdf.Profile.InfList)): + Model = MODEL_META_DATA_COMPONENT + Value1 = Fdf.Profile.InfList[Index] + Value2 = '' + FileName = Fdf.Profile.InfFileLineList[Index][0] + StartLine = Fdf.Profile.InfFileLineList[Index][1] + BelongsToFile = self.InsertFile(FileName) + self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) + +## +# +# This acts like the main() function for the script, unless it is 'import'ed into another +# script. +# +if __name__ == '__main__': + pass + diff --git a/BaseTools/Source/Python/Ecc/Xml/__init__.py b/BaseTools/Source/Python/Ecc/Xml/__init__.py index 5d268d990b..f09eece5fb 100644 --- a/BaseTools/Source/Python/Ecc/Xml/__init__.py +++ b/BaseTools/Source/Python/Ecc/Xml/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Xml +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Xml ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/Eot/CLexer.py b/BaseTools/Source/Python/Eot/CLexer.py index a72d4ee3c2..a496f43440 100644 --- a/BaseTools/Source/Python/Eot/CLexer.py +++ b/BaseTools/Source/Python/Eot/CLexer.py @@ -1,7 +1,7 @@ -# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 - -from antlr3 import * -from antlr3.compat import set, frozenset +# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 + +from antlr3 import * +from antlr3.compat import set, frozenset ## @file # The file defines the Lexer for C source files. @@ -21,4927 +21,4927 @@ from antlr3.compat import set, frozenset # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # ## - - - -# for convenience in actions -HIDDEN = BaseRecognizer.HIDDEN - -# token types -T114=114 -T115=115 -T116=116 -T117=117 -FloatTypeSuffix=16 -LETTER=11 -T29=29 -T28=28 -T27=27 -T26=26 -T25=25 -EOF=-1 -STRING_LITERAL=9 -FLOATING_POINT_LITERAL=10 -T38=38 -T37=37 -T39=39 -T34=34 -COMMENT=22 -T33=33 -T36=36 -T35=35 -T30=30 -T32=32 -T31=31 -LINE_COMMENT=23 -IntegerTypeSuffix=14 -CHARACTER_LITERAL=8 -T49=49 -T48=48 -T100=100 -T43=43 -T42=42 -T102=102 -T41=41 -T101=101 -T40=40 -T47=47 -T46=46 -T45=45 -T44=44 -T109=109 -T107=107 -T108=108 -T105=105 -WS=19 -T106=106 -T103=103 -T104=104 -T50=50 -LINE_COMMAND=24 -T59=59 -T113=113 -T52=52 -T112=112 -T51=51 -T111=111 -T54=54 -T110=110 -EscapeSequence=12 -DECIMAL_LITERAL=7 -T53=53 -T56=56 -T55=55 -T58=58 -T57=57 -T75=75 -T76=76 -T73=73 -T74=74 -T79=79 -T77=77 -T78=78 -Exponent=15 -HexDigit=13 -T72=72 -T71=71 -T70=70 -T62=62 -T63=63 -T64=64 -T65=65 -T66=66 -T67=67 -T68=68 -T69=69 -IDENTIFIER=4 -UnicodeVocabulary=21 -HEX_LITERAL=5 -T61=61 -T60=60 -T99=99 -T97=97 -BS=20 -T98=98 -T95=95 -T96=96 -OCTAL_LITERAL=6 -T94=94 -Tokens=118 -T93=93 -T92=92 -T91=91 -T90=90 -T88=88 -T89=89 -T84=84 -T85=85 -T86=86 -T87=87 -UnicodeEscape=18 -T81=81 -T80=80 -T83=83 -OctalEscape=17 -T82=82 - -class CLexer(Lexer): - - grammarFileName = "C.g" - - def __init__(self, input=None): - Lexer.__init__(self, input) - self.dfa25 = self.DFA25( - self, 25, - eot = self.DFA25_eot, - eof = self.DFA25_eof, - min = self.DFA25_min, - max = self.DFA25_max, - accept = self.DFA25_accept, - special = self.DFA25_special, - transition = self.DFA25_transition - ) - self.dfa35 = self.DFA35( - self, 35, - eot = self.DFA35_eot, - eof = self.DFA35_eof, - min = self.DFA35_min, - max = self.DFA35_max, - accept = self.DFA35_accept, - special = self.DFA35_special, - transition = self.DFA35_transition - ) - - - - - - - # $ANTLR start T25 - def mT25(self, ): - - try: - self.type = T25 - - # C.g:27:5: ( ';' ) - # C.g:27:7: ';' - self.match(u';') - - - - - - finally: - - pass - - # $ANTLR end T25 - - - - # $ANTLR start T26 - def mT26(self, ): - - try: - self.type = T26 - - # C.g:28:5: ( 'typedef' ) - # C.g:28:7: 'typedef' - self.match("typedef") - - - - - - - finally: - - pass - - # $ANTLR end T26 - - - - # $ANTLR start T27 - def mT27(self, ): - - try: - self.type = T27 - - # C.g:29:5: ( ',' ) - # C.g:29:7: ',' - self.match(u',') - - - - - - finally: - - pass - - # $ANTLR end T27 - - - - # $ANTLR start T28 - def mT28(self, ): - - try: - self.type = T28 - - # C.g:30:5: ( '=' ) - # C.g:30:7: '=' - self.match(u'=') - - - - - - finally: - - pass - - # $ANTLR end T28 - - - - # $ANTLR start T29 - def mT29(self, ): - - try: - self.type = T29 - - # C.g:31:5: ( 'extern' ) - # C.g:31:7: 'extern' - self.match("extern") - - - - - - - finally: - - pass - - # $ANTLR end T29 - - - - # $ANTLR start T30 - def mT30(self, ): - - try: - self.type = T30 - - # C.g:32:5: ( 'static' ) - # C.g:32:7: 'static' - self.match("static") - - - - - - - finally: - - pass - - # $ANTLR end T30 - - - - # $ANTLR start T31 - def mT31(self, ): - - try: - self.type = T31 - - # C.g:33:5: ( 'auto' ) - # C.g:33:7: 'auto' - self.match("auto") - - - - - - - finally: - - pass - - # $ANTLR end T31 - - - - # $ANTLR start T32 - def mT32(self, ): - - try: - self.type = T32 - - # C.g:34:5: ( 'register' ) - # C.g:34:7: 'register' - self.match("register") - - - - - - - finally: - - pass - - # $ANTLR end T32 - - - - # $ANTLR start T33 - def mT33(self, ): - - try: - self.type = T33 - - # C.g:35:5: ( 'STATIC' ) - # C.g:35:7: 'STATIC' - self.match("STATIC") - - - - - - - finally: - - pass - - # $ANTLR end T33 - - - - # $ANTLR start T34 - def mT34(self, ): - - try: - self.type = T34 - - # C.g:36:5: ( 'void' ) - # C.g:36:7: 'void' - self.match("void") - - - - - - - finally: - - pass - - # $ANTLR end T34 - - - - # $ANTLR start T35 - def mT35(self, ): - - try: - self.type = T35 - - # C.g:37:5: ( 'char' ) - # C.g:37:7: 'char' - self.match("char") - - - - - - - finally: - - pass - - # $ANTLR end T35 - - - - # $ANTLR start T36 - def mT36(self, ): - - try: - self.type = T36 - - # C.g:38:5: ( 'short' ) - # C.g:38:7: 'short' - self.match("short") - - - - - - - finally: - - pass - - # $ANTLR end T36 - - - - # $ANTLR start T37 - def mT37(self, ): - - try: - self.type = T37 - - # C.g:39:5: ( 'int' ) - # C.g:39:7: 'int' - self.match("int") - - - - - - - finally: - - pass - - # $ANTLR end T37 - - - - # $ANTLR start T38 - def mT38(self, ): - - try: - self.type = T38 - - # C.g:40:5: ( 'long' ) - # C.g:40:7: 'long' - self.match("long") - - - - - - - finally: - - pass - - # $ANTLR end T38 - - - - # $ANTLR start T39 - def mT39(self, ): - - try: - self.type = T39 - - # C.g:41:5: ( 'float' ) - # C.g:41:7: 'float' - self.match("float") - - - - - - - finally: - - pass - - # $ANTLR end T39 - - - - # $ANTLR start T40 - def mT40(self, ): - - try: - self.type = T40 - - # C.g:42:5: ( 'double' ) - # C.g:42:7: 'double' - self.match("double") - - - - - - - finally: - - pass - - # $ANTLR end T40 - - - - # $ANTLR start T41 - def mT41(self, ): - - try: - self.type = T41 - - # C.g:43:5: ( 'signed' ) - # C.g:43:7: 'signed' - self.match("signed") - - - - - - - finally: - - pass - - # $ANTLR end T41 - - - - # $ANTLR start T42 - def mT42(self, ): - - try: - self.type = T42 - - # C.g:44:5: ( 'unsigned' ) - # C.g:44:7: 'unsigned' - self.match("unsigned") - - - - - - - finally: - - pass - - # $ANTLR end T42 - - - - # $ANTLR start T43 - def mT43(self, ): - - try: - self.type = T43 - - # C.g:45:5: ( '{' ) - # C.g:45:7: '{' - self.match(u'{') - - - - - - finally: - - pass - - # $ANTLR end T43 - - - - # $ANTLR start T44 - def mT44(self, ): - - try: - self.type = T44 - - # C.g:46:5: ( '}' ) - # C.g:46:7: '}' - self.match(u'}') - - - - - - finally: - - pass - - # $ANTLR end T44 - - - - # $ANTLR start T45 - def mT45(self, ): - - try: - self.type = T45 - - # C.g:47:5: ( 'struct' ) - # C.g:47:7: 'struct' - self.match("struct") - - - - - - - finally: - - pass - - # $ANTLR end T45 - - - - # $ANTLR start T46 - def mT46(self, ): - - try: - self.type = T46 - - # C.g:48:5: ( 'union' ) - # C.g:48:7: 'union' - self.match("union") - - - - - - - finally: - - pass - - # $ANTLR end T46 - - - - # $ANTLR start T47 - def mT47(self, ): - - try: - self.type = T47 - - # C.g:49:5: ( ':' ) - # C.g:49:7: ':' - self.match(u':') - - - - - - finally: - - pass - - # $ANTLR end T47 - - - - # $ANTLR start T48 - def mT48(self, ): - - try: - self.type = T48 - - # C.g:50:5: ( 'enum' ) - # C.g:50:7: 'enum' - self.match("enum") - - - - - - - finally: - - pass - - # $ANTLR end T48 - - - - # $ANTLR start T49 - def mT49(self, ): - - try: - self.type = T49 - - # C.g:51:5: ( 'const' ) - # C.g:51:7: 'const' - self.match("const") - - - - - - - finally: - - pass - - # $ANTLR end T49 - - - - # $ANTLR start T50 - def mT50(self, ): - - try: - self.type = T50 - - # C.g:52:5: ( 'volatile' ) - # C.g:52:7: 'volatile' - self.match("volatile") - - - - - - - finally: - - pass - - # $ANTLR end T50 - - - - # $ANTLR start T51 - def mT51(self, ): - - try: - self.type = T51 - - # C.g:53:5: ( 'IN' ) - # C.g:53:7: 'IN' - self.match("IN") - - - - - - - finally: - - pass - - # $ANTLR end T51 - - - - # $ANTLR start T52 - def mT52(self, ): - - try: - self.type = T52 - - # C.g:54:5: ( 'OUT' ) - # C.g:54:7: 'OUT' - self.match("OUT") - - - - - - - finally: - - pass - - # $ANTLR end T52 - - - - # $ANTLR start T53 - def mT53(self, ): - - try: - self.type = T53 - - # C.g:55:5: ( 'OPTIONAL' ) - # C.g:55:7: 'OPTIONAL' - self.match("OPTIONAL") - - - - - - - finally: - - pass - - # $ANTLR end T53 - - - - # $ANTLR start T54 - def mT54(self, ): - - try: - self.type = T54 - - # C.g:56:5: ( 'CONST' ) - # C.g:56:7: 'CONST' - self.match("CONST") - - - - - - - finally: - - pass - - # $ANTLR end T54 - - - - # $ANTLR start T55 - def mT55(self, ): - - try: - self.type = T55 - - # C.g:57:5: ( 'UNALIGNED' ) - # C.g:57:7: 'UNALIGNED' - self.match("UNALIGNED") - - - - - - - finally: - - pass - - # $ANTLR end T55 - - - - # $ANTLR start T56 - def mT56(self, ): - - try: - self.type = T56 - - # C.g:58:5: ( 'VOLATILE' ) - # C.g:58:7: 'VOLATILE' - self.match("VOLATILE") - - - - - - - finally: - - pass - - # $ANTLR end T56 - - - - # $ANTLR start T57 - def mT57(self, ): - - try: - self.type = T57 - - # C.g:59:5: ( 'GLOBAL_REMOVE_IF_UNREFERENCED' ) - # C.g:59:7: 'GLOBAL_REMOVE_IF_UNREFERENCED' - self.match("GLOBAL_REMOVE_IF_UNREFERENCED") - - - - - - - finally: - - pass - - # $ANTLR end T57 - - - - # $ANTLR start T58 - def mT58(self, ): - - try: - self.type = T58 - - # C.g:60:5: ( 'EFIAPI' ) - # C.g:60:7: 'EFIAPI' - self.match("EFIAPI") - - - - - - - finally: - - pass - - # $ANTLR end T58 - - - - # $ANTLR start T59 - def mT59(self, ): - - try: - self.type = T59 - - # C.g:61:5: ( 'EFI_BOOTSERVICE' ) - # C.g:61:7: 'EFI_BOOTSERVICE' - self.match("EFI_BOOTSERVICE") - - - - - - - finally: - - pass - - # $ANTLR end T59 - - - - # $ANTLR start T60 - def mT60(self, ): - - try: - self.type = T60 - - # C.g:62:5: ( 'EFI_RUNTIMESERVICE' ) - # C.g:62:7: 'EFI_RUNTIMESERVICE' - self.match("EFI_RUNTIMESERVICE") - - - - - - - finally: - - pass - - # $ANTLR end T60 - - - - # $ANTLR start T61 - def mT61(self, ): - - try: - self.type = T61 - - # C.g:63:5: ( 'PACKED' ) - # C.g:63:7: 'PACKED' - self.match("PACKED") - - - - - - - finally: - - pass - - # $ANTLR end T61 - - - - # $ANTLR start T62 - def mT62(self, ): - - try: - self.type = T62 - - # C.g:64:5: ( '(' ) - # C.g:64:7: '(' - self.match(u'(') - - - - - - finally: - - pass - - # $ANTLR end T62 - - - - # $ANTLR start T63 - def mT63(self, ): - - try: - self.type = T63 - - # C.g:65:5: ( ')' ) - # C.g:65:7: ')' - self.match(u')') - - - - - - finally: - - pass - - # $ANTLR end T63 - - - - # $ANTLR start T64 - def mT64(self, ): - - try: - self.type = T64 - - # C.g:66:5: ( '[' ) - # C.g:66:7: '[' - self.match(u'[') - - - - - - finally: - - pass - - # $ANTLR end T64 - - - - # $ANTLR start T65 - def mT65(self, ): - - try: - self.type = T65 - - # C.g:67:5: ( ']' ) - # C.g:67:7: ']' - self.match(u']') - - - - - - finally: - - pass - - # $ANTLR end T65 - - - - # $ANTLR start T66 - def mT66(self, ): - - try: - self.type = T66 - - # C.g:68:5: ( '*' ) - # C.g:68:7: '*' - self.match(u'*') - - - - - - finally: - - pass - - # $ANTLR end T66 - - - - # $ANTLR start T67 - def mT67(self, ): - - try: - self.type = T67 - - # C.g:69:5: ( '...' ) - # C.g:69:7: '...' - self.match("...") - - - - - - - finally: - - pass - - # $ANTLR end T67 - - - - # $ANTLR start T68 - def mT68(self, ): - - try: - self.type = T68 - - # C.g:70:5: ( '+' ) - # C.g:70:7: '+' - self.match(u'+') - - - - - - finally: - - pass - - # $ANTLR end T68 - - - - # $ANTLR start T69 - def mT69(self, ): - - try: - self.type = T69 - - # C.g:71:5: ( '-' ) - # C.g:71:7: '-' - self.match(u'-') - - - - - - finally: - - pass - - # $ANTLR end T69 - - - - # $ANTLR start T70 - def mT70(self, ): - - try: - self.type = T70 - - # C.g:72:5: ( '/' ) - # C.g:72:7: '/' - self.match(u'/') - - - - - - finally: - - pass - - # $ANTLR end T70 - - - - # $ANTLR start T71 - def mT71(self, ): - - try: - self.type = T71 - - # C.g:73:5: ( '%' ) - # C.g:73:7: '%' - self.match(u'%') - - - - - - finally: - - pass - - # $ANTLR end T71 - - - - # $ANTLR start T72 - def mT72(self, ): - - try: - self.type = T72 - - # C.g:74:5: ( '++' ) - # C.g:74:7: '++' - self.match("++") - - - - - - - finally: - - pass - - # $ANTLR end T72 - - - - # $ANTLR start T73 - def mT73(self, ): - - try: - self.type = T73 - - # C.g:75:5: ( '--' ) - # C.g:75:7: '--' - self.match("--") - - - - - - - finally: - - pass - - # $ANTLR end T73 - - - - # $ANTLR start T74 - def mT74(self, ): - - try: - self.type = T74 - - # C.g:76:5: ( 'sizeof' ) - # C.g:76:7: 'sizeof' - self.match("sizeof") - - - - - - - finally: - - pass - - # $ANTLR end T74 - - - - # $ANTLR start T75 - def mT75(self, ): - - try: - self.type = T75 - - # C.g:77:5: ( '.' ) - # C.g:77:7: '.' - self.match(u'.') - - - - - - finally: - - pass - - # $ANTLR end T75 - - - - # $ANTLR start T76 - def mT76(self, ): - - try: - self.type = T76 - - # C.g:78:5: ( '->' ) - # C.g:78:7: '->' - self.match("->") - - - - - - - finally: - - pass - - # $ANTLR end T76 - - - - # $ANTLR start T77 - def mT77(self, ): - - try: - self.type = T77 - - # C.g:79:5: ( '&' ) - # C.g:79:7: '&' - self.match(u'&') - - - - - - finally: - - pass - - # $ANTLR end T77 - - - - # $ANTLR start T78 - def mT78(self, ): - - try: - self.type = T78 - - # C.g:80:5: ( '~' ) - # C.g:80:7: '~' - self.match(u'~') - - - - - - finally: - - pass - - # $ANTLR end T78 - - - - # $ANTLR start T79 - def mT79(self, ): - - try: - self.type = T79 - - # C.g:81:5: ( '!' ) - # C.g:81:7: '!' - self.match(u'!') - - - - - - finally: - - pass - - # $ANTLR end T79 - - - - # $ANTLR start T80 - def mT80(self, ): - - try: - self.type = T80 - - # C.g:82:5: ( '*=' ) - # C.g:82:7: '*=' - self.match("*=") - - - - - - - finally: - - pass - - # $ANTLR end T80 - - - - # $ANTLR start T81 - def mT81(self, ): - - try: - self.type = T81 - - # C.g:83:5: ( '/=' ) - # C.g:83:7: '/=' - self.match("/=") - - - - - - - finally: - - pass - - # $ANTLR end T81 - - - - # $ANTLR start T82 - def mT82(self, ): - - try: - self.type = T82 - - # C.g:84:5: ( '%=' ) - # C.g:84:7: '%=' - self.match("%=") - - - - - - - finally: - - pass - - # $ANTLR end T82 - - - - # $ANTLR start T83 - def mT83(self, ): - - try: - self.type = T83 - - # C.g:85:5: ( '+=' ) - # C.g:85:7: '+=' - self.match("+=") - - - - - - - finally: - - pass - - # $ANTLR end T83 - - - - # $ANTLR start T84 - def mT84(self, ): - - try: - self.type = T84 - - # C.g:86:5: ( '-=' ) - # C.g:86:7: '-=' - self.match("-=") - - - - - - - finally: - - pass - - # $ANTLR end T84 - - - - # $ANTLR start T85 - def mT85(self, ): - - try: - self.type = T85 - - # C.g:87:5: ( '<<=' ) - # C.g:87:7: '<<=' - self.match("<<=") - - - - - - - finally: - - pass - - # $ANTLR end T85 - - - - # $ANTLR start T86 - def mT86(self, ): - - try: - self.type = T86 - - # C.g:88:5: ( '>>=' ) - # C.g:88:7: '>>=' - self.match(">>=") - - - - - - - finally: - - pass - - # $ANTLR end T86 - - - - # $ANTLR start T87 - def mT87(self, ): - - try: - self.type = T87 - - # C.g:89:5: ( '&=' ) - # C.g:89:7: '&=' - self.match("&=") - - - - - - - finally: - - pass - - # $ANTLR end T87 - - - - # $ANTLR start T88 - def mT88(self, ): - - try: - self.type = T88 - - # C.g:90:5: ( '^=' ) - # C.g:90:7: '^=' - self.match("^=") - - - - - - - finally: - - pass - - # $ANTLR end T88 - - - - # $ANTLR start T89 - def mT89(self, ): - - try: - self.type = T89 - - # C.g:91:5: ( '|=' ) - # C.g:91:7: '|=' - self.match("|=") - - - - - - - finally: - - pass - - # $ANTLR end T89 - - - - # $ANTLR start T90 - def mT90(self, ): - - try: - self.type = T90 - - # C.g:92:5: ( '?' ) - # C.g:92:7: '?' - self.match(u'?') - - - - - - finally: - - pass - - # $ANTLR end T90 - - - - # $ANTLR start T91 - def mT91(self, ): - - try: - self.type = T91 - - # C.g:93:5: ( '||' ) - # C.g:93:7: '||' - self.match("||") - - - - - - - finally: - - pass - - # $ANTLR end T91 - - - - # $ANTLR start T92 - def mT92(self, ): - - try: - self.type = T92 - - # C.g:94:5: ( '&&' ) - # C.g:94:7: '&&' - self.match("&&") - - - - - - - finally: - - pass - - # $ANTLR end T92 - - - - # $ANTLR start T93 - def mT93(self, ): - - try: - self.type = T93 - - # C.g:95:5: ( '|' ) - # C.g:95:7: '|' - self.match(u'|') - - - - - - finally: - - pass - - # $ANTLR end T93 - - - - # $ANTLR start T94 - def mT94(self, ): - - try: - self.type = T94 - - # C.g:96:5: ( '^' ) - # C.g:96:7: '^' - self.match(u'^') - - - - - - finally: - - pass - - # $ANTLR end T94 - - - - # $ANTLR start T95 - def mT95(self, ): - - try: - self.type = T95 - - # C.g:97:5: ( '==' ) - # C.g:97:7: '==' - self.match("==") - - - - - - - finally: - - pass - - # $ANTLR end T95 - - - - # $ANTLR start T96 - def mT96(self, ): - - try: - self.type = T96 - - # C.g:98:5: ( '!=' ) - # C.g:98:7: '!=' - self.match("!=") - - - - - - - finally: - - pass - - # $ANTLR end T96 - - - - # $ANTLR start T97 - def mT97(self, ): - - try: - self.type = T97 - - # C.g:99:5: ( '<' ) - # C.g:99:7: '<' - self.match(u'<') - - - - - - finally: - - pass - - # $ANTLR end T97 - - - - # $ANTLR start T98 - def mT98(self, ): - - try: - self.type = T98 - - # C.g:100:5: ( '>' ) - # C.g:100:7: '>' - self.match(u'>') - - - - - - finally: - - pass - - # $ANTLR end T98 - - - - # $ANTLR start T99 - def mT99(self, ): - - try: - self.type = T99 - - # C.g:101:5: ( '<=' ) - # C.g:101:7: '<=' - self.match("<=") - - - - - - - finally: - - pass - - # $ANTLR end T99 - - - - # $ANTLR start T100 - def mT100(self, ): - - try: - self.type = T100 - - # C.g:102:6: ( '>=' ) - # C.g:102:8: '>=' - self.match(">=") - - - - - - - finally: - - pass - - # $ANTLR end T100 - - - - # $ANTLR start T101 - def mT101(self, ): - - try: - self.type = T101 - - # C.g:103:6: ( '<<' ) - # C.g:103:8: '<<' - self.match("<<") - - - - - - - finally: - - pass - - # $ANTLR end T101 - - - - # $ANTLR start T102 - def mT102(self, ): - - try: - self.type = T102 - - # C.g:104:6: ( '>>' ) - # C.g:104:8: '>>' - self.match(">>") - - - - - - - finally: - - pass - - # $ANTLR end T102 - - - - # $ANTLR start T103 - def mT103(self, ): - - try: - self.type = T103 - - # C.g:105:6: ( '__asm__' ) - # C.g:105:8: '__asm__' - self.match("__asm__") - - - - - - - finally: - - pass - - # $ANTLR end T103 - - - - # $ANTLR start T104 - def mT104(self, ): - - try: - self.type = T104 - - # C.g:106:6: ( '_asm' ) - # C.g:106:8: '_asm' - self.match("_asm") - - - - - - - finally: - - pass - - # $ANTLR end T104 - - - - # $ANTLR start T105 - def mT105(self, ): - - try: - self.type = T105 - - # C.g:107:6: ( '__asm' ) - # C.g:107:8: '__asm' - self.match("__asm") - - - - - - - finally: - - pass - - # $ANTLR end T105 - - - - # $ANTLR start T106 - def mT106(self, ): - - try: - self.type = T106 - - # C.g:108:6: ( 'case' ) - # C.g:108:8: 'case' - self.match("case") - - - - - - - finally: - - pass - - # $ANTLR end T106 - - - - # $ANTLR start T107 - def mT107(self, ): - - try: - self.type = T107 - - # C.g:109:6: ( 'default' ) - # C.g:109:8: 'default' - self.match("default") - - - - - - - finally: - - pass - - # $ANTLR end T107 - - - - # $ANTLR start T108 - def mT108(self, ): - - try: - self.type = T108 - - # C.g:110:6: ( 'if' ) - # C.g:110:8: 'if' - self.match("if") - - - - - - - finally: - - pass - - # $ANTLR end T108 - - - - # $ANTLR start T109 - def mT109(self, ): - - try: - self.type = T109 - - # C.g:111:6: ( 'else' ) - # C.g:111:8: 'else' - self.match("else") - - - - - - - finally: - - pass - - # $ANTLR end T109 - - - - # $ANTLR start T110 - def mT110(self, ): - - try: - self.type = T110 - - # C.g:112:6: ( 'switch' ) - # C.g:112:8: 'switch' - self.match("switch") - - - - - - - finally: - - pass - - # $ANTLR end T110 - - - - # $ANTLR start T111 - def mT111(self, ): - - try: - self.type = T111 - - # C.g:113:6: ( 'while' ) - # C.g:113:8: 'while' - self.match("while") - - - - - - - finally: - - pass - - # $ANTLR end T111 - - - - # $ANTLR start T112 - def mT112(self, ): - - try: - self.type = T112 - - # C.g:114:6: ( 'do' ) - # C.g:114:8: 'do' - self.match("do") - - - - - - - finally: - - pass - - # $ANTLR end T112 - - - - # $ANTLR start T113 - def mT113(self, ): - - try: - self.type = T113 - - # C.g:115:6: ( 'for' ) - # C.g:115:8: 'for' - self.match("for") - - - - - - - finally: - - pass - - # $ANTLR end T113 - - - - # $ANTLR start T114 - def mT114(self, ): - - try: - self.type = T114 - - # C.g:116:6: ( 'goto' ) - # C.g:116:8: 'goto' - self.match("goto") - - - - - - - finally: - - pass - - # $ANTLR end T114 - - - - # $ANTLR start T115 - def mT115(self, ): - - try: - self.type = T115 - - # C.g:117:6: ( 'continue' ) - # C.g:117:8: 'continue' - self.match("continue") - - - - - - - finally: - - pass - - # $ANTLR end T115 - - - - # $ANTLR start T116 - def mT116(self, ): - - try: - self.type = T116 - - # C.g:118:6: ( 'break' ) - # C.g:118:8: 'break' - self.match("break") - - - - - - - finally: - - pass - - # $ANTLR end T116 - - - - # $ANTLR start T117 - def mT117(self, ): - - try: - self.type = T117 - - # C.g:119:6: ( 'return' ) - # C.g:119:8: 'return' - self.match("return") - - - - - - - finally: - - pass - - # $ANTLR end T117 - - - - # $ANTLR start IDENTIFIER - def mIDENTIFIER(self, ): - - try: - self.type = IDENTIFIER - - # C.g:586:2: ( LETTER ( LETTER | '0' .. '9' )* ) - # C.g:586:4: LETTER ( LETTER | '0' .. '9' )* - self.mLETTER() - - # C.g:586:11: ( LETTER | '0' .. '9' )* - while True: #loop1 - alt1 = 2 - LA1_0 = self.input.LA(1) - - if (LA1_0 == u'$' or (u'0' <= LA1_0 <= u'9') or (u'A' <= LA1_0 <= u'Z') or LA1_0 == u'_' or (u'a' <= LA1_0 <= u'z')) : - alt1 = 1 - - - if alt1 == 1: - # C.g: - if self.input.LA(1) == u'$' or (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop1 - - - - - - - finally: - - pass - - # $ANTLR end IDENTIFIER - - - - # $ANTLR start LETTER - def mLETTER(self, ): - - try: - # C.g:591:2: ( '$' | 'A' .. 'Z' | 'a' .. 'z' | '_' ) - # C.g: - if self.input.LA(1) == u'$' or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end LETTER - - - - # $ANTLR start CHARACTER_LITERAL - def mCHARACTER_LITERAL(self, ): - - try: - self.type = CHARACTER_LITERAL - - # C.g:598:5: ( ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' ) - # C.g:598:9: ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' - # C.g:598:9: ( 'L' )? - alt2 = 2 - LA2_0 = self.input.LA(1) - - if (LA2_0 == u'L') : - alt2 = 1 - if alt2 == 1: - # C.g:598:10: 'L' - self.match(u'L') - - - - - self.match(u'\'') - - # C.g:598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) - alt3 = 2 - LA3_0 = self.input.LA(1) - - if (LA3_0 == u'\\') : - alt3 = 1 - elif ((u'\u0000' <= LA3_0 <= u'&') or (u'(' <= LA3_0 <= u'[') or (u']' <= LA3_0 <= u'\uFFFE')) : - alt3 = 2 - else: - nvae = NoViableAltException("598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) )", 3, 0, self.input) - - raise nvae - - if alt3 == 1: - # C.g:598:23: EscapeSequence - self.mEscapeSequence() - - - - elif alt3 == 2: - # C.g:598:40: ~ ( '\\'' | '\\\\' ) - if (u'\u0000' <= self.input.LA(1) <= u'&') or (u'(' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - self.match(u'\'') - - - - - - finally: - - pass - - # $ANTLR end CHARACTER_LITERAL - - - - # $ANTLR start STRING_LITERAL - def mSTRING_LITERAL(self, ): - - try: - self.type = STRING_LITERAL - - # C.g:602:5: ( ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) - # C.g:602:8: ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' - # C.g:602:8: ( 'L' )? - alt4 = 2 - LA4_0 = self.input.LA(1) - - if (LA4_0 == u'L') : - alt4 = 1 - if alt4 == 1: - # C.g:602:9: 'L' - self.match(u'L') - - - - - self.match(u'"') - - # C.g:602:19: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* - while True: #loop5 - alt5 = 3 - LA5_0 = self.input.LA(1) - - if (LA5_0 == u'\\') : - alt5 = 1 - elif ((u'\u0000' <= LA5_0 <= u'!') or (u'#' <= LA5_0 <= u'[') or (u']' <= LA5_0 <= u'\uFFFE')) : - alt5 = 2 - - - if alt5 == 1: - # C.g:602:21: EscapeSequence - self.mEscapeSequence() - - - - elif alt5 == 2: - # C.g:602:38: ~ ( '\\\\' | '\"' ) - if (u'\u0000' <= self.input.LA(1) <= u'!') or (u'#' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop5 - - - self.match(u'"') - - - - - - finally: - - pass - - # $ANTLR end STRING_LITERAL - - - - # $ANTLR start HEX_LITERAL - def mHEX_LITERAL(self, ): - - try: - self.type = HEX_LITERAL - - # C.g:605:13: ( '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? ) - # C.g:605:15: '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? - self.match(u'0') - - if self.input.LA(1) == u'X' or self.input.LA(1) == u'x': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - # C.g:605:29: ( HexDigit )+ - cnt6 = 0 - while True: #loop6 - alt6 = 2 - LA6_0 = self.input.LA(1) - - if ((u'0' <= LA6_0 <= u'9') or (u'A' <= LA6_0 <= u'F') or (u'a' <= LA6_0 <= u'f')) : - alt6 = 1 - - - if alt6 == 1: - # C.g:605:29: HexDigit - self.mHexDigit() - - - - else: - if cnt6 >= 1: - break #loop6 - - eee = EarlyExitException(6, self.input) - raise eee - - cnt6 += 1 - - - # C.g:605:39: ( IntegerTypeSuffix )? - alt7 = 2 - LA7_0 = self.input.LA(1) - - if (LA7_0 == u'L' or LA7_0 == u'U' or LA7_0 == u'l' or LA7_0 == u'u') : - alt7 = 1 - if alt7 == 1: - # C.g:605:39: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end HEX_LITERAL - - - - # $ANTLR start DECIMAL_LITERAL - def mDECIMAL_LITERAL(self, ): - - try: - self.type = DECIMAL_LITERAL - - # C.g:607:17: ( ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? ) - # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? - # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) - alt9 = 2 - LA9_0 = self.input.LA(1) - - if (LA9_0 == u'0') : - alt9 = 1 - elif ((u'1' <= LA9_0 <= u'9')) : - alt9 = 2 - else: - nvae = NoViableAltException("607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* )", 9, 0, self.input) - - raise nvae - - if alt9 == 1: - # C.g:607:20: '0' - self.match(u'0') - - - - elif alt9 == 2: - # C.g:607:26: '1' .. '9' ( '0' .. '9' )* - self.matchRange(u'1', u'9') - - # C.g:607:35: ( '0' .. '9' )* - while True: #loop8 - alt8 = 2 - LA8_0 = self.input.LA(1) - - if ((u'0' <= LA8_0 <= u'9')) : - alt8 = 1 - - - if alt8 == 1: - # C.g:607:35: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - break #loop8 - - - - - - # C.g:607:46: ( IntegerTypeSuffix )? - alt10 = 2 - LA10_0 = self.input.LA(1) - - if (LA10_0 == u'L' or LA10_0 == u'U' or LA10_0 == u'l' or LA10_0 == u'u') : - alt10 = 1 - if alt10 == 1: - # C.g:607:46: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end DECIMAL_LITERAL - - - - # $ANTLR start OCTAL_LITERAL - def mOCTAL_LITERAL(self, ): - - try: - self.type = OCTAL_LITERAL - - # C.g:609:15: ( '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? ) - # C.g:609:17: '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? - self.match(u'0') - - # C.g:609:21: ( '0' .. '7' )+ - cnt11 = 0 - while True: #loop11 - alt11 = 2 - LA11_0 = self.input.LA(1) - - if ((u'0' <= LA11_0 <= u'7')) : - alt11 = 1 - - - if alt11 == 1: - # C.g:609:22: '0' .. '7' - self.matchRange(u'0', u'7') - - - - else: - if cnt11 >= 1: - break #loop11 - - eee = EarlyExitException(11, self.input) - raise eee - - cnt11 += 1 - - - # C.g:609:33: ( IntegerTypeSuffix )? - alt12 = 2 - LA12_0 = self.input.LA(1) - - if (LA12_0 == u'L' or LA12_0 == u'U' or LA12_0 == u'l' or LA12_0 == u'u') : - alt12 = 1 - if alt12 == 1: - # C.g:609:33: IntegerTypeSuffix - self.mIntegerTypeSuffix() - - - - - - - - - finally: - - pass - - # $ANTLR end OCTAL_LITERAL - - - - # $ANTLR start HexDigit - def mHexDigit(self, ): - - try: - # C.g:612:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) ) - # C.g:612:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) - if (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'F') or (u'a' <= self.input.LA(1) <= u'f'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end HexDigit - - - - # $ANTLR start IntegerTypeSuffix - def mIntegerTypeSuffix(self, ): - - try: - # C.g:616:2: ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) ) - alt13 = 4 - LA13_0 = self.input.LA(1) - - if (LA13_0 == u'U' or LA13_0 == u'u') : - LA13_1 = self.input.LA(2) - - if (LA13_1 == u'L' or LA13_1 == u'l') : - LA13_3 = self.input.LA(3) - - if (LA13_3 == u'L' or LA13_3 == u'l') : - alt13 = 4 - else: - alt13 = 3 - else: - alt13 = 1 - elif (LA13_0 == u'L' or LA13_0 == u'l') : - alt13 = 2 - else: - nvae = NoViableAltException("614:1: fragment IntegerTypeSuffix : ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) );", 13, 0, self.input) - - raise nvae - - if alt13 == 1: - # C.g:616:4: ( 'u' | 'U' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 2: - # C.g:617:4: ( 'l' | 'L' ) - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 3: - # C.g:618:4: ( 'u' | 'U' ) ( 'l' | 'L' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt13 == 4: - # C.g:619:4: ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) - if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - finally: - - pass - - # $ANTLR end IntegerTypeSuffix - - - - # $ANTLR start FLOATING_POINT_LITERAL - def mFLOATING_POINT_LITERAL(self, ): - - try: - self.type = FLOATING_POINT_LITERAL - - # C.g:623:5: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? | '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? | ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? | ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix ) - alt25 = 4 - alt25 = self.dfa25.predict(self.input) - if alt25 == 1: - # C.g:623:9: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? - # C.g:623:9: ( '0' .. '9' )+ - cnt14 = 0 - while True: #loop14 - alt14 = 2 - LA14_0 = self.input.LA(1) - - if ((u'0' <= LA14_0 <= u'9')) : - alt14 = 1 - - - if alt14 == 1: - # C.g:623:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt14 >= 1: - break #loop14 - - eee = EarlyExitException(14, self.input) - raise eee - - cnt14 += 1 - - - self.match(u'.') - - # C.g:623:25: ( '0' .. '9' )* - while True: #loop15 - alt15 = 2 - LA15_0 = self.input.LA(1) - - if ((u'0' <= LA15_0 <= u'9')) : - alt15 = 1 - - - if alt15 == 1: - # C.g:623:26: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - break #loop15 - - - # C.g:623:37: ( Exponent )? - alt16 = 2 - LA16_0 = self.input.LA(1) - - if (LA16_0 == u'E' or LA16_0 == u'e') : - alt16 = 1 - if alt16 == 1: - # C.g:623:37: Exponent - self.mExponent() - - - - - # C.g:623:47: ( FloatTypeSuffix )? - alt17 = 2 - LA17_0 = self.input.LA(1) - - if (LA17_0 == u'D' or LA17_0 == u'F' or LA17_0 == u'd' or LA17_0 == u'f') : - alt17 = 1 - if alt17 == 1: - # C.g:623:47: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 2: - # C.g:624:9: '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? - self.match(u'.') - - # C.g:624:13: ( '0' .. '9' )+ - cnt18 = 0 - while True: #loop18 - alt18 = 2 - LA18_0 = self.input.LA(1) - - if ((u'0' <= LA18_0 <= u'9')) : - alt18 = 1 - - - if alt18 == 1: - # C.g:624:14: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt18 >= 1: - break #loop18 - - eee = EarlyExitException(18, self.input) - raise eee - - cnt18 += 1 - - - # C.g:624:25: ( Exponent )? - alt19 = 2 - LA19_0 = self.input.LA(1) - - if (LA19_0 == u'E' or LA19_0 == u'e') : - alt19 = 1 - if alt19 == 1: - # C.g:624:25: Exponent - self.mExponent() - - - - - # C.g:624:35: ( FloatTypeSuffix )? - alt20 = 2 - LA20_0 = self.input.LA(1) - - if (LA20_0 == u'D' or LA20_0 == u'F' or LA20_0 == u'd' or LA20_0 == u'f') : - alt20 = 1 - if alt20 == 1: - # C.g:624:35: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 3: - # C.g:625:9: ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? - # C.g:625:9: ( '0' .. '9' )+ - cnt21 = 0 - while True: #loop21 - alt21 = 2 - LA21_0 = self.input.LA(1) - - if ((u'0' <= LA21_0 <= u'9')) : - alt21 = 1 - - - if alt21 == 1: - # C.g:625:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt21 >= 1: - break #loop21 - - eee = EarlyExitException(21, self.input) - raise eee - - cnt21 += 1 - - - self.mExponent() - - # C.g:625:30: ( FloatTypeSuffix )? - alt22 = 2 - LA22_0 = self.input.LA(1) - - if (LA22_0 == u'D' or LA22_0 == u'F' or LA22_0 == u'd' or LA22_0 == u'f') : - alt22 = 1 - if alt22 == 1: - # C.g:625:30: FloatTypeSuffix - self.mFloatTypeSuffix() - - - - - - - elif alt25 == 4: - # C.g:626:9: ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix - # C.g:626:9: ( '0' .. '9' )+ - cnt23 = 0 - while True: #loop23 - alt23 = 2 - LA23_0 = self.input.LA(1) - - if ((u'0' <= LA23_0 <= u'9')) : - alt23 = 1 - - - if alt23 == 1: - # C.g:626:10: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt23 >= 1: - break #loop23 - - eee = EarlyExitException(23, self.input) - raise eee - - cnt23 += 1 - - - # C.g:626:21: ( Exponent )? - alt24 = 2 - LA24_0 = self.input.LA(1) - - if (LA24_0 == u'E' or LA24_0 == u'e') : - alt24 = 1 - if alt24 == 1: - # C.g:626:21: Exponent - self.mExponent() - - - - - self.mFloatTypeSuffix() - - - - - finally: - - pass - - # $ANTLR end FLOATING_POINT_LITERAL - - - - # $ANTLR start Exponent - def mExponent(self, ): - - try: - # C.g:630:10: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ ) - # C.g:630:12: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ - if self.input.LA(1) == u'E' or self.input.LA(1) == u'e': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - # C.g:630:22: ( '+' | '-' )? - alt26 = 2 - LA26_0 = self.input.LA(1) - - if (LA26_0 == u'+' or LA26_0 == u'-') : - alt26 = 1 - if alt26 == 1: - # C.g: - if self.input.LA(1) == u'+' or self.input.LA(1) == u'-': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - # C.g:630:33: ( '0' .. '9' )+ - cnt27 = 0 - while True: #loop27 - alt27 = 2 - LA27_0 = self.input.LA(1) - - if ((u'0' <= LA27_0 <= u'9')) : - alt27 = 1 - - - if alt27 == 1: - # C.g:630:34: '0' .. '9' - self.matchRange(u'0', u'9') - - - - else: - if cnt27 >= 1: - break #loop27 - - eee = EarlyExitException(27, self.input) - raise eee - - cnt27 += 1 - - - - - - - finally: - - pass - - # $ANTLR end Exponent - - - - # $ANTLR start FloatTypeSuffix - def mFloatTypeSuffix(self, ): - - try: - # C.g:633:17: ( ( 'f' | 'F' | 'd' | 'D' ) ) - # C.g:633:19: ( 'f' | 'F' | 'd' | 'D' ) - if self.input.LA(1) == u'D' or self.input.LA(1) == u'F' or self.input.LA(1) == u'd' or self.input.LA(1) == u'f': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - - - finally: - - pass - - # $ANTLR end FloatTypeSuffix - - - - # $ANTLR start EscapeSequence - def mEscapeSequence(self, ): - - try: - # C.g:637:5: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape ) - alt28 = 2 - LA28_0 = self.input.LA(1) - - if (LA28_0 == u'\\') : - LA28_1 = self.input.LA(2) - - if (LA28_1 == u'"' or LA28_1 == u'\'' or LA28_1 == u'\\' or LA28_1 == u'b' or LA28_1 == u'f' or LA28_1 == u'n' or LA28_1 == u'r' or LA28_1 == u't') : - alt28 = 1 - elif ((u'0' <= LA28_1 <= u'7')) : - alt28 = 2 - else: - nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 1, self.input) - - raise nvae - - else: - nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 0, self.input) - - raise nvae - - if alt28 == 1: - # C.g:637:8: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) - self.match(u'\\') - - if self.input.LA(1) == u'"' or self.input.LA(1) == u'\'' or self.input.LA(1) == u'\\' or self.input.LA(1) == u'b' or self.input.LA(1) == u'f' or self.input.LA(1) == u'n' or self.input.LA(1) == u'r' or self.input.LA(1) == u't': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - elif alt28 == 2: - # C.g:638:9: OctalEscape - self.mOctalEscape() - - - - - finally: - - pass - - # $ANTLR end EscapeSequence - - - - # $ANTLR start OctalEscape - def mOctalEscape(self, ): - - try: - # C.g:643:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ) - alt29 = 3 - LA29_0 = self.input.LA(1) - - if (LA29_0 == u'\\') : - LA29_1 = self.input.LA(2) - - if ((u'0' <= LA29_1 <= u'3')) : - LA29_2 = self.input.LA(3) - - if ((u'0' <= LA29_2 <= u'7')) : - LA29_4 = self.input.LA(4) - - if ((u'0' <= LA29_4 <= u'7')) : - alt29 = 1 - else: - alt29 = 2 - else: - alt29 = 3 - elif ((u'4' <= LA29_1 <= u'7')) : - LA29_3 = self.input.LA(3) - - if ((u'0' <= LA29_3 <= u'7')) : - alt29 = 2 - else: - alt29 = 3 - else: - nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 1, self.input) - - raise nvae - - else: - nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 0, self.input) - - raise nvae - - if alt29 == 1: - # C.g:643:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) - self.match(u'\\') - - # C.g:643:14: ( '0' .. '3' ) - # C.g:643:15: '0' .. '3' - self.matchRange(u'0', u'3') - - - - - # C.g:643:25: ( '0' .. '7' ) - # C.g:643:26: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - # C.g:643:36: ( '0' .. '7' ) - # C.g:643:37: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - elif alt29 == 2: - # C.g:644:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) - self.match(u'\\') - - # C.g:644:14: ( '0' .. '7' ) - # C.g:644:15: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - # C.g:644:25: ( '0' .. '7' ) - # C.g:644:26: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - elif alt29 == 3: - # C.g:645:9: '\\\\' ( '0' .. '7' ) - self.match(u'\\') - - # C.g:645:14: ( '0' .. '7' ) - # C.g:645:15: '0' .. '7' - self.matchRange(u'0', u'7') - - - - - - - - finally: - - pass - - # $ANTLR end OctalEscape - - - - # $ANTLR start UnicodeEscape - def mUnicodeEscape(self, ): - - try: - # C.g:650:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit ) - # C.g:650:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit - self.match(u'\\') - - self.match(u'u') - - self.mHexDigit() - - self.mHexDigit() - - self.mHexDigit() - - self.mHexDigit() - - - - - - finally: - - pass - - # $ANTLR end UnicodeEscape - - - - # $ANTLR start WS - def mWS(self, ): - - try: - self.type = WS - - # C.g:653:5: ( ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) ) - # C.g:653:8: ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) - if (u'\t' <= self.input.LA(1) <= u'\n') or (u'\f' <= self.input.LA(1) <= u'\r') or self.input.LA(1) == u' ': - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end WS - - - - # $ANTLR start BS - def mBS(self, ): - - try: - self.type = BS - - # C.g:657:5: ( ( '\\\\' ) ) - # C.g:657:7: ( '\\\\' ) - # C.g:657:7: ( '\\\\' ) - # C.g:657:8: '\\\\' - self.match(u'\\') - - - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end BS - - - - # $ANTLR start UnicodeVocabulary - def mUnicodeVocabulary(self, ): - - try: - self.type = UnicodeVocabulary - - # C.g:665:5: ( '\\u0003' .. '\\uFFFE' ) - # C.g:665:7: '\\u0003' .. '\\uFFFE' - self.matchRange(u'\u0003', u'\uFFFE') - - - - - - finally: - - pass - - # $ANTLR end UnicodeVocabulary - - - - # $ANTLR start COMMENT - def mCOMMENT(self, ): - - try: - self.type = COMMENT - - # C.g:668:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) - # C.g:668:9: '/*' ( options {greedy=false; } : . )* '*/' - self.match("/*") - - - # C.g:668:14: ( options {greedy=false; } : . )* - while True: #loop30 - alt30 = 2 - LA30_0 = self.input.LA(1) - - if (LA30_0 == u'*') : - LA30_1 = self.input.LA(2) - - if (LA30_1 == u'/') : - alt30 = 2 - elif ((u'\u0000' <= LA30_1 <= u'.') or (u'0' <= LA30_1 <= u'\uFFFE')) : - alt30 = 1 - - - elif ((u'\u0000' <= LA30_0 <= u')') or (u'+' <= LA30_0 <= u'\uFFFE')) : - alt30 = 1 - - - if alt30 == 1: - # C.g:668:42: . - self.matchAny() - - - - else: - break #loop30 - - - self.match("*/") - - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end COMMENT - - - - # $ANTLR start LINE_COMMENT - def mLINE_COMMENT(self, ): - - try: - self.type = LINE_COMMENT - - # C.g:673:5: ( '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) - # C.g:673:7: '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' - self.match("//") - - - # C.g:673:12: (~ ( '\\n' | '\\r' ) )* - while True: #loop31 - alt31 = 2 - LA31_0 = self.input.LA(1) - - if ((u'\u0000' <= LA31_0 <= u'\t') or (u'\u000B' <= LA31_0 <= u'\f') or (u'\u000E' <= LA31_0 <= u'\uFFFE')) : - alt31 = 1 - - - if alt31 == 1: - # C.g:673:12: ~ ( '\\n' | '\\r' ) - if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop31 - - - # C.g:673:26: ( '\\r' )? - alt32 = 2 - LA32_0 = self.input.LA(1) - - if (LA32_0 == u'\r') : - alt32 = 1 - if alt32 == 1: - # C.g:673:26: '\\r' - self.match(u'\r') - - - - - self.match(u'\n') - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end LINE_COMMENT - - - - # $ANTLR start LINE_COMMAND - def mLINE_COMMAND(self, ): - - try: - self.type = LINE_COMMAND - - # C.g:678:5: ( '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) - # C.g:678:7: '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' - self.match(u'#') - - # C.g:678:11: (~ ( '\\n' | '\\r' ) )* - while True: #loop33 - alt33 = 2 - LA33_0 = self.input.LA(1) - - if ((u'\u0000' <= LA33_0 <= u'\t') or (u'\u000B' <= LA33_0 <= u'\f') or (u'\u000E' <= LA33_0 <= u'\uFFFE')) : - alt33 = 1 - - - if alt33 == 1: - # C.g:678:11: ~ ( '\\n' | '\\r' ) - if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): - self.input.consume(); - - else: - mse = MismatchedSetException(None, self.input) - self.recover(mse) - raise mse - - - - - else: - break #loop33 - - - # C.g:678:25: ( '\\r' )? - alt34 = 2 - LA34_0 = self.input.LA(1) - - if (LA34_0 == u'\r') : - alt34 = 1 - if alt34 == 1: - # C.g:678:25: '\\r' - self.match(u'\r') - - - - - self.match(u'\n') - - #action start - self.channel=HIDDEN; - #action end - - - - - finally: - - pass - - # $ANTLR end LINE_COMMAND - - - - def mTokens(self): - # C.g:1:8: ( T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | T90 | T91 | T92 | T93 | T94 | T95 | T96 | T97 | T98 | T99 | T100 | T101 | T102 | T103 | T104 | T105 | T106 | T107 | T108 | T109 | T110 | T111 | T112 | T113 | T114 | T115 | T116 | T117 | IDENTIFIER | CHARACTER_LITERAL | STRING_LITERAL | HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL | FLOATING_POINT_LITERAL | WS | BS | UnicodeVocabulary | COMMENT | LINE_COMMENT | LINE_COMMAND ) - alt35 = 106 - alt35 = self.dfa35.predict(self.input) - if alt35 == 1: - # C.g:1:10: T25 - self.mT25() - - - - elif alt35 == 2: - # C.g:1:14: T26 - self.mT26() - - - - elif alt35 == 3: - # C.g:1:18: T27 - self.mT27() - - - - elif alt35 == 4: - # C.g:1:22: T28 - self.mT28() - - - - elif alt35 == 5: - # C.g:1:26: T29 - self.mT29() - - - - elif alt35 == 6: - # C.g:1:30: T30 - self.mT30() - - - - elif alt35 == 7: - # C.g:1:34: T31 - self.mT31() - - - - elif alt35 == 8: - # C.g:1:38: T32 - self.mT32() - - - - elif alt35 == 9: - # C.g:1:42: T33 - self.mT33() - - - - elif alt35 == 10: - # C.g:1:46: T34 - self.mT34() - - - - elif alt35 == 11: - # C.g:1:50: T35 - self.mT35() - - - - elif alt35 == 12: - # C.g:1:54: T36 - self.mT36() - - - - elif alt35 == 13: - # C.g:1:58: T37 - self.mT37() - - - - elif alt35 == 14: - # C.g:1:62: T38 - self.mT38() - - - - elif alt35 == 15: - # C.g:1:66: T39 - self.mT39() - - - - elif alt35 == 16: - # C.g:1:70: T40 - self.mT40() - - - - elif alt35 == 17: - # C.g:1:74: T41 - self.mT41() - - - - elif alt35 == 18: - # C.g:1:78: T42 - self.mT42() - - - - elif alt35 == 19: - # C.g:1:82: T43 - self.mT43() - - - - elif alt35 == 20: - # C.g:1:86: T44 - self.mT44() - - - - elif alt35 == 21: - # C.g:1:90: T45 - self.mT45() - - - - elif alt35 == 22: - # C.g:1:94: T46 - self.mT46() - - - - elif alt35 == 23: - # C.g:1:98: T47 - self.mT47() - - - - elif alt35 == 24: - # C.g:1:102: T48 - self.mT48() - - - - elif alt35 == 25: - # C.g:1:106: T49 - self.mT49() - - - - elif alt35 == 26: - # C.g:1:110: T50 - self.mT50() - - - - elif alt35 == 27: - # C.g:1:114: T51 - self.mT51() - - - - elif alt35 == 28: - # C.g:1:118: T52 - self.mT52() - - - - elif alt35 == 29: - # C.g:1:122: T53 - self.mT53() - - - - elif alt35 == 30: - # C.g:1:126: T54 - self.mT54() - - - - elif alt35 == 31: - # C.g:1:130: T55 - self.mT55() - - - - elif alt35 == 32: - # C.g:1:134: T56 - self.mT56() - - - - elif alt35 == 33: - # C.g:1:138: T57 - self.mT57() - - - - elif alt35 == 34: - # C.g:1:142: T58 - self.mT58() - - - - elif alt35 == 35: - # C.g:1:146: T59 - self.mT59() - - - - elif alt35 == 36: - # C.g:1:150: T60 - self.mT60() - - - - elif alt35 == 37: - # C.g:1:154: T61 - self.mT61() - - - - elif alt35 == 38: - # C.g:1:158: T62 - self.mT62() - - - - elif alt35 == 39: - # C.g:1:162: T63 - self.mT63() - - - - elif alt35 == 40: - # C.g:1:166: T64 - self.mT64() - - - - elif alt35 == 41: - # C.g:1:170: T65 - self.mT65() - - - - elif alt35 == 42: - # C.g:1:174: T66 - self.mT66() - - - - elif alt35 == 43: - # C.g:1:178: T67 - self.mT67() - - - - elif alt35 == 44: - # C.g:1:182: T68 - self.mT68() - - - - elif alt35 == 45: - # C.g:1:186: T69 - self.mT69() - - - - elif alt35 == 46: - # C.g:1:190: T70 - self.mT70() - - - - elif alt35 == 47: - # C.g:1:194: T71 - self.mT71() - - - - elif alt35 == 48: - # C.g:1:198: T72 - self.mT72() - - - - elif alt35 == 49: - # C.g:1:202: T73 - self.mT73() - - - - elif alt35 == 50: - # C.g:1:206: T74 - self.mT74() - - - - elif alt35 == 51: - # C.g:1:210: T75 - self.mT75() - - - - elif alt35 == 52: - # C.g:1:214: T76 - self.mT76() - - - - elif alt35 == 53: - # C.g:1:218: T77 - self.mT77() - - - - elif alt35 == 54: - # C.g:1:222: T78 - self.mT78() - - - - elif alt35 == 55: - # C.g:1:226: T79 - self.mT79() - - - - elif alt35 == 56: - # C.g:1:230: T80 - self.mT80() - - - - elif alt35 == 57: - # C.g:1:234: T81 - self.mT81() - - - - elif alt35 == 58: - # C.g:1:238: T82 - self.mT82() - - - - elif alt35 == 59: - # C.g:1:242: T83 - self.mT83() - - - - elif alt35 == 60: - # C.g:1:246: T84 - self.mT84() - - - - elif alt35 == 61: - # C.g:1:250: T85 - self.mT85() - - - - elif alt35 == 62: - # C.g:1:254: T86 - self.mT86() - - - - elif alt35 == 63: - # C.g:1:258: T87 - self.mT87() - - - - elif alt35 == 64: - # C.g:1:262: T88 - self.mT88() - - - - elif alt35 == 65: - # C.g:1:266: T89 - self.mT89() - - - - elif alt35 == 66: - # C.g:1:270: T90 - self.mT90() - - - - elif alt35 == 67: - # C.g:1:274: T91 - self.mT91() - - - - elif alt35 == 68: - # C.g:1:278: T92 - self.mT92() - - - - elif alt35 == 69: - # C.g:1:282: T93 - self.mT93() - - - - elif alt35 == 70: - # C.g:1:286: T94 - self.mT94() - - - - elif alt35 == 71: - # C.g:1:290: T95 - self.mT95() - - - - elif alt35 == 72: - # C.g:1:294: T96 - self.mT96() - - - - elif alt35 == 73: - # C.g:1:298: T97 - self.mT97() - - - - elif alt35 == 74: - # C.g:1:302: T98 - self.mT98() - - - - elif alt35 == 75: - # C.g:1:306: T99 - self.mT99() - - - - elif alt35 == 76: - # C.g:1:310: T100 - self.mT100() - - - - elif alt35 == 77: - # C.g:1:315: T101 - self.mT101() - - - - elif alt35 == 78: - # C.g:1:320: T102 - self.mT102() - - - - elif alt35 == 79: - # C.g:1:325: T103 - self.mT103() - - - - elif alt35 == 80: - # C.g:1:330: T104 - self.mT104() - - - - elif alt35 == 81: - # C.g:1:335: T105 - self.mT105() - - - - elif alt35 == 82: - # C.g:1:340: T106 - self.mT106() - - - - elif alt35 == 83: - # C.g:1:345: T107 - self.mT107() - - - - elif alt35 == 84: - # C.g:1:350: T108 - self.mT108() - - - - elif alt35 == 85: - # C.g:1:355: T109 - self.mT109() - - - - elif alt35 == 86: - # C.g:1:360: T110 - self.mT110() - - - - elif alt35 == 87: - # C.g:1:365: T111 - self.mT111() - - - - elif alt35 == 88: - # C.g:1:370: T112 - self.mT112() - - - - elif alt35 == 89: - # C.g:1:375: T113 - self.mT113() - - - - elif alt35 == 90: - # C.g:1:380: T114 - self.mT114() - - - - elif alt35 == 91: - # C.g:1:385: T115 - self.mT115() - - - - elif alt35 == 92: - # C.g:1:390: T116 - self.mT116() - - - - elif alt35 == 93: - # C.g:1:395: T117 - self.mT117() - - - - elif alt35 == 94: - # C.g:1:400: IDENTIFIER - self.mIDENTIFIER() - - - - elif alt35 == 95: - # C.g:1:411: CHARACTER_LITERAL - self.mCHARACTER_LITERAL() - - - - elif alt35 == 96: - # C.g:1:429: STRING_LITERAL - self.mSTRING_LITERAL() - - - - elif alt35 == 97: - # C.g:1:444: HEX_LITERAL - self.mHEX_LITERAL() - - - - elif alt35 == 98: - # C.g:1:456: DECIMAL_LITERAL - self.mDECIMAL_LITERAL() - - - - elif alt35 == 99: - # C.g:1:472: OCTAL_LITERAL - self.mOCTAL_LITERAL() - - - - elif alt35 == 100: - # C.g:1:486: FLOATING_POINT_LITERAL - self.mFLOATING_POINT_LITERAL() - - - - elif alt35 == 101: - # C.g:1:509: WS - self.mWS() - - - - elif alt35 == 102: - # C.g:1:512: BS - self.mBS() - - - - elif alt35 == 103: - # C.g:1:515: UnicodeVocabulary - self.mUnicodeVocabulary() - - - - elif alt35 == 104: - # C.g:1:533: COMMENT - self.mCOMMENT() - - - - elif alt35 == 105: - # C.g:1:541: LINE_COMMENT - self.mLINE_COMMENT() - - - - elif alt35 == 106: - # C.g:1:554: LINE_COMMAND - self.mLINE_COMMAND() - - - - - - - - - # lookup tables for DFA #25 - - DFA25_eot = DFA.unpack( - u"\7\uffff\1\10\2\uffff" - ) - - DFA25_eof = DFA.unpack( - u"\12\uffff" - ) - - DFA25_min = DFA.unpack( - u"\2\56\2\uffff\1\53\1\uffff\2\60\2\uffff" - ) - - DFA25_max = DFA.unpack( - u"\1\71\1\146\2\uffff\1\71\1\uffff\1\71\1\146\2\uffff" - ) - - DFA25_accept = DFA.unpack( - u"\2\uffff\1\2\1\1\1\uffff\1\4\2\uffff\2\3" - ) - - DFA25_special = DFA.unpack( - u"\12\uffff" - ) - - - DFA25_transition = [ - DFA.unpack(u"\1\2\1\uffff\12\1"), - DFA.unpack(u"\1\3\1\uffff\12\1\12\uffff\1\5\1\4\1\5\35\uffff\1\5" - u"\1\4\1\5"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\6\1\uffff\1\6\2\uffff\12\7"), - DFA.unpack(u""), - DFA.unpack(u"\12\7"), - DFA.unpack(u"\12\7\12\uffff\1\11\1\uffff\1\11\35\uffff\1\11\1\uffff" - u"\1\11"), - DFA.unpack(u""), - DFA.unpack(u"") - ] - - # class definition for DFA #25 - - DFA25 = DFA - # lookup tables for DFA #35 - - DFA35_eot = DFA.unpack( - u"\2\uffff\1\76\1\uffff\1\101\14\76\3\uffff\10\76\4\uffff\1\151\1" - u"\153\1\157\1\163\1\167\1\171\1\174\1\uffff\1\177\1\u0082\1\u0085" - u"\1\u0087\1\u008a\1\uffff\5\76\1\uffff\2\73\2\u0095\2\uffff\1\73" - u"\2\uffff\1\76\4\uffff\16\76\1\u00ad\5\76\1\u00b4\1\76\3\uffff\1" - u"\u00b7\10\76\34\uffff\1\u00c1\2\uffff\1\u00c3\10\uffff\5\76\3\uffff" - u"\1\u00c9\1\uffff\1\u0095\3\uffff\23\76\1\uffff\1\u00de\1\76\1\u00e0" - u"\3\76\1\uffff\2\76\1\uffff\1\76\1\u00e7\6\76\4\uffff\5\76\1\uffff" - u"\1\76\1\u00f5\1\76\1\u00f7\6\76\1\u00fe\4\76\1\u0103\1\u0104\2" - u"\76\1\u0107\1\uffff\1\u0108\1\uffff\6\76\1\uffff\10\76\1\u0118" - u"\1\76\1\u011a\2\76\1\uffff\1\76\1\uffff\5\76\1\u0123\1\uffff\4" - u"\76\2\uffff\1\76\1\u0129\2\uffff\1\u012a\3\76\1\u012e\1\76\1\u0130" - u"\7\76\1\u0139\1\uffff\1\u013a\1\uffff\1\u013b\1\76\1\u013d\1\u013e" - u"\1\u013f\1\u0140\1\u0141\1\u0142\1\uffff\1\76\1\u0144\1\u0145\2" - u"\76\2\uffff\1\76\1\u0149\1\76\1\uffff\1\76\1\uffff\5\76\1\u0151" - u"\1\u0152\1\76\3\uffff\1\u0154\6\uffff\1\76\2\uffff\2\76\1\u0158" - u"\1\uffff\7\76\2\uffff\1\u0160\1\uffff\1\u0161\1\u0162\1\u0163\1" - u"\uffff\1\u0164\1\u0165\1\76\1\u0167\3\76\6\uffff\1\u016b\1\uffff" - u"\3\76\1\uffff\21\76\1\u0180\2\76\1\uffff\3\76\1\u0186\1\76\1\uffff" - u"\11\76\1\u0191\1\uffff" - ) - - DFA35_eof = DFA.unpack( - u"\u0192\uffff" - ) - - DFA35_min = DFA.unpack( - u"\1\3\1\uffff\1\171\1\uffff\1\75\1\154\1\150\1\165\1\145\1\124\1" - u"\157\1\141\1\146\1\157\1\154\1\145\1\156\3\uffff\1\116\1\120\1" - u"\117\1\116\1\117\1\114\1\106\1\101\4\uffff\1\75\1\56\1\53\1\55" - u"\1\52\1\75\1\46\1\uffff\1\75\1\74\3\75\1\uffff\1\137\1\150\1\157" - u"\1\162\1\42\1\uffff\2\0\2\56\2\uffff\1\0\2\uffff\1\160\4\uffff" - u"\1\163\1\164\1\165\1\151\1\141\1\147\1\157\1\164\1\147\1\101\1" - u"\151\1\163\1\156\1\141\1\44\1\164\1\156\1\162\1\157\1\146\1\44" - u"\1\151\3\uffff\1\44\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34" - u"\uffff\1\75\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145" - u"\3\uffff\1\56\1\uffff\1\56\3\uffff\3\145\1\155\2\164\1\165\1\145" - u"\1\156\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\163\1" - u"\162\1\uffff\1\44\1\147\1\44\2\141\1\142\1\uffff\1\151\1\157\1" - u"\uffff\1\111\1\44\1\123\1\114\1\101\1\102\1\101\1\113\4\uffff\1" - u"\163\1\155\1\154\1\157\1\141\1\uffff\1\144\1\44\1\162\1\44\1\143" - u"\1\151\1\143\1\157\1\145\1\164\1\44\1\163\1\162\1\111\1\164\2\44" - u"\1\151\1\164\1\44\1\uffff\1\44\1\uffff\1\164\1\165\1\154\1\147" - u"\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\102\1\120\1\105" - u"\1\155\1\44\1\145\1\44\1\153\1\145\1\uffff\1\156\1\uffff\1\150" - u"\1\143\1\164\1\146\1\144\1\44\1\uffff\1\164\1\156\1\103\1\151\2" - u"\uffff\1\156\1\44\2\uffff\1\44\1\154\1\145\1\156\1\44\1\116\1\44" - u"\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\44\1\uffff\1\44\1" - u"\uffff\1\44\1\146\6\44\1\uffff\1\145\2\44\1\154\1\165\2\uffff\1" - u"\164\1\44\1\145\1\uffff\1\101\1\uffff\1\116\1\114\1\137\1\116\1" - u"\117\2\44\1\137\3\uffff\1\44\6\uffff\1\162\2\uffff\2\145\1\44\1" - u"\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff\1\44\1\uffff\3\44" - u"\1\uffff\2\44\1\104\1\44\1\105\1\111\1\123\6\uffff\1\44\1\uffff" - u"\2\115\1\105\1\uffff\1\117\1\105\1\122\1\126\1\123\1\126\2\105" - u"\1\111\1\137\1\122\1\103\1\111\1\126\1\105\1\106\1\111\1\44\1\137" - u"\1\103\1\uffff\1\125\1\105\1\116\1\44\1\122\1\uffff\1\105\1\106" - u"\1\105\1\122\1\105\1\116\1\103\1\105\1\104\1\44\1\uffff" - ) - - DFA35_max = DFA.unpack( - u"\1\ufffe\1\uffff\1\171\1\uffff\1\75\1\170\1\167\1\165\1\145\1\124" - u"\2\157\1\156\3\157\1\156\3\uffff\1\116\1\125\1\117\1\116\1\117" - u"\1\114\1\106\1\101\4\uffff\1\75\1\71\1\75\1\76\3\75\1\uffff\2\75" - u"\1\76\1\75\1\174\1\uffff\1\141\1\150\1\157\1\162\1\47\1\uffff\2" - u"\ufffe\1\170\1\146\2\uffff\1\ufffe\2\uffff\1\160\4\uffff\1\163" - u"\1\164\1\165\1\151\1\162\1\172\1\157\2\164\1\101\1\154\1\163\1" - u"\156\1\141\1\172\1\164\1\156\1\162\1\157\1\146\1\172\1\163\3\uffff" - u"\1\172\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34\uffff\1\75" - u"\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145\3\uffff\1" - u"\146\1\uffff\1\146\3\uffff\3\145\1\155\2\164\1\165\1\145\1\156" - u"\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\164\1\162\1" - u"\uffff\1\172\1\147\1\172\2\141\1\142\1\uffff\1\151\1\157\1\uffff" - u"\1\111\1\172\1\123\1\114\1\101\1\102\1\137\1\113\4\uffff\1\163" - u"\1\155\1\154\1\157\1\141\1\uffff\1\144\1\172\1\162\1\172\1\143" - u"\1\151\1\143\1\157\1\145\1\164\1\172\1\163\1\162\1\111\1\164\2" - u"\172\1\151\1\164\1\172\1\uffff\1\172\1\uffff\1\164\1\165\1\154" - u"\1\147\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\122\1\120" - u"\1\105\1\155\1\172\1\145\1\172\1\153\1\145\1\uffff\1\156\1\uffff" - u"\1\150\1\143\1\164\1\146\1\144\1\172\1\uffff\1\164\1\156\1\103" - u"\1\151\2\uffff\1\156\1\172\2\uffff\1\172\1\154\1\145\1\156\1\172" - u"\1\116\1\172\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\172\1" - u"\uffff\1\172\1\uffff\1\172\1\146\6\172\1\uffff\1\145\2\172\1\154" - u"\1\165\2\uffff\1\164\1\172\1\145\1\uffff\1\101\1\uffff\1\116\1" - u"\114\1\137\1\116\1\117\2\172\1\137\3\uffff\1\172\6\uffff\1\162" - u"\2\uffff\2\145\1\172\1\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff" - u"\1\172\1\uffff\3\172\1\uffff\2\172\1\104\1\172\1\105\1\111\1\123" - u"\6\uffff\1\172\1\uffff\2\115\1\105\1\uffff\1\117\1\105\1\122\1" - u"\126\1\123\1\126\2\105\1\111\1\137\1\122\1\103\1\111\1\126\1\105" - u"\1\106\1\111\1\172\1\137\1\103\1\uffff\1\125\1\105\1\116\1\172" - u"\1\122\1\uffff\1\105\1\106\1\105\1\122\1\105\1\116\1\103\1\105" - u"\1\104\1\172\1\uffff" - ) - - DFA35_accept = DFA.unpack( - u"\1\uffff\1\1\1\uffff\1\3\15\uffff\1\23\1\24\1\27\10\uffff\1\46" - u"\1\47\1\50\1\51\7\uffff\1\66\5\uffff\1\102\5\uffff\1\136\4\uffff" - u"\1\145\1\146\1\uffff\1\147\1\1\1\uffff\1\136\1\3\1\107\1\4\26\uffff" - u"\1\23\1\24\1\27\11\uffff\1\46\1\47\1\50\1\51\1\70\1\52\1\53\1\63" - u"\1\144\1\73\1\60\1\54\1\74\1\64\1\61\1\55\1\150\1\151\1\71\1\56" - u"\1\72\1\57\1\77\1\104\1\65\1\66\1\110\1\67\1\uffff\1\113\1\111" - u"\1\uffff\1\114\1\112\1\100\1\106\1\103\1\101\1\105\1\102\5\uffff" - u"\1\140\1\137\1\141\1\uffff\1\142\1\uffff\1\145\1\146\1\152\23\uffff" - u"\1\124\6\uffff\1\130\2\uffff\1\33\10\uffff\1\75\1\115\1\76\1\116" - u"\5\uffff\1\143\24\uffff\1\15\1\uffff\1\131\6\uffff\1\34\15\uffff" - u"\1\125\1\uffff\1\30\6\uffff\1\7\4\uffff\1\12\1\122\2\uffff\1\13" - u"\1\16\17\uffff\1\120\1\uffff\1\132\10\uffff\1\14\5\uffff\1\31\1" - u"\17\3\uffff\1\26\1\uffff\1\36\10\uffff\1\121\1\127\1\134\1\uffff" - u"\1\5\1\126\1\6\1\25\1\62\1\21\1\uffff\1\135\1\11\3\uffff\1\20\7" - u"\uffff\1\42\1\45\1\uffff\1\2\3\uffff\1\123\7\uffff\1\117\1\10\1" - u"\32\1\133\1\22\1\35\1\uffff\1\40\3\uffff\1\37\24\uffff\1\43\5\uffff" - u"\1\44\12\uffff\1\41" - ) - - DFA35_special = DFA.unpack( - u"\u0192\uffff" - ) - - - DFA35_transition = [ - DFA.unpack(u"\6\73\2\70\1\73\2\70\22\73\1\70\1\50\1\65\1\72\1\63" - u"\1\45\1\46\1\64\1\34\1\35\1\40\1\42\1\3\1\43\1\41\1\44\1\66\11" - u"\67\1\23\1\1\1\51\1\4\1\52\1\55\1\73\2\63\1\26\1\63\1\32\1\63\1" - u"\31\1\63\1\24\2\63\1\62\2\63\1\25\1\33\2\63\1\11\1\63\1\27\1\30" - u"\4\63\1\36\1\71\1\37\1\53\1\56\1\73\1\7\1\61\1\13\1\17\1\5\1\16" - u"\1\60\1\63\1\14\2\63\1\15\5\63\1\10\1\6\1\2\1\20\1\12\1\57\3\63" - u"\1\21\1\54\1\22\1\47\uff80\73"), - DFA.unpack(u""), - DFA.unpack(u"\1\75"), - DFA.unpack(u""), - DFA.unpack(u"\1\100"), - DFA.unpack(u"\1\102\1\uffff\1\104\11\uffff\1\103"), - DFA.unpack(u"\1\110\1\107\12\uffff\1\106\2\uffff\1\105"), - DFA.unpack(u"\1\111"), - DFA.unpack(u"\1\112"), - DFA.unpack(u"\1\113"), - DFA.unpack(u"\1\114"), - DFA.unpack(u"\1\115\6\uffff\1\117\6\uffff\1\116"), - DFA.unpack(u"\1\120\7\uffff\1\121"), - DFA.unpack(u"\1\122"), - DFA.unpack(u"\1\124\2\uffff\1\123"), - DFA.unpack(u"\1\125\11\uffff\1\126"), - DFA.unpack(u"\1\127"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\133"), - DFA.unpack(u"\1\134\4\uffff\1\135"), - DFA.unpack(u"\1\136"), - DFA.unpack(u"\1\137"), - DFA.unpack(u"\1\140"), - DFA.unpack(u"\1\141"), - DFA.unpack(u"\1\142"), - DFA.unpack(u"\1\143"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\150"), - DFA.unpack(u"\1\152\1\uffff\12\154"), - DFA.unpack(u"\1\156\21\uffff\1\155"), - DFA.unpack(u"\1\162\17\uffff\1\160\1\161"), - DFA.unpack(u"\1\164\4\uffff\1\165\15\uffff\1\166"), - DFA.unpack(u"\1\170"), - DFA.unpack(u"\1\173\26\uffff\1\172"), - DFA.unpack(u""), - DFA.unpack(u"\1\176"), - DFA.unpack(u"\1\u0080\1\u0081"), - DFA.unpack(u"\1\u0084\1\u0083"), - DFA.unpack(u"\1\u0086"), - DFA.unpack(u"\1\u0089\76\uffff\1\u0088"), - DFA.unpack(u""), - DFA.unpack(u"\1\u008c\1\uffff\1\u008d"), - DFA.unpack(u"\1\u008e"), - DFA.unpack(u"\1\u008f"), - DFA.unpack(u"\1\u0090"), - DFA.unpack(u"\1\u0091\4\uffff\1\u0092"), - DFA.unpack(u""), - DFA.unpack(u"\47\u0092\1\uffff\uffd7\u0092"), - DFA.unpack(u"\uffff\u0091"), - DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\21\uffff" - u"\1\u0093\13\uffff\3\154\21\uffff\1\u0093"), - DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\uffff\u0099"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u009a"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u009b"), - DFA.unpack(u"\1\u009c"), - DFA.unpack(u"\1\u009d"), - DFA.unpack(u"\1\u009e"), - DFA.unpack(u"\1\u009f\20\uffff\1\u00a0"), - DFA.unpack(u"\1\u00a2\22\uffff\1\u00a1"), - DFA.unpack(u"\1\u00a3"), - DFA.unpack(u"\1\u00a4"), - DFA.unpack(u"\1\u00a5\14\uffff\1\u00a6"), - DFA.unpack(u"\1\u00a7"), - DFA.unpack(u"\1\u00a9\2\uffff\1\u00a8"), - DFA.unpack(u"\1\u00aa"), - DFA.unpack(u"\1\u00ab"), - DFA.unpack(u"\1\u00ac"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00ae"), - DFA.unpack(u"\1\u00af"), - DFA.unpack(u"\1\u00b0"), - DFA.unpack(u"\1\u00b1"), - DFA.unpack(u"\1\u00b2"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\24\76\1\u00b3\5\76"), - DFA.unpack(u"\1\u00b6\11\uffff\1\u00b5"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00b8"), - DFA.unpack(u"\1\u00b9"), - DFA.unpack(u"\1\u00ba"), - DFA.unpack(u"\1\u00bb"), - DFA.unpack(u"\1\u00bc"), - DFA.unpack(u"\1\u00bd"), - DFA.unpack(u"\1\u00be"), - DFA.unpack(u"\1\u00bf"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c0"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c2"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00c4"), - DFA.unpack(u"\1\u00c5"), - DFA.unpack(u"\1\u00c6"), - DFA.unpack(u"\1\u00c7"), - DFA.unpack(u"\1\u00c8"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\35\uffff" - u"\3\154"), - DFA.unpack(u""), - DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00ca"), - DFA.unpack(u"\1\u00cb"), - DFA.unpack(u"\1\u00cc"), - DFA.unpack(u"\1\u00cd"), - DFA.unpack(u"\1\u00ce"), - DFA.unpack(u"\1\u00cf"), - DFA.unpack(u"\1\u00d0"), - DFA.unpack(u"\1\u00d1"), - DFA.unpack(u"\1\u00d2"), - DFA.unpack(u"\1\u00d3"), - DFA.unpack(u"\1\u00d4"), - DFA.unpack(u"\1\u00d5"), - DFA.unpack(u"\1\u00d6"), - DFA.unpack(u"\1\u00d7"), - DFA.unpack(u"\1\u00d8"), - DFA.unpack(u"\1\u00d9"), - DFA.unpack(u"\1\u00da"), - DFA.unpack(u"\1\u00dc\1\u00db"), - DFA.unpack(u"\1\u00dd"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00df"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00e1"), - DFA.unpack(u"\1\u00e2"), - DFA.unpack(u"\1\u00e3"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00e4"), - DFA.unpack(u"\1\u00e5"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00e6"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00e8"), - DFA.unpack(u"\1\u00e9"), - DFA.unpack(u"\1\u00ea"), - DFA.unpack(u"\1\u00eb"), - DFA.unpack(u"\1\u00ed\35\uffff\1\u00ec"), - DFA.unpack(u"\1\u00ee"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u00ef"), - DFA.unpack(u"\1\u00f0"), - DFA.unpack(u"\1\u00f1"), - DFA.unpack(u"\1\u00f2"), - DFA.unpack(u"\1\u00f3"), - DFA.unpack(u""), - DFA.unpack(u"\1\u00f4"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00f6"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00f8"), - DFA.unpack(u"\1\u00f9"), - DFA.unpack(u"\1\u00fa"), - DFA.unpack(u"\1\u00fb"), - DFA.unpack(u"\1\u00fc"), - DFA.unpack(u"\1\u00fd"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u00ff"), - DFA.unpack(u"\1\u0100"), - DFA.unpack(u"\1\u0101"), - DFA.unpack(u"\1\u0102"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0105"), - DFA.unpack(u"\1\u0106"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0109"), - DFA.unpack(u"\1\u010a"), - DFA.unpack(u"\1\u010b"), - DFA.unpack(u"\1\u010c"), - DFA.unpack(u"\1\u010d"), - DFA.unpack(u"\1\u010e"), - DFA.unpack(u""), - DFA.unpack(u"\1\u010f"), - DFA.unpack(u"\1\u0110"), - DFA.unpack(u"\1\u0111"), - DFA.unpack(u"\1\u0112"), - DFA.unpack(u"\1\u0114\17\uffff\1\u0113"), - DFA.unpack(u"\1\u0115"), - DFA.unpack(u"\1\u0116"), - DFA.unpack(u"\1\u0117"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0119"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u011b"), - DFA.unpack(u"\1\u011c"), - DFA.unpack(u""), - DFA.unpack(u"\1\u011d"), - DFA.unpack(u""), - DFA.unpack(u"\1\u011e"), - DFA.unpack(u"\1\u011f"), - DFA.unpack(u"\1\u0120"), - DFA.unpack(u"\1\u0121"), - DFA.unpack(u"\1\u0122"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0124"), - DFA.unpack(u"\1\u0125"), - DFA.unpack(u"\1\u0126"), - DFA.unpack(u"\1\u0127"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0128"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u012b"), - DFA.unpack(u"\1\u012c"), - DFA.unpack(u"\1\u012d"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u012f"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0131"), - DFA.unpack(u"\1\u0132"), - DFA.unpack(u"\1\u0133"), - DFA.unpack(u"\1\u0134"), - DFA.unpack(u"\1\u0135"), - DFA.unpack(u"\1\u0136"), - DFA.unpack(u"\1\u0137"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\u0138\1" - u"\uffff\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u013c"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0143"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0146"), - DFA.unpack(u"\1\u0147"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0148"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u014a"), - DFA.unpack(u""), - DFA.unpack(u"\1\u014b"), - DFA.unpack(u""), - DFA.unpack(u"\1\u014c"), - DFA.unpack(u"\1\u014d"), - DFA.unpack(u"\1\u014e"), - DFA.unpack(u"\1\u014f"), - DFA.unpack(u"\1\u0150"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0153"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0155"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\u0156"), - DFA.unpack(u"\1\u0157"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0159"), - DFA.unpack(u"\1\u015a"), - DFA.unpack(u"\1\u015b"), - DFA.unpack(u"\1\u015c"), - DFA.unpack(u"\1\u015d"), - DFA.unpack(u"\1\u015e"), - DFA.unpack(u"\1\u015f"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0166"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0168"), - DFA.unpack(u"\1\u0169"), - DFA.unpack(u"\1\u016a"), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u""), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u""), - DFA.unpack(u"\1\u016c"), - DFA.unpack(u"\1\u016d"), - DFA.unpack(u"\1\u016e"), - DFA.unpack(u""), - DFA.unpack(u"\1\u016f"), - DFA.unpack(u"\1\u0170"), - DFA.unpack(u"\1\u0171"), - DFA.unpack(u"\1\u0172"), - DFA.unpack(u"\1\u0173"), - DFA.unpack(u"\1\u0174"), - DFA.unpack(u"\1\u0175"), - DFA.unpack(u"\1\u0176"), - DFA.unpack(u"\1\u0177"), - DFA.unpack(u"\1\u0178"), - DFA.unpack(u"\1\u0179"), - DFA.unpack(u"\1\u017a"), - DFA.unpack(u"\1\u017b"), - DFA.unpack(u"\1\u017c"), - DFA.unpack(u"\1\u017d"), - DFA.unpack(u"\1\u017e"), - DFA.unpack(u"\1\u017f"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0181"), - DFA.unpack(u"\1\u0182"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0183"), - DFA.unpack(u"\1\u0184"), - DFA.unpack(u"\1\u0185"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"\1\u0187"), - DFA.unpack(u""), - DFA.unpack(u"\1\u0188"), - DFA.unpack(u"\1\u0189"), - DFA.unpack(u"\1\u018a"), - DFA.unpack(u"\1\u018b"), - DFA.unpack(u"\1\u018c"), - DFA.unpack(u"\1\u018d"), - DFA.unpack(u"\1\u018e"), - DFA.unpack(u"\1\u018f"), - DFA.unpack(u"\1\u0190"), - DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" - u"\32\76"), - DFA.unpack(u"") - ] - - # class definition for DFA #35 - - DFA35 = DFA - - + + + +# for convenience in actions +HIDDEN = BaseRecognizer.HIDDEN + +# token types +T114=114 +T115=115 +T116=116 +T117=117 +FloatTypeSuffix=16 +LETTER=11 +T29=29 +T28=28 +T27=27 +T26=26 +T25=25 +EOF=-1 +STRING_LITERAL=9 +FLOATING_POINT_LITERAL=10 +T38=38 +T37=37 +T39=39 +T34=34 +COMMENT=22 +T33=33 +T36=36 +T35=35 +T30=30 +T32=32 +T31=31 +LINE_COMMENT=23 +IntegerTypeSuffix=14 +CHARACTER_LITERAL=8 +T49=49 +T48=48 +T100=100 +T43=43 +T42=42 +T102=102 +T41=41 +T101=101 +T40=40 +T47=47 +T46=46 +T45=45 +T44=44 +T109=109 +T107=107 +T108=108 +T105=105 +WS=19 +T106=106 +T103=103 +T104=104 +T50=50 +LINE_COMMAND=24 +T59=59 +T113=113 +T52=52 +T112=112 +T51=51 +T111=111 +T54=54 +T110=110 +EscapeSequence=12 +DECIMAL_LITERAL=7 +T53=53 +T56=56 +T55=55 +T58=58 +T57=57 +T75=75 +T76=76 +T73=73 +T74=74 +T79=79 +T77=77 +T78=78 +Exponent=15 +HexDigit=13 +T72=72 +T71=71 +T70=70 +T62=62 +T63=63 +T64=64 +T65=65 +T66=66 +T67=67 +T68=68 +T69=69 +IDENTIFIER=4 +UnicodeVocabulary=21 +HEX_LITERAL=5 +T61=61 +T60=60 +T99=99 +T97=97 +BS=20 +T98=98 +T95=95 +T96=96 +OCTAL_LITERAL=6 +T94=94 +Tokens=118 +T93=93 +T92=92 +T91=91 +T90=90 +T88=88 +T89=89 +T84=84 +T85=85 +T86=86 +T87=87 +UnicodeEscape=18 +T81=81 +T80=80 +T83=83 +OctalEscape=17 +T82=82 + +class CLexer(Lexer): + + grammarFileName = "C.g" + + def __init__(self, input=None): + Lexer.__init__(self, input) + self.dfa25 = self.DFA25( + self, 25, + eot = self.DFA25_eot, + eof = self.DFA25_eof, + min = self.DFA25_min, + max = self.DFA25_max, + accept = self.DFA25_accept, + special = self.DFA25_special, + transition = self.DFA25_transition + ) + self.dfa35 = self.DFA35( + self, 35, + eot = self.DFA35_eot, + eof = self.DFA35_eof, + min = self.DFA35_min, + max = self.DFA35_max, + accept = self.DFA35_accept, + special = self.DFA35_special, + transition = self.DFA35_transition + ) + + + + + + + # $ANTLR start T25 + def mT25(self, ): + + try: + self.type = T25 + + # C.g:27:5: ( ';' ) + # C.g:27:7: ';' + self.match(u';') + + + + + + finally: + + pass + + # $ANTLR end T25 + + + + # $ANTLR start T26 + def mT26(self, ): + + try: + self.type = T26 + + # C.g:28:5: ( 'typedef' ) + # C.g:28:7: 'typedef' + self.match("typedef") + + + + + + + finally: + + pass + + # $ANTLR end T26 + + + + # $ANTLR start T27 + def mT27(self, ): + + try: + self.type = T27 + + # C.g:29:5: ( ',' ) + # C.g:29:7: ',' + self.match(u',') + + + + + + finally: + + pass + + # $ANTLR end T27 + + + + # $ANTLR start T28 + def mT28(self, ): + + try: + self.type = T28 + + # C.g:30:5: ( '=' ) + # C.g:30:7: '=' + self.match(u'=') + + + + + + finally: + + pass + + # $ANTLR end T28 + + + + # $ANTLR start T29 + def mT29(self, ): + + try: + self.type = T29 + + # C.g:31:5: ( 'extern' ) + # C.g:31:7: 'extern' + self.match("extern") + + + + + + + finally: + + pass + + # $ANTLR end T29 + + + + # $ANTLR start T30 + def mT30(self, ): + + try: + self.type = T30 + + # C.g:32:5: ( 'static' ) + # C.g:32:7: 'static' + self.match("static") + + + + + + + finally: + + pass + + # $ANTLR end T30 + + + + # $ANTLR start T31 + def mT31(self, ): + + try: + self.type = T31 + + # C.g:33:5: ( 'auto' ) + # C.g:33:7: 'auto' + self.match("auto") + + + + + + + finally: + + pass + + # $ANTLR end T31 + + + + # $ANTLR start T32 + def mT32(self, ): + + try: + self.type = T32 + + # C.g:34:5: ( 'register' ) + # C.g:34:7: 'register' + self.match("register") + + + + + + + finally: + + pass + + # $ANTLR end T32 + + + + # $ANTLR start T33 + def mT33(self, ): + + try: + self.type = T33 + + # C.g:35:5: ( 'STATIC' ) + # C.g:35:7: 'STATIC' + self.match("STATIC") + + + + + + + finally: + + pass + + # $ANTLR end T33 + + + + # $ANTLR start T34 + def mT34(self, ): + + try: + self.type = T34 + + # C.g:36:5: ( 'void' ) + # C.g:36:7: 'void' + self.match("void") + + + + + + + finally: + + pass + + # $ANTLR end T34 + + + + # $ANTLR start T35 + def mT35(self, ): + + try: + self.type = T35 + + # C.g:37:5: ( 'char' ) + # C.g:37:7: 'char' + self.match("char") + + + + + + + finally: + + pass + + # $ANTLR end T35 + + + + # $ANTLR start T36 + def mT36(self, ): + + try: + self.type = T36 + + # C.g:38:5: ( 'short' ) + # C.g:38:7: 'short' + self.match("short") + + + + + + + finally: + + pass + + # $ANTLR end T36 + + + + # $ANTLR start T37 + def mT37(self, ): + + try: + self.type = T37 + + # C.g:39:5: ( 'int' ) + # C.g:39:7: 'int' + self.match("int") + + + + + + + finally: + + pass + + # $ANTLR end T37 + + + + # $ANTLR start T38 + def mT38(self, ): + + try: + self.type = T38 + + # C.g:40:5: ( 'long' ) + # C.g:40:7: 'long' + self.match("long") + + + + + + + finally: + + pass + + # $ANTLR end T38 + + + + # $ANTLR start T39 + def mT39(self, ): + + try: + self.type = T39 + + # C.g:41:5: ( 'float' ) + # C.g:41:7: 'float' + self.match("float") + + + + + + + finally: + + pass + + # $ANTLR end T39 + + + + # $ANTLR start T40 + def mT40(self, ): + + try: + self.type = T40 + + # C.g:42:5: ( 'double' ) + # C.g:42:7: 'double' + self.match("double") + + + + + + + finally: + + pass + + # $ANTLR end T40 + + + + # $ANTLR start T41 + def mT41(self, ): + + try: + self.type = T41 + + # C.g:43:5: ( 'signed' ) + # C.g:43:7: 'signed' + self.match("signed") + + + + + + + finally: + + pass + + # $ANTLR end T41 + + + + # $ANTLR start T42 + def mT42(self, ): + + try: + self.type = T42 + + # C.g:44:5: ( 'unsigned' ) + # C.g:44:7: 'unsigned' + self.match("unsigned") + + + + + + + finally: + + pass + + # $ANTLR end T42 + + + + # $ANTLR start T43 + def mT43(self, ): + + try: + self.type = T43 + + # C.g:45:5: ( '{' ) + # C.g:45:7: '{' + self.match(u'{') + + + + + + finally: + + pass + + # $ANTLR end T43 + + + + # $ANTLR start T44 + def mT44(self, ): + + try: + self.type = T44 + + # C.g:46:5: ( '}' ) + # C.g:46:7: '}' + self.match(u'}') + + + + + + finally: + + pass + + # $ANTLR end T44 + + + + # $ANTLR start T45 + def mT45(self, ): + + try: + self.type = T45 + + # C.g:47:5: ( 'struct' ) + # C.g:47:7: 'struct' + self.match("struct") + + + + + + + finally: + + pass + + # $ANTLR end T45 + + + + # $ANTLR start T46 + def mT46(self, ): + + try: + self.type = T46 + + # C.g:48:5: ( 'union' ) + # C.g:48:7: 'union' + self.match("union") + + + + + + + finally: + + pass + + # $ANTLR end T46 + + + + # $ANTLR start T47 + def mT47(self, ): + + try: + self.type = T47 + + # C.g:49:5: ( ':' ) + # C.g:49:7: ':' + self.match(u':') + + + + + + finally: + + pass + + # $ANTLR end T47 + + + + # $ANTLR start T48 + def mT48(self, ): + + try: + self.type = T48 + + # C.g:50:5: ( 'enum' ) + # C.g:50:7: 'enum' + self.match("enum") + + + + + + + finally: + + pass + + # $ANTLR end T48 + + + + # $ANTLR start T49 + def mT49(self, ): + + try: + self.type = T49 + + # C.g:51:5: ( 'const' ) + # C.g:51:7: 'const' + self.match("const") + + + + + + + finally: + + pass + + # $ANTLR end T49 + + + + # $ANTLR start T50 + def mT50(self, ): + + try: + self.type = T50 + + # C.g:52:5: ( 'volatile' ) + # C.g:52:7: 'volatile' + self.match("volatile") + + + + + + + finally: + + pass + + # $ANTLR end T50 + + + + # $ANTLR start T51 + def mT51(self, ): + + try: + self.type = T51 + + # C.g:53:5: ( 'IN' ) + # C.g:53:7: 'IN' + self.match("IN") + + + + + + + finally: + + pass + + # $ANTLR end T51 + + + + # $ANTLR start T52 + def mT52(self, ): + + try: + self.type = T52 + + # C.g:54:5: ( 'OUT' ) + # C.g:54:7: 'OUT' + self.match("OUT") + + + + + + + finally: + + pass + + # $ANTLR end T52 + + + + # $ANTLR start T53 + def mT53(self, ): + + try: + self.type = T53 + + # C.g:55:5: ( 'OPTIONAL' ) + # C.g:55:7: 'OPTIONAL' + self.match("OPTIONAL") + + + + + + + finally: + + pass + + # $ANTLR end T53 + + + + # $ANTLR start T54 + def mT54(self, ): + + try: + self.type = T54 + + # C.g:56:5: ( 'CONST' ) + # C.g:56:7: 'CONST' + self.match("CONST") + + + + + + + finally: + + pass + + # $ANTLR end T54 + + + + # $ANTLR start T55 + def mT55(self, ): + + try: + self.type = T55 + + # C.g:57:5: ( 'UNALIGNED' ) + # C.g:57:7: 'UNALIGNED' + self.match("UNALIGNED") + + + + + + + finally: + + pass + + # $ANTLR end T55 + + + + # $ANTLR start T56 + def mT56(self, ): + + try: + self.type = T56 + + # C.g:58:5: ( 'VOLATILE' ) + # C.g:58:7: 'VOLATILE' + self.match("VOLATILE") + + + + + + + finally: + + pass + + # $ANTLR end T56 + + + + # $ANTLR start T57 + def mT57(self, ): + + try: + self.type = T57 + + # C.g:59:5: ( 'GLOBAL_REMOVE_IF_UNREFERENCED' ) + # C.g:59:7: 'GLOBAL_REMOVE_IF_UNREFERENCED' + self.match("GLOBAL_REMOVE_IF_UNREFERENCED") + + + + + + + finally: + + pass + + # $ANTLR end T57 + + + + # $ANTLR start T58 + def mT58(self, ): + + try: + self.type = T58 + + # C.g:60:5: ( 'EFIAPI' ) + # C.g:60:7: 'EFIAPI' + self.match("EFIAPI") + + + + + + + finally: + + pass + + # $ANTLR end T58 + + + + # $ANTLR start T59 + def mT59(self, ): + + try: + self.type = T59 + + # C.g:61:5: ( 'EFI_BOOTSERVICE' ) + # C.g:61:7: 'EFI_BOOTSERVICE' + self.match("EFI_BOOTSERVICE") + + + + + + + finally: + + pass + + # $ANTLR end T59 + + + + # $ANTLR start T60 + def mT60(self, ): + + try: + self.type = T60 + + # C.g:62:5: ( 'EFI_RUNTIMESERVICE' ) + # C.g:62:7: 'EFI_RUNTIMESERVICE' + self.match("EFI_RUNTIMESERVICE") + + + + + + + finally: + + pass + + # $ANTLR end T60 + + + + # $ANTLR start T61 + def mT61(self, ): + + try: + self.type = T61 + + # C.g:63:5: ( 'PACKED' ) + # C.g:63:7: 'PACKED' + self.match("PACKED") + + + + + + + finally: + + pass + + # $ANTLR end T61 + + + + # $ANTLR start T62 + def mT62(self, ): + + try: + self.type = T62 + + # C.g:64:5: ( '(' ) + # C.g:64:7: '(' + self.match(u'(') + + + + + + finally: + + pass + + # $ANTLR end T62 + + + + # $ANTLR start T63 + def mT63(self, ): + + try: + self.type = T63 + + # C.g:65:5: ( ')' ) + # C.g:65:7: ')' + self.match(u')') + + + + + + finally: + + pass + + # $ANTLR end T63 + + + + # $ANTLR start T64 + def mT64(self, ): + + try: + self.type = T64 + + # C.g:66:5: ( '[' ) + # C.g:66:7: '[' + self.match(u'[') + + + + + + finally: + + pass + + # $ANTLR end T64 + + + + # $ANTLR start T65 + def mT65(self, ): + + try: + self.type = T65 + + # C.g:67:5: ( ']' ) + # C.g:67:7: ']' + self.match(u']') + + + + + + finally: + + pass + + # $ANTLR end T65 + + + + # $ANTLR start T66 + def mT66(self, ): + + try: + self.type = T66 + + # C.g:68:5: ( '*' ) + # C.g:68:7: '*' + self.match(u'*') + + + + + + finally: + + pass + + # $ANTLR end T66 + + + + # $ANTLR start T67 + def mT67(self, ): + + try: + self.type = T67 + + # C.g:69:5: ( '...' ) + # C.g:69:7: '...' + self.match("...") + + + + + + + finally: + + pass + + # $ANTLR end T67 + + + + # $ANTLR start T68 + def mT68(self, ): + + try: + self.type = T68 + + # C.g:70:5: ( '+' ) + # C.g:70:7: '+' + self.match(u'+') + + + + + + finally: + + pass + + # $ANTLR end T68 + + + + # $ANTLR start T69 + def mT69(self, ): + + try: + self.type = T69 + + # C.g:71:5: ( '-' ) + # C.g:71:7: '-' + self.match(u'-') + + + + + + finally: + + pass + + # $ANTLR end T69 + + + + # $ANTLR start T70 + def mT70(self, ): + + try: + self.type = T70 + + # C.g:72:5: ( '/' ) + # C.g:72:7: '/' + self.match(u'/') + + + + + + finally: + + pass + + # $ANTLR end T70 + + + + # $ANTLR start T71 + def mT71(self, ): + + try: + self.type = T71 + + # C.g:73:5: ( '%' ) + # C.g:73:7: '%' + self.match(u'%') + + + + + + finally: + + pass + + # $ANTLR end T71 + + + + # $ANTLR start T72 + def mT72(self, ): + + try: + self.type = T72 + + # C.g:74:5: ( '++' ) + # C.g:74:7: '++' + self.match("++") + + + + + + + finally: + + pass + + # $ANTLR end T72 + + + + # $ANTLR start T73 + def mT73(self, ): + + try: + self.type = T73 + + # C.g:75:5: ( '--' ) + # C.g:75:7: '--' + self.match("--") + + + + + + + finally: + + pass + + # $ANTLR end T73 + + + + # $ANTLR start T74 + def mT74(self, ): + + try: + self.type = T74 + + # C.g:76:5: ( 'sizeof' ) + # C.g:76:7: 'sizeof' + self.match("sizeof") + + + + + + + finally: + + pass + + # $ANTLR end T74 + + + + # $ANTLR start T75 + def mT75(self, ): + + try: + self.type = T75 + + # C.g:77:5: ( '.' ) + # C.g:77:7: '.' + self.match(u'.') + + + + + + finally: + + pass + + # $ANTLR end T75 + + + + # $ANTLR start T76 + def mT76(self, ): + + try: + self.type = T76 + + # C.g:78:5: ( '->' ) + # C.g:78:7: '->' + self.match("->") + + + + + + + finally: + + pass + + # $ANTLR end T76 + + + + # $ANTLR start T77 + def mT77(self, ): + + try: + self.type = T77 + + # C.g:79:5: ( '&' ) + # C.g:79:7: '&' + self.match(u'&') + + + + + + finally: + + pass + + # $ANTLR end T77 + + + + # $ANTLR start T78 + def mT78(self, ): + + try: + self.type = T78 + + # C.g:80:5: ( '~' ) + # C.g:80:7: '~' + self.match(u'~') + + + + + + finally: + + pass + + # $ANTLR end T78 + + + + # $ANTLR start T79 + def mT79(self, ): + + try: + self.type = T79 + + # C.g:81:5: ( '!' ) + # C.g:81:7: '!' + self.match(u'!') + + + + + + finally: + + pass + + # $ANTLR end T79 + + + + # $ANTLR start T80 + def mT80(self, ): + + try: + self.type = T80 + + # C.g:82:5: ( '*=' ) + # C.g:82:7: '*=' + self.match("*=") + + + + + + + finally: + + pass + + # $ANTLR end T80 + + + + # $ANTLR start T81 + def mT81(self, ): + + try: + self.type = T81 + + # C.g:83:5: ( '/=' ) + # C.g:83:7: '/=' + self.match("/=") + + + + + + + finally: + + pass + + # $ANTLR end T81 + + + + # $ANTLR start T82 + def mT82(self, ): + + try: + self.type = T82 + + # C.g:84:5: ( '%=' ) + # C.g:84:7: '%=' + self.match("%=") + + + + + + + finally: + + pass + + # $ANTLR end T82 + + + + # $ANTLR start T83 + def mT83(self, ): + + try: + self.type = T83 + + # C.g:85:5: ( '+=' ) + # C.g:85:7: '+=' + self.match("+=") + + + + + + + finally: + + pass + + # $ANTLR end T83 + + + + # $ANTLR start T84 + def mT84(self, ): + + try: + self.type = T84 + + # C.g:86:5: ( '-=' ) + # C.g:86:7: '-=' + self.match("-=") + + + + + + + finally: + + pass + + # $ANTLR end T84 + + + + # $ANTLR start T85 + def mT85(self, ): + + try: + self.type = T85 + + # C.g:87:5: ( '<<=' ) + # C.g:87:7: '<<=' + self.match("<<=") + + + + + + + finally: + + pass + + # $ANTLR end T85 + + + + # $ANTLR start T86 + def mT86(self, ): + + try: + self.type = T86 + + # C.g:88:5: ( '>>=' ) + # C.g:88:7: '>>=' + self.match(">>=") + + + + + + + finally: + + pass + + # $ANTLR end T86 + + + + # $ANTLR start T87 + def mT87(self, ): + + try: + self.type = T87 + + # C.g:89:5: ( '&=' ) + # C.g:89:7: '&=' + self.match("&=") + + + + + + + finally: + + pass + + # $ANTLR end T87 + + + + # $ANTLR start T88 + def mT88(self, ): + + try: + self.type = T88 + + # C.g:90:5: ( '^=' ) + # C.g:90:7: '^=' + self.match("^=") + + + + + + + finally: + + pass + + # $ANTLR end T88 + + + + # $ANTLR start T89 + def mT89(self, ): + + try: + self.type = T89 + + # C.g:91:5: ( '|=' ) + # C.g:91:7: '|=' + self.match("|=") + + + + + + + finally: + + pass + + # $ANTLR end T89 + + + + # $ANTLR start T90 + def mT90(self, ): + + try: + self.type = T90 + + # C.g:92:5: ( '?' ) + # C.g:92:7: '?' + self.match(u'?') + + + + + + finally: + + pass + + # $ANTLR end T90 + + + + # $ANTLR start T91 + def mT91(self, ): + + try: + self.type = T91 + + # C.g:93:5: ( '||' ) + # C.g:93:7: '||' + self.match("||") + + + + + + + finally: + + pass + + # $ANTLR end T91 + + + + # $ANTLR start T92 + def mT92(self, ): + + try: + self.type = T92 + + # C.g:94:5: ( '&&' ) + # C.g:94:7: '&&' + self.match("&&") + + + + + + + finally: + + pass + + # $ANTLR end T92 + + + + # $ANTLR start T93 + def mT93(self, ): + + try: + self.type = T93 + + # C.g:95:5: ( '|' ) + # C.g:95:7: '|' + self.match(u'|') + + + + + + finally: + + pass + + # $ANTLR end T93 + + + + # $ANTLR start T94 + def mT94(self, ): + + try: + self.type = T94 + + # C.g:96:5: ( '^' ) + # C.g:96:7: '^' + self.match(u'^') + + + + + + finally: + + pass + + # $ANTLR end T94 + + + + # $ANTLR start T95 + def mT95(self, ): + + try: + self.type = T95 + + # C.g:97:5: ( '==' ) + # C.g:97:7: '==' + self.match("==") + + + + + + + finally: + + pass + + # $ANTLR end T95 + + + + # $ANTLR start T96 + def mT96(self, ): + + try: + self.type = T96 + + # C.g:98:5: ( '!=' ) + # C.g:98:7: '!=' + self.match("!=") + + + + + + + finally: + + pass + + # $ANTLR end T96 + + + + # $ANTLR start T97 + def mT97(self, ): + + try: + self.type = T97 + + # C.g:99:5: ( '<' ) + # C.g:99:7: '<' + self.match(u'<') + + + + + + finally: + + pass + + # $ANTLR end T97 + + + + # $ANTLR start T98 + def mT98(self, ): + + try: + self.type = T98 + + # C.g:100:5: ( '>' ) + # C.g:100:7: '>' + self.match(u'>') + + + + + + finally: + + pass + + # $ANTLR end T98 + + + + # $ANTLR start T99 + def mT99(self, ): + + try: + self.type = T99 + + # C.g:101:5: ( '<=' ) + # C.g:101:7: '<=' + self.match("<=") + + + + + + + finally: + + pass + + # $ANTLR end T99 + + + + # $ANTLR start T100 + def mT100(self, ): + + try: + self.type = T100 + + # C.g:102:6: ( '>=' ) + # C.g:102:8: '>=' + self.match(">=") + + + + + + + finally: + + pass + + # $ANTLR end T100 + + + + # $ANTLR start T101 + def mT101(self, ): + + try: + self.type = T101 + + # C.g:103:6: ( '<<' ) + # C.g:103:8: '<<' + self.match("<<") + + + + + + + finally: + + pass + + # $ANTLR end T101 + + + + # $ANTLR start T102 + def mT102(self, ): + + try: + self.type = T102 + + # C.g:104:6: ( '>>' ) + # C.g:104:8: '>>' + self.match(">>") + + + + + + + finally: + + pass + + # $ANTLR end T102 + + + + # $ANTLR start T103 + def mT103(self, ): + + try: + self.type = T103 + + # C.g:105:6: ( '__asm__' ) + # C.g:105:8: '__asm__' + self.match("__asm__") + + + + + + + finally: + + pass + + # $ANTLR end T103 + + + + # $ANTLR start T104 + def mT104(self, ): + + try: + self.type = T104 + + # C.g:106:6: ( '_asm' ) + # C.g:106:8: '_asm' + self.match("_asm") + + + + + + + finally: + + pass + + # $ANTLR end T104 + + + + # $ANTLR start T105 + def mT105(self, ): + + try: + self.type = T105 + + # C.g:107:6: ( '__asm' ) + # C.g:107:8: '__asm' + self.match("__asm") + + + + + + + finally: + + pass + + # $ANTLR end T105 + + + + # $ANTLR start T106 + def mT106(self, ): + + try: + self.type = T106 + + # C.g:108:6: ( 'case' ) + # C.g:108:8: 'case' + self.match("case") + + + + + + + finally: + + pass + + # $ANTLR end T106 + + + + # $ANTLR start T107 + def mT107(self, ): + + try: + self.type = T107 + + # C.g:109:6: ( 'default' ) + # C.g:109:8: 'default' + self.match("default") + + + + + + + finally: + + pass + + # $ANTLR end T107 + + + + # $ANTLR start T108 + def mT108(self, ): + + try: + self.type = T108 + + # C.g:110:6: ( 'if' ) + # C.g:110:8: 'if' + self.match("if") + + + + + + + finally: + + pass + + # $ANTLR end T108 + + + + # $ANTLR start T109 + def mT109(self, ): + + try: + self.type = T109 + + # C.g:111:6: ( 'else' ) + # C.g:111:8: 'else' + self.match("else") + + + + + + + finally: + + pass + + # $ANTLR end T109 + + + + # $ANTLR start T110 + def mT110(self, ): + + try: + self.type = T110 + + # C.g:112:6: ( 'switch' ) + # C.g:112:8: 'switch' + self.match("switch") + + + + + + + finally: + + pass + + # $ANTLR end T110 + + + + # $ANTLR start T111 + def mT111(self, ): + + try: + self.type = T111 + + # C.g:113:6: ( 'while' ) + # C.g:113:8: 'while' + self.match("while") + + + + + + + finally: + + pass + + # $ANTLR end T111 + + + + # $ANTLR start T112 + def mT112(self, ): + + try: + self.type = T112 + + # C.g:114:6: ( 'do' ) + # C.g:114:8: 'do' + self.match("do") + + + + + + + finally: + + pass + + # $ANTLR end T112 + + + + # $ANTLR start T113 + def mT113(self, ): + + try: + self.type = T113 + + # C.g:115:6: ( 'for' ) + # C.g:115:8: 'for' + self.match("for") + + + + + + + finally: + + pass + + # $ANTLR end T113 + + + + # $ANTLR start T114 + def mT114(self, ): + + try: + self.type = T114 + + # C.g:116:6: ( 'goto' ) + # C.g:116:8: 'goto' + self.match("goto") + + + + + + + finally: + + pass + + # $ANTLR end T114 + + + + # $ANTLR start T115 + def mT115(self, ): + + try: + self.type = T115 + + # C.g:117:6: ( 'continue' ) + # C.g:117:8: 'continue' + self.match("continue") + + + + + + + finally: + + pass + + # $ANTLR end T115 + + + + # $ANTLR start T116 + def mT116(self, ): + + try: + self.type = T116 + + # C.g:118:6: ( 'break' ) + # C.g:118:8: 'break' + self.match("break") + + + + + + + finally: + + pass + + # $ANTLR end T116 + + + + # $ANTLR start T117 + def mT117(self, ): + + try: + self.type = T117 + + # C.g:119:6: ( 'return' ) + # C.g:119:8: 'return' + self.match("return") + + + + + + + finally: + + pass + + # $ANTLR end T117 + + + + # $ANTLR start IDENTIFIER + def mIDENTIFIER(self, ): + + try: + self.type = IDENTIFIER + + # C.g:586:2: ( LETTER ( LETTER | '0' .. '9' )* ) + # C.g:586:4: LETTER ( LETTER | '0' .. '9' )* + self.mLETTER() + + # C.g:586:11: ( LETTER | '0' .. '9' )* + while True: #loop1 + alt1 = 2 + LA1_0 = self.input.LA(1) + + if (LA1_0 == u'$' or (u'0' <= LA1_0 <= u'9') or (u'A' <= LA1_0 <= u'Z') or LA1_0 == u'_' or (u'a' <= LA1_0 <= u'z')) : + alt1 = 1 + + + if alt1 == 1: + # C.g: + if self.input.LA(1) == u'$' or (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop1 + + + + + + + finally: + + pass + + # $ANTLR end IDENTIFIER + + + + # $ANTLR start LETTER + def mLETTER(self, ): + + try: + # C.g:591:2: ( '$' | 'A' .. 'Z' | 'a' .. 'z' | '_' ) + # C.g: + if self.input.LA(1) == u'$' or (u'A' <= self.input.LA(1) <= u'Z') or self.input.LA(1) == u'_' or (u'a' <= self.input.LA(1) <= u'z'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end LETTER + + + + # $ANTLR start CHARACTER_LITERAL + def mCHARACTER_LITERAL(self, ): + + try: + self.type = CHARACTER_LITERAL + + # C.g:598:5: ( ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' ) + # C.g:598:9: ( 'L' )? '\\'' ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) '\\'' + # C.g:598:9: ( 'L' )? + alt2 = 2 + LA2_0 = self.input.LA(1) + + if (LA2_0 == u'L') : + alt2 = 1 + if alt2 == 1: + # C.g:598:10: 'L' + self.match(u'L') + + + + + self.match(u'\'') + + # C.g:598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) ) + alt3 = 2 + LA3_0 = self.input.LA(1) + + if (LA3_0 == u'\\') : + alt3 = 1 + elif ((u'\u0000' <= LA3_0 <= u'&') or (u'(' <= LA3_0 <= u'[') or (u']' <= LA3_0 <= u'\uFFFE')) : + alt3 = 2 + else: + nvae = NoViableAltException("598:21: ( EscapeSequence | ~ ( '\\'' | '\\\\' ) )", 3, 0, self.input) + + raise nvae + + if alt3 == 1: + # C.g:598:23: EscapeSequence + self.mEscapeSequence() + + + + elif alt3 == 2: + # C.g:598:40: ~ ( '\\'' | '\\\\' ) + if (u'\u0000' <= self.input.LA(1) <= u'&') or (u'(' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + self.match(u'\'') + + + + + + finally: + + pass + + # $ANTLR end CHARACTER_LITERAL + + + + # $ANTLR start STRING_LITERAL + def mSTRING_LITERAL(self, ): + + try: + self.type = STRING_LITERAL + + # C.g:602:5: ( ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) + # C.g:602:8: ( 'L' )? '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' + # C.g:602:8: ( 'L' )? + alt4 = 2 + LA4_0 = self.input.LA(1) + + if (LA4_0 == u'L') : + alt4 = 1 + if alt4 == 1: + # C.g:602:9: 'L' + self.match(u'L') + + + + + self.match(u'"') + + # C.g:602:19: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* + while True: #loop5 + alt5 = 3 + LA5_0 = self.input.LA(1) + + if (LA5_0 == u'\\') : + alt5 = 1 + elif ((u'\u0000' <= LA5_0 <= u'!') or (u'#' <= LA5_0 <= u'[') or (u']' <= LA5_0 <= u'\uFFFE')) : + alt5 = 2 + + + if alt5 == 1: + # C.g:602:21: EscapeSequence + self.mEscapeSequence() + + + + elif alt5 == 2: + # C.g:602:38: ~ ( '\\\\' | '\"' ) + if (u'\u0000' <= self.input.LA(1) <= u'!') or (u'#' <= self.input.LA(1) <= u'[') or (u']' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop5 + + + self.match(u'"') + + + + + + finally: + + pass + + # $ANTLR end STRING_LITERAL + + + + # $ANTLR start HEX_LITERAL + def mHEX_LITERAL(self, ): + + try: + self.type = HEX_LITERAL + + # C.g:605:13: ( '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? ) + # C.g:605:15: '0' ( 'x' | 'X' ) ( HexDigit )+ ( IntegerTypeSuffix )? + self.match(u'0') + + if self.input.LA(1) == u'X' or self.input.LA(1) == u'x': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + # C.g:605:29: ( HexDigit )+ + cnt6 = 0 + while True: #loop6 + alt6 = 2 + LA6_0 = self.input.LA(1) + + if ((u'0' <= LA6_0 <= u'9') or (u'A' <= LA6_0 <= u'F') or (u'a' <= LA6_0 <= u'f')) : + alt6 = 1 + + + if alt6 == 1: + # C.g:605:29: HexDigit + self.mHexDigit() + + + + else: + if cnt6 >= 1: + break #loop6 + + eee = EarlyExitException(6, self.input) + raise eee + + cnt6 += 1 + + + # C.g:605:39: ( IntegerTypeSuffix )? + alt7 = 2 + LA7_0 = self.input.LA(1) + + if (LA7_0 == u'L' or LA7_0 == u'U' or LA7_0 == u'l' or LA7_0 == u'u') : + alt7 = 1 + if alt7 == 1: + # C.g:605:39: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end HEX_LITERAL + + + + # $ANTLR start DECIMAL_LITERAL + def mDECIMAL_LITERAL(self, ): + + try: + self.type = DECIMAL_LITERAL + + # C.g:607:17: ( ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? ) + # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) ( IntegerTypeSuffix )? + # C.g:607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* ) + alt9 = 2 + LA9_0 = self.input.LA(1) + + if (LA9_0 == u'0') : + alt9 = 1 + elif ((u'1' <= LA9_0 <= u'9')) : + alt9 = 2 + else: + nvae = NoViableAltException("607:19: ( '0' | '1' .. '9' ( '0' .. '9' )* )", 9, 0, self.input) + + raise nvae + + if alt9 == 1: + # C.g:607:20: '0' + self.match(u'0') + + + + elif alt9 == 2: + # C.g:607:26: '1' .. '9' ( '0' .. '9' )* + self.matchRange(u'1', u'9') + + # C.g:607:35: ( '0' .. '9' )* + while True: #loop8 + alt8 = 2 + LA8_0 = self.input.LA(1) + + if ((u'0' <= LA8_0 <= u'9')) : + alt8 = 1 + + + if alt8 == 1: + # C.g:607:35: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + break #loop8 + + + + + + # C.g:607:46: ( IntegerTypeSuffix )? + alt10 = 2 + LA10_0 = self.input.LA(1) + + if (LA10_0 == u'L' or LA10_0 == u'U' or LA10_0 == u'l' or LA10_0 == u'u') : + alt10 = 1 + if alt10 == 1: + # C.g:607:46: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end DECIMAL_LITERAL + + + + # $ANTLR start OCTAL_LITERAL + def mOCTAL_LITERAL(self, ): + + try: + self.type = OCTAL_LITERAL + + # C.g:609:15: ( '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? ) + # C.g:609:17: '0' ( '0' .. '7' )+ ( IntegerTypeSuffix )? + self.match(u'0') + + # C.g:609:21: ( '0' .. '7' )+ + cnt11 = 0 + while True: #loop11 + alt11 = 2 + LA11_0 = self.input.LA(1) + + if ((u'0' <= LA11_0 <= u'7')) : + alt11 = 1 + + + if alt11 == 1: + # C.g:609:22: '0' .. '7' + self.matchRange(u'0', u'7') + + + + else: + if cnt11 >= 1: + break #loop11 + + eee = EarlyExitException(11, self.input) + raise eee + + cnt11 += 1 + + + # C.g:609:33: ( IntegerTypeSuffix )? + alt12 = 2 + LA12_0 = self.input.LA(1) + + if (LA12_0 == u'L' or LA12_0 == u'U' or LA12_0 == u'l' or LA12_0 == u'u') : + alt12 = 1 + if alt12 == 1: + # C.g:609:33: IntegerTypeSuffix + self.mIntegerTypeSuffix() + + + + + + + + + finally: + + pass + + # $ANTLR end OCTAL_LITERAL + + + + # $ANTLR start HexDigit + def mHexDigit(self, ): + + try: + # C.g:612:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) ) + # C.g:612:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) + if (u'0' <= self.input.LA(1) <= u'9') or (u'A' <= self.input.LA(1) <= u'F') or (u'a' <= self.input.LA(1) <= u'f'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end HexDigit + + + + # $ANTLR start IntegerTypeSuffix + def mIntegerTypeSuffix(self, ): + + try: + # C.g:616:2: ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) ) + alt13 = 4 + LA13_0 = self.input.LA(1) + + if (LA13_0 == u'U' or LA13_0 == u'u') : + LA13_1 = self.input.LA(2) + + if (LA13_1 == u'L' or LA13_1 == u'l') : + LA13_3 = self.input.LA(3) + + if (LA13_3 == u'L' or LA13_3 == u'l') : + alt13 = 4 + else: + alt13 = 3 + else: + alt13 = 1 + elif (LA13_0 == u'L' or LA13_0 == u'l') : + alt13 = 2 + else: + nvae = NoViableAltException("614:1: fragment IntegerTypeSuffix : ( ( 'u' | 'U' ) | ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) | ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) );", 13, 0, self.input) + + raise nvae + + if alt13 == 1: + # C.g:616:4: ( 'u' | 'U' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 2: + # C.g:617:4: ( 'l' | 'L' ) + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 3: + # C.g:618:4: ( 'u' | 'U' ) ( 'l' | 'L' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt13 == 4: + # C.g:619:4: ( 'u' | 'U' ) ( 'l' | 'L' ) ( 'l' | 'L' ) + if self.input.LA(1) == u'U' or self.input.LA(1) == u'u': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + if self.input.LA(1) == u'L' or self.input.LA(1) == u'l': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + finally: + + pass + + # $ANTLR end IntegerTypeSuffix + + + + # $ANTLR start FLOATING_POINT_LITERAL + def mFLOATING_POINT_LITERAL(self, ): + + try: + self.type = FLOATING_POINT_LITERAL + + # C.g:623:5: ( ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? | '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? | ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? | ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix ) + alt25 = 4 + alt25 = self.dfa25.predict(self.input) + if alt25 == 1: + # C.g:623:9: ( '0' .. '9' )+ '.' ( '0' .. '9' )* ( Exponent )? ( FloatTypeSuffix )? + # C.g:623:9: ( '0' .. '9' )+ + cnt14 = 0 + while True: #loop14 + alt14 = 2 + LA14_0 = self.input.LA(1) + + if ((u'0' <= LA14_0 <= u'9')) : + alt14 = 1 + + + if alt14 == 1: + # C.g:623:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt14 >= 1: + break #loop14 + + eee = EarlyExitException(14, self.input) + raise eee + + cnt14 += 1 + + + self.match(u'.') + + # C.g:623:25: ( '0' .. '9' )* + while True: #loop15 + alt15 = 2 + LA15_0 = self.input.LA(1) + + if ((u'0' <= LA15_0 <= u'9')) : + alt15 = 1 + + + if alt15 == 1: + # C.g:623:26: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + break #loop15 + + + # C.g:623:37: ( Exponent )? + alt16 = 2 + LA16_0 = self.input.LA(1) + + if (LA16_0 == u'E' or LA16_0 == u'e') : + alt16 = 1 + if alt16 == 1: + # C.g:623:37: Exponent + self.mExponent() + + + + + # C.g:623:47: ( FloatTypeSuffix )? + alt17 = 2 + LA17_0 = self.input.LA(1) + + if (LA17_0 == u'D' or LA17_0 == u'F' or LA17_0 == u'd' or LA17_0 == u'f') : + alt17 = 1 + if alt17 == 1: + # C.g:623:47: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 2: + # C.g:624:9: '.' ( '0' .. '9' )+ ( Exponent )? ( FloatTypeSuffix )? + self.match(u'.') + + # C.g:624:13: ( '0' .. '9' )+ + cnt18 = 0 + while True: #loop18 + alt18 = 2 + LA18_0 = self.input.LA(1) + + if ((u'0' <= LA18_0 <= u'9')) : + alt18 = 1 + + + if alt18 == 1: + # C.g:624:14: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt18 >= 1: + break #loop18 + + eee = EarlyExitException(18, self.input) + raise eee + + cnt18 += 1 + + + # C.g:624:25: ( Exponent )? + alt19 = 2 + LA19_0 = self.input.LA(1) + + if (LA19_0 == u'E' or LA19_0 == u'e') : + alt19 = 1 + if alt19 == 1: + # C.g:624:25: Exponent + self.mExponent() + + + + + # C.g:624:35: ( FloatTypeSuffix )? + alt20 = 2 + LA20_0 = self.input.LA(1) + + if (LA20_0 == u'D' or LA20_0 == u'F' or LA20_0 == u'd' or LA20_0 == u'f') : + alt20 = 1 + if alt20 == 1: + # C.g:624:35: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 3: + # C.g:625:9: ( '0' .. '9' )+ Exponent ( FloatTypeSuffix )? + # C.g:625:9: ( '0' .. '9' )+ + cnt21 = 0 + while True: #loop21 + alt21 = 2 + LA21_0 = self.input.LA(1) + + if ((u'0' <= LA21_0 <= u'9')) : + alt21 = 1 + + + if alt21 == 1: + # C.g:625:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt21 >= 1: + break #loop21 + + eee = EarlyExitException(21, self.input) + raise eee + + cnt21 += 1 + + + self.mExponent() + + # C.g:625:30: ( FloatTypeSuffix )? + alt22 = 2 + LA22_0 = self.input.LA(1) + + if (LA22_0 == u'D' or LA22_0 == u'F' or LA22_0 == u'd' or LA22_0 == u'f') : + alt22 = 1 + if alt22 == 1: + # C.g:625:30: FloatTypeSuffix + self.mFloatTypeSuffix() + + + + + + + elif alt25 == 4: + # C.g:626:9: ( '0' .. '9' )+ ( Exponent )? FloatTypeSuffix + # C.g:626:9: ( '0' .. '9' )+ + cnt23 = 0 + while True: #loop23 + alt23 = 2 + LA23_0 = self.input.LA(1) + + if ((u'0' <= LA23_0 <= u'9')) : + alt23 = 1 + + + if alt23 == 1: + # C.g:626:10: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt23 >= 1: + break #loop23 + + eee = EarlyExitException(23, self.input) + raise eee + + cnt23 += 1 + + + # C.g:626:21: ( Exponent )? + alt24 = 2 + LA24_0 = self.input.LA(1) + + if (LA24_0 == u'E' or LA24_0 == u'e') : + alt24 = 1 + if alt24 == 1: + # C.g:626:21: Exponent + self.mExponent() + + + + + self.mFloatTypeSuffix() + + + + + finally: + + pass + + # $ANTLR end FLOATING_POINT_LITERAL + + + + # $ANTLR start Exponent + def mExponent(self, ): + + try: + # C.g:630:10: ( ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ ) + # C.g:630:12: ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ + if self.input.LA(1) == u'E' or self.input.LA(1) == u'e': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + # C.g:630:22: ( '+' | '-' )? + alt26 = 2 + LA26_0 = self.input.LA(1) + + if (LA26_0 == u'+' or LA26_0 == u'-') : + alt26 = 1 + if alt26 == 1: + # C.g: + if self.input.LA(1) == u'+' or self.input.LA(1) == u'-': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + # C.g:630:33: ( '0' .. '9' )+ + cnt27 = 0 + while True: #loop27 + alt27 = 2 + LA27_0 = self.input.LA(1) + + if ((u'0' <= LA27_0 <= u'9')) : + alt27 = 1 + + + if alt27 == 1: + # C.g:630:34: '0' .. '9' + self.matchRange(u'0', u'9') + + + + else: + if cnt27 >= 1: + break #loop27 + + eee = EarlyExitException(27, self.input) + raise eee + + cnt27 += 1 + + + + + + + finally: + + pass + + # $ANTLR end Exponent + + + + # $ANTLR start FloatTypeSuffix + def mFloatTypeSuffix(self, ): + + try: + # C.g:633:17: ( ( 'f' | 'F' | 'd' | 'D' ) ) + # C.g:633:19: ( 'f' | 'F' | 'd' | 'D' ) + if self.input.LA(1) == u'D' or self.input.LA(1) == u'F' or self.input.LA(1) == u'd' or self.input.LA(1) == u'f': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + + + finally: + + pass + + # $ANTLR end FloatTypeSuffix + + + + # $ANTLR start EscapeSequence + def mEscapeSequence(self, ): + + try: + # C.g:637:5: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape ) + alt28 = 2 + LA28_0 = self.input.LA(1) + + if (LA28_0 == u'\\') : + LA28_1 = self.input.LA(2) + + if (LA28_1 == u'"' or LA28_1 == u'\'' or LA28_1 == u'\\' or LA28_1 == u'b' or LA28_1 == u'f' or LA28_1 == u'n' or LA28_1 == u'r' or LA28_1 == u't') : + alt28 = 1 + elif ((u'0' <= LA28_1 <= u'7')) : + alt28 = 2 + else: + nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 1, self.input) + + raise nvae + + else: + nvae = NoViableAltException("635:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) | OctalEscape );", 28, 0, self.input) + + raise nvae + + if alt28 == 1: + # C.g:637:8: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' ) + self.match(u'\\') + + if self.input.LA(1) == u'"' or self.input.LA(1) == u'\'' or self.input.LA(1) == u'\\' or self.input.LA(1) == u'b' or self.input.LA(1) == u'f' or self.input.LA(1) == u'n' or self.input.LA(1) == u'r' or self.input.LA(1) == u't': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + elif alt28 == 2: + # C.g:638:9: OctalEscape + self.mOctalEscape() + + + + + finally: + + pass + + # $ANTLR end EscapeSequence + + + + # $ANTLR start OctalEscape + def mOctalEscape(self, ): + + try: + # C.g:643:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ) + alt29 = 3 + LA29_0 = self.input.LA(1) + + if (LA29_0 == u'\\') : + LA29_1 = self.input.LA(2) + + if ((u'0' <= LA29_1 <= u'3')) : + LA29_2 = self.input.LA(3) + + if ((u'0' <= LA29_2 <= u'7')) : + LA29_4 = self.input.LA(4) + + if ((u'0' <= LA29_4 <= u'7')) : + alt29 = 1 + else: + alt29 = 2 + else: + alt29 = 3 + elif ((u'4' <= LA29_1 <= u'7')) : + LA29_3 = self.input.LA(3) + + if ((u'0' <= LA29_3 <= u'7')) : + alt29 = 2 + else: + alt29 = 3 + else: + nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 1, self.input) + + raise nvae + + else: + nvae = NoViableAltException("641:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 29, 0, self.input) + + raise nvae + + if alt29 == 1: + # C.g:643:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) + self.match(u'\\') + + # C.g:643:14: ( '0' .. '3' ) + # C.g:643:15: '0' .. '3' + self.matchRange(u'0', u'3') + + + + + # C.g:643:25: ( '0' .. '7' ) + # C.g:643:26: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + # C.g:643:36: ( '0' .. '7' ) + # C.g:643:37: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + elif alt29 == 2: + # C.g:644:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) + self.match(u'\\') + + # C.g:644:14: ( '0' .. '7' ) + # C.g:644:15: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + # C.g:644:25: ( '0' .. '7' ) + # C.g:644:26: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + elif alt29 == 3: + # C.g:645:9: '\\\\' ( '0' .. '7' ) + self.match(u'\\') + + # C.g:645:14: ( '0' .. '7' ) + # C.g:645:15: '0' .. '7' + self.matchRange(u'0', u'7') + + + + + + + + finally: + + pass + + # $ANTLR end OctalEscape + + + + # $ANTLR start UnicodeEscape + def mUnicodeEscape(self, ): + + try: + # C.g:650:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit ) + # C.g:650:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit + self.match(u'\\') + + self.match(u'u') + + self.mHexDigit() + + self.mHexDigit() + + self.mHexDigit() + + self.mHexDigit() + + + + + + finally: + + pass + + # $ANTLR end UnicodeEscape + + + + # $ANTLR start WS + def mWS(self, ): + + try: + self.type = WS + + # C.g:653:5: ( ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) ) + # C.g:653:8: ( ' ' | '\\r' | '\\t' | '\\u000C' | '\\n' ) + if (u'\t' <= self.input.LA(1) <= u'\n') or (u'\f' <= self.input.LA(1) <= u'\r') or self.input.LA(1) == u' ': + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end WS + + + + # $ANTLR start BS + def mBS(self, ): + + try: + self.type = BS + + # C.g:657:5: ( ( '\\\\' ) ) + # C.g:657:7: ( '\\\\' ) + # C.g:657:7: ( '\\\\' ) + # C.g:657:8: '\\\\' + self.match(u'\\') + + + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end BS + + + + # $ANTLR start UnicodeVocabulary + def mUnicodeVocabulary(self, ): + + try: + self.type = UnicodeVocabulary + + # C.g:665:5: ( '\\u0003' .. '\\uFFFE' ) + # C.g:665:7: '\\u0003' .. '\\uFFFE' + self.matchRange(u'\u0003', u'\uFFFE') + + + + + + finally: + + pass + + # $ANTLR end UnicodeVocabulary + + + + # $ANTLR start COMMENT + def mCOMMENT(self, ): + + try: + self.type = COMMENT + + # C.g:668:5: ( '/*' ( options {greedy=false; } : . )* '*/' ) + # C.g:668:9: '/*' ( options {greedy=false; } : . )* '*/' + self.match("/*") + + + # C.g:668:14: ( options {greedy=false; } : . )* + while True: #loop30 + alt30 = 2 + LA30_0 = self.input.LA(1) + + if (LA30_0 == u'*') : + LA30_1 = self.input.LA(2) + + if (LA30_1 == u'/') : + alt30 = 2 + elif ((u'\u0000' <= LA30_1 <= u'.') or (u'0' <= LA30_1 <= u'\uFFFE')) : + alt30 = 1 + + + elif ((u'\u0000' <= LA30_0 <= u')') or (u'+' <= LA30_0 <= u'\uFFFE')) : + alt30 = 1 + + + if alt30 == 1: + # C.g:668:42: . + self.matchAny() + + + + else: + break #loop30 + + + self.match("*/") + + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end COMMENT + + + + # $ANTLR start LINE_COMMENT + def mLINE_COMMENT(self, ): + + try: + self.type = LINE_COMMENT + + # C.g:673:5: ( '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) + # C.g:673:7: '//' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' + self.match("//") + + + # C.g:673:12: (~ ( '\\n' | '\\r' ) )* + while True: #loop31 + alt31 = 2 + LA31_0 = self.input.LA(1) + + if ((u'\u0000' <= LA31_0 <= u'\t') or (u'\u000B' <= LA31_0 <= u'\f') or (u'\u000E' <= LA31_0 <= u'\uFFFE')) : + alt31 = 1 + + + if alt31 == 1: + # C.g:673:12: ~ ( '\\n' | '\\r' ) + if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop31 + + + # C.g:673:26: ( '\\r' )? + alt32 = 2 + LA32_0 = self.input.LA(1) + + if (LA32_0 == u'\r') : + alt32 = 1 + if alt32 == 1: + # C.g:673:26: '\\r' + self.match(u'\r') + + + + + self.match(u'\n') + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end LINE_COMMENT + + + + # $ANTLR start LINE_COMMAND + def mLINE_COMMAND(self, ): + + try: + self.type = LINE_COMMAND + + # C.g:678:5: ( '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' ) + # C.g:678:7: '#' (~ ( '\\n' | '\\r' ) )* ( '\\r' )? '\\n' + self.match(u'#') + + # C.g:678:11: (~ ( '\\n' | '\\r' ) )* + while True: #loop33 + alt33 = 2 + LA33_0 = self.input.LA(1) + + if ((u'\u0000' <= LA33_0 <= u'\t') or (u'\u000B' <= LA33_0 <= u'\f') or (u'\u000E' <= LA33_0 <= u'\uFFFE')) : + alt33 = 1 + + + if alt33 == 1: + # C.g:678:11: ~ ( '\\n' | '\\r' ) + if (u'\u0000' <= self.input.LA(1) <= u'\t') or (u'\u000B' <= self.input.LA(1) <= u'\f') or (u'\u000E' <= self.input.LA(1) <= u'\uFFFE'): + self.input.consume(); + + else: + mse = MismatchedSetException(None, self.input) + self.recover(mse) + raise mse + + + + + else: + break #loop33 + + + # C.g:678:25: ( '\\r' )? + alt34 = 2 + LA34_0 = self.input.LA(1) + + if (LA34_0 == u'\r') : + alt34 = 1 + if alt34 == 1: + # C.g:678:25: '\\r' + self.match(u'\r') + + + + + self.match(u'\n') + + #action start + self.channel=HIDDEN; + #action end + + + + + finally: + + pass + + # $ANTLR end LINE_COMMAND + + + + def mTokens(self): + # C.g:1:8: ( T25 | T26 | T27 | T28 | T29 | T30 | T31 | T32 | T33 | T34 | T35 | T36 | T37 | T38 | T39 | T40 | T41 | T42 | T43 | T44 | T45 | T46 | T47 | T48 | T49 | T50 | T51 | T52 | T53 | T54 | T55 | T56 | T57 | T58 | T59 | T60 | T61 | T62 | T63 | T64 | T65 | T66 | T67 | T68 | T69 | T70 | T71 | T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | T84 | T85 | T86 | T87 | T88 | T89 | T90 | T91 | T92 | T93 | T94 | T95 | T96 | T97 | T98 | T99 | T100 | T101 | T102 | T103 | T104 | T105 | T106 | T107 | T108 | T109 | T110 | T111 | T112 | T113 | T114 | T115 | T116 | T117 | IDENTIFIER | CHARACTER_LITERAL | STRING_LITERAL | HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL | FLOATING_POINT_LITERAL | WS | BS | UnicodeVocabulary | COMMENT | LINE_COMMENT | LINE_COMMAND ) + alt35 = 106 + alt35 = self.dfa35.predict(self.input) + if alt35 == 1: + # C.g:1:10: T25 + self.mT25() + + + + elif alt35 == 2: + # C.g:1:14: T26 + self.mT26() + + + + elif alt35 == 3: + # C.g:1:18: T27 + self.mT27() + + + + elif alt35 == 4: + # C.g:1:22: T28 + self.mT28() + + + + elif alt35 == 5: + # C.g:1:26: T29 + self.mT29() + + + + elif alt35 == 6: + # C.g:1:30: T30 + self.mT30() + + + + elif alt35 == 7: + # C.g:1:34: T31 + self.mT31() + + + + elif alt35 == 8: + # C.g:1:38: T32 + self.mT32() + + + + elif alt35 == 9: + # C.g:1:42: T33 + self.mT33() + + + + elif alt35 == 10: + # C.g:1:46: T34 + self.mT34() + + + + elif alt35 == 11: + # C.g:1:50: T35 + self.mT35() + + + + elif alt35 == 12: + # C.g:1:54: T36 + self.mT36() + + + + elif alt35 == 13: + # C.g:1:58: T37 + self.mT37() + + + + elif alt35 == 14: + # C.g:1:62: T38 + self.mT38() + + + + elif alt35 == 15: + # C.g:1:66: T39 + self.mT39() + + + + elif alt35 == 16: + # C.g:1:70: T40 + self.mT40() + + + + elif alt35 == 17: + # C.g:1:74: T41 + self.mT41() + + + + elif alt35 == 18: + # C.g:1:78: T42 + self.mT42() + + + + elif alt35 == 19: + # C.g:1:82: T43 + self.mT43() + + + + elif alt35 == 20: + # C.g:1:86: T44 + self.mT44() + + + + elif alt35 == 21: + # C.g:1:90: T45 + self.mT45() + + + + elif alt35 == 22: + # C.g:1:94: T46 + self.mT46() + + + + elif alt35 == 23: + # C.g:1:98: T47 + self.mT47() + + + + elif alt35 == 24: + # C.g:1:102: T48 + self.mT48() + + + + elif alt35 == 25: + # C.g:1:106: T49 + self.mT49() + + + + elif alt35 == 26: + # C.g:1:110: T50 + self.mT50() + + + + elif alt35 == 27: + # C.g:1:114: T51 + self.mT51() + + + + elif alt35 == 28: + # C.g:1:118: T52 + self.mT52() + + + + elif alt35 == 29: + # C.g:1:122: T53 + self.mT53() + + + + elif alt35 == 30: + # C.g:1:126: T54 + self.mT54() + + + + elif alt35 == 31: + # C.g:1:130: T55 + self.mT55() + + + + elif alt35 == 32: + # C.g:1:134: T56 + self.mT56() + + + + elif alt35 == 33: + # C.g:1:138: T57 + self.mT57() + + + + elif alt35 == 34: + # C.g:1:142: T58 + self.mT58() + + + + elif alt35 == 35: + # C.g:1:146: T59 + self.mT59() + + + + elif alt35 == 36: + # C.g:1:150: T60 + self.mT60() + + + + elif alt35 == 37: + # C.g:1:154: T61 + self.mT61() + + + + elif alt35 == 38: + # C.g:1:158: T62 + self.mT62() + + + + elif alt35 == 39: + # C.g:1:162: T63 + self.mT63() + + + + elif alt35 == 40: + # C.g:1:166: T64 + self.mT64() + + + + elif alt35 == 41: + # C.g:1:170: T65 + self.mT65() + + + + elif alt35 == 42: + # C.g:1:174: T66 + self.mT66() + + + + elif alt35 == 43: + # C.g:1:178: T67 + self.mT67() + + + + elif alt35 == 44: + # C.g:1:182: T68 + self.mT68() + + + + elif alt35 == 45: + # C.g:1:186: T69 + self.mT69() + + + + elif alt35 == 46: + # C.g:1:190: T70 + self.mT70() + + + + elif alt35 == 47: + # C.g:1:194: T71 + self.mT71() + + + + elif alt35 == 48: + # C.g:1:198: T72 + self.mT72() + + + + elif alt35 == 49: + # C.g:1:202: T73 + self.mT73() + + + + elif alt35 == 50: + # C.g:1:206: T74 + self.mT74() + + + + elif alt35 == 51: + # C.g:1:210: T75 + self.mT75() + + + + elif alt35 == 52: + # C.g:1:214: T76 + self.mT76() + + + + elif alt35 == 53: + # C.g:1:218: T77 + self.mT77() + + + + elif alt35 == 54: + # C.g:1:222: T78 + self.mT78() + + + + elif alt35 == 55: + # C.g:1:226: T79 + self.mT79() + + + + elif alt35 == 56: + # C.g:1:230: T80 + self.mT80() + + + + elif alt35 == 57: + # C.g:1:234: T81 + self.mT81() + + + + elif alt35 == 58: + # C.g:1:238: T82 + self.mT82() + + + + elif alt35 == 59: + # C.g:1:242: T83 + self.mT83() + + + + elif alt35 == 60: + # C.g:1:246: T84 + self.mT84() + + + + elif alt35 == 61: + # C.g:1:250: T85 + self.mT85() + + + + elif alt35 == 62: + # C.g:1:254: T86 + self.mT86() + + + + elif alt35 == 63: + # C.g:1:258: T87 + self.mT87() + + + + elif alt35 == 64: + # C.g:1:262: T88 + self.mT88() + + + + elif alt35 == 65: + # C.g:1:266: T89 + self.mT89() + + + + elif alt35 == 66: + # C.g:1:270: T90 + self.mT90() + + + + elif alt35 == 67: + # C.g:1:274: T91 + self.mT91() + + + + elif alt35 == 68: + # C.g:1:278: T92 + self.mT92() + + + + elif alt35 == 69: + # C.g:1:282: T93 + self.mT93() + + + + elif alt35 == 70: + # C.g:1:286: T94 + self.mT94() + + + + elif alt35 == 71: + # C.g:1:290: T95 + self.mT95() + + + + elif alt35 == 72: + # C.g:1:294: T96 + self.mT96() + + + + elif alt35 == 73: + # C.g:1:298: T97 + self.mT97() + + + + elif alt35 == 74: + # C.g:1:302: T98 + self.mT98() + + + + elif alt35 == 75: + # C.g:1:306: T99 + self.mT99() + + + + elif alt35 == 76: + # C.g:1:310: T100 + self.mT100() + + + + elif alt35 == 77: + # C.g:1:315: T101 + self.mT101() + + + + elif alt35 == 78: + # C.g:1:320: T102 + self.mT102() + + + + elif alt35 == 79: + # C.g:1:325: T103 + self.mT103() + + + + elif alt35 == 80: + # C.g:1:330: T104 + self.mT104() + + + + elif alt35 == 81: + # C.g:1:335: T105 + self.mT105() + + + + elif alt35 == 82: + # C.g:1:340: T106 + self.mT106() + + + + elif alt35 == 83: + # C.g:1:345: T107 + self.mT107() + + + + elif alt35 == 84: + # C.g:1:350: T108 + self.mT108() + + + + elif alt35 == 85: + # C.g:1:355: T109 + self.mT109() + + + + elif alt35 == 86: + # C.g:1:360: T110 + self.mT110() + + + + elif alt35 == 87: + # C.g:1:365: T111 + self.mT111() + + + + elif alt35 == 88: + # C.g:1:370: T112 + self.mT112() + + + + elif alt35 == 89: + # C.g:1:375: T113 + self.mT113() + + + + elif alt35 == 90: + # C.g:1:380: T114 + self.mT114() + + + + elif alt35 == 91: + # C.g:1:385: T115 + self.mT115() + + + + elif alt35 == 92: + # C.g:1:390: T116 + self.mT116() + + + + elif alt35 == 93: + # C.g:1:395: T117 + self.mT117() + + + + elif alt35 == 94: + # C.g:1:400: IDENTIFIER + self.mIDENTIFIER() + + + + elif alt35 == 95: + # C.g:1:411: CHARACTER_LITERAL + self.mCHARACTER_LITERAL() + + + + elif alt35 == 96: + # C.g:1:429: STRING_LITERAL + self.mSTRING_LITERAL() + + + + elif alt35 == 97: + # C.g:1:444: HEX_LITERAL + self.mHEX_LITERAL() + + + + elif alt35 == 98: + # C.g:1:456: DECIMAL_LITERAL + self.mDECIMAL_LITERAL() + + + + elif alt35 == 99: + # C.g:1:472: OCTAL_LITERAL + self.mOCTAL_LITERAL() + + + + elif alt35 == 100: + # C.g:1:486: FLOATING_POINT_LITERAL + self.mFLOATING_POINT_LITERAL() + + + + elif alt35 == 101: + # C.g:1:509: WS + self.mWS() + + + + elif alt35 == 102: + # C.g:1:512: BS + self.mBS() + + + + elif alt35 == 103: + # C.g:1:515: UnicodeVocabulary + self.mUnicodeVocabulary() + + + + elif alt35 == 104: + # C.g:1:533: COMMENT + self.mCOMMENT() + + + + elif alt35 == 105: + # C.g:1:541: LINE_COMMENT + self.mLINE_COMMENT() + + + + elif alt35 == 106: + # C.g:1:554: LINE_COMMAND + self.mLINE_COMMAND() + + + + + + + + + # lookup tables for DFA #25 + + DFA25_eot = DFA.unpack( + u"\7\uffff\1\10\2\uffff" + ) + + DFA25_eof = DFA.unpack( + u"\12\uffff" + ) + + DFA25_min = DFA.unpack( + u"\2\56\2\uffff\1\53\1\uffff\2\60\2\uffff" + ) + + DFA25_max = DFA.unpack( + u"\1\71\1\146\2\uffff\1\71\1\uffff\1\71\1\146\2\uffff" + ) + + DFA25_accept = DFA.unpack( + u"\2\uffff\1\2\1\1\1\uffff\1\4\2\uffff\2\3" + ) + + DFA25_special = DFA.unpack( + u"\12\uffff" + ) + + + DFA25_transition = [ + DFA.unpack(u"\1\2\1\uffff\12\1"), + DFA.unpack(u"\1\3\1\uffff\12\1\12\uffff\1\5\1\4\1\5\35\uffff\1\5" + u"\1\4\1\5"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\6\1\uffff\1\6\2\uffff\12\7"), + DFA.unpack(u""), + DFA.unpack(u"\12\7"), + DFA.unpack(u"\12\7\12\uffff\1\11\1\uffff\1\11\35\uffff\1\11\1\uffff" + u"\1\11"), + DFA.unpack(u""), + DFA.unpack(u"") + ] + + # class definition for DFA #25 + + DFA25 = DFA + # lookup tables for DFA #35 + + DFA35_eot = DFA.unpack( + u"\2\uffff\1\76\1\uffff\1\101\14\76\3\uffff\10\76\4\uffff\1\151\1" + u"\153\1\157\1\163\1\167\1\171\1\174\1\uffff\1\177\1\u0082\1\u0085" + u"\1\u0087\1\u008a\1\uffff\5\76\1\uffff\2\73\2\u0095\2\uffff\1\73" + u"\2\uffff\1\76\4\uffff\16\76\1\u00ad\5\76\1\u00b4\1\76\3\uffff\1" + u"\u00b7\10\76\34\uffff\1\u00c1\2\uffff\1\u00c3\10\uffff\5\76\3\uffff" + u"\1\u00c9\1\uffff\1\u0095\3\uffff\23\76\1\uffff\1\u00de\1\76\1\u00e0" + u"\3\76\1\uffff\2\76\1\uffff\1\76\1\u00e7\6\76\4\uffff\5\76\1\uffff" + u"\1\76\1\u00f5\1\76\1\u00f7\6\76\1\u00fe\4\76\1\u0103\1\u0104\2" + u"\76\1\u0107\1\uffff\1\u0108\1\uffff\6\76\1\uffff\10\76\1\u0118" + u"\1\76\1\u011a\2\76\1\uffff\1\76\1\uffff\5\76\1\u0123\1\uffff\4" + u"\76\2\uffff\1\76\1\u0129\2\uffff\1\u012a\3\76\1\u012e\1\76\1\u0130" + u"\7\76\1\u0139\1\uffff\1\u013a\1\uffff\1\u013b\1\76\1\u013d\1\u013e" + u"\1\u013f\1\u0140\1\u0141\1\u0142\1\uffff\1\76\1\u0144\1\u0145\2" + u"\76\2\uffff\1\76\1\u0149\1\76\1\uffff\1\76\1\uffff\5\76\1\u0151" + u"\1\u0152\1\76\3\uffff\1\u0154\6\uffff\1\76\2\uffff\2\76\1\u0158" + u"\1\uffff\7\76\2\uffff\1\u0160\1\uffff\1\u0161\1\u0162\1\u0163\1" + u"\uffff\1\u0164\1\u0165\1\76\1\u0167\3\76\6\uffff\1\u016b\1\uffff" + u"\3\76\1\uffff\21\76\1\u0180\2\76\1\uffff\3\76\1\u0186\1\76\1\uffff" + u"\11\76\1\u0191\1\uffff" + ) + + DFA35_eof = DFA.unpack( + u"\u0192\uffff" + ) + + DFA35_min = DFA.unpack( + u"\1\3\1\uffff\1\171\1\uffff\1\75\1\154\1\150\1\165\1\145\1\124\1" + u"\157\1\141\1\146\1\157\1\154\1\145\1\156\3\uffff\1\116\1\120\1" + u"\117\1\116\1\117\1\114\1\106\1\101\4\uffff\1\75\1\56\1\53\1\55" + u"\1\52\1\75\1\46\1\uffff\1\75\1\74\3\75\1\uffff\1\137\1\150\1\157" + u"\1\162\1\42\1\uffff\2\0\2\56\2\uffff\1\0\2\uffff\1\160\4\uffff" + u"\1\163\1\164\1\165\1\151\1\141\1\147\1\157\1\164\1\147\1\101\1" + u"\151\1\163\1\156\1\141\1\44\1\164\1\156\1\162\1\157\1\146\1\44" + u"\1\151\3\uffff\1\44\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34" + u"\uffff\1\75\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145" + u"\3\uffff\1\56\1\uffff\1\56\3\uffff\3\145\1\155\2\164\1\165\1\145" + u"\1\156\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\163\1" + u"\162\1\uffff\1\44\1\147\1\44\2\141\1\142\1\uffff\1\151\1\157\1" + u"\uffff\1\111\1\44\1\123\1\114\1\101\1\102\1\101\1\113\4\uffff\1" + u"\163\1\155\1\154\1\157\1\141\1\uffff\1\144\1\44\1\162\1\44\1\143" + u"\1\151\1\143\1\157\1\145\1\164\1\44\1\163\1\162\1\111\1\164\2\44" + u"\1\151\1\164\1\44\1\uffff\1\44\1\uffff\1\164\1\165\1\154\1\147" + u"\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\102\1\120\1\105" + u"\1\155\1\44\1\145\1\44\1\153\1\145\1\uffff\1\156\1\uffff\1\150" + u"\1\143\1\164\1\146\1\144\1\44\1\uffff\1\164\1\156\1\103\1\151\2" + u"\uffff\1\156\1\44\2\uffff\1\44\1\154\1\145\1\156\1\44\1\116\1\44" + u"\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\44\1\uffff\1\44\1" + u"\uffff\1\44\1\146\6\44\1\uffff\1\145\2\44\1\154\1\165\2\uffff\1" + u"\164\1\44\1\145\1\uffff\1\101\1\uffff\1\116\1\114\1\137\1\116\1" + u"\117\2\44\1\137\3\uffff\1\44\6\uffff\1\162\2\uffff\2\145\1\44\1" + u"\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff\1\44\1\uffff\3\44" + u"\1\uffff\2\44\1\104\1\44\1\105\1\111\1\123\6\uffff\1\44\1\uffff" + u"\2\115\1\105\1\uffff\1\117\1\105\1\122\1\126\1\123\1\126\2\105" + u"\1\111\1\137\1\122\1\103\1\111\1\126\1\105\1\106\1\111\1\44\1\137" + u"\1\103\1\uffff\1\125\1\105\1\116\1\44\1\122\1\uffff\1\105\1\106" + u"\1\105\1\122\1\105\1\116\1\103\1\105\1\104\1\44\1\uffff" + ) + + DFA35_max = DFA.unpack( + u"\1\ufffe\1\uffff\1\171\1\uffff\1\75\1\170\1\167\1\165\1\145\1\124" + u"\2\157\1\156\3\157\1\156\3\uffff\1\116\1\125\1\117\1\116\1\117" + u"\1\114\1\106\1\101\4\uffff\1\75\1\71\1\75\1\76\3\75\1\uffff\2\75" + u"\1\76\1\75\1\174\1\uffff\1\141\1\150\1\157\1\162\1\47\1\uffff\2" + u"\ufffe\1\170\1\146\2\uffff\1\ufffe\2\uffff\1\160\4\uffff\1\163" + u"\1\164\1\165\1\151\1\162\1\172\1\157\2\164\1\101\1\154\1\163\1" + u"\156\1\141\1\172\1\164\1\156\1\162\1\157\1\146\1\172\1\163\3\uffff" + u"\1\172\2\124\1\116\1\101\1\114\1\117\1\111\1\103\34\uffff\1\75" + u"\2\uffff\1\75\10\uffff\1\141\1\163\1\151\1\164\1\145\3\uffff\1" + u"\146\1\uffff\1\146\3\uffff\3\145\1\155\2\164\1\165\1\145\1\156" + u"\1\162\1\157\1\151\1\165\1\124\1\141\1\144\1\145\1\164\1\162\1" + u"\uffff\1\172\1\147\1\172\2\141\1\142\1\uffff\1\151\1\157\1\uffff" + u"\1\111\1\172\1\123\1\114\1\101\1\102\1\137\1\113\4\uffff\1\163" + u"\1\155\1\154\1\157\1\141\1\uffff\1\144\1\172\1\162\1\172\1\143" + u"\1\151\1\143\1\157\1\145\1\164\1\172\1\163\1\162\1\111\1\164\2" + u"\172\1\151\1\164\1\172\1\uffff\1\172\1\uffff\1\164\1\165\1\154" + u"\1\147\1\156\1\117\1\uffff\1\124\1\111\1\124\1\101\1\122\1\120" + u"\1\105\1\155\1\172\1\145\1\172\1\153\1\145\1\uffff\1\156\1\uffff" + u"\1\150\1\143\1\164\1\146\1\144\1\172\1\uffff\1\164\1\156\1\103" + u"\1\151\2\uffff\1\156\1\172\2\uffff\1\172\1\154\1\145\1\156\1\172" + u"\1\116\1\172\1\107\1\111\1\114\1\125\1\117\1\111\1\104\1\172\1" + u"\uffff\1\172\1\uffff\1\172\1\146\6\172\1\uffff\1\145\2\172\1\154" + u"\1\165\2\uffff\1\164\1\172\1\145\1\uffff\1\101\1\uffff\1\116\1" + u"\114\1\137\1\116\1\117\2\172\1\137\3\uffff\1\172\6\uffff\1\162" + u"\2\uffff\2\145\1\172\1\uffff\1\144\1\114\2\105\1\122\2\124\2\uffff" + u"\1\172\1\uffff\3\172\1\uffff\2\172\1\104\1\172\1\105\1\111\1\123" + u"\6\uffff\1\172\1\uffff\2\115\1\105\1\uffff\1\117\1\105\1\122\1" + u"\126\1\123\1\126\2\105\1\111\1\137\1\122\1\103\1\111\1\126\1\105" + u"\1\106\1\111\1\172\1\137\1\103\1\uffff\1\125\1\105\1\116\1\172" + u"\1\122\1\uffff\1\105\1\106\1\105\1\122\1\105\1\116\1\103\1\105" + u"\1\104\1\172\1\uffff" + ) + + DFA35_accept = DFA.unpack( + u"\1\uffff\1\1\1\uffff\1\3\15\uffff\1\23\1\24\1\27\10\uffff\1\46" + u"\1\47\1\50\1\51\7\uffff\1\66\5\uffff\1\102\5\uffff\1\136\4\uffff" + u"\1\145\1\146\1\uffff\1\147\1\1\1\uffff\1\136\1\3\1\107\1\4\26\uffff" + u"\1\23\1\24\1\27\11\uffff\1\46\1\47\1\50\1\51\1\70\1\52\1\53\1\63" + u"\1\144\1\73\1\60\1\54\1\74\1\64\1\61\1\55\1\150\1\151\1\71\1\56" + u"\1\72\1\57\1\77\1\104\1\65\1\66\1\110\1\67\1\uffff\1\113\1\111" + u"\1\uffff\1\114\1\112\1\100\1\106\1\103\1\101\1\105\1\102\5\uffff" + u"\1\140\1\137\1\141\1\uffff\1\142\1\uffff\1\145\1\146\1\152\23\uffff" + u"\1\124\6\uffff\1\130\2\uffff\1\33\10\uffff\1\75\1\115\1\76\1\116" + u"\5\uffff\1\143\24\uffff\1\15\1\uffff\1\131\6\uffff\1\34\15\uffff" + u"\1\125\1\uffff\1\30\6\uffff\1\7\4\uffff\1\12\1\122\2\uffff\1\13" + u"\1\16\17\uffff\1\120\1\uffff\1\132\10\uffff\1\14\5\uffff\1\31\1" + u"\17\3\uffff\1\26\1\uffff\1\36\10\uffff\1\121\1\127\1\134\1\uffff" + u"\1\5\1\126\1\6\1\25\1\62\1\21\1\uffff\1\135\1\11\3\uffff\1\20\7" + u"\uffff\1\42\1\45\1\uffff\1\2\3\uffff\1\123\7\uffff\1\117\1\10\1" + u"\32\1\133\1\22\1\35\1\uffff\1\40\3\uffff\1\37\24\uffff\1\43\5\uffff" + u"\1\44\12\uffff\1\41" + ) + + DFA35_special = DFA.unpack( + u"\u0192\uffff" + ) + + + DFA35_transition = [ + DFA.unpack(u"\6\73\2\70\1\73\2\70\22\73\1\70\1\50\1\65\1\72\1\63" + u"\1\45\1\46\1\64\1\34\1\35\1\40\1\42\1\3\1\43\1\41\1\44\1\66\11" + u"\67\1\23\1\1\1\51\1\4\1\52\1\55\1\73\2\63\1\26\1\63\1\32\1\63\1" + u"\31\1\63\1\24\2\63\1\62\2\63\1\25\1\33\2\63\1\11\1\63\1\27\1\30" + u"\4\63\1\36\1\71\1\37\1\53\1\56\1\73\1\7\1\61\1\13\1\17\1\5\1\16" + u"\1\60\1\63\1\14\2\63\1\15\5\63\1\10\1\6\1\2\1\20\1\12\1\57\3\63" + u"\1\21\1\54\1\22\1\47\uff80\73"), + DFA.unpack(u""), + DFA.unpack(u"\1\75"), + DFA.unpack(u""), + DFA.unpack(u"\1\100"), + DFA.unpack(u"\1\102\1\uffff\1\104\11\uffff\1\103"), + DFA.unpack(u"\1\110\1\107\12\uffff\1\106\2\uffff\1\105"), + DFA.unpack(u"\1\111"), + DFA.unpack(u"\1\112"), + DFA.unpack(u"\1\113"), + DFA.unpack(u"\1\114"), + DFA.unpack(u"\1\115\6\uffff\1\117\6\uffff\1\116"), + DFA.unpack(u"\1\120\7\uffff\1\121"), + DFA.unpack(u"\1\122"), + DFA.unpack(u"\1\124\2\uffff\1\123"), + DFA.unpack(u"\1\125\11\uffff\1\126"), + DFA.unpack(u"\1\127"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\133"), + DFA.unpack(u"\1\134\4\uffff\1\135"), + DFA.unpack(u"\1\136"), + DFA.unpack(u"\1\137"), + DFA.unpack(u"\1\140"), + DFA.unpack(u"\1\141"), + DFA.unpack(u"\1\142"), + DFA.unpack(u"\1\143"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\150"), + DFA.unpack(u"\1\152\1\uffff\12\154"), + DFA.unpack(u"\1\156\21\uffff\1\155"), + DFA.unpack(u"\1\162\17\uffff\1\160\1\161"), + DFA.unpack(u"\1\164\4\uffff\1\165\15\uffff\1\166"), + DFA.unpack(u"\1\170"), + DFA.unpack(u"\1\173\26\uffff\1\172"), + DFA.unpack(u""), + DFA.unpack(u"\1\176"), + DFA.unpack(u"\1\u0080\1\u0081"), + DFA.unpack(u"\1\u0084\1\u0083"), + DFA.unpack(u"\1\u0086"), + DFA.unpack(u"\1\u0089\76\uffff\1\u0088"), + DFA.unpack(u""), + DFA.unpack(u"\1\u008c\1\uffff\1\u008d"), + DFA.unpack(u"\1\u008e"), + DFA.unpack(u"\1\u008f"), + DFA.unpack(u"\1\u0090"), + DFA.unpack(u"\1\u0091\4\uffff\1\u0092"), + DFA.unpack(u""), + DFA.unpack(u"\47\u0092\1\uffff\uffd7\u0092"), + DFA.unpack(u"\uffff\u0091"), + DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\21\uffff" + u"\1\u0093\13\uffff\3\154\21\uffff\1\u0093"), + DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\uffff\u0099"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u009a"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u009b"), + DFA.unpack(u"\1\u009c"), + DFA.unpack(u"\1\u009d"), + DFA.unpack(u"\1\u009e"), + DFA.unpack(u"\1\u009f\20\uffff\1\u00a0"), + DFA.unpack(u"\1\u00a2\22\uffff\1\u00a1"), + DFA.unpack(u"\1\u00a3"), + DFA.unpack(u"\1\u00a4"), + DFA.unpack(u"\1\u00a5\14\uffff\1\u00a6"), + DFA.unpack(u"\1\u00a7"), + DFA.unpack(u"\1\u00a9\2\uffff\1\u00a8"), + DFA.unpack(u"\1\u00aa"), + DFA.unpack(u"\1\u00ab"), + DFA.unpack(u"\1\u00ac"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00ae"), + DFA.unpack(u"\1\u00af"), + DFA.unpack(u"\1\u00b0"), + DFA.unpack(u"\1\u00b1"), + DFA.unpack(u"\1\u00b2"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\24\76\1\u00b3\5\76"), + DFA.unpack(u"\1\u00b6\11\uffff\1\u00b5"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00b8"), + DFA.unpack(u"\1\u00b9"), + DFA.unpack(u"\1\u00ba"), + DFA.unpack(u"\1\u00bb"), + DFA.unpack(u"\1\u00bc"), + DFA.unpack(u"\1\u00bd"), + DFA.unpack(u"\1\u00be"), + DFA.unpack(u"\1\u00bf"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c0"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c2"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00c4"), + DFA.unpack(u"\1\u00c5"), + DFA.unpack(u"\1\u00c6"), + DFA.unpack(u"\1\u00c7"), + DFA.unpack(u"\1\u00c8"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\154\1\uffff\10\u0094\2\154\12\uffff\3\154\35\uffff" + u"\3\154"), + DFA.unpack(u""), + DFA.unpack(u"\1\154\1\uffff\12\u0096\12\uffff\3\154\35\uffff\3\154"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00ca"), + DFA.unpack(u"\1\u00cb"), + DFA.unpack(u"\1\u00cc"), + DFA.unpack(u"\1\u00cd"), + DFA.unpack(u"\1\u00ce"), + DFA.unpack(u"\1\u00cf"), + DFA.unpack(u"\1\u00d0"), + DFA.unpack(u"\1\u00d1"), + DFA.unpack(u"\1\u00d2"), + DFA.unpack(u"\1\u00d3"), + DFA.unpack(u"\1\u00d4"), + DFA.unpack(u"\1\u00d5"), + DFA.unpack(u"\1\u00d6"), + DFA.unpack(u"\1\u00d7"), + DFA.unpack(u"\1\u00d8"), + DFA.unpack(u"\1\u00d9"), + DFA.unpack(u"\1\u00da"), + DFA.unpack(u"\1\u00dc\1\u00db"), + DFA.unpack(u"\1\u00dd"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00df"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00e1"), + DFA.unpack(u"\1\u00e2"), + DFA.unpack(u"\1\u00e3"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00e4"), + DFA.unpack(u"\1\u00e5"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00e6"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00e8"), + DFA.unpack(u"\1\u00e9"), + DFA.unpack(u"\1\u00ea"), + DFA.unpack(u"\1\u00eb"), + DFA.unpack(u"\1\u00ed\35\uffff\1\u00ec"), + DFA.unpack(u"\1\u00ee"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u00ef"), + DFA.unpack(u"\1\u00f0"), + DFA.unpack(u"\1\u00f1"), + DFA.unpack(u"\1\u00f2"), + DFA.unpack(u"\1\u00f3"), + DFA.unpack(u""), + DFA.unpack(u"\1\u00f4"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00f6"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00f8"), + DFA.unpack(u"\1\u00f9"), + DFA.unpack(u"\1\u00fa"), + DFA.unpack(u"\1\u00fb"), + DFA.unpack(u"\1\u00fc"), + DFA.unpack(u"\1\u00fd"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u00ff"), + DFA.unpack(u"\1\u0100"), + DFA.unpack(u"\1\u0101"), + DFA.unpack(u"\1\u0102"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0105"), + DFA.unpack(u"\1\u0106"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0109"), + DFA.unpack(u"\1\u010a"), + DFA.unpack(u"\1\u010b"), + DFA.unpack(u"\1\u010c"), + DFA.unpack(u"\1\u010d"), + DFA.unpack(u"\1\u010e"), + DFA.unpack(u""), + DFA.unpack(u"\1\u010f"), + DFA.unpack(u"\1\u0110"), + DFA.unpack(u"\1\u0111"), + DFA.unpack(u"\1\u0112"), + DFA.unpack(u"\1\u0114\17\uffff\1\u0113"), + DFA.unpack(u"\1\u0115"), + DFA.unpack(u"\1\u0116"), + DFA.unpack(u"\1\u0117"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0119"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u011b"), + DFA.unpack(u"\1\u011c"), + DFA.unpack(u""), + DFA.unpack(u"\1\u011d"), + DFA.unpack(u""), + DFA.unpack(u"\1\u011e"), + DFA.unpack(u"\1\u011f"), + DFA.unpack(u"\1\u0120"), + DFA.unpack(u"\1\u0121"), + DFA.unpack(u"\1\u0122"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0124"), + DFA.unpack(u"\1\u0125"), + DFA.unpack(u"\1\u0126"), + DFA.unpack(u"\1\u0127"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0128"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u012b"), + DFA.unpack(u"\1\u012c"), + DFA.unpack(u"\1\u012d"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u012f"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0131"), + DFA.unpack(u"\1\u0132"), + DFA.unpack(u"\1\u0133"), + DFA.unpack(u"\1\u0134"), + DFA.unpack(u"\1\u0135"), + DFA.unpack(u"\1\u0136"), + DFA.unpack(u"\1\u0137"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\u0138\1" + u"\uffff\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u013c"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0143"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0146"), + DFA.unpack(u"\1\u0147"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0148"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u014a"), + DFA.unpack(u""), + DFA.unpack(u"\1\u014b"), + DFA.unpack(u""), + DFA.unpack(u"\1\u014c"), + DFA.unpack(u"\1\u014d"), + DFA.unpack(u"\1\u014e"), + DFA.unpack(u"\1\u014f"), + DFA.unpack(u"\1\u0150"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0153"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0155"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\u0156"), + DFA.unpack(u"\1\u0157"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0159"), + DFA.unpack(u"\1\u015a"), + DFA.unpack(u"\1\u015b"), + DFA.unpack(u"\1\u015c"), + DFA.unpack(u"\1\u015d"), + DFA.unpack(u"\1\u015e"), + DFA.unpack(u"\1\u015f"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0166"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0168"), + DFA.unpack(u"\1\u0169"), + DFA.unpack(u"\1\u016a"), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u""), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u""), + DFA.unpack(u"\1\u016c"), + DFA.unpack(u"\1\u016d"), + DFA.unpack(u"\1\u016e"), + DFA.unpack(u""), + DFA.unpack(u"\1\u016f"), + DFA.unpack(u"\1\u0170"), + DFA.unpack(u"\1\u0171"), + DFA.unpack(u"\1\u0172"), + DFA.unpack(u"\1\u0173"), + DFA.unpack(u"\1\u0174"), + DFA.unpack(u"\1\u0175"), + DFA.unpack(u"\1\u0176"), + DFA.unpack(u"\1\u0177"), + DFA.unpack(u"\1\u0178"), + DFA.unpack(u"\1\u0179"), + DFA.unpack(u"\1\u017a"), + DFA.unpack(u"\1\u017b"), + DFA.unpack(u"\1\u017c"), + DFA.unpack(u"\1\u017d"), + DFA.unpack(u"\1\u017e"), + DFA.unpack(u"\1\u017f"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0181"), + DFA.unpack(u"\1\u0182"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0183"), + DFA.unpack(u"\1\u0184"), + DFA.unpack(u"\1\u0185"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"\1\u0187"), + DFA.unpack(u""), + DFA.unpack(u"\1\u0188"), + DFA.unpack(u"\1\u0189"), + DFA.unpack(u"\1\u018a"), + DFA.unpack(u"\1\u018b"), + DFA.unpack(u"\1\u018c"), + DFA.unpack(u"\1\u018d"), + DFA.unpack(u"\1\u018e"), + DFA.unpack(u"\1\u018f"), + DFA.unpack(u"\1\u0190"), + DFA.unpack(u"\1\76\13\uffff\12\76\7\uffff\32\76\4\uffff\1\76\1\uffff" + u"\32\76"), + DFA.unpack(u"") + ] + + # class definition for DFA #35 + + DFA35 = DFA + + diff --git a/BaseTools/Source/Python/Eot/CParser.py b/BaseTools/Source/Python/Eot/CParser.py index 511d429f26..baa521f43c 100644 --- a/BaseTools/Source/Python/Eot/CParser.py +++ b/BaseTools/Source/Python/Eot/CParser.py @@ -1,7 +1,7 @@ -# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 - -from antlr3 import * -from antlr3.compat import set, frozenset +# $ANTLR 3.0.1 C.g 2010-02-23 09:58:53 + +from antlr3 import * +from antlr3.compat import set, frozenset ## @file # The file defines the parser for C source files. @@ -24,88 +24,88 @@ from antlr3.compat import set, frozenset import CodeFragment import FileProfile - - - -# for convenience in actions -HIDDEN = BaseRecognizer.HIDDEN - -# token types -BS=20 -LINE_COMMENT=23 -FloatTypeSuffix=16 -IntegerTypeSuffix=14 -LETTER=11 -OCTAL_LITERAL=6 -CHARACTER_LITERAL=8 -Exponent=15 -EOF=-1 -HexDigit=13 -STRING_LITERAL=9 -WS=19 -FLOATING_POINT_LITERAL=10 -IDENTIFIER=4 -UnicodeEscape=18 -LINE_COMMAND=24 -UnicodeVocabulary=21 -HEX_LITERAL=5 -COMMENT=22 -DECIMAL_LITERAL=7 -EscapeSequence=12 -OctalEscape=17 - -# token names -tokenNames = [ - "", "", "", "", - "IDENTIFIER", "HEX_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", "CHARACTER_LITERAL", - "STRING_LITERAL", "FLOATING_POINT_LITERAL", "LETTER", "EscapeSequence", - "HexDigit", "IntegerTypeSuffix", "Exponent", "FloatTypeSuffix", "OctalEscape", - "UnicodeEscape", "WS", "BS", "UnicodeVocabulary", "COMMENT", "LINE_COMMENT", - "LINE_COMMAND", "';'", "'typedef'", "','", "'='", "'extern'", "'static'", - "'auto'", "'register'", "'STATIC'", "'void'", "'char'", "'short'", "'int'", - "'long'", "'float'", "'double'", "'signed'", "'unsigned'", "'{'", "'}'", - "'struct'", "'union'", "':'", "'enum'", "'const'", "'volatile'", "'IN'", - "'OUT'", "'OPTIONAL'", "'CONST'", "'UNALIGNED'", "'VOLATILE'", "'GLOBAL_REMOVE_IF_UNREFERENCED'", - "'EFIAPI'", "'EFI_BOOTSERVICE'", "'EFI_RUNTIMESERVICE'", "'PACKED'", - "'('", "')'", "'['", "']'", "'*'", "'...'", "'+'", "'-'", "'/'", "'%'", - "'++'", "'--'", "'sizeof'", "'.'", "'->'", "'&'", "'~'", "'!'", "'*='", - "'/='", "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", "'|='", - "'?'", "'||'", "'&&'", "'|'", "'^'", "'=='", "'!='", "'<'", "'>'", "'<='", - "'>='", "'<<'", "'>>'", "'__asm__'", "'_asm'", "'__asm'", "'case'", - "'default'", "'if'", "'else'", "'switch'", "'while'", "'do'", "'for'", - "'goto'", "'continue'", "'break'", "'return'" -] - - -class function_definition_scope(object): - def __init__(self): - self.ModifierText = None - self.DeclText = None - self.LBLine = None - self.LBOffset = None - self.DeclLine = None - self.DeclOffset = None -class postfix_expression_scope(object): - def __init__(self): - self.FuncCallText = None - - -class CParser(Parser): - grammarFileName = "C.g" - tokenNames = tokenNames - - def __init__(self, input): - Parser.__init__(self, input) - self.ruleMemo = {} - - self.function_definition_stack = [] - self.postfix_expression_stack = [] - - - - - - + + + +# for convenience in actions +HIDDEN = BaseRecognizer.HIDDEN + +# token types +BS=20 +LINE_COMMENT=23 +FloatTypeSuffix=16 +IntegerTypeSuffix=14 +LETTER=11 +OCTAL_LITERAL=6 +CHARACTER_LITERAL=8 +Exponent=15 +EOF=-1 +HexDigit=13 +STRING_LITERAL=9 +WS=19 +FLOATING_POINT_LITERAL=10 +IDENTIFIER=4 +UnicodeEscape=18 +LINE_COMMAND=24 +UnicodeVocabulary=21 +HEX_LITERAL=5 +COMMENT=22 +DECIMAL_LITERAL=7 +EscapeSequence=12 +OctalEscape=17 + +# token names +tokenNames = [ + "", "", "", "", + "IDENTIFIER", "HEX_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", "CHARACTER_LITERAL", + "STRING_LITERAL", "FLOATING_POINT_LITERAL", "LETTER", "EscapeSequence", + "HexDigit", "IntegerTypeSuffix", "Exponent", "FloatTypeSuffix", "OctalEscape", + "UnicodeEscape", "WS", "BS", "UnicodeVocabulary", "COMMENT", "LINE_COMMENT", + "LINE_COMMAND", "';'", "'typedef'", "','", "'='", "'extern'", "'static'", + "'auto'", "'register'", "'STATIC'", "'void'", "'char'", "'short'", "'int'", + "'long'", "'float'", "'double'", "'signed'", "'unsigned'", "'{'", "'}'", + "'struct'", "'union'", "':'", "'enum'", "'const'", "'volatile'", "'IN'", + "'OUT'", "'OPTIONAL'", "'CONST'", "'UNALIGNED'", "'VOLATILE'", "'GLOBAL_REMOVE_IF_UNREFERENCED'", + "'EFIAPI'", "'EFI_BOOTSERVICE'", "'EFI_RUNTIMESERVICE'", "'PACKED'", + "'('", "')'", "'['", "']'", "'*'", "'...'", "'+'", "'-'", "'/'", "'%'", + "'++'", "'--'", "'sizeof'", "'.'", "'->'", "'&'", "'~'", "'!'", "'*='", + "'/='", "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", "'|='", + "'?'", "'||'", "'&&'", "'|'", "'^'", "'=='", "'!='", "'<'", "'>'", "'<='", + "'>='", "'<<'", "'>>'", "'__asm__'", "'_asm'", "'__asm'", "'case'", + "'default'", "'if'", "'else'", "'switch'", "'while'", "'do'", "'for'", + "'goto'", "'continue'", "'break'", "'return'" +] + + +class function_definition_scope(object): + def __init__(self): + self.ModifierText = None + self.DeclText = None + self.LBLine = None + self.LBOffset = None + self.DeclLine = None + self.DeclOffset = None +class postfix_expression_scope(object): + def __init__(self): + self.FuncCallText = None + + +class CParser(Parser): + grammarFileName = "C.g" + tokenNames = tokenNames + + def __init__(self, input): + Parser.__init__(self, input) + self.ruleMemo = {} + + self.function_definition_stack = [] + self.postfix_expression_stack = [] + + + + + + def printTokenInfo(self, line, offset, tokenText): @@ -139,442 +139,442 @@ class CParser(Parser): FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset)) FileProfile.FunctionCallingList.append(FuncCall) - - - - # $ANTLR start translation_unit - # C.g:102:1: translation_unit : ( external_declaration )* ; - def translation_unit(self, ): - - translation_unit_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 1): - return - - # C.g:103:2: ( ( external_declaration )* ) - # C.g:103:4: ( external_declaration )* - # C.g:103:4: ( external_declaration )* - while True: #loop1 - alt1 = 2 - LA1_0 = self.input.LA(1) - - if (LA1_0 == IDENTIFIER or LA1_0 == 26 or (29 <= LA1_0 <= 42) or (45 <= LA1_0 <= 46) or (48 <= LA1_0 <= 62) or LA1_0 == 66) : - alt1 = 1 - - - if alt1 == 1: - # C.g:0:0: external_declaration - self.following.append(self.FOLLOW_external_declaration_in_translation_unit74) - self.external_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 1, translation_unit_StartIndex) - - pass - - return - - # $ANTLR end translation_unit - - - # $ANTLR start external_declaration - # C.g:114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ); - def external_declaration(self, ): - - external_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 2): - return - - # C.g:119:2: ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ) - alt3 = 3 - LA3_0 = self.input.LA(1) - - if ((29 <= LA3_0 <= 33)) : - LA3_1 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 1, self.input) - - raise nvae - - elif (LA3_0 == 34) : - LA3_2 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 2, self.input) - - raise nvae - - elif (LA3_0 == 35) : - LA3_3 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 3, self.input) - - raise nvae - - elif (LA3_0 == 36) : - LA3_4 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 4, self.input) - - raise nvae - - elif (LA3_0 == 37) : - LA3_5 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 5, self.input) - - raise nvae - - elif (LA3_0 == 38) : - LA3_6 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 6, self.input) - - raise nvae - - elif (LA3_0 == 39) : - LA3_7 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 7, self.input) - - raise nvae - - elif (LA3_0 == 40) : - LA3_8 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 8, self.input) - - raise nvae - - elif (LA3_0 == 41) : - LA3_9 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 9, self.input) - - raise nvae - - elif (LA3_0 == 42) : - LA3_10 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 10, self.input) - - raise nvae - - elif ((45 <= LA3_0 <= 46)) : - LA3_11 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 11, self.input) - - raise nvae - - elif (LA3_0 == 48) : - LA3_12 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 12, self.input) - - raise nvae - - elif (LA3_0 == IDENTIFIER) : - LA3_13 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - elif (True) : - alt3 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 13, self.input) - - raise nvae - - elif (LA3_0 == 58) : - LA3_14 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 14, self.input) - - raise nvae - - elif (LA3_0 == 66) and (self.synpred4()): - alt3 = 1 - elif (LA3_0 == 59) : - LA3_16 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 16, self.input) - - raise nvae - - elif (LA3_0 == 60) : - LA3_17 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 17, self.input) - - raise nvae - - elif ((49 <= LA3_0 <= 57) or LA3_0 == 61) : - LA3_18 = self.input.LA(2) - - if (self.synpred4()) : - alt3 = 1 - elif (self.synpred5()) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 18, self.input) - - raise nvae - - elif (LA3_0 == 62) and (self.synpred4()): - alt3 = 1 - elif (LA3_0 == 26) : - alt3 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 0, self.input) - - raise nvae - - if alt3 == 1: - # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition - self.following.append(self.FOLLOW_function_definition_in_external_declaration113) - self.function_definition() - self.following.pop() - if self.failed: - return - - - elif alt3 == 2: - # C.g:120:4: declaration - self.following.append(self.FOLLOW_declaration_in_external_declaration118) - self.declaration() - self.following.pop() - if self.failed: - return - - - elif alt3 == 3: - # C.g:121:4: macro_statement ( ';' )? - self.following.append(self.FOLLOW_macro_statement_in_external_declaration123) - self.macro_statement() - self.following.pop() - if self.failed: - return - # C.g:121:20: ( ';' )? - alt2 = 2 - LA2_0 = self.input.LA(1) - - if (LA2_0 == 25) : - alt2 = 1 - if alt2 == 1: - # C.g:121:21: ';' - self.match(self.input, 25, self.FOLLOW_25_in_external_declaration126) - if self.failed: - return - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 2, external_declaration_StartIndex) - - pass - - return - - # $ANTLR end external_declaration - - class function_definition_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start function_definition - # C.g:126:1: function_definition : (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ; - def function_definition(self, ): - self.function_definition_stack.append(function_definition_scope()) - retval = self.function_definition_return() - retval.start = self.input.LT(1) - function_definition_StartIndex = self.input.index() - d = None - - a = None - - b = None - - declarator1 = None - - + + + + # $ANTLR start translation_unit + # C.g:102:1: translation_unit : ( external_declaration )* ; + def translation_unit(self, ): + + translation_unit_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 1): + return + + # C.g:103:2: ( ( external_declaration )* ) + # C.g:103:4: ( external_declaration )* + # C.g:103:4: ( external_declaration )* + while True: #loop1 + alt1 = 2 + LA1_0 = self.input.LA(1) + + if (LA1_0 == IDENTIFIER or LA1_0 == 26 or (29 <= LA1_0 <= 42) or (45 <= LA1_0 <= 46) or (48 <= LA1_0 <= 62) or LA1_0 == 66) : + alt1 = 1 + + + if alt1 == 1: + # C.g:0:0: external_declaration + self.following.append(self.FOLLOW_external_declaration_in_translation_unit74) + self.external_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 1, translation_unit_StartIndex) + + pass + + return + + # $ANTLR end translation_unit + + + # $ANTLR start external_declaration + # C.g:114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ); + def external_declaration(self, ): + + external_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 2): + return + + # C.g:119:2: ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? ) + alt3 = 3 + LA3_0 = self.input.LA(1) + + if ((29 <= LA3_0 <= 33)) : + LA3_1 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 1, self.input) + + raise nvae + + elif (LA3_0 == 34) : + LA3_2 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 2, self.input) + + raise nvae + + elif (LA3_0 == 35) : + LA3_3 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 3, self.input) + + raise nvae + + elif (LA3_0 == 36) : + LA3_4 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 4, self.input) + + raise nvae + + elif (LA3_0 == 37) : + LA3_5 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 5, self.input) + + raise nvae + + elif (LA3_0 == 38) : + LA3_6 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 6, self.input) + + raise nvae + + elif (LA3_0 == 39) : + LA3_7 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 7, self.input) + + raise nvae + + elif (LA3_0 == 40) : + LA3_8 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 8, self.input) + + raise nvae + + elif (LA3_0 == 41) : + LA3_9 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 9, self.input) + + raise nvae + + elif (LA3_0 == 42) : + LA3_10 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 10, self.input) + + raise nvae + + elif ((45 <= LA3_0 <= 46)) : + LA3_11 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 11, self.input) + + raise nvae + + elif (LA3_0 == 48) : + LA3_12 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 12, self.input) + + raise nvae + + elif (LA3_0 == IDENTIFIER) : + LA3_13 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + elif (True) : + alt3 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 13, self.input) + + raise nvae + + elif (LA3_0 == 58) : + LA3_14 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 14, self.input) + + raise nvae + + elif (LA3_0 == 66) and (self.synpred4()): + alt3 = 1 + elif (LA3_0 == 59) : + LA3_16 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 16, self.input) + + raise nvae + + elif (LA3_0 == 60) : + LA3_17 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 17, self.input) + + raise nvae + + elif ((49 <= LA3_0 <= 57) or LA3_0 == 61) : + LA3_18 = self.input.LA(2) + + if (self.synpred4()) : + alt3 = 1 + elif (self.synpred5()) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 18, self.input) + + raise nvae + + elif (LA3_0 == 62) and (self.synpred4()): + alt3 = 1 + elif (LA3_0 == 26) : + alt3 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("114:1: external_declaration options {k=1; } : ( ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition | declaration | macro_statement ( ';' )? );", 3, 0, self.input) + + raise nvae + + if alt3 == 1: + # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' )=> function_definition + self.following.append(self.FOLLOW_function_definition_in_external_declaration113) + self.function_definition() + self.following.pop() + if self.failed: + return + + + elif alt3 == 2: + # C.g:120:4: declaration + self.following.append(self.FOLLOW_declaration_in_external_declaration118) + self.declaration() + self.following.pop() + if self.failed: + return + + + elif alt3 == 3: + # C.g:121:4: macro_statement ( ';' )? + self.following.append(self.FOLLOW_macro_statement_in_external_declaration123) + self.macro_statement() + self.following.pop() + if self.failed: + return + # C.g:121:20: ( ';' )? + alt2 = 2 + LA2_0 = self.input.LA(1) + + if (LA2_0 == 25) : + alt2 = 1 + if alt2 == 1: + # C.g:121:21: ';' + self.match(self.input, 25, self.FOLLOW_25_in_external_declaration126) + if self.failed: + return + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 2, external_declaration_StartIndex) + + pass + + return + + # $ANTLR end external_declaration + + class function_definition_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start function_definition + # C.g:126:1: function_definition : (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ; + def function_definition(self, ): + self.function_definition_stack.append(function_definition_scope()) + retval = self.function_definition_return() + retval.start = self.input.LT(1) + function_definition_StartIndex = self.input.index() + d = None + + a = None + + b = None + + declarator1 = None + + self.function_definition_stack[-1].ModifierText = '' self.function_definition_stack[-1].DeclText = '' @@ -582,213 +582,213 @@ class CParser(Parser): self.function_definition_stack[-1].LBOffset = 0 self.function_definition_stack[-1].DeclLine = 0 self.function_definition_stack[-1].DeclOffset = 0 - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 3): - return retval - - # C.g:146:2: ( (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ) - # C.g:146:4: (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) - # C.g:146:5: (d= declaration_specifiers )? - alt4 = 2 - LA4 = self.input.LA(1) - if LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33 or LA4 == 34 or LA4 == 35 or LA4 == 36 or LA4 == 37 or LA4 == 38 or LA4 == 39 or LA4 == 40 or LA4 == 41 or LA4 == 42 or LA4 == 45 or LA4 == 46 or LA4 == 48 or LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: - alt4 = 1 - elif LA4 == IDENTIFIER: - LA4 = self.input.LA(2) - if LA4 == 66: - alt4 = 1 - elif LA4 == 58: - LA4_21 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 59: - LA4_22 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 60: - LA4_23 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == IDENTIFIER: - LA4_24 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 62: - LA4_25 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33: - LA4_26 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 34: - LA4_27 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 35: - LA4_28 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 36: - LA4_29 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 37: - LA4_30 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 38: - LA4_31 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 39: - LA4_32 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 40: - LA4_33 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 41: - LA4_34 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 42: - LA4_35 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 45 or LA4 == 46: - LA4_36 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 48: - LA4_37 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: - LA4_38 = self.input.LA(3) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 58: - LA4_14 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 59: - LA4_16 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - elif LA4 == 60: - LA4_17 = self.input.LA(2) - - if (self.synpred7()) : - alt4 = 1 - if alt4 == 1: - # C.g:0:0: d= declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_function_definition157) - d = self.declaration_specifiers() - self.following.pop() - if self.failed: - return retval - - - - self.following.append(self.FOLLOW_declarator_in_function_definition160) - declarator1 = self.declarator() - self.following.pop() - if self.failed: - return retval - # C.g:147:3: ( ( declaration )+ a= compound_statement | b= compound_statement ) - alt6 = 2 - LA6_0 = self.input.LA(1) - - if (LA6_0 == IDENTIFIER or LA6_0 == 26 or (29 <= LA6_0 <= 42) or (45 <= LA6_0 <= 46) or (48 <= LA6_0 <= 61)) : - alt6 = 1 - elif (LA6_0 == 43) : - alt6 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("147:3: ( ( declaration )+ a= compound_statement | b= compound_statement )", 6, 0, self.input) - - raise nvae - - if alt6 == 1: - # C.g:147:5: ( declaration )+ a= compound_statement - # C.g:147:5: ( declaration )+ - cnt5 = 0 - while True: #loop5 - alt5 = 2 - LA5_0 = self.input.LA(1) - - if (LA5_0 == IDENTIFIER or LA5_0 == 26 or (29 <= LA5_0 <= 42) or (45 <= LA5_0 <= 46) or (48 <= LA5_0 <= 61)) : - alt5 = 1 - - - if alt5 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_function_definition166) - self.declaration() - self.following.pop() - if self.failed: - return retval - - - else: - if cnt5 >= 1: - break #loop5 - - if self.backtracking > 0: - self.failed = True - return retval - - eee = EarlyExitException(5, self.input) - raise eee - - cnt5 += 1 - - - self.following.append(self.FOLLOW_compound_statement_in_function_definition171) - a = self.compound_statement() - self.following.pop() - if self.failed: - return retval - - - elif alt6 == 2: - # C.g:148:5: b= compound_statement - self.following.append(self.FOLLOW_compound_statement_in_function_definition180) - b = self.compound_statement() - self.following.pop() - if self.failed: - return retval - - - - if self.backtracking == 0: + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 3): + return retval + + # C.g:146:2: ( (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) ) + # C.g:146:4: (d= declaration_specifiers )? declarator ( ( declaration )+ a= compound_statement | b= compound_statement ) + # C.g:146:5: (d= declaration_specifiers )? + alt4 = 2 + LA4 = self.input.LA(1) + if LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33 or LA4 == 34 or LA4 == 35 or LA4 == 36 or LA4 == 37 or LA4 == 38 or LA4 == 39 or LA4 == 40 or LA4 == 41 or LA4 == 42 or LA4 == 45 or LA4 == 46 or LA4 == 48 or LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: + alt4 = 1 + elif LA4 == IDENTIFIER: + LA4 = self.input.LA(2) + if LA4 == 66: + alt4 = 1 + elif LA4 == 58: + LA4_21 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 59: + LA4_22 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 60: + LA4_23 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == IDENTIFIER: + LA4_24 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 62: + LA4_25 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 29 or LA4 == 30 or LA4 == 31 or LA4 == 32 or LA4 == 33: + LA4_26 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 34: + LA4_27 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 35: + LA4_28 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 36: + LA4_29 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 37: + LA4_30 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 38: + LA4_31 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 39: + LA4_32 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 40: + LA4_33 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 41: + LA4_34 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 42: + LA4_35 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 45 or LA4 == 46: + LA4_36 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 48: + LA4_37 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 49 or LA4 == 50 or LA4 == 51 or LA4 == 52 or LA4 == 53 or LA4 == 54 or LA4 == 55 or LA4 == 56 or LA4 == 57 or LA4 == 61: + LA4_38 = self.input.LA(3) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 58: + LA4_14 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 59: + LA4_16 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + elif LA4 == 60: + LA4_17 = self.input.LA(2) + + if (self.synpred7()) : + alt4 = 1 + if alt4 == 1: + # C.g:0:0: d= declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_function_definition157) + d = self.declaration_specifiers() + self.following.pop() + if self.failed: + return retval + + + + self.following.append(self.FOLLOW_declarator_in_function_definition160) + declarator1 = self.declarator() + self.following.pop() + if self.failed: + return retval + # C.g:147:3: ( ( declaration )+ a= compound_statement | b= compound_statement ) + alt6 = 2 + LA6_0 = self.input.LA(1) + + if (LA6_0 == IDENTIFIER or LA6_0 == 26 or (29 <= LA6_0 <= 42) or (45 <= LA6_0 <= 46) or (48 <= LA6_0 <= 61)) : + alt6 = 1 + elif (LA6_0 == 43) : + alt6 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("147:3: ( ( declaration )+ a= compound_statement | b= compound_statement )", 6, 0, self.input) + + raise nvae + + if alt6 == 1: + # C.g:147:5: ( declaration )+ a= compound_statement + # C.g:147:5: ( declaration )+ + cnt5 = 0 + while True: #loop5 + alt5 = 2 + LA5_0 = self.input.LA(1) + + if (LA5_0 == IDENTIFIER or LA5_0 == 26 or (29 <= LA5_0 <= 42) or (45 <= LA5_0 <= 46) or (48 <= LA5_0 <= 61)) : + alt5 = 1 + + + if alt5 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_function_definition166) + self.declaration() + self.following.pop() + if self.failed: + return retval + + + else: + if cnt5 >= 1: + break #loop5 + + if self.backtracking > 0: + self.failed = True + return retval + + eee = EarlyExitException(5, self.input) + raise eee + + cnt5 += 1 + + + self.following.append(self.FOLLOW_compound_statement_in_function_definition171) + a = self.compound_statement() + self.following.pop() + if self.failed: + return retval + + + elif alt6 == 2: + # C.g:148:5: b= compound_statement + self.following.append(self.FOLLOW_compound_statement_in_function_definition180) + b = self.compound_statement() + self.following.pop() + if self.failed: + return retval + + + + if self.backtracking == 0: if d != None: self.function_definition_stack[-1].ModifierText = self.input.toString(d.start,d.stop) @@ -803,18042 +803,18042 @@ class CParser(Parser): else: self.function_definition_stack[-1].LBLine = b.start.line self.function_definition_stack[-1].LBOffset = b.start.charPositionInLine - - - - - - retval.stop = self.input.LT(-1) - - if self.backtracking == 0: + + + + + + retval.stop = self.input.LT(-1) + + if self.backtracking == 0: self.StoreFunctionDefinition(retval.start.line, retval.start.charPositionInLine, retval.stop.line, retval.stop.charPositionInLine, self.function_definition_stack[-1].ModifierText, self.function_definition_stack[-1].DeclText, self.function_definition_stack[-1].LBLine, self.function_definition_stack[-1].LBOffset, self.function_definition_stack[-1].DeclLine, self.function_definition_stack[-1].DeclOffset) - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 3, function_definition_StartIndex) - - self.function_definition_stack.pop() - pass - - return retval - - # $ANTLR end function_definition - - - # $ANTLR start declaration - # C.g:166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ); - def declaration(self, ): - - declaration_StartIndex = self.input.index() - a = None - d = None - e = None - b = None - - c = None - - s = None - - t = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 4): - return - - # C.g:167:2: (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ) - alt9 = 2 - LA9_0 = self.input.LA(1) - - if (LA9_0 == 26) : - alt9 = 1 - elif (LA9_0 == IDENTIFIER or (29 <= LA9_0 <= 42) or (45 <= LA9_0 <= 46) or (48 <= LA9_0 <= 61)) : - alt9 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' );", 9, 0, self.input) - - raise nvae - - if alt9 == 1: - # C.g:167:4: a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' - a = self.input.LT(1) - self.match(self.input, 26, self.FOLLOW_26_in_declaration203) - if self.failed: - return - # C.g:167:17: (b= declaration_specifiers )? - alt7 = 2 - LA7 = self.input.LA(1) - if LA7 == 29 or LA7 == 30 or LA7 == 31 or LA7 == 32 or LA7 == 33 or LA7 == 34 or LA7 == 35 or LA7 == 36 or LA7 == 37 or LA7 == 38 or LA7 == 39 or LA7 == 40 or LA7 == 41 or LA7 == 42 or LA7 == 45 or LA7 == 46 or LA7 == 48 or LA7 == 49 or LA7 == 50 or LA7 == 51 or LA7 == 52 or LA7 == 53 or LA7 == 54 or LA7 == 55 or LA7 == 56 or LA7 == 57 or LA7 == 61: - alt7 = 1 - elif LA7 == IDENTIFIER: - LA7_13 = self.input.LA(2) - - if (LA7_13 == 62) : - LA7_21 = self.input.LA(3) - - if (self.synpred10()) : - alt7 = 1 - elif (LA7_13 == IDENTIFIER or (29 <= LA7_13 <= 42) or (45 <= LA7_13 <= 46) or (48 <= LA7_13 <= 61) or LA7_13 == 66) : - alt7 = 1 - elif LA7 == 58: - LA7_14 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - elif LA7 == 59: - LA7_16 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - elif LA7 == 60: - LA7_17 = self.input.LA(2) - - if (self.synpred10()) : - alt7 = 1 - if alt7 == 1: - # C.g:0:0: b= declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_declaration207) - b = self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - - self.following.append(self.FOLLOW_init_declarator_list_in_declaration216) - c = self.init_declarator_list() - self.following.pop() - if self.failed: - return - d = self.input.LT(1) - self.match(self.input, 25, self.FOLLOW_25_in_declaration220) - if self.failed: - return - if self.backtracking == 0: + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 3, function_definition_StartIndex) + + self.function_definition_stack.pop() + pass + + return retval + + # $ANTLR end function_definition + + + # $ANTLR start declaration + # C.g:166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ); + def declaration(self, ): + + declaration_StartIndex = self.input.index() + a = None + d = None + e = None + b = None + + c = None + + s = None + + t = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 4): + return + + # C.g:167:2: (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' ) + alt9 = 2 + LA9_0 = self.input.LA(1) + + if (LA9_0 == 26) : + alt9 = 1 + elif (LA9_0 == IDENTIFIER or (29 <= LA9_0 <= 42) or (45 <= LA9_0 <= 46) or (48 <= LA9_0 <= 61)) : + alt9 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("166:1: declaration : (a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' | s= declaration_specifiers (t= init_declarator_list )? e= ';' );", 9, 0, self.input) + + raise nvae + + if alt9 == 1: + # C.g:167:4: a= 'typedef' (b= declaration_specifiers )? c= init_declarator_list d= ';' + a = self.input.LT(1) + self.match(self.input, 26, self.FOLLOW_26_in_declaration203) + if self.failed: + return + # C.g:167:17: (b= declaration_specifiers )? + alt7 = 2 + LA7 = self.input.LA(1) + if LA7 == 29 or LA7 == 30 or LA7 == 31 or LA7 == 32 or LA7 == 33 or LA7 == 34 or LA7 == 35 or LA7 == 36 or LA7 == 37 or LA7 == 38 or LA7 == 39 or LA7 == 40 or LA7 == 41 or LA7 == 42 or LA7 == 45 or LA7 == 46 or LA7 == 48 or LA7 == 49 or LA7 == 50 or LA7 == 51 or LA7 == 52 or LA7 == 53 or LA7 == 54 or LA7 == 55 or LA7 == 56 or LA7 == 57 or LA7 == 61: + alt7 = 1 + elif LA7 == IDENTIFIER: + LA7_13 = self.input.LA(2) + + if (LA7_13 == 62) : + LA7_21 = self.input.LA(3) + + if (self.synpred10()) : + alt7 = 1 + elif (LA7_13 == IDENTIFIER or (29 <= LA7_13 <= 42) or (45 <= LA7_13 <= 46) or (48 <= LA7_13 <= 61) or LA7_13 == 66) : + alt7 = 1 + elif LA7 == 58: + LA7_14 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + elif LA7 == 59: + LA7_16 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + elif LA7 == 60: + LA7_17 = self.input.LA(2) + + if (self.synpred10()) : + alt7 = 1 + if alt7 == 1: + # C.g:0:0: b= declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_declaration207) + b = self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + + self.following.append(self.FOLLOW_init_declarator_list_in_declaration216) + c = self.init_declarator_list() + self.following.pop() + if self.failed: + return + d = self.input.LT(1) + self.match(self.input, 25, self.FOLLOW_25_in_declaration220) + if self.failed: + return + if self.backtracking == 0: if b != None: self.StoreTypedefDefinition(a.line, a.charPositionInLine, d.line, d.charPositionInLine, self.input.toString(b.start,b.stop), self.input.toString(c.start,c.stop)) else: self.StoreTypedefDefinition(a.line, a.charPositionInLine, d.line, d.charPositionInLine, '', self.input.toString(c.start,c.stop)) - - - - - elif alt9 == 2: - # C.g:175:4: s= declaration_specifiers (t= init_declarator_list )? e= ';' - self.following.append(self.FOLLOW_declaration_specifiers_in_declaration234) - s = self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:175:30: (t= init_declarator_list )? - alt8 = 2 - LA8_0 = self.input.LA(1) - - if (LA8_0 == IDENTIFIER or (58 <= LA8_0 <= 60) or LA8_0 == 62 or LA8_0 == 66) : - alt8 = 1 - if alt8 == 1: - # C.g:0:0: t= init_declarator_list - self.following.append(self.FOLLOW_init_declarator_list_in_declaration238) - t = self.init_declarator_list() - self.following.pop() - if self.failed: - return - - - - e = self.input.LT(1) - self.match(self.input, 25, self.FOLLOW_25_in_declaration243) - if self.failed: - return - if self.backtracking == 0: + + + + + elif alt9 == 2: + # C.g:175:4: s= declaration_specifiers (t= init_declarator_list )? e= ';' + self.following.append(self.FOLLOW_declaration_specifiers_in_declaration234) + s = self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:175:30: (t= init_declarator_list )? + alt8 = 2 + LA8_0 = self.input.LA(1) + + if (LA8_0 == IDENTIFIER or (58 <= LA8_0 <= 60) or LA8_0 == 62 or LA8_0 == 66) : + alt8 = 1 + if alt8 == 1: + # C.g:0:0: t= init_declarator_list + self.following.append(self.FOLLOW_init_declarator_list_in_declaration238) + t = self.init_declarator_list() + self.following.pop() + if self.failed: + return + + + + e = self.input.LT(1) + self.match(self.input, 25, self.FOLLOW_25_in_declaration243) + if self.failed: + return + if self.backtracking == 0: if t != None: self.StoreVariableDeclaration(s.start.line, s.start.charPositionInLine, t.start.line, t.start.charPositionInLine, self.input.toString(s.start,s.stop), self.input.toString(t.start,t.stop)) - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 4, declaration_StartIndex) - - pass - - return - - # $ANTLR end declaration - - class declaration_specifiers_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start declaration_specifiers - # C.g:182:1: declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ; - def declaration_specifiers(self, ): - - retval = self.declaration_specifiers_return() - retval.start = self.input.LT(1) - declaration_specifiers_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 5): - return retval - - # C.g:183:2: ( ( storage_class_specifier | type_specifier | type_qualifier )+ ) - # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ - # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ - cnt10 = 0 - while True: #loop10 - alt10 = 4 - LA10 = self.input.LA(1) - if LA10 == 58: - LA10_2 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 59: - LA10_3 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 60: - LA10_4 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == IDENTIFIER: - LA10_5 = self.input.LA(2) - - if (self.synpred14()) : - alt10 = 2 - - - elif LA10 == 53: - LA10_9 = self.input.LA(2) - - if (self.synpred15()) : - alt10 = 3 - - - elif LA10 == 29 or LA10 == 30 or LA10 == 31 or LA10 == 32 or LA10 == 33: - alt10 = 1 - elif LA10 == 34 or LA10 == 35 or LA10 == 36 or LA10 == 37 or LA10 == 38 or LA10 == 39 or LA10 == 40 or LA10 == 41 or LA10 == 42 or LA10 == 45 or LA10 == 46 or LA10 == 48: - alt10 = 2 - elif LA10 == 49 or LA10 == 50 or LA10 == 51 or LA10 == 52 or LA10 == 54 or LA10 == 55 or LA10 == 56 or LA10 == 57 or LA10 == 61: - alt10 = 3 - - if alt10 == 1: - # C.g:183:10: storage_class_specifier - self.following.append(self.FOLLOW_storage_class_specifier_in_declaration_specifiers264) - self.storage_class_specifier() - self.following.pop() - if self.failed: - return retval - - - elif alt10 == 2: - # C.g:184:7: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_declaration_specifiers272) - self.type_specifier() - self.following.pop() - if self.failed: - return retval - - - elif alt10 == 3: - # C.g:185:13: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_declaration_specifiers286) - self.type_qualifier() - self.following.pop() - if self.failed: - return retval - - - else: - if cnt10 >= 1: - break #loop10 - - if self.backtracking > 0: - self.failed = True - return retval - - eee = EarlyExitException(10, self.input) - raise eee - - cnt10 += 1 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 5, declaration_specifiers_StartIndex) - - pass - - return retval - - # $ANTLR end declaration_specifiers - - class init_declarator_list_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start init_declarator_list - # C.g:189:1: init_declarator_list : init_declarator ( ',' init_declarator )* ; - def init_declarator_list(self, ): - - retval = self.init_declarator_list_return() - retval.start = self.input.LT(1) - init_declarator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 6): - return retval - - # C.g:190:2: ( init_declarator ( ',' init_declarator )* ) - # C.g:190:4: init_declarator ( ',' init_declarator )* - self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list308) - self.init_declarator() - self.following.pop() - if self.failed: - return retval - # C.g:190:20: ( ',' init_declarator )* - while True: #loop11 - alt11 = 2 - LA11_0 = self.input.LA(1) - - if (LA11_0 == 27) : - alt11 = 1 - - - if alt11 == 1: - # C.g:190:21: ',' init_declarator - self.match(self.input, 27, self.FOLLOW_27_in_init_declarator_list311) - if self.failed: - return retval - self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list313) - self.init_declarator() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop11 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 6, init_declarator_list_StartIndex) - - pass - - return retval - - # $ANTLR end init_declarator_list - - - # $ANTLR start init_declarator - # C.g:193:1: init_declarator : declarator ( '=' initializer )? ; - def init_declarator(self, ): - - init_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 7): - return - - # C.g:194:2: ( declarator ( '=' initializer )? ) - # C.g:194:4: declarator ( '=' initializer )? - self.following.append(self.FOLLOW_declarator_in_init_declarator326) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:194:15: ( '=' initializer )? - alt12 = 2 - LA12_0 = self.input.LA(1) - - if (LA12_0 == 28) : - alt12 = 1 - if alt12 == 1: - # C.g:194:16: '=' initializer - self.match(self.input, 28, self.FOLLOW_28_in_init_declarator329) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_in_init_declarator331) - self.initializer() - self.following.pop() - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 7, init_declarator_StartIndex) - - pass - - return - - # $ANTLR end init_declarator - - - # $ANTLR start storage_class_specifier - # C.g:197:1: storage_class_specifier : ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ); - def storage_class_specifier(self, ): - - storage_class_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 8): - return - - # C.g:198:2: ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ) - # C.g: - if (29 <= self.input.LA(1) <= 33): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_storage_class_specifier0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 8, storage_class_specifier_StartIndex) - - pass - - return - - # $ANTLR end storage_class_specifier - - - # $ANTLR start type_specifier - # C.g:205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ); - def type_specifier(self, ): - - type_specifier_StartIndex = self.input.index() - s = None - - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 9): - return - - # C.g:206:2: ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ) - alt13 = 12 - LA13_0 = self.input.LA(1) - - if (LA13_0 == 34) : - alt13 = 1 - elif (LA13_0 == 35) : - alt13 = 2 - elif (LA13_0 == 36) : - alt13 = 3 - elif (LA13_0 == 37) : - alt13 = 4 - elif (LA13_0 == 38) : - alt13 = 5 - elif (LA13_0 == 39) : - alt13 = 6 - elif (LA13_0 == 40) : - alt13 = 7 - elif (LA13_0 == 41) : - alt13 = 8 - elif (LA13_0 == 42) : - alt13 = 9 - elif ((45 <= LA13_0 <= 46)) : - alt13 = 10 - elif (LA13_0 == 48) : - alt13 = 11 - elif (LA13_0 == IDENTIFIER) and (self.synpred34()): - alt13 = 12 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id );", 13, 0, self.input) - - raise nvae - - if alt13 == 1: - # C.g:206:4: 'void' - self.match(self.input, 34, self.FOLLOW_34_in_type_specifier376) - if self.failed: - return - - - elif alt13 == 2: - # C.g:207:4: 'char' - self.match(self.input, 35, self.FOLLOW_35_in_type_specifier381) - if self.failed: - return - - - elif alt13 == 3: - # C.g:208:4: 'short' - self.match(self.input, 36, self.FOLLOW_36_in_type_specifier386) - if self.failed: - return - - - elif alt13 == 4: - # C.g:209:4: 'int' - self.match(self.input, 37, self.FOLLOW_37_in_type_specifier391) - if self.failed: - return - - - elif alt13 == 5: - # C.g:210:4: 'long' - self.match(self.input, 38, self.FOLLOW_38_in_type_specifier396) - if self.failed: - return - - - elif alt13 == 6: - # C.g:211:4: 'float' - self.match(self.input, 39, self.FOLLOW_39_in_type_specifier401) - if self.failed: - return - - - elif alt13 == 7: - # C.g:212:4: 'double' - self.match(self.input, 40, self.FOLLOW_40_in_type_specifier406) - if self.failed: - return - - - elif alt13 == 8: - # C.g:213:4: 'signed' - self.match(self.input, 41, self.FOLLOW_41_in_type_specifier411) - if self.failed: - return - - - elif alt13 == 9: - # C.g:214:4: 'unsigned' - self.match(self.input, 42, self.FOLLOW_42_in_type_specifier416) - if self.failed: - return - - - elif alt13 == 10: - # C.g:215:4: s= struct_or_union_specifier - self.following.append(self.FOLLOW_struct_or_union_specifier_in_type_specifier423) - s = self.struct_or_union_specifier() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - - if s.stop != None: - self.StoreStructUnionDefinition(s.start.line, s.start.charPositionInLine, s.stop.line, s.stop.charPositionInLine, self.input.toString(s.start,s.stop)) - - - - - elif alt13 == 11: - # C.g:220:4: e= enum_specifier - self.following.append(self.FOLLOW_enum_specifier_in_type_specifier433) - e = self.enum_specifier() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - - if e.stop != None: - self.StoreEnumerationDefinition(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - elif alt13 == 12: - # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator )=> type_id - self.following.append(self.FOLLOW_type_id_in_type_specifier451) - self.type_id() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 9, type_specifier_StartIndex) - - pass - - return - - # $ANTLR end type_specifier - - - # $ANTLR start type_id - # C.g:228:1: type_id : IDENTIFIER ; - def type_id(self, ): - - type_id_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 10): - return - - # C.g:229:5: ( IDENTIFIER ) - # C.g:229:9: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_type_id467) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 10, type_id_StartIndex) - - pass - - return - - # $ANTLR end type_id - - class struct_or_union_specifier_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start struct_or_union_specifier - # C.g:233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ); - def struct_or_union_specifier(self, ): - - retval = self.struct_or_union_specifier_return() - retval.start = self.input.LT(1) - struct_or_union_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 11): - return retval - - # C.g:235:2: ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ) - alt15 = 2 - LA15_0 = self.input.LA(1) - - if ((45 <= LA15_0 <= 46)) : - LA15_1 = self.input.LA(2) - - if (LA15_1 == IDENTIFIER) : - LA15_2 = self.input.LA(3) - - if (LA15_2 == 43) : - alt15 = 1 - elif (LA15_2 == EOF or LA15_2 == IDENTIFIER or LA15_2 == 25 or LA15_2 == 27 or (29 <= LA15_2 <= 42) or (45 <= LA15_2 <= 64) or LA15_2 == 66) : - alt15 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 2, self.input) - - raise nvae - - elif (LA15_1 == 43) : - alt15 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 0, self.input) - - raise nvae - - if alt15 == 1: - # C.g:235:4: struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' - self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier494) - self.struct_or_union() - self.following.pop() - if self.failed: - return retval - # C.g:235:20: ( IDENTIFIER )? - alt14 = 2 - LA14_0 = self.input.LA(1) - - if (LA14_0 == IDENTIFIER) : - alt14 = 1 - if alt14 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier496) - if self.failed: - return retval - - - - self.match(self.input, 43, self.FOLLOW_43_in_struct_or_union_specifier499) - if self.failed: - return retval - self.following.append(self.FOLLOW_struct_declaration_list_in_struct_or_union_specifier501) - self.struct_declaration_list() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 44, self.FOLLOW_44_in_struct_or_union_specifier503) - if self.failed: - return retval - - - elif alt15 == 2: - # C.g:236:4: struct_or_union IDENTIFIER - self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier508) - self.struct_or_union() - self.following.pop() - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier510) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 11, struct_or_union_specifier_StartIndex) - - pass - - return retval - - # $ANTLR end struct_or_union_specifier - - - # $ANTLR start struct_or_union - # C.g:239:1: struct_or_union : ( 'struct' | 'union' ); - def struct_or_union(self, ): - - struct_or_union_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 12): - return - - # C.g:240:2: ( 'struct' | 'union' ) - # C.g: - if (45 <= self.input.LA(1) <= 46): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_struct_or_union0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 12, struct_or_union_StartIndex) - - pass - - return - - # $ANTLR end struct_or_union - - - # $ANTLR start struct_declaration_list - # C.g:244:1: struct_declaration_list : ( struct_declaration )+ ; - def struct_declaration_list(self, ): - - struct_declaration_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 13): - return - - # C.g:245:2: ( ( struct_declaration )+ ) - # C.g:245:4: ( struct_declaration )+ - # C.g:245:4: ( struct_declaration )+ - cnt16 = 0 - while True: #loop16 - alt16 = 2 - LA16_0 = self.input.LA(1) - - if (LA16_0 == IDENTIFIER or (34 <= LA16_0 <= 42) or (45 <= LA16_0 <= 46) or (48 <= LA16_0 <= 61)) : - alt16 = 1 - - - if alt16 == 1: - # C.g:0:0: struct_declaration - self.following.append(self.FOLLOW_struct_declaration_in_struct_declaration_list537) - self.struct_declaration() - self.following.pop() - if self.failed: - return - - - else: - if cnt16 >= 1: - break #loop16 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(16, self.input) - raise eee - - cnt16 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 13, struct_declaration_list_StartIndex) - - pass - - return - - # $ANTLR end struct_declaration_list - - - # $ANTLR start struct_declaration - # C.g:248:1: struct_declaration : specifier_qualifier_list struct_declarator_list ';' ; - def struct_declaration(self, ): - - struct_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 14): - return - - # C.g:249:2: ( specifier_qualifier_list struct_declarator_list ';' ) - # C.g:249:4: specifier_qualifier_list struct_declarator_list ';' - self.following.append(self.FOLLOW_specifier_qualifier_list_in_struct_declaration549) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_struct_declarator_list_in_struct_declaration551) - self.struct_declarator_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_struct_declaration553) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 14, struct_declaration_StartIndex) - - pass - - return - - # $ANTLR end struct_declaration - - - # $ANTLR start specifier_qualifier_list - # C.g:252:1: specifier_qualifier_list : ( type_qualifier | type_specifier )+ ; - def specifier_qualifier_list(self, ): - - specifier_qualifier_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 15): - return - - # C.g:253:2: ( ( type_qualifier | type_specifier )+ ) - # C.g:253:4: ( type_qualifier | type_specifier )+ - # C.g:253:4: ( type_qualifier | type_specifier )+ - cnt17 = 0 - while True: #loop17 - alt17 = 3 - LA17 = self.input.LA(1) - if LA17 == 58: - LA17_2 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == 59: - LA17_3 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == 60: - LA17_4 = self.input.LA(2) - - if (self.synpred39()) : - alt17 = 1 - - - elif LA17 == IDENTIFIER: - LA17 = self.input.LA(2) - if LA17 == EOF or LA17 == IDENTIFIER or LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48 or LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 58 or LA17 == 59 or LA17 == 60 or LA17 == 61 or LA17 == 63 or LA17 == 66: - alt17 = 2 - elif LA17 == 62: - LA17_94 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - elif LA17 == 47: - LA17_95 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - elif LA17 == 64: - LA17_96 = self.input.LA(3) - - if (self.synpred40()) : - alt17 = 2 - - - - elif LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 61: - alt17 = 1 - elif LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48: - alt17 = 2 - - if alt17 == 1: - # C.g:253:6: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_specifier_qualifier_list566) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - elif alt17 == 2: - # C.g:253:23: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_specifier_qualifier_list570) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt17 >= 1: - break #loop17 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(17, self.input) - raise eee - - cnt17 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 15, specifier_qualifier_list_StartIndex) - - pass - - return - - # $ANTLR end specifier_qualifier_list - - - # $ANTLR start struct_declarator_list - # C.g:256:1: struct_declarator_list : struct_declarator ( ',' struct_declarator )* ; - def struct_declarator_list(self, ): - - struct_declarator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 16): - return - - # C.g:257:2: ( struct_declarator ( ',' struct_declarator )* ) - # C.g:257:4: struct_declarator ( ',' struct_declarator )* - self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list584) - self.struct_declarator() - self.following.pop() - if self.failed: - return - # C.g:257:22: ( ',' struct_declarator )* - while True: #loop18 - alt18 = 2 - LA18_0 = self.input.LA(1) - - if (LA18_0 == 27) : - alt18 = 1 - - - if alt18 == 1: - # C.g:257:23: ',' struct_declarator - self.match(self.input, 27, self.FOLLOW_27_in_struct_declarator_list587) - if self.failed: - return - self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list589) - self.struct_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop18 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 16, struct_declarator_list_StartIndex) - - pass - - return - - # $ANTLR end struct_declarator_list - - - # $ANTLR start struct_declarator - # C.g:260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression ); - def struct_declarator(self, ): - - struct_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 17): - return - - # C.g:261:2: ( declarator ( ':' constant_expression )? | ':' constant_expression ) - alt20 = 2 - LA20_0 = self.input.LA(1) - - if (LA20_0 == IDENTIFIER or (58 <= LA20_0 <= 60) or LA20_0 == 62 or LA20_0 == 66) : - alt20 = 1 - elif (LA20_0 == 47) : - alt20 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression );", 20, 0, self.input) - - raise nvae - - if alt20 == 1: - # C.g:261:4: declarator ( ':' constant_expression )? - self.following.append(self.FOLLOW_declarator_in_struct_declarator602) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:261:15: ( ':' constant_expression )? - alt19 = 2 - LA19_0 = self.input.LA(1) - - if (LA19_0 == 47) : - alt19 = 1 - if alt19 == 1: - # C.g:261:16: ':' constant_expression - self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator605) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_struct_declarator607) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - - - elif alt20 == 2: - # C.g:262:4: ':' constant_expression - self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator614) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_struct_declarator616) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 17, struct_declarator_StartIndex) - - pass - - return - - # $ANTLR end struct_declarator - - class enum_specifier_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start enum_specifier - # C.g:265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ); - def enum_specifier(self, ): - - retval = self.enum_specifier_return() - retval.start = self.input.LT(1) - enum_specifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 18): - return retval - - # C.g:267:2: ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ) - alt23 = 3 - LA23_0 = self.input.LA(1) - - if (LA23_0 == 48) : - LA23_1 = self.input.LA(2) - - if (LA23_1 == IDENTIFIER) : - LA23_2 = self.input.LA(3) - - if (LA23_2 == 43) : - alt23 = 2 - elif (LA23_2 == EOF or LA23_2 == IDENTIFIER or LA23_2 == 25 or LA23_2 == 27 or (29 <= LA23_2 <= 42) or (45 <= LA23_2 <= 64) or LA23_2 == 66) : - alt23 = 3 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 2, self.input) - - raise nvae - - elif (LA23_1 == 43) : - alt23 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 0, self.input) - - raise nvae - - if alt23 == 1: - # C.g:267:4: 'enum' '{' enumerator_list ( ',' )? '}' - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier634) - if self.failed: - return retval - self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier636) - if self.failed: - return retval - self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier638) - self.enumerator_list() - self.following.pop() - if self.failed: - return retval - # C.g:267:31: ( ',' )? - alt21 = 2 - LA21_0 = self.input.LA(1) - - if (LA21_0 == 27) : - alt21 = 1 - if alt21 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier640) - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier643) - if self.failed: - return retval - - - elif alt23 == 2: - # C.g:268:4: 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier648) - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier650) - if self.failed: - return retval - self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier652) - if self.failed: - return retval - self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier654) - self.enumerator_list() - self.following.pop() - if self.failed: - return retval - # C.g:268:42: ( ',' )? - alt22 = 2 - LA22_0 = self.input.LA(1) - - if (LA22_0 == 27) : - alt22 = 1 - if alt22 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier656) - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier659) - if self.failed: - return retval - - - elif alt23 == 3: - # C.g:269:4: 'enum' IDENTIFIER - self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier664) - if self.failed: - return retval - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier666) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 18, enum_specifier_StartIndex) - - pass - - return retval - - # $ANTLR end enum_specifier - - - # $ANTLR start enumerator_list - # C.g:272:1: enumerator_list : enumerator ( ',' enumerator )* ; - def enumerator_list(self, ): - - enumerator_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 19): - return - - # C.g:273:2: ( enumerator ( ',' enumerator )* ) - # C.g:273:4: enumerator ( ',' enumerator )* - self.following.append(self.FOLLOW_enumerator_in_enumerator_list677) - self.enumerator() - self.following.pop() - if self.failed: - return - # C.g:273:15: ( ',' enumerator )* - while True: #loop24 - alt24 = 2 - LA24_0 = self.input.LA(1) - - if (LA24_0 == 27) : - LA24_1 = self.input.LA(2) - - if (LA24_1 == IDENTIFIER) : - alt24 = 1 - - - - - if alt24 == 1: - # C.g:273:16: ',' enumerator - self.match(self.input, 27, self.FOLLOW_27_in_enumerator_list680) - if self.failed: - return - self.following.append(self.FOLLOW_enumerator_in_enumerator_list682) - self.enumerator() - self.following.pop() - if self.failed: - return - - - else: - break #loop24 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 19, enumerator_list_StartIndex) - - pass - - return - - # $ANTLR end enumerator_list - - - # $ANTLR start enumerator - # C.g:276:1: enumerator : IDENTIFIER ( '=' constant_expression )? ; - def enumerator(self, ): - - enumerator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 20): - return - - # C.g:277:2: ( IDENTIFIER ( '=' constant_expression )? ) - # C.g:277:4: IDENTIFIER ( '=' constant_expression )? - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enumerator695) - if self.failed: - return - # C.g:277:15: ( '=' constant_expression )? - alt25 = 2 - LA25_0 = self.input.LA(1) - - if (LA25_0 == 28) : - alt25 = 1 - if alt25 == 1: - # C.g:277:16: '=' constant_expression - self.match(self.input, 28, self.FOLLOW_28_in_enumerator698) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_enumerator700) - self.constant_expression() - self.following.pop() - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 20, enumerator_StartIndex) - - pass - - return - - # $ANTLR end enumerator - - - # $ANTLR start type_qualifier - # C.g:280:1: type_qualifier : ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ); - def type_qualifier(self, ): - - type_qualifier_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 21): - return - - # C.g:281:2: ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ) - # C.g: - if (49 <= self.input.LA(1) <= 61): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_type_qualifier0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 21, type_qualifier_StartIndex) - - pass - - return - - # $ANTLR end type_qualifier - - class declarator_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start declarator - # C.g:296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ); - def declarator(self, ): - - retval = self.declarator_return() - retval.start = self.input.LT(1) - declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 22): - return retval - - # C.g:297:2: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ) - alt30 = 2 - LA30_0 = self.input.LA(1) - - if (LA30_0 == 66) : - LA30_1 = self.input.LA(2) - - if (self.synpred66()) : - alt30 = 1 - elif (True) : - alt30 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 1, self.input) - - raise nvae - - elif (LA30_0 == IDENTIFIER or (58 <= LA30_0 <= 60) or LA30_0 == 62) : - alt30 = 1 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 0, self.input) - - raise nvae - - if alt30 == 1: - # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator - # C.g:297:4: ( pointer )? - alt26 = 2 - LA26_0 = self.input.LA(1) - - if (LA26_0 == 66) : - alt26 = 1 - if alt26 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_declarator784) - self.pointer() - self.following.pop() - if self.failed: - return retval - - - - # C.g:297:13: ( 'EFIAPI' )? - alt27 = 2 - LA27_0 = self.input.LA(1) - - if (LA27_0 == 58) : - alt27 = 1 - if alt27 == 1: - # C.g:297:14: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_declarator788) - if self.failed: - return retval - - - - # C.g:297:25: ( 'EFI_BOOTSERVICE' )? - alt28 = 2 - LA28_0 = self.input.LA(1) - - if (LA28_0 == 59) : - alt28 = 1 - if alt28 == 1: - # C.g:297:26: 'EFI_BOOTSERVICE' - self.match(self.input, 59, self.FOLLOW_59_in_declarator793) - if self.failed: - return retval - - - - # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? - alt29 = 2 - LA29_0 = self.input.LA(1) - - if (LA29_0 == 60) : - alt29 = 1 - if alt29 == 1: - # C.g:297:47: 'EFI_RUNTIMESERVICE' - self.match(self.input, 60, self.FOLLOW_60_in_declarator798) - if self.failed: - return retval - - - - self.following.append(self.FOLLOW_direct_declarator_in_declarator802) - self.direct_declarator() - self.following.pop() - if self.failed: - return retval - - - elif alt30 == 2: - # C.g:299:4: pointer - self.following.append(self.FOLLOW_pointer_in_declarator808) - self.pointer() - self.following.pop() - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 22, declarator_StartIndex) - - pass - - return retval - - # $ANTLR end declarator - - - # $ANTLR start direct_declarator - # C.g:302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ); - def direct_declarator(self, ): - - direct_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 23): - return - - # C.g:303:2: ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ) - alt34 = 2 - LA34_0 = self.input.LA(1) - - if (LA34_0 == IDENTIFIER) : - alt34 = 1 - elif (LA34_0 == 62) : - alt34 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ );", 34, 0, self.input) - - raise nvae - - if alt34 == 1: - # C.g:303:4: IDENTIFIER ( declarator_suffix )* - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_direct_declarator819) - if self.failed: - return - # C.g:303:15: ( declarator_suffix )* - while True: #loop31 - alt31 = 2 - LA31_0 = self.input.LA(1) - - if (LA31_0 == 62) : - LA31 = self.input.LA(2) - if LA31 == 63: - LA31_30 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 58: - LA31_31 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 66: - LA31_32 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 59: - LA31_33 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 60: - LA31_34 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == IDENTIFIER: - LA31_35 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 29 or LA31 == 30 or LA31 == 31 or LA31 == 32 or LA31 == 33: - LA31_37 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 34: - LA31_38 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 35: - LA31_39 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 36: - LA31_40 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 37: - LA31_41 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 38: - LA31_42 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 39: - LA31_43 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 40: - LA31_44 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 41: - LA31_45 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 42: - LA31_46 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 45 or LA31 == 46: - LA31_47 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 48: - LA31_48 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 49 or LA31 == 50 or LA31 == 51 or LA31 == 52 or LA31 == 53 or LA31 == 54 or LA31 == 55 or LA31 == 56 or LA31 == 57 or LA31 == 61: - LA31_49 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - - elif (LA31_0 == 64) : - LA31 = self.input.LA(2) - if LA31 == 65: - LA31_51 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 62: - LA31_52 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == IDENTIFIER: - LA31_53 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == HEX_LITERAL: - LA31_54 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == OCTAL_LITERAL: - LA31_55 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == DECIMAL_LITERAL: - LA31_56 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == CHARACTER_LITERAL: - LA31_57 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == STRING_LITERAL: - LA31_58 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == FLOATING_POINT_LITERAL: - LA31_59 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 72: - LA31_60 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 73: - LA31_61 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 66 or LA31 == 68 or LA31 == 69 or LA31 == 77 or LA31 == 78 or LA31 == 79: - LA31_62 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - elif LA31 == 74: - LA31_63 = self.input.LA(3) - - if (self.synpred67()) : - alt31 = 1 - - - - - - if alt31 == 1: - # C.g:0:0: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator821) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - break #loop31 - - - - - elif alt34 == 2: - # C.g:304:4: '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ - self.match(self.input, 62, self.FOLLOW_62_in_direct_declarator827) - if self.failed: - return - # C.g:304:8: ( 'EFIAPI' )? - alt32 = 2 - LA32_0 = self.input.LA(1) - - if (LA32_0 == 58) : - LA32_1 = self.input.LA(2) - - if (self.synpred69()) : - alt32 = 1 - if alt32 == 1: - # C.g:304:9: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_direct_declarator830) - if self.failed: - return - - - - self.following.append(self.FOLLOW_declarator_in_direct_declarator834) - self.declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_direct_declarator836) - if self.failed: - return - # C.g:304:35: ( declarator_suffix )+ - cnt33 = 0 - while True: #loop33 - alt33 = 2 - LA33_0 = self.input.LA(1) - - if (LA33_0 == 62) : - LA33 = self.input.LA(2) - if LA33 == 63: - LA33_30 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 58: - LA33_31 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 66: - LA33_32 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 59: - LA33_33 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 60: - LA33_34 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == IDENTIFIER: - LA33_35 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 29 or LA33 == 30 or LA33 == 31 or LA33 == 32 or LA33 == 33: - LA33_37 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 34: - LA33_38 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 35: - LA33_39 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 36: - LA33_40 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 37: - LA33_41 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 38: - LA33_42 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 39: - LA33_43 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 40: - LA33_44 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 41: - LA33_45 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 42: - LA33_46 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 45 or LA33 == 46: - LA33_47 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 48: - LA33_48 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 49 or LA33 == 50 or LA33 == 51 or LA33 == 52 or LA33 == 53 or LA33 == 54 or LA33 == 55 or LA33 == 56 or LA33 == 57 or LA33 == 61: - LA33_49 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - - elif (LA33_0 == 64) : - LA33 = self.input.LA(2) - if LA33 == 65: - LA33_51 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 62: - LA33_52 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == IDENTIFIER: - LA33_53 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == HEX_LITERAL: - LA33_54 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == OCTAL_LITERAL: - LA33_55 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == DECIMAL_LITERAL: - LA33_56 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == CHARACTER_LITERAL: - LA33_57 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == STRING_LITERAL: - LA33_58 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == FLOATING_POINT_LITERAL: - LA33_59 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 72: - LA33_60 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 73: - LA33_61 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 66 or LA33 == 68 or LA33 == 69 or LA33 == 77 or LA33 == 78 or LA33 == 79: - LA33_62 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - elif LA33 == 74: - LA33_63 = self.input.LA(3) - - if (self.synpred70()) : - alt33 = 1 - - - - - - if alt33 == 1: - # C.g:0:0: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator838) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - if cnt33 >= 1: - break #loop33 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(33, self.input) - raise eee - - cnt33 += 1 - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 23, direct_declarator_StartIndex) - - pass - - return - - # $ANTLR end direct_declarator - - - # $ANTLR start declarator_suffix - # C.g:307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ); - def declarator_suffix(self, ): - - declarator_suffix_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 24): - return - - # C.g:308:2: ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ) - alt35 = 5 - LA35_0 = self.input.LA(1) - - if (LA35_0 == 64) : - LA35_1 = self.input.LA(2) - - if (LA35_1 == 65) : - alt35 = 2 - elif ((IDENTIFIER <= LA35_1 <= FLOATING_POINT_LITERAL) or LA35_1 == 62 or LA35_1 == 66 or (68 <= LA35_1 <= 69) or (72 <= LA35_1 <= 74) or (77 <= LA35_1 <= 79)) : - alt35 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 1, self.input) - - raise nvae - - elif (LA35_0 == 62) : - LA35 = self.input.LA(2) - if LA35 == 63: - alt35 = 5 - elif LA35 == 29 or LA35 == 30 or LA35 == 31 or LA35 == 32 or LA35 == 33 or LA35 == 34 or LA35 == 35 or LA35 == 36 or LA35 == 37 or LA35 == 38 or LA35 == 39 or LA35 == 40 or LA35 == 41 or LA35 == 42 or LA35 == 45 or LA35 == 46 or LA35 == 48 or LA35 == 49 or LA35 == 50 or LA35 == 51 or LA35 == 52 or LA35 == 53 or LA35 == 54 or LA35 == 55 or LA35 == 56 or LA35 == 57 or LA35 == 58 or LA35 == 59 or LA35 == 60 or LA35 == 61 or LA35 == 66: - alt35 = 3 - elif LA35 == IDENTIFIER: - LA35_29 = self.input.LA(3) - - if (self.synpred73()) : - alt35 = 3 - elif (self.synpred74()) : - alt35 = 4 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 29, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 2, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 0, self.input) - - raise nvae - - if alt35 == 1: - # C.g:308:6: '[' constant_expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix852) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_declarator_suffix854) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix856) - if self.failed: - return - - - elif alt35 == 2: - # C.g:309:9: '[' ']' - self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix866) - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix868) - if self.failed: - return - - - elif alt35 == 3: - # C.g:310:9: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix878) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_declarator_suffix880) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix882) - if self.failed: - return - - - elif alt35 == 4: - # C.g:311:9: '(' identifier_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix892) - if self.failed: - return - self.following.append(self.FOLLOW_identifier_list_in_declarator_suffix894) - self.identifier_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix896) - if self.failed: - return - - - elif alt35 == 5: - # C.g:312:9: '(' ')' - self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix906) - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix908) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 24, declarator_suffix_StartIndex) - - pass - - return - - # $ANTLR end declarator_suffix - - - # $ANTLR start pointer - # C.g:315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ); - def pointer(self, ): - - pointer_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 25): - return - - # C.g:316:2: ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ) - alt38 = 3 - LA38_0 = self.input.LA(1) - - if (LA38_0 == 66) : - LA38 = self.input.LA(2) - if LA38 == 66: - LA38_2 = self.input.LA(3) - - if (self.synpred78()) : - alt38 = 2 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 2, self.input) - - raise nvae - - elif LA38 == 58: - LA38_3 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 3, self.input) - - raise nvae - - elif LA38 == 59: - LA38_4 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 4, self.input) - - raise nvae - - elif LA38 == 60: - LA38_5 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 5, self.input) - - raise nvae - - elif LA38 == EOF or LA38 == IDENTIFIER or LA38 == 25 or LA38 == 26 or LA38 == 27 or LA38 == 28 or LA38 == 29 or LA38 == 30 or LA38 == 31 or LA38 == 32 or LA38 == 33 or LA38 == 34 or LA38 == 35 or LA38 == 36 or LA38 == 37 or LA38 == 38 or LA38 == 39 or LA38 == 40 or LA38 == 41 or LA38 == 42 or LA38 == 43 or LA38 == 45 or LA38 == 46 or LA38 == 47 or LA38 == 48 or LA38 == 62 or LA38 == 63 or LA38 == 64: - alt38 = 3 - elif LA38 == 53: - LA38_21 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 21, self.input) - - raise nvae - - elif LA38 == 49 or LA38 == 50 or LA38 == 51 or LA38 == 52 or LA38 == 54 or LA38 == 55 or LA38 == 56 or LA38 == 57 or LA38 == 61: - LA38_29 = self.input.LA(3) - - if (self.synpred77()) : - alt38 = 1 - elif (True) : - alt38 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 29, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 1, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 0, self.input) - - raise nvae - - if alt38 == 1: - # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? - self.match(self.input, 66, self.FOLLOW_66_in_pointer919) - if self.failed: - return - # C.g:316:8: ( type_qualifier )+ - cnt36 = 0 - while True: #loop36 - alt36 = 2 - LA36 = self.input.LA(1) - if LA36 == 58: - LA36_2 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 59: - LA36_3 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 60: - LA36_4 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 53: - LA36_20 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - elif LA36 == 49 or LA36 == 50 or LA36 == 51 or LA36 == 52 or LA36 == 54 or LA36 == 55 or LA36 == 56 or LA36 == 57 or LA36 == 61: - LA36_28 = self.input.LA(2) - - if (self.synpred75()) : - alt36 = 1 - - - - if alt36 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_pointer921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt36 >= 1: - break #loop36 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(36, self.input) - raise eee - - cnt36 += 1 - - - # C.g:316:24: ( pointer )? - alt37 = 2 - LA37_0 = self.input.LA(1) - - if (LA37_0 == 66) : - LA37_1 = self.input.LA(2) - - if (self.synpred76()) : - alt37 = 1 - if alt37 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_pointer924) - self.pointer() - self.following.pop() - if self.failed: - return - - - - - - elif alt38 == 2: - # C.g:317:4: '*' pointer - self.match(self.input, 66, self.FOLLOW_66_in_pointer930) - if self.failed: - return - self.following.append(self.FOLLOW_pointer_in_pointer932) - self.pointer() - self.following.pop() - if self.failed: - return - - - elif alt38 == 3: - # C.g:318:4: '*' - self.match(self.input, 66, self.FOLLOW_66_in_pointer937) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 25, pointer_StartIndex) - - pass - - return - - # $ANTLR end pointer - - - # $ANTLR start parameter_type_list - # C.g:321:1: parameter_type_list : parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ; - def parameter_type_list(self, ): - - parameter_type_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 26): - return - - # C.g:322:2: ( parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ) - # C.g:322:4: parameter_list ( ',' ( 'OPTIONAL' )? '...' )? - self.following.append(self.FOLLOW_parameter_list_in_parameter_type_list948) - self.parameter_list() - self.following.pop() - if self.failed: - return - # C.g:322:19: ( ',' ( 'OPTIONAL' )? '...' )? - alt40 = 2 - LA40_0 = self.input.LA(1) - - if (LA40_0 == 27) : - alt40 = 1 - if alt40 == 1: - # C.g:322:20: ',' ( 'OPTIONAL' )? '...' - self.match(self.input, 27, self.FOLLOW_27_in_parameter_type_list951) - if self.failed: - return - # C.g:322:24: ( 'OPTIONAL' )? - alt39 = 2 - LA39_0 = self.input.LA(1) - - if (LA39_0 == 53) : - alt39 = 1 - if alt39 == 1: - # C.g:322:25: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_type_list954) - if self.failed: - return - - - - self.match(self.input, 67, self.FOLLOW_67_in_parameter_type_list958) - if self.failed: - return - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 26, parameter_type_list_StartIndex) - - pass - - return - - # $ANTLR end parameter_type_list - - - # $ANTLR start parameter_list - # C.g:325:1: parameter_list : parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ; - def parameter_list(self, ): - - parameter_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 27): - return - - # C.g:326:2: ( parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ) - # C.g:326:4: parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* - self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list971) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - # C.g:326:26: ( ',' ( 'OPTIONAL' )? parameter_declaration )* - while True: #loop42 - alt42 = 2 - LA42_0 = self.input.LA(1) - - if (LA42_0 == 27) : - LA42_1 = self.input.LA(2) - - if (LA42_1 == 53) : - LA42_3 = self.input.LA(3) - - if (self.synpred82()) : - alt42 = 1 - - - elif (LA42_1 == IDENTIFIER or (29 <= LA42_1 <= 42) or (45 <= LA42_1 <= 46) or (48 <= LA42_1 <= 52) or (54 <= LA42_1 <= 61) or LA42_1 == 66) : - alt42 = 1 - - - - - if alt42 == 1: - # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_parameter_list974) - if self.failed: - return - # C.g:326:31: ( 'OPTIONAL' )? - alt41 = 2 - LA41_0 = self.input.LA(1) - - if (LA41_0 == 53) : - LA41_1 = self.input.LA(2) - - if (self.synpred81()) : - alt41 = 1 - if alt41 == 1: - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_list977) - if self.failed: - return - - - - self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list981) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop42 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 27, parameter_list_StartIndex) - - pass - - return - - # $ANTLR end parameter_list - - - # $ANTLR start parameter_declaration - # C.g:329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ); - def parameter_declaration(self, ): - - parameter_declaration_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 28): - return - - # C.g:330:2: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ) - alt46 = 2 - LA46 = self.input.LA(1) - if LA46 == 29 or LA46 == 30 or LA46 == 31 or LA46 == 32 or LA46 == 33 or LA46 == 34 or LA46 == 35 or LA46 == 36 or LA46 == 37 or LA46 == 38 or LA46 == 39 or LA46 == 40 or LA46 == 41 or LA46 == 42 or LA46 == 45 or LA46 == 46 or LA46 == 48 or LA46 == 49 or LA46 == 50 or LA46 == 51 or LA46 == 52 or LA46 == 53 or LA46 == 54 or LA46 == 55 or LA46 == 56 or LA46 == 57 or LA46 == 58 or LA46 == 59 or LA46 == 60 or LA46 == 61: - alt46 = 1 - elif LA46 == IDENTIFIER: - LA46_13 = self.input.LA(2) - - if (self.synpred86()) : - alt46 = 1 - elif (True) : - alt46 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 13, self.input) - - raise nvae - - elif LA46 == 66: - alt46 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 0, self.input) - - raise nvae - - if alt46 == 1: - # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? - self.following.append(self.FOLLOW_declaration_specifiers_in_parameter_declaration994) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:330:27: ( declarator | abstract_declarator )* - while True: #loop43 - alt43 = 3 - LA43 = self.input.LA(1) - if LA43 == 66: - LA43_5 = self.input.LA(2) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == IDENTIFIER or LA43 == 58 or LA43 == 59 or LA43 == 60: - alt43 = 1 - elif LA43 == 62: - LA43 = self.input.LA(2) - if LA43 == 29 or LA43 == 30 or LA43 == 31 or LA43 == 32 or LA43 == 33 or LA43 == 34 or LA43 == 35 or LA43 == 36 or LA43 == 37 or LA43 == 38 or LA43 == 39 or LA43 == 40 or LA43 == 41 or LA43 == 42 or LA43 == 45 or LA43 == 46 or LA43 == 48 or LA43 == 49 or LA43 == 50 or LA43 == 51 or LA43 == 52 or LA43 == 53 or LA43 == 54 or LA43 == 55 or LA43 == 56 or LA43 == 57 or LA43 == 61 or LA43 == 63 or LA43 == 64: - alt43 = 2 - elif LA43 == IDENTIFIER: - LA43_37 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 58: - LA43_38 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 66: - LA43_39 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 59: - LA43_40 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 60: - LA43_41 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - elif LA43 == 62: - LA43_43 = self.input.LA(3) - - if (self.synpred83()) : - alt43 = 1 - elif (self.synpred84()) : - alt43 = 2 - - - - elif LA43 == 64: - alt43 = 2 - - if alt43 == 1: - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_parameter_declaration997) - self.declarator() - self.following.pop() - if self.failed: - return - - - elif alt43 == 2: - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_parameter_declaration999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop43 - - - # C.g:330:61: ( 'OPTIONAL' )? - alt44 = 2 - LA44_0 = self.input.LA(1) - - if (LA44_0 == 53) : - alt44 = 1 - if alt44 == 1: - # C.g:330:62: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_parameter_declaration1004) - if self.failed: - return - - - - - - elif alt46 == 2: - # C.g:332:4: ( pointer )* IDENTIFIER - # C.g:332:4: ( pointer )* - while True: #loop45 - alt45 = 2 - LA45_0 = self.input.LA(1) - - if (LA45_0 == 66) : - alt45 = 1 - - - if alt45 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_parameter_declaration1013) - self.pointer() - self.following.pop() - if self.failed: - return - - - else: - break #loop45 - - - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_parameter_declaration1016) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 28, parameter_declaration_StartIndex) - - pass - - return - - # $ANTLR end parameter_declaration - - - # $ANTLR start identifier_list - # C.g:335:1: identifier_list : IDENTIFIER ( ',' IDENTIFIER )* ; - def identifier_list(self, ): - - identifier_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 29): - return - - # C.g:336:2: ( IDENTIFIER ( ',' IDENTIFIER )* ) - # C.g:336:4: IDENTIFIER ( ',' IDENTIFIER )* - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1027) - if self.failed: - return - # C.g:337:2: ( ',' IDENTIFIER )* - while True: #loop47 - alt47 = 2 - LA47_0 = self.input.LA(1) - - if (LA47_0 == 27) : - alt47 = 1 - - - if alt47 == 1: - # C.g:337:3: ',' IDENTIFIER - self.match(self.input, 27, self.FOLLOW_27_in_identifier_list1031) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1033) - if self.failed: - return - - - else: - break #loop47 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 29, identifier_list_StartIndex) - - pass - - return - - # $ANTLR end identifier_list - - - # $ANTLR start type_name - # C.g:340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id ); - def type_name(self, ): - - type_name_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 30): - return - - # C.g:341:2: ( specifier_qualifier_list ( abstract_declarator )? | type_id ) - alt49 = 2 - LA49_0 = self.input.LA(1) - - if ((34 <= LA49_0 <= 42) or (45 <= LA49_0 <= 46) or (48 <= LA49_0 <= 61)) : - alt49 = 1 - elif (LA49_0 == IDENTIFIER) : - LA49_13 = self.input.LA(2) - - if (self.synpred90()) : - alt49 = 1 - elif (True) : - alt49 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 13, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 0, self.input) - - raise nvae - - if alt49 == 1: - # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? - self.following.append(self.FOLLOW_specifier_qualifier_list_in_type_name1046) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - # C.g:341:29: ( abstract_declarator )? - alt48 = 2 - LA48_0 = self.input.LA(1) - - if (LA48_0 == 62 or LA48_0 == 64 or LA48_0 == 66) : - alt48 = 1 - if alt48 == 1: - # C.g:0:0: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_type_name1048) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - elif alt49 == 2: - # C.g:342:4: type_id - self.following.append(self.FOLLOW_type_id_in_type_name1054) - self.type_id() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 30, type_name_StartIndex) - - pass - - return - - # $ANTLR end type_name - - - # $ANTLR start abstract_declarator - # C.g:345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ); - def abstract_declarator(self, ): - - abstract_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 31): - return - - # C.g:346:2: ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ) - alt51 = 2 - LA51_0 = self.input.LA(1) - - if (LA51_0 == 66) : - alt51 = 1 - elif (LA51_0 == 62 or LA51_0 == 64) : - alt51 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator );", 51, 0, self.input) - - raise nvae - - if alt51 == 1: - # C.g:346:4: pointer ( direct_abstract_declarator )? - self.following.append(self.FOLLOW_pointer_in_abstract_declarator1065) - self.pointer() - self.following.pop() - if self.failed: - return - # C.g:346:12: ( direct_abstract_declarator )? - alt50 = 2 - LA50_0 = self.input.LA(1) - - if (LA50_0 == 62) : - LA50 = self.input.LA(2) - if LA50 == 63: - LA50_12 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 58: - LA50_13 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 66: - LA50_14 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 59: - LA50_15 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 60: - LA50_16 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == IDENTIFIER: - LA50_17 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 62: - LA50_18 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 64: - LA50_19 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 29 or LA50 == 30 or LA50 == 31 or LA50 == 32 or LA50 == 33: - LA50_20 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 34: - LA50_21 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 35: - LA50_22 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 36: - LA50_23 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 37: - LA50_24 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 38: - LA50_25 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 39: - LA50_26 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 40: - LA50_27 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 41: - LA50_28 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 42: - LA50_29 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 45 or LA50 == 46: - LA50_30 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 48: - LA50_31 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 49 or LA50 == 50 or LA50 == 51 or LA50 == 52 or LA50 == 53 or LA50 == 54 or LA50 == 55 or LA50 == 56 or LA50 == 57 or LA50 == 61: - LA50_32 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif (LA50_0 == 64) : - LA50 = self.input.LA(2) - if LA50 == 65: - LA50_33 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 62: - LA50_34 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == IDENTIFIER: - LA50_35 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == HEX_LITERAL: - LA50_36 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == OCTAL_LITERAL: - LA50_37 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == DECIMAL_LITERAL: - LA50_38 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == CHARACTER_LITERAL: - LA50_39 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == STRING_LITERAL: - LA50_40 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == FLOATING_POINT_LITERAL: - LA50_41 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 72: - LA50_42 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 73: - LA50_43 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 66 or LA50 == 68 or LA50 == 69 or LA50 == 77 or LA50 == 78 or LA50 == 79: - LA50_44 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - elif LA50 == 74: - LA50_45 = self.input.LA(3) - - if (self.synpred91()) : - alt50 = 1 - if alt50 == 1: - # C.g:0:0: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1067) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - elif alt51 == 2: - # C.g:347:4: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1073) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 31, abstract_declarator_StartIndex) - - pass - - return - - # $ANTLR end abstract_declarator - - - # $ANTLR start direct_abstract_declarator - # C.g:350:1: direct_abstract_declarator : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ; - def direct_abstract_declarator(self, ): - - direct_abstract_declarator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 32): - return - - # C.g:351:2: ( ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ) - # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* - # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) - alt52 = 2 - LA52_0 = self.input.LA(1) - - if (LA52_0 == 62) : - LA52 = self.input.LA(2) - if LA52 == IDENTIFIER or LA52 == 29 or LA52 == 30 or LA52 == 31 or LA52 == 32 or LA52 == 33 or LA52 == 34 or LA52 == 35 or LA52 == 36 or LA52 == 37 or LA52 == 38 or LA52 == 39 or LA52 == 40 or LA52 == 41 or LA52 == 42 or LA52 == 45 or LA52 == 46 or LA52 == 48 or LA52 == 49 or LA52 == 50 or LA52 == 51 or LA52 == 52 or LA52 == 53 or LA52 == 54 or LA52 == 55 or LA52 == 56 or LA52 == 57 or LA52 == 58 or LA52 == 59 or LA52 == 60 or LA52 == 61 or LA52 == 63: - alt52 = 2 - elif LA52 == 66: - LA52_18 = self.input.LA(3) - - if (self.synpred93()) : - alt52 = 1 - elif (True) : - alt52 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 18, self.input) - - raise nvae - - elif LA52 == 62 or LA52 == 64: - alt52 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 1, self.input) - - raise nvae - - elif (LA52_0 == 64) : - alt52 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 0, self.input) - - raise nvae - - if alt52 == 1: - # C.g:351:6: '(' abstract_declarator ')' - self.match(self.input, 62, self.FOLLOW_62_in_direct_abstract_declarator1086) - if self.failed: - return - self.following.append(self.FOLLOW_abstract_declarator_in_direct_abstract_declarator1088) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_direct_abstract_declarator1090) - if self.failed: - return - - - elif alt52 == 2: - # C.g:351:36: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - - # C.g:351:65: ( abstract_declarator_suffix )* - while True: #loop53 - alt53 = 2 - LA53_0 = self.input.LA(1) - - if (LA53_0 == 62) : - LA53 = self.input.LA(2) - if LA53 == 63: - LA53_12 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 58: - LA53_13 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 66: - LA53_14 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 59: - LA53_15 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 60: - LA53_16 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == IDENTIFIER: - LA53_17 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 29 or LA53 == 30 or LA53 == 31 or LA53 == 32 or LA53 == 33: - LA53_19 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 34: - LA53_20 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 35: - LA53_21 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 36: - LA53_22 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 37: - LA53_23 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 38: - LA53_24 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 39: - LA53_25 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 40: - LA53_26 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 41: - LA53_27 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 42: - LA53_28 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 45 or LA53 == 46: - LA53_29 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 48: - LA53_30 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 49 or LA53 == 50 or LA53 == 51 or LA53 == 52 or LA53 == 53 or LA53 == 54 or LA53 == 55 or LA53 == 56 or LA53 == 57 or LA53 == 61: - LA53_31 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - - elif (LA53_0 == 64) : - LA53 = self.input.LA(2) - if LA53 == 65: - LA53_33 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 62: - LA53_34 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == IDENTIFIER: - LA53_35 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == HEX_LITERAL: - LA53_36 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == OCTAL_LITERAL: - LA53_37 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == DECIMAL_LITERAL: - LA53_38 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == CHARACTER_LITERAL: - LA53_39 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == STRING_LITERAL: - LA53_40 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == FLOATING_POINT_LITERAL: - LA53_41 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 72: - LA53_42 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 73: - LA53_43 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 66 or LA53 == 68 or LA53 == 69 or LA53 == 77 or LA53 == 78 or LA53 == 79: - LA53_44 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - elif LA53 == 74: - LA53_45 = self.input.LA(3) - - if (self.synpred94()) : - alt53 = 1 - - - - - - if alt53 == 1: - # C.g:0:0: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - else: - break #loop53 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 32, direct_abstract_declarator_StartIndex) - - pass - - return - - # $ANTLR end direct_abstract_declarator - - - # $ANTLR start abstract_declarator_suffix - # C.g:354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ); - def abstract_declarator_suffix(self, ): - - abstract_declarator_suffix_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 33): - return - - # C.g:355:2: ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ) - alt54 = 4 - LA54_0 = self.input.LA(1) - - if (LA54_0 == 64) : - LA54_1 = self.input.LA(2) - - if (LA54_1 == 65) : - alt54 = 1 - elif ((IDENTIFIER <= LA54_1 <= FLOATING_POINT_LITERAL) or LA54_1 == 62 or LA54_1 == 66 or (68 <= LA54_1 <= 69) or (72 <= LA54_1 <= 74) or (77 <= LA54_1 <= 79)) : - alt54 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 1, self.input) - - raise nvae - - elif (LA54_0 == 62) : - LA54_2 = self.input.LA(2) - - if (LA54_2 == 63) : - alt54 = 3 - elif (LA54_2 == IDENTIFIER or (29 <= LA54_2 <= 42) or (45 <= LA54_2 <= 46) or (48 <= LA54_2 <= 61) or LA54_2 == 66) : - alt54 = 4 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 2, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 0, self.input) - - raise nvae - - if alt54 == 1: - # C.g:355:4: '[' ']' - self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1110) - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1112) - if self.failed: - return - - - elif alt54 == 2: - # C.g:356:4: '[' constant_expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1117) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_abstract_declarator_suffix1119) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1121) - if self.failed: - return - - - elif alt54 == 3: - # C.g:357:4: '(' ')' - self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1126) - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1128) - if self.failed: - return - - - elif alt54 == 4: - # C.g:358:4: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1133) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1137) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 33, abstract_declarator_suffix_StartIndex) - - pass - - return - - # $ANTLR end abstract_declarator_suffix - - - # $ANTLR start initializer - # C.g:361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' ); - def initializer(self, ): - - initializer_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 34): - return - - # C.g:363:2: ( assignment_expression | '{' initializer_list ( ',' )? '}' ) - alt56 = 2 - LA56_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA56_0 <= FLOATING_POINT_LITERAL) or LA56_0 == 62 or LA56_0 == 66 or (68 <= LA56_0 <= 69) or (72 <= LA56_0 <= 74) or (77 <= LA56_0 <= 79)) : - alt56 = 1 - elif (LA56_0 == 43) : - alt56 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' );", 56, 0, self.input) - - raise nvae - - if alt56 == 1: - # C.g:363:4: assignment_expression - self.following.append(self.FOLLOW_assignment_expression_in_initializer1150) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - elif alt56 == 2: - # C.g:364:4: '{' initializer_list ( ',' )? '}' - self.match(self.input, 43, self.FOLLOW_43_in_initializer1155) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_list_in_initializer1157) - self.initializer_list() - self.following.pop() - if self.failed: - return - # C.g:364:25: ( ',' )? - alt55 = 2 - LA55_0 = self.input.LA(1) - - if (LA55_0 == 27) : - alt55 = 1 - if alt55 == 1: - # C.g:0:0: ',' - self.match(self.input, 27, self.FOLLOW_27_in_initializer1159) - if self.failed: - return - - - - self.match(self.input, 44, self.FOLLOW_44_in_initializer1162) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 34, initializer_StartIndex) - - pass - - return - - # $ANTLR end initializer - - - # $ANTLR start initializer_list - # C.g:367:1: initializer_list : initializer ( ',' initializer )* ; - def initializer_list(self, ): - - initializer_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 35): - return - - # C.g:368:2: ( initializer ( ',' initializer )* ) - # C.g:368:4: initializer ( ',' initializer )* - self.following.append(self.FOLLOW_initializer_in_initializer_list1173) - self.initializer() - self.following.pop() - if self.failed: - return - # C.g:368:16: ( ',' initializer )* - while True: #loop57 - alt57 = 2 - LA57_0 = self.input.LA(1) - - if (LA57_0 == 27) : - LA57_1 = self.input.LA(2) - - if ((IDENTIFIER <= LA57_1 <= FLOATING_POINT_LITERAL) or LA57_1 == 43 or LA57_1 == 62 or LA57_1 == 66 or (68 <= LA57_1 <= 69) or (72 <= LA57_1 <= 74) or (77 <= LA57_1 <= 79)) : - alt57 = 1 - - - - - if alt57 == 1: - # C.g:368:17: ',' initializer - self.match(self.input, 27, self.FOLLOW_27_in_initializer_list1176) - if self.failed: - return - self.following.append(self.FOLLOW_initializer_in_initializer_list1178) - self.initializer() - self.following.pop() - if self.failed: - return - - - else: - break #loop57 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 35, initializer_list_StartIndex) - - pass - - return - - # $ANTLR end initializer_list - - class argument_expression_list_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start argument_expression_list - # C.g:373:1: argument_expression_list : assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ; - def argument_expression_list(self, ): - - retval = self.argument_expression_list_return() - retval.start = self.input.LT(1) - argument_expression_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 36): - return retval - - # C.g:374:2: ( assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ) - # C.g:374:6: assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* - self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1196) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:374:28: ( 'OPTIONAL' )? - alt58 = 2 - LA58_0 = self.input.LA(1) - - if (LA58_0 == 53) : - alt58 = 1 - if alt58 == 1: - # C.g:374:29: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1199) - if self.failed: - return retval - - - - # C.g:374:42: ( ',' assignment_expression ( 'OPTIONAL' )? )* - while True: #loop60 - alt60 = 2 - LA60_0 = self.input.LA(1) - - if (LA60_0 == 27) : - alt60 = 1 - - - if alt60 == 1: - # C.g:374:43: ',' assignment_expression ( 'OPTIONAL' )? - self.match(self.input, 27, self.FOLLOW_27_in_argument_expression_list1204) - if self.failed: - return retval - self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1206) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:374:69: ( 'OPTIONAL' )? - alt59 = 2 - LA59_0 = self.input.LA(1) - - if (LA59_0 == 53) : - alt59 = 1 - if alt59 == 1: - # C.g:374:70: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1209) - if self.failed: - return retval - - - - - - else: - break #loop60 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 36, argument_expression_list_StartIndex) - - pass - - return retval - - # $ANTLR end argument_expression_list - - - # $ANTLR start additive_expression - # C.g:377:1: additive_expression : ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ; - def additive_expression(self, ): - - additive_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 37): - return - - # C.g:378:2: ( ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ) - # C.g:378:4: ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* - # C.g:378:4: ( multiplicative_expression ) - # C.g:378:5: multiplicative_expression - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1225) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - - # C.g:378:32: ( '+' multiplicative_expression | '-' multiplicative_expression )* - while True: #loop61 - alt61 = 3 - LA61_0 = self.input.LA(1) - - if (LA61_0 == 68) : - alt61 = 1 - elif (LA61_0 == 69) : - alt61 = 2 - - - if alt61 == 1: - # C.g:378:33: '+' multiplicative_expression - self.match(self.input, 68, self.FOLLOW_68_in_additive_expression1229) - if self.failed: - return - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1231) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - elif alt61 == 2: - # C.g:378:65: '-' multiplicative_expression - self.match(self.input, 69, self.FOLLOW_69_in_additive_expression1235) - if self.failed: - return - self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1237) - self.multiplicative_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop61 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 37, additive_expression_StartIndex) - - pass - - return - - # $ANTLR end additive_expression - - - # $ANTLR start multiplicative_expression - # C.g:381:1: multiplicative_expression : ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ; - def multiplicative_expression(self, ): - - multiplicative_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 38): - return - - # C.g:382:2: ( ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ) - # C.g:382:4: ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* - # C.g:382:4: ( cast_expression ) - # C.g:382:5: cast_expression - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1251) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - - # C.g:382:22: ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* - while True: #loop62 - alt62 = 4 - LA62 = self.input.LA(1) - if LA62 == 66: - alt62 = 1 - elif LA62 == 70: - alt62 = 2 - elif LA62 == 71: - alt62 = 3 - - if alt62 == 1: - # C.g:382:23: '*' cast_expression - self.match(self.input, 66, self.FOLLOW_66_in_multiplicative_expression1255) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1257) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt62 == 2: - # C.g:382:45: '/' cast_expression - self.match(self.input, 70, self.FOLLOW_70_in_multiplicative_expression1261) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1263) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt62 == 3: - # C.g:382:67: '%' cast_expression - self.match(self.input, 71, self.FOLLOW_71_in_multiplicative_expression1267) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1269) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop62 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 38, multiplicative_expression_StartIndex) - - pass - - return - - # $ANTLR end multiplicative_expression - - - # $ANTLR start cast_expression - # C.g:385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression ); - def cast_expression(self, ): - - cast_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 39): - return - - # C.g:386:2: ( '(' type_name ')' cast_expression | unary_expression ) - alt63 = 2 - LA63_0 = self.input.LA(1) - - if (LA63_0 == 62) : - LA63 = self.input.LA(2) - if LA63 == 34 or LA63 == 35 or LA63 == 36 or LA63 == 37 or LA63 == 38 or LA63 == 39 or LA63 == 40 or LA63 == 41 or LA63 == 42 or LA63 == 45 or LA63 == 46 or LA63 == 48 or LA63 == 49 or LA63 == 50 or LA63 == 51 or LA63 == 52 or LA63 == 53 or LA63 == 54 or LA63 == 55 or LA63 == 56 or LA63 == 57 or LA63 == 58 or LA63 == 59 or LA63 == 60 or LA63 == 61: - alt63 = 1 - elif LA63 == IDENTIFIER: - LA63_25 = self.input.LA(3) - - if (self.synpred109()) : - alt63 = 1 - elif (True) : - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 25, self.input) - - raise nvae - - elif LA63 == HEX_LITERAL or LA63 == OCTAL_LITERAL or LA63 == DECIMAL_LITERAL or LA63 == CHARACTER_LITERAL or LA63 == STRING_LITERAL or LA63 == FLOATING_POINT_LITERAL or LA63 == 62 or LA63 == 66 or LA63 == 68 or LA63 == 69 or LA63 == 72 or LA63 == 73 or LA63 == 74 or LA63 == 77 or LA63 == 78 or LA63 == 79: - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 1, self.input) - - raise nvae - - elif ((IDENTIFIER <= LA63_0 <= FLOATING_POINT_LITERAL) or LA63_0 == 66 or (68 <= LA63_0 <= 69) or (72 <= LA63_0 <= 74) or (77 <= LA63_0 <= 79)) : - alt63 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 0, self.input) - - raise nvae - - if alt63 == 1: - # C.g:386:4: '(' type_name ')' cast_expression - self.match(self.input, 62, self.FOLLOW_62_in_cast_expression1282) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_cast_expression1284) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_cast_expression1286) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_cast_expression1288) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt63 == 2: - # C.g:387:4: unary_expression - self.following.append(self.FOLLOW_unary_expression_in_cast_expression1293) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 39, cast_expression_StartIndex) - - pass - - return - - # $ANTLR end cast_expression - - - # $ANTLR start unary_expression - # C.g:390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ); - def unary_expression(self, ): - - unary_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 40): - return - - # C.g:391:2: ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ) - alt64 = 6 - LA64 = self.input.LA(1) - if LA64 == IDENTIFIER or LA64 == HEX_LITERAL or LA64 == OCTAL_LITERAL or LA64 == DECIMAL_LITERAL or LA64 == CHARACTER_LITERAL or LA64 == STRING_LITERAL or LA64 == FLOATING_POINT_LITERAL or LA64 == 62: - alt64 = 1 - elif LA64 == 72: - alt64 = 2 - elif LA64 == 73: - alt64 = 3 - elif LA64 == 66 or LA64 == 68 or LA64 == 69 or LA64 == 77 or LA64 == 78 or LA64 == 79: - alt64 = 4 - elif LA64 == 74: - LA64_12 = self.input.LA(2) - - if (LA64_12 == 62) : - LA64_13 = self.input.LA(3) - - if (self.synpred114()) : - alt64 = 5 - elif (True) : - alt64 = 6 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 13, self.input) - - raise nvae - - elif ((IDENTIFIER <= LA64_12 <= FLOATING_POINT_LITERAL) or LA64_12 == 66 or (68 <= LA64_12 <= 69) or (72 <= LA64_12 <= 74) or (77 <= LA64_12 <= 79)) : - alt64 = 5 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 12, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 0, self.input) - - raise nvae - - if alt64 == 1: - # C.g:391:4: postfix_expression - self.following.append(self.FOLLOW_postfix_expression_in_unary_expression1304) - self.postfix_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 2: - # C.g:392:4: '++' unary_expression - self.match(self.input, 72, self.FOLLOW_72_in_unary_expression1309) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1311) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 3: - # C.g:393:4: '--' unary_expression - self.match(self.input, 73, self.FOLLOW_73_in_unary_expression1316) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1318) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 4: - # C.g:394:4: unary_operator cast_expression - self.following.append(self.FOLLOW_unary_operator_in_unary_expression1323) - self.unary_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_unary_expression1325) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 5: - # C.g:395:4: 'sizeof' unary_expression - self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1330) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_unary_expression1332) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - elif alt64 == 6: - # C.g:396:4: 'sizeof' '(' type_name ')' - self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1337) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_unary_expression1339) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_unary_expression1341) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_unary_expression1343) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 40, unary_expression_StartIndex) - - pass - - return - - # $ANTLR end unary_expression - - - # $ANTLR start postfix_expression - # C.g:399:1: postfix_expression : p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ; - def postfix_expression(self, ): - self.postfix_expression_stack.append(postfix_expression_scope()) - postfix_expression_StartIndex = self.input.index() - a = None - b = None - x = None - y = None - z = None - p = None - - c = None - - - - self.postfix_expression_stack[-1].FuncCallText = '' - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 41): - return - - # C.g:406:2: (p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ) - # C.g:406:6: p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* - self.following.append(self.FOLLOW_primary_expression_in_postfix_expression1367) - p = self.primary_expression() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += self.input.toString(p.start,p.stop) - - # C.g:407:9: ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* - while True: #loop65 - alt65 = 10 - LA65 = self.input.LA(1) - if LA65 == 66: - LA65_1 = self.input.LA(2) - - if (LA65_1 == IDENTIFIER) : - LA65_30 = self.input.LA(3) - - if (self.synpred120()) : - alt65 = 6 - - - - - elif LA65 == 64: - alt65 = 1 - elif LA65 == 62: - LA65 = self.input.LA(2) - if LA65 == 63: - alt65 = 2 - elif LA65 == 29 or LA65 == 30 or LA65 == 31 or LA65 == 32 or LA65 == 33 or LA65 == 34 or LA65 == 35 or LA65 == 36 or LA65 == 37 or LA65 == 38 or LA65 == 39 or LA65 == 40 or LA65 == 41 or LA65 == 42 or LA65 == 45 or LA65 == 46 or LA65 == 48 or LA65 == 49 or LA65 == 50 or LA65 == 51 or LA65 == 52 or LA65 == 53 or LA65 == 54 or LA65 == 55 or LA65 == 56 or LA65 == 57 or LA65 == 58 or LA65 == 59 or LA65 == 60 or LA65 == 61: - alt65 = 4 - elif LA65 == IDENTIFIER: - LA65_55 = self.input.LA(3) - - if (self.synpred117()) : - alt65 = 3 - elif (self.synpred118()) : - alt65 = 4 - - - elif LA65 == 66: - LA65_57 = self.input.LA(3) - - if (self.synpred117()) : - alt65 = 3 - elif (self.synpred118()) : - alt65 = 4 - - - elif LA65 == HEX_LITERAL or LA65 == OCTAL_LITERAL or LA65 == DECIMAL_LITERAL or LA65 == CHARACTER_LITERAL or LA65 == STRING_LITERAL or LA65 == FLOATING_POINT_LITERAL or LA65 == 62 or LA65 == 68 or LA65 == 69 or LA65 == 72 or LA65 == 73 or LA65 == 74 or LA65 == 77 or LA65 == 78 or LA65 == 79: - alt65 = 3 - - elif LA65 == 75: - alt65 = 5 - elif LA65 == 76: - alt65 = 7 - elif LA65 == 72: - alt65 = 8 - elif LA65 == 73: - alt65 = 9 - - if alt65 == 1: - # C.g:407:13: '[' expression ']' - self.match(self.input, 64, self.FOLLOW_64_in_postfix_expression1383) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_postfix_expression1385) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 65, self.FOLLOW_65_in_postfix_expression1387) - if self.failed: - return - - - elif alt65 == 2: - # C.g:408:13: '(' a= ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1401) - if self.failed: - return - a = self.input.LT(1) - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1405) - if self.failed: - return - if self.backtracking == 0: - self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, a.line, a.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, '') - - - - elif alt65 == 3: - # C.g:409:13: '(' c= argument_expression_list b= ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1420) - if self.failed: - return - self.following.append(self.FOLLOW_argument_expression_list_in_postfix_expression1424) - c = self.argument_expression_list() - self.following.pop() - if self.failed: - return - b = self.input.LT(1) - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1428) - if self.failed: - return - if self.backtracking == 0: - self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, b.line, b.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, self.input.toString(c.start,c.stop)) - - - - elif alt65 == 4: - # C.g:410:13: '(' macro_parameter_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1444) - if self.failed: - return - self.following.append(self.FOLLOW_macro_parameter_list_in_postfix_expression1446) - self.macro_parameter_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1448) - if self.failed: - return - - - elif alt65 == 5: - # C.g:411:13: '.' x= IDENTIFIER - self.match(self.input, 75, self.FOLLOW_75_in_postfix_expression1462) - if self.failed: - return - x = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1466) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += '.' + x.text - - - - elif alt65 == 6: - # C.g:412:13: '*' y= IDENTIFIER - self.match(self.input, 66, self.FOLLOW_66_in_postfix_expression1482) - if self.failed: - return - y = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1486) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText = y.text - - - - elif alt65 == 7: - # C.g:413:13: '->' z= IDENTIFIER - self.match(self.input, 76, self.FOLLOW_76_in_postfix_expression1502) - if self.failed: - return - z = self.input.LT(1) - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1506) - if self.failed: - return - if self.backtracking == 0: - self.postfix_expression_stack[-1].FuncCallText += '->' + z.text - - - - elif alt65 == 8: - # C.g:414:13: '++' - self.match(self.input, 72, self.FOLLOW_72_in_postfix_expression1522) - if self.failed: - return - - - elif alt65 == 9: - # C.g:415:13: '--' - self.match(self.input, 73, self.FOLLOW_73_in_postfix_expression1536) - if self.failed: - return - - - else: - break #loop65 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 41, postfix_expression_StartIndex) - - self.postfix_expression_stack.pop() - pass - - return - - # $ANTLR end postfix_expression - - - # $ANTLR start macro_parameter_list - # C.g:419:1: macro_parameter_list : parameter_declaration ( ',' parameter_declaration )* ; - def macro_parameter_list(self, ): - - macro_parameter_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 42): - return - - # C.g:420:2: ( parameter_declaration ( ',' parameter_declaration )* ) - # C.g:420:4: parameter_declaration ( ',' parameter_declaration )* - self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1559) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - # C.g:420:26: ( ',' parameter_declaration )* - while True: #loop66 - alt66 = 2 - LA66_0 = self.input.LA(1) - - if (LA66_0 == 27) : - alt66 = 1 - - - if alt66 == 1: - # C.g:420:27: ',' parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_macro_parameter_list1562) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1564) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop66 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 42, macro_parameter_list_StartIndex) - - pass - - return - - # $ANTLR end macro_parameter_list - - - # $ANTLR start unary_operator - # C.g:423:1: unary_operator : ( '&' | '*' | '+' | '-' | '~' | '!' ); - def unary_operator(self, ): - - unary_operator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 43): - return - - # C.g:424:2: ( '&' | '*' | '+' | '-' | '~' | '!' ) - # C.g: - if self.input.LA(1) == 66 or (68 <= self.input.LA(1) <= 69) or (77 <= self.input.LA(1) <= 79): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_unary_operator0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 43, unary_operator_StartIndex) - - pass - - return - - # $ANTLR end unary_operator - - class primary_expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start primary_expression - # C.g:432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' ); - def primary_expression(self, ): - - retval = self.primary_expression_return() - retval.start = self.input.LT(1) - primary_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 44): - return retval - - # C.g:433:2: ( IDENTIFIER | constant | '(' expression ')' ) - alt67 = 3 - LA67 = self.input.LA(1) - if LA67 == IDENTIFIER: - LA67_1 = self.input.LA(2) - - if (LA67_1 == EOF or LA67_1 == 25 or (27 <= LA67_1 <= 28) or LA67_1 == 44 or LA67_1 == 47 or LA67_1 == 53 or (62 <= LA67_1 <= 66) or (68 <= LA67_1 <= 73) or (75 <= LA67_1 <= 77) or (80 <= LA67_1 <= 102)) : - alt67 = 1 - elif (LA67_1 == IDENTIFIER or LA67_1 == STRING_LITERAL) : - alt67 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 1, self.input) - - raise nvae - - elif LA67 == HEX_LITERAL or LA67 == OCTAL_LITERAL or LA67 == DECIMAL_LITERAL or LA67 == CHARACTER_LITERAL or LA67 == STRING_LITERAL or LA67 == FLOATING_POINT_LITERAL: - alt67 = 2 - elif LA67 == 62: - alt67 = 3 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 0, self.input) - - raise nvae - - if alt67 == 1: - # C.g:433:4: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_primary_expression1613) - if self.failed: - return retval - - - elif alt67 == 2: - # C.g:434:4: constant - self.following.append(self.FOLLOW_constant_in_primary_expression1618) - self.constant() - self.following.pop() - if self.failed: - return retval - - - elif alt67 == 3: - # C.g:435:4: '(' expression ')' - self.match(self.input, 62, self.FOLLOW_62_in_primary_expression1623) - if self.failed: - return retval - self.following.append(self.FOLLOW_expression_in_primary_expression1625) - self.expression() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 63, self.FOLLOW_63_in_primary_expression1627) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 44, primary_expression_StartIndex) - - pass - - return retval - - # $ANTLR end primary_expression - - - # $ANTLR start constant - # C.g:438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ); - def constant(self, ): - - constant_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 45): - return - - # C.g:439:5: ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ) - alt72 = 6 - LA72 = self.input.LA(1) - if LA72 == HEX_LITERAL: - alt72 = 1 - elif LA72 == OCTAL_LITERAL: - alt72 = 2 - elif LA72 == DECIMAL_LITERAL: - alt72 = 3 - elif LA72 == CHARACTER_LITERAL: - alt72 = 4 - elif LA72 == IDENTIFIER or LA72 == STRING_LITERAL: - alt72 = 5 - elif LA72 == FLOATING_POINT_LITERAL: - alt72 = 6 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL );", 72, 0, self.input) - - raise nvae - - if alt72 == 1: - # C.g:439:9: HEX_LITERAL - self.match(self.input, HEX_LITERAL, self.FOLLOW_HEX_LITERAL_in_constant1643) - if self.failed: - return - - - elif alt72 == 2: - # C.g:440:9: OCTAL_LITERAL - self.match(self.input, OCTAL_LITERAL, self.FOLLOW_OCTAL_LITERAL_in_constant1653) - if self.failed: - return - - - elif alt72 == 3: - # C.g:441:9: DECIMAL_LITERAL - self.match(self.input, DECIMAL_LITERAL, self.FOLLOW_DECIMAL_LITERAL_in_constant1663) - if self.failed: - return - - - elif alt72 == 4: - # C.g:442:7: CHARACTER_LITERAL - self.match(self.input, CHARACTER_LITERAL, self.FOLLOW_CHARACTER_LITERAL_in_constant1671) - if self.failed: - return - - - elif alt72 == 5: - # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* - # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ - cnt70 = 0 - while True: #loop70 - alt70 = 2 - LA70_0 = self.input.LA(1) - - if (LA70_0 == IDENTIFIER) : - LA70_1 = self.input.LA(2) - - if (LA70_1 == STRING_LITERAL) : - alt70 = 1 - elif (LA70_1 == IDENTIFIER) : - LA70_33 = self.input.LA(3) - - if (self.synpred138()) : - alt70 = 1 - - - - - elif (LA70_0 == STRING_LITERAL) : - alt70 = 1 - - - if alt70 == 1: - # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ - # C.g:443:8: ( IDENTIFIER )* - while True: #loop68 - alt68 = 2 - LA68_0 = self.input.LA(1) - - if (LA68_0 == IDENTIFIER) : - alt68 = 1 - - - if alt68 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1680) - if self.failed: - return - - - else: - break #loop68 - - - # C.g:443:20: ( STRING_LITERAL )+ - cnt69 = 0 - while True: #loop69 - alt69 = 2 - LA69_0 = self.input.LA(1) - - if (LA69_0 == STRING_LITERAL) : - LA69_31 = self.input.LA(2) - - if (self.synpred137()) : - alt69 = 1 - - - - - if alt69 == 1: - # C.g:0:0: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_constant1683) - if self.failed: - return - - - else: - if cnt69 >= 1: - break #loop69 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(69, self.input) - raise eee - - cnt69 += 1 - - - - - else: - if cnt70 >= 1: - break #loop70 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(70, self.input) - raise eee - - cnt70 += 1 - - - # C.g:443:38: ( IDENTIFIER )* - while True: #loop71 - alt71 = 2 - LA71_0 = self.input.LA(1) - - if (LA71_0 == IDENTIFIER) : - alt71 = 1 - - - if alt71 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1688) - if self.failed: - return - - - else: - break #loop71 - - - - - elif alt72 == 6: - # C.g:444:9: FLOATING_POINT_LITERAL - self.match(self.input, FLOATING_POINT_LITERAL, self.FOLLOW_FLOATING_POINT_LITERAL_in_constant1699) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 45, constant_StartIndex) - - pass - - return - - # $ANTLR end constant - - class expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start expression - # C.g:449:1: expression : assignment_expression ( ',' assignment_expression )* ; - def expression(self, ): - - retval = self.expression_return() - retval.start = self.input.LT(1) - expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 46): - return retval - - # C.g:450:2: ( assignment_expression ( ',' assignment_expression )* ) - # C.g:450:4: assignment_expression ( ',' assignment_expression )* - self.following.append(self.FOLLOW_assignment_expression_in_expression1715) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - # C.g:450:26: ( ',' assignment_expression )* - while True: #loop73 - alt73 = 2 - LA73_0 = self.input.LA(1) - - if (LA73_0 == 27) : - alt73 = 1 - - - if alt73 == 1: - # C.g:450:27: ',' assignment_expression - self.match(self.input, 27, self.FOLLOW_27_in_expression1718) - if self.failed: - return retval - self.following.append(self.FOLLOW_assignment_expression_in_expression1720) - self.assignment_expression() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop73 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 46, expression_StartIndex) - - pass - - return retval - - # $ANTLR end expression - - - # $ANTLR start constant_expression - # C.g:453:1: constant_expression : conditional_expression ; - def constant_expression(self, ): - - constant_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 47): - return - - # C.g:454:2: ( conditional_expression ) - # C.g:454:4: conditional_expression - self.following.append(self.FOLLOW_conditional_expression_in_constant_expression1733) - self.conditional_expression() - self.following.pop() - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 47, constant_expression_StartIndex) - - pass - - return - - # $ANTLR end constant_expression - - - # $ANTLR start assignment_expression - # C.g:457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression ); - def assignment_expression(self, ): - - assignment_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 48): - return - - # C.g:458:2: ( lvalue assignment_operator assignment_expression | conditional_expression ) - alt74 = 2 - LA74 = self.input.LA(1) - if LA74 == IDENTIFIER: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_13 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 13, self.input) - - raise nvae - - elif LA74 == 62: - LA74_14 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 14, self.input) - - raise nvae - - elif LA74 == 75: - LA74_15 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 15, self.input) - - raise nvae - - elif LA74 == 66: - LA74_16 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 16, self.input) - - raise nvae - - elif LA74 == 76: - LA74_17 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 17, self.input) - - raise nvae - - elif LA74 == 72: - LA74_18 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 18, self.input) - - raise nvae - - elif LA74 == 73: - LA74_19 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 19, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - elif LA74 == STRING_LITERAL: - LA74_21 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 21, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_22 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 22, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 1, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_44 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 44, self.input) - - raise nvae - - elif LA74 == 62: - LA74_45 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 45, self.input) - - raise nvae - - elif LA74 == 75: - LA74_46 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 46, self.input) - - raise nvae - - elif LA74 == 66: - LA74_47 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 47, self.input) - - raise nvae - - elif LA74 == 76: - LA74_48 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 48, self.input) - - raise nvae - - elif LA74 == 72: - LA74_49 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 49, self.input) - - raise nvae - - elif LA74 == 73: - LA74_50 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 50, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 2, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_73 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 73, self.input) - - raise nvae - - elif LA74 == 62: - LA74_74 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 74, self.input) - - raise nvae - - elif LA74 == 75: - LA74_75 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 75, self.input) - - raise nvae - - elif LA74 == 66: - LA74_76 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 76, self.input) - - raise nvae - - elif LA74 == 76: - LA74_77 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 77, self.input) - - raise nvae - - elif LA74 == 72: - LA74_78 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 78, self.input) - - raise nvae - - elif LA74 == 73: - LA74_79 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 79, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 3, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_102 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 102, self.input) - - raise nvae - - elif LA74 == 62: - LA74_103 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 103, self.input) - - raise nvae - - elif LA74 == 75: - LA74_104 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 104, self.input) - - raise nvae - - elif LA74 == 66: - LA74_105 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 105, self.input) - - raise nvae - - elif LA74 == 76: - LA74_106 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 106, self.input) - - raise nvae - - elif LA74 == 72: - LA74_107 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 107, self.input) - - raise nvae - - elif LA74 == 73: - LA74_108 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 108, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 4, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_131 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 131, self.input) - - raise nvae - - elif LA74 == 62: - LA74_132 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 132, self.input) - - raise nvae - - elif LA74 == 75: - LA74_133 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 133, self.input) - - raise nvae - - elif LA74 == 66: - LA74_134 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 134, self.input) - - raise nvae - - elif LA74 == 76: - LA74_135 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 135, self.input) - - raise nvae - - elif LA74 == 72: - LA74_136 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 136, self.input) - - raise nvae - - elif LA74 == 73: - LA74_137 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 137, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 5, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_160 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 160, self.input) - - raise nvae - - elif LA74 == 64: - LA74_161 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 161, self.input) - - raise nvae - - elif LA74 == 62: - LA74_162 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 162, self.input) - - raise nvae - - elif LA74 == 75: - LA74_163 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 163, self.input) - - raise nvae - - elif LA74 == 66: - LA74_164 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 164, self.input) - - raise nvae - - elif LA74 == 76: - LA74_165 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 165, self.input) - - raise nvae - - elif LA74 == 72: - LA74_166 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 166, self.input) - - raise nvae - - elif LA74 == 73: - LA74_167 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 167, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == STRING_LITERAL: - LA74_189 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 189, self.input) - - raise nvae - - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 6, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74 = self.input.LA(2) - if LA74 == 64: - LA74_191 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 191, self.input) - - raise nvae - - elif LA74 == 62: - LA74_192 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 192, self.input) - - raise nvae - - elif LA74 == 75: - LA74_193 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 193, self.input) - - raise nvae - - elif LA74 == 66: - LA74_194 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 194, self.input) - - raise nvae - - elif LA74 == 76: - LA74_195 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 195, self.input) - - raise nvae - - elif LA74 == 72: - LA74_196 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 196, self.input) - - raise nvae - - elif LA74 == 73: - LA74_197 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 197, self.input) - - raise nvae - - elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: - alt74 = 2 - elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: - alt74 = 1 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 7, self.input) - - raise nvae - - elif LA74 == 62: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_220 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 220, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_221 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 221, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_222 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 222, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_223 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 223, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_224 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 224, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_225 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 225, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_226 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 226, self.input) - - raise nvae - - elif LA74 == 62: - LA74_227 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 227, self.input) - - raise nvae - - elif LA74 == 72: - LA74_228 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 228, self.input) - - raise nvae - - elif LA74 == 73: - LA74_229 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 229, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_230 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 230, self.input) - - raise nvae - - elif LA74 == 74: - LA74_231 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 231, self.input) - - raise nvae - - elif LA74 == 34 or LA74 == 35 or LA74 == 36 or LA74 == 37 or LA74 == 38 or LA74 == 39 or LA74 == 40 or LA74 == 41 or LA74 == 42 or LA74 == 45 or LA74 == 46 or LA74 == 48 or LA74 == 49 or LA74 == 50 or LA74 == 51 or LA74 == 52 or LA74 == 53 or LA74 == 54 or LA74 == 55 or LA74 == 56 or LA74 == 57 or LA74 == 58 or LA74 == 59 or LA74 == 60 or LA74 == 61: - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 8, self.input) - - raise nvae - - elif LA74 == 72: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_244 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 244, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_245 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 245, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_246 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 246, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_247 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 247, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_248 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 248, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_249 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 249, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_250 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 250, self.input) - - raise nvae - - elif LA74 == 62: - LA74_251 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 251, self.input) - - raise nvae - - elif LA74 == 72: - LA74_252 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 252, self.input) - - raise nvae - - elif LA74 == 73: - LA74_253 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 253, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_254 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 254, self.input) - - raise nvae - - elif LA74 == 74: - LA74_255 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 255, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 9, self.input) - - raise nvae - - elif LA74 == 73: - LA74 = self.input.LA(2) - if LA74 == IDENTIFIER: - LA74_256 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 256, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_257 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 257, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_258 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 258, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_259 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 259, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_260 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 260, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_261 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 261, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_262 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 262, self.input) - - raise nvae - - elif LA74 == 62: - LA74_263 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 263, self.input) - - raise nvae - - elif LA74 == 72: - LA74_264 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 264, self.input) - - raise nvae - - elif LA74 == 73: - LA74_265 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 265, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_266 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 266, self.input) - - raise nvae - - elif LA74 == 74: - LA74_267 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 267, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 10, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74 = self.input.LA(2) - if LA74 == 62: - LA74_268 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 268, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_269 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 269, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_270 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 270, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_271 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 271, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_272 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 272, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_273 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 273, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_274 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 274, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_275 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 275, self.input) - - raise nvae - - elif LA74 == 72: - LA74_276 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 276, self.input) - - raise nvae - - elif LA74 == 73: - LA74_277 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 277, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_278 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 278, self.input) - - raise nvae - - elif LA74 == 74: - LA74_279 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 279, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 11, self.input) - - raise nvae - - elif LA74 == 74: - LA74 = self.input.LA(2) - if LA74 == 62: - LA74_280 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 280, self.input) - - raise nvae - - elif LA74 == IDENTIFIER: - LA74_281 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 281, self.input) - - raise nvae - - elif LA74 == HEX_LITERAL: - LA74_282 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 282, self.input) - - raise nvae - - elif LA74 == OCTAL_LITERAL: - LA74_283 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 283, self.input) - - raise nvae - - elif LA74 == DECIMAL_LITERAL: - LA74_284 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 284, self.input) - - raise nvae - - elif LA74 == CHARACTER_LITERAL: - LA74_285 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 285, self.input) - - raise nvae - - elif LA74 == STRING_LITERAL: - LA74_286 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 286, self.input) - - raise nvae - - elif LA74 == FLOATING_POINT_LITERAL: - LA74_287 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 287, self.input) - - raise nvae - - elif LA74 == 72: - LA74_288 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 288, self.input) - - raise nvae - - elif LA74 == 73: - LA74_289 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 289, self.input) - - raise nvae - - elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: - LA74_290 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 290, self.input) - - raise nvae - - elif LA74 == 74: - LA74_291 = self.input.LA(3) - - if (self.synpred142()) : - alt74 = 1 - elif (True) : - alt74 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 291, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 12, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 0, self.input) - - raise nvae - - if alt74 == 1: - # C.g:458:4: lvalue assignment_operator assignment_expression - self.following.append(self.FOLLOW_lvalue_in_assignment_expression1744) - self.lvalue() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_operator_in_assignment_expression1746) - self.assignment_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_expression_in_assignment_expression1748) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - elif alt74 == 2: - # C.g:459:4: conditional_expression - self.following.append(self.FOLLOW_conditional_expression_in_assignment_expression1753) - self.conditional_expression() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 48, assignment_expression_StartIndex) - - pass - - return - - # $ANTLR end assignment_expression - - - # $ANTLR start lvalue - # C.g:462:1: lvalue : unary_expression ; - def lvalue(self, ): - - lvalue_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 49): - return - - # C.g:463:2: ( unary_expression ) - # C.g:463:4: unary_expression - self.following.append(self.FOLLOW_unary_expression_in_lvalue1765) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 49, lvalue_StartIndex) - - pass - - return - - # $ANTLR end lvalue - - - # $ANTLR start assignment_operator - # C.g:466:1: assignment_operator : ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ); - def assignment_operator(self, ): - - assignment_operator_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 50): - return - - # C.g:467:2: ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ) - # C.g: - if self.input.LA(1) == 28 or (80 <= self.input.LA(1) <= 89): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_assignment_operator0 - ) - raise mse - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 50, assignment_operator_StartIndex) - - pass - - return - - # $ANTLR end assignment_operator - - - # $ANTLR start conditional_expression - # C.g:480:1: conditional_expression : e= logical_or_expression ( '?' expression ':' conditional_expression )? ; - def conditional_expression(self, ): - - conditional_expression_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 51): - return - - # C.g:481:2: (e= logical_or_expression ( '?' expression ':' conditional_expression )? ) - # C.g:481:4: e= logical_or_expression ( '?' expression ':' conditional_expression )? - self.following.append(self.FOLLOW_logical_or_expression_in_conditional_expression1839) - e = self.logical_or_expression() - self.following.pop() - if self.failed: - return - # C.g:481:28: ( '?' expression ':' conditional_expression )? - alt75 = 2 - LA75_0 = self.input.LA(1) - - if (LA75_0 == 90) : - alt75 = 1 - if alt75 == 1: - # C.g:481:29: '?' expression ':' conditional_expression - self.match(self.input, 90, self.FOLLOW_90_in_conditional_expression1842) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_conditional_expression1844) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_conditional_expression1846) - if self.failed: - return - self.following.append(self.FOLLOW_conditional_expression_in_conditional_expression1848) - self.conditional_expression() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 51, conditional_expression_StartIndex) - - pass - - return - - # $ANTLR end conditional_expression - - class logical_or_expression_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start logical_or_expression - # C.g:484:1: logical_or_expression : logical_and_expression ( '||' logical_and_expression )* ; - def logical_or_expression(self, ): - - retval = self.logical_or_expression_return() - retval.start = self.input.LT(1) - logical_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 52): - return retval - - # C.g:485:2: ( logical_and_expression ( '||' logical_and_expression )* ) - # C.g:485:4: logical_and_expression ( '||' logical_and_expression )* - self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1863) - self.logical_and_expression() - self.following.pop() - if self.failed: - return retval - # C.g:485:27: ( '||' logical_and_expression )* - while True: #loop76 - alt76 = 2 - LA76_0 = self.input.LA(1) - - if (LA76_0 == 91) : - alt76 = 1 - - - if alt76 == 1: - # C.g:485:28: '||' logical_and_expression - self.match(self.input, 91, self.FOLLOW_91_in_logical_or_expression1866) - if self.failed: - return retval - self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1868) - self.logical_and_expression() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop76 - - - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 52, logical_or_expression_StartIndex) - - pass - - return retval - - # $ANTLR end logical_or_expression - - - # $ANTLR start logical_and_expression - # C.g:488:1: logical_and_expression : inclusive_or_expression ( '&&' inclusive_or_expression )* ; - def logical_and_expression(self, ): - - logical_and_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 53): - return - - # C.g:489:2: ( inclusive_or_expression ( '&&' inclusive_or_expression )* ) - # C.g:489:4: inclusive_or_expression ( '&&' inclusive_or_expression )* - self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1881) - self.inclusive_or_expression() - self.following.pop() - if self.failed: - return - # C.g:489:28: ( '&&' inclusive_or_expression )* - while True: #loop77 - alt77 = 2 - LA77_0 = self.input.LA(1) - - if (LA77_0 == 92) : - alt77 = 1 - - - if alt77 == 1: - # C.g:489:29: '&&' inclusive_or_expression - self.match(self.input, 92, self.FOLLOW_92_in_logical_and_expression1884) - if self.failed: - return - self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1886) - self.inclusive_or_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop77 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 53, logical_and_expression_StartIndex) - - pass - - return - - # $ANTLR end logical_and_expression - - - # $ANTLR start inclusive_or_expression - # C.g:492:1: inclusive_or_expression : exclusive_or_expression ( '|' exclusive_or_expression )* ; - def inclusive_or_expression(self, ): - - inclusive_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 54): - return - - # C.g:493:2: ( exclusive_or_expression ( '|' exclusive_or_expression )* ) - # C.g:493:4: exclusive_or_expression ( '|' exclusive_or_expression )* - self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899) - self.exclusive_or_expression() - self.following.pop() - if self.failed: - return - # C.g:493:28: ( '|' exclusive_or_expression )* - while True: #loop78 - alt78 = 2 - LA78_0 = self.input.LA(1) - - if (LA78_0 == 93) : - alt78 = 1 - - - if alt78 == 1: - # C.g:493:29: '|' exclusive_or_expression - self.match(self.input, 93, self.FOLLOW_93_in_inclusive_or_expression1902) - if self.failed: - return - self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904) - self.exclusive_or_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop78 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 54, inclusive_or_expression_StartIndex) - - pass - - return - - # $ANTLR end inclusive_or_expression - - - # $ANTLR start exclusive_or_expression - # C.g:496:1: exclusive_or_expression : and_expression ( '^' and_expression )* ; - def exclusive_or_expression(self, ): - - exclusive_or_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 55): - return - - # C.g:497:2: ( and_expression ( '^' and_expression )* ) - # C.g:497:4: and_expression ( '^' and_expression )* - self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1917) - self.and_expression() - self.following.pop() - if self.failed: - return - # C.g:497:19: ( '^' and_expression )* - while True: #loop79 - alt79 = 2 - LA79_0 = self.input.LA(1) - - if (LA79_0 == 94) : - alt79 = 1 - - - if alt79 == 1: - # C.g:497:20: '^' and_expression - self.match(self.input, 94, self.FOLLOW_94_in_exclusive_or_expression1920) - if self.failed: - return - self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1922) - self.and_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop79 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 55, exclusive_or_expression_StartIndex) - - pass - - return - - # $ANTLR end exclusive_or_expression - - - # $ANTLR start and_expression - # C.g:500:1: and_expression : equality_expression ( '&' equality_expression )* ; - def and_expression(self, ): - - and_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 56): - return - - # C.g:501:2: ( equality_expression ( '&' equality_expression )* ) - # C.g:501:4: equality_expression ( '&' equality_expression )* - self.following.append(self.FOLLOW_equality_expression_in_and_expression1935) - self.equality_expression() - self.following.pop() - if self.failed: - return - # C.g:501:24: ( '&' equality_expression )* - while True: #loop80 - alt80 = 2 - LA80_0 = self.input.LA(1) - - if (LA80_0 == 77) : - alt80 = 1 - - - if alt80 == 1: - # C.g:501:25: '&' equality_expression - self.match(self.input, 77, self.FOLLOW_77_in_and_expression1938) - if self.failed: - return - self.following.append(self.FOLLOW_equality_expression_in_and_expression1940) - self.equality_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop80 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 56, and_expression_StartIndex) - - pass - - return - - # $ANTLR end and_expression - - - # $ANTLR start equality_expression - # C.g:503:1: equality_expression : relational_expression ( ( '==' | '!=' ) relational_expression )* ; - def equality_expression(self, ): - - equality_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 57): - return - - # C.g:504:2: ( relational_expression ( ( '==' | '!=' ) relational_expression )* ) - # C.g:504:4: relational_expression ( ( '==' | '!=' ) relational_expression )* - self.following.append(self.FOLLOW_relational_expression_in_equality_expression1952) - self.relational_expression() - self.following.pop() - if self.failed: - return - # C.g:504:26: ( ( '==' | '!=' ) relational_expression )* - while True: #loop81 - alt81 = 2 - LA81_0 = self.input.LA(1) - - if ((95 <= LA81_0 <= 96)) : - alt81 = 1 - - - if alt81 == 1: - # C.g:504:27: ( '==' | '!=' ) relational_expression - if (95 <= self.input.LA(1) <= 96): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_equality_expression1955 - ) - raise mse - - - self.following.append(self.FOLLOW_relational_expression_in_equality_expression1961) - self.relational_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop81 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 57, equality_expression_StartIndex) - - pass - - return - - # $ANTLR end equality_expression - - - # $ANTLR start relational_expression - # C.g:507:1: relational_expression : shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ; - def relational_expression(self, ): - - relational_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 58): - return - - # C.g:508:2: ( shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ) - # C.g:508:4: shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* - self.following.append(self.FOLLOW_shift_expression_in_relational_expression1975) - self.shift_expression() - self.following.pop() - if self.failed: - return - # C.g:508:21: ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* - while True: #loop82 - alt82 = 2 - LA82_0 = self.input.LA(1) - - if ((97 <= LA82_0 <= 100)) : - alt82 = 1 - - - if alt82 == 1: - # C.g:508:22: ( '<' | '>' | '<=' | '>=' ) shift_expression - if (97 <= self.input.LA(1) <= 100): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_relational_expression1978 - ) - raise mse - - - self.following.append(self.FOLLOW_shift_expression_in_relational_expression1988) - self.shift_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop82 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 58, relational_expression_StartIndex) - - pass - - return - - # $ANTLR end relational_expression - - - # $ANTLR start shift_expression - # C.g:511:1: shift_expression : additive_expression ( ( '<<' | '>>' ) additive_expression )* ; - def shift_expression(self, ): - - shift_expression_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 59): - return - - # C.g:512:2: ( additive_expression ( ( '<<' | '>>' ) additive_expression )* ) - # C.g:512:4: additive_expression ( ( '<<' | '>>' ) additive_expression )* - self.following.append(self.FOLLOW_additive_expression_in_shift_expression2001) - self.additive_expression() - self.following.pop() - if self.failed: - return - # C.g:512:24: ( ( '<<' | '>>' ) additive_expression )* - while True: #loop83 - alt83 = 2 - LA83_0 = self.input.LA(1) - - if ((101 <= LA83_0 <= 102)) : - alt83 = 1 - - - if alt83 == 1: - # C.g:512:25: ( '<<' | '>>' ) additive_expression - if (101 <= self.input.LA(1) <= 102): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_shift_expression2004 - ) - raise mse - - - self.following.append(self.FOLLOW_additive_expression_in_shift_expression2010) - self.additive_expression() - self.following.pop() - if self.failed: - return - - - else: - break #loop83 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 59, shift_expression_StartIndex) - - pass - - return - - # $ANTLR end shift_expression - - - # $ANTLR start statement - # C.g:517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ); - def statement(self, ): - - statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 60): - return - - # C.g:518:2: ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ) - alt84 = 11 - LA84 = self.input.LA(1) - if LA84 == IDENTIFIER: - LA84 = self.input.LA(2) - if LA84 == 62: - LA84_43 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (self.synpred173()) : - alt84 = 7 - elif (self.synpred174()) : - alt84 = 8 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 43, self.input) - - raise nvae - - elif LA84 == 47: - alt84 = 1 - elif LA84 == STRING_LITERAL or LA84 == 27 or LA84 == 28 or LA84 == 64 or LA84 == 68 or LA84 == 69 or LA84 == 70 or LA84 == 71 or LA84 == 72 or LA84 == 73 or LA84 == 75 or LA84 == 76 or LA84 == 77 or LA84 == 80 or LA84 == 81 or LA84 == 82 or LA84 == 83 or LA84 == 84 or LA84 == 85 or LA84 == 86 or LA84 == 87 or LA84 == 88 or LA84 == 89 or LA84 == 90 or LA84 == 91 or LA84 == 92 or LA84 == 93 or LA84 == 94 or LA84 == 95 or LA84 == 96 or LA84 == 97 or LA84 == 98 or LA84 == 99 or LA84 == 100 or LA84 == 101 or LA84 == 102: - alt84 = 3 - elif LA84 == 66: - LA84_47 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 47, self.input) - - raise nvae - - elif LA84 == IDENTIFIER: - LA84_53 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 53, self.input) - - raise nvae - - elif LA84 == 25: - LA84_68 = self.input.LA(3) - - if (self.synpred169()) : - alt84 = 3 - elif (True) : - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 68, self.input) - - raise nvae - - elif LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 1, self.input) - - raise nvae - - elif LA84 == 106 or LA84 == 107: - alt84 = 1 - elif LA84 == 43: - alt84 = 2 - elif LA84 == HEX_LITERAL or LA84 == OCTAL_LITERAL or LA84 == DECIMAL_LITERAL or LA84 == CHARACTER_LITERAL or LA84 == STRING_LITERAL or LA84 == FLOATING_POINT_LITERAL or LA84 == 25 or LA84 == 62 or LA84 == 66 or LA84 == 68 or LA84 == 69 or LA84 == 72 or LA84 == 73 or LA84 == 74 or LA84 == 77 or LA84 == 78 or LA84 == 79: - alt84 = 3 - elif LA84 == 108 or LA84 == 110: - alt84 = 4 - elif LA84 == 111 or LA84 == 112 or LA84 == 113: - alt84 = 5 - elif LA84 == 114 or LA84 == 115 or LA84 == 116 or LA84 == 117: - alt84 = 6 - elif LA84 == 103: - alt84 = 8 - elif LA84 == 104: - alt84 = 9 - elif LA84 == 105: - alt84 = 10 - elif LA84 == 26 or LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: - alt84 = 11 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 0, self.input) - - raise nvae - - if alt84 == 1: - # C.g:518:4: labeled_statement - self.following.append(self.FOLLOW_labeled_statement_in_statement2025) - self.labeled_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 2: - # C.g:519:4: compound_statement - self.following.append(self.FOLLOW_compound_statement_in_statement2030) - self.compound_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 3: - # C.g:520:4: expression_statement - self.following.append(self.FOLLOW_expression_statement_in_statement2035) - self.expression_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 4: - # C.g:521:4: selection_statement - self.following.append(self.FOLLOW_selection_statement_in_statement2040) - self.selection_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 5: - # C.g:522:4: iteration_statement - self.following.append(self.FOLLOW_iteration_statement_in_statement2045) - self.iteration_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 6: - # C.g:523:4: jump_statement - self.following.append(self.FOLLOW_jump_statement_in_statement2050) - self.jump_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 7: - # C.g:524:4: macro_statement - self.following.append(self.FOLLOW_macro_statement_in_statement2055) - self.macro_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 8: - # C.g:525:4: asm2_statement - self.following.append(self.FOLLOW_asm2_statement_in_statement2060) - self.asm2_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 9: - # C.g:526:4: asm1_statement - self.following.append(self.FOLLOW_asm1_statement_in_statement2065) - self.asm1_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 10: - # C.g:527:4: asm_statement - self.following.append(self.FOLLOW_asm_statement_in_statement2070) - self.asm_statement() - self.following.pop() - if self.failed: - return - - - elif alt84 == 11: - # C.g:528:4: declaration - self.following.append(self.FOLLOW_declaration_in_statement2075) - self.declaration() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 60, statement_StartIndex) - - pass - - return - - # $ANTLR end statement - - - # $ANTLR start asm2_statement - # C.g:531:1: asm2_statement : ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ; - def asm2_statement(self, ): - - asm2_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 61): - return - - # C.g:532:2: ( ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ) - # C.g:532:4: ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' - # C.g:532:4: ( '__asm__' )? - alt85 = 2 - LA85_0 = self.input.LA(1) - - if (LA85_0 == 103) : - alt85 = 1 - if alt85 == 1: - # C.g:0:0: '__asm__' - self.match(self.input, 103, self.FOLLOW_103_in_asm2_statement2086) - if self.failed: - return - - - - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_asm2_statement2089) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_asm2_statement2091) - if self.failed: - return - # C.g:532:30: (~ ( ';' ) )* - while True: #loop86 - alt86 = 2 - LA86_0 = self.input.LA(1) - - if (LA86_0 == 63) : - LA86_1 = self.input.LA(2) - - if ((IDENTIFIER <= LA86_1 <= LINE_COMMAND) or (26 <= LA86_1 <= 117)) : - alt86 = 1 - - - elif ((IDENTIFIER <= LA86_0 <= LINE_COMMAND) or (26 <= LA86_0 <= 62) or (64 <= LA86_0 <= 117)) : - alt86 = 1 - - - if alt86 == 1: - # C.g:532:31: ~ ( ';' ) - if (IDENTIFIER <= self.input.LA(1) <= LINE_COMMAND) or (26 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm2_statement2094 - ) - raise mse - - - - - else: - break #loop86 - - - self.match(self.input, 63, self.FOLLOW_63_in_asm2_statement2101) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_asm2_statement2103) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 61, asm2_statement_StartIndex) - - pass - - return - - # $ANTLR end asm2_statement - - - # $ANTLR start asm1_statement - # C.g:535:1: asm1_statement : '_asm' '{' (~ ( '}' ) )* '}' ; - def asm1_statement(self, ): - - asm1_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 62): - return - - # C.g:536:2: ( '_asm' '{' (~ ( '}' ) )* '}' ) - # C.g:536:4: '_asm' '{' (~ ( '}' ) )* '}' - self.match(self.input, 104, self.FOLLOW_104_in_asm1_statement2115) - if self.failed: - return - self.match(self.input, 43, self.FOLLOW_43_in_asm1_statement2117) - if self.failed: - return - # C.g:536:15: (~ ( '}' ) )* - while True: #loop87 - alt87 = 2 - LA87_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA87_0 <= 43) or (45 <= LA87_0 <= 117)) : - alt87 = 1 - - - if alt87 == 1: - # C.g:536:16: ~ ( '}' ) - if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm1_statement2120 - ) - raise mse - - - - - else: - break #loop87 - - - self.match(self.input, 44, self.FOLLOW_44_in_asm1_statement2127) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 62, asm1_statement_StartIndex) - - pass - - return - - # $ANTLR end asm1_statement - - - # $ANTLR start asm_statement - # C.g:539:1: asm_statement : '__asm' '{' (~ ( '}' ) )* '}' ; - def asm_statement(self, ): - - asm_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 63): - return - - # C.g:540:2: ( '__asm' '{' (~ ( '}' ) )* '}' ) - # C.g:540:4: '__asm' '{' (~ ( '}' ) )* '}' - self.match(self.input, 105, self.FOLLOW_105_in_asm_statement2138) - if self.failed: - return - self.match(self.input, 43, self.FOLLOW_43_in_asm_statement2140) - if self.failed: - return - # C.g:540:16: (~ ( '}' ) )* - while True: #loop88 - alt88 = 2 - LA88_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA88_0 <= 43) or (45 <= LA88_0 <= 117)) : - alt88 = 1 - - - if alt88 == 1: - # C.g:540:17: ~ ( '}' ) - if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): - self.input.consume(); - self.errorRecovery = False - self.failed = False - - else: - if self.backtracking > 0: - self.failed = True - return - - mse = MismatchedSetException(None, self.input) - self.recoverFromMismatchedSet( - self.input, mse, self.FOLLOW_set_in_asm_statement2143 - ) - raise mse - - - - - else: - break #loop88 - - - self.match(self.input, 44, self.FOLLOW_44_in_asm_statement2150) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 63, asm_statement_StartIndex) - - pass - - return - - # $ANTLR end asm_statement - - - # $ANTLR start macro_statement - # C.g:543:1: macro_statement : IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ; - def macro_statement(self, ): - - macro_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 64): - return - - # C.g:544:2: ( IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ) - # C.g:544:4: IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_macro_statement2162) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_macro_statement2164) - if self.failed: - return - # C.g:544:19: ( declaration )* - while True: #loop89 - alt89 = 2 - LA89 = self.input.LA(1) - if LA89 == IDENTIFIER: - LA89 = self.input.LA(2) - if LA89 == 62: - LA89_45 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_47 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 66: - LA89_50 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_68 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_71 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_72 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_73 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_74 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_75 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_76 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_77 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_78 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_79 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_80 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_81 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_82 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_83 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_84 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_85 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_86 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 26: - LA89 = self.input.LA(2) - if LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_87 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_88 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_89 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_90 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_91 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_92 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_93 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_94 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_95 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_96 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_97 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_98 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_99 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_100 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 66: - LA89_101 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_102 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_103 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_104 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_105 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_106 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_107 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_108 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_109 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_110 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_111 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_112 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_113 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_114 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_115 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_116 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_117 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_118 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_119 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_120 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_121 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_122 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_123 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_124 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_125 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 34: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_126 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_127 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_128 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_129 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_130 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_131 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_132 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_133 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_134 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_135 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_136 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_137 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_138 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_139 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_140 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_141 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_142 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_143 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_144 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_145 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 35: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_146 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_147 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_148 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_149 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_150 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_151 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_152 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_153 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_154 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_155 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_156 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_157 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_158 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_159 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_160 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_161 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_162 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_163 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_164 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_165 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 36: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_166 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_167 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_168 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_169 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_170 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_171 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_172 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_173 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_174 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_175 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_176 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_177 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_178 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_179 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_180 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_181 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_182 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_183 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_184 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_185 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 37: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_186 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_187 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_188 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_189 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_190 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_191 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_192 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_193 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_194 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_195 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_196 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_197 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_198 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_199 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_200 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_201 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_202 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_203 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_204 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_205 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 38: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_206 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_207 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_208 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_209 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_210 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_211 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_212 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_213 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_214 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_215 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_216 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_217 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_218 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_219 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_220 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_221 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_222 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_223 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_224 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_225 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 39: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_226 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_227 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_228 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_229 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_230 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_231 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_232 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_233 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_234 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_235 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_236 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_237 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_238 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_239 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_240 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_241 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_242 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_243 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_244 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_245 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 40: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_246 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_247 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_248 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_249 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_250 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_251 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_252 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_253 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_254 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_255 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_256 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_257 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_258 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_259 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_260 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_261 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_262 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_263 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_264 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_265 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 41: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_266 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_267 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_268 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_269 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_270 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_271 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_272 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_273 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_274 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_275 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_276 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_277 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_278 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_279 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_280 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_281 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_282 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_283 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_284 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_285 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 42: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_286 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_287 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_288 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_289 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_290 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_291 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_292 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_293 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_294 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_295 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_296 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_297 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_298 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_299 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_300 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_301 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_302 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_303 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_304 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_305 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - elif LA89 == 45 or LA89 == 46: - LA89_40 = self.input.LA(2) - - if (LA89_40 == IDENTIFIER) : - LA89_306 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif (LA89_40 == 43) : - LA89_307 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - elif LA89 == 48: - LA89_41 = self.input.LA(2) - - if (LA89_41 == 43) : - LA89_308 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif (LA89_41 == IDENTIFIER) : - LA89_309 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 58 or LA89 == 59 or LA89 == 60 or LA89 == 61: - LA89 = self.input.LA(2) - if LA89 == 66: - LA89_310 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 58: - LA89_311 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 59: - LA89_312 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 60: - LA89_313 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == IDENTIFIER: - LA89_314 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 62: - LA89_315 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 25: - LA89_316 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: - LA89_317 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 34: - LA89_318 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 35: - LA89_319 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 36: - LA89_320 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 37: - LA89_321 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 38: - LA89_322 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 39: - LA89_323 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 40: - LA89_324 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 41: - LA89_325 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 42: - LA89_326 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 45 or LA89 == 46: - LA89_327 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 48: - LA89_328 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: - LA89_329 = self.input.LA(3) - - if (self.synpred181()) : - alt89 = 1 - - - - - if alt89 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_macro_statement2166) - self.declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop89 - - - # C.g:544:33: ( statement_list )? - alt90 = 2 - LA90 = self.input.LA(1) - if LA90 == IDENTIFIER: - LA90 = self.input.LA(2) - if LA90 == 25 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 45 or LA90 == 46 or LA90 == 47 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: - alt90 = 1 - elif LA90 == 62: - LA90_45 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_46 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_47 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 64: - LA90_48 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_49 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_50 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_51 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_52 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_53 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_54 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_55 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_56 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_57 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_58 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_59 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_60 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_61 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_62 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_63 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_64 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_65 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_66 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_67 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_70 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25 or LA90 == 26 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 43 or LA90 == 45 or LA90 == 46 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61 or LA90 == 103 or LA90 == 104 or LA90 == 105 or LA90 == 106 or LA90 == 107 or LA90 == 108 or LA90 == 110 or LA90 == 111 or LA90 == 112 or LA90 == 113 or LA90 == 114 or LA90 == 115 or LA90 == 116 or LA90 == 117: - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_87 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_88 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_89 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_90 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_91 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_92 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_93 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_94 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_95 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_96 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_97 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_98 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_99 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_100 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_101 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_102 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_103 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_104 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_105 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_106 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_107 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_108 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_111 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_112 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_113 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_114 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_115 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_116 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_117 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_118 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_119 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_120 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_121 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_122 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_123 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_124 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_125 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_126 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_127 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_128 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_129 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_130 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_131 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_134 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_135 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_136 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_137 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_138 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_139 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_140 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_141 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_142 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_143 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_144 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_145 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_146 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_147 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_148 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_149 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_150 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_151 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_152 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_153 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_154 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_155 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_156 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_159 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_160 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_161 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_162 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_163 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_164 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_165 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_166 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_167 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_168 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_169 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_170 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_171 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_172 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_173 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_174 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_175 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_176 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_177 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_178 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_179 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_181 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_183 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 64: - LA90_184 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_185 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_186 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_187 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_188 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_189 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_190 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_191 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_192 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_193 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_194 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_195 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_196 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_197 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_198 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_199 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_200 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_201 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_202 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_203 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_204 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_205 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_206 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90 = self.input.LA(2) - if LA90 == 64: - LA90_209 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_210 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 75: - LA90_211 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66: - LA90_212 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 76: - LA90_213 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_214 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_215 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: - LA90_216 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 70: - LA90_217 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 71: - LA90_218 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 68: - LA90_219 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 69: - LA90_220 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 101 or LA90 == 102: - LA90_221 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: - LA90_222 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 95 or LA90 == 96: - LA90_223 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 77: - LA90_224 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 94: - LA90_225 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 93: - LA90_226 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 92: - LA90_227 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 91: - LA90_228 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 90: - LA90_229 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 27: - LA90_230 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 25: - alt90 = 1 - elif LA90 == 62: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_233 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_234 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_235 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_236 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_237 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_238 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_239 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_240 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_241 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_242 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_243 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_244 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: - LA90_245 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 34: - LA90_246 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 35: - LA90_247 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 36: - LA90_248 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 37: - LA90_249 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 38: - LA90_250 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 39: - LA90_251 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 40: - LA90_252 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 41: - LA90_253 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 42: - LA90_254 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 45 or LA90 == 46: - LA90_255 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 48: - LA90_256 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_257 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_258 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_259 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_260 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_261 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_262 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_263 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_264 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_265 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_266 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_267 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_268 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90 = self.input.LA(2) - if LA90 == IDENTIFIER: - LA90_269 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_270 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_271 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_272 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_273 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_274 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_275 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 62: - LA90_276 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_277 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_278 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_279 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_280 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90 = self.input.LA(2) - if LA90 == 62: - LA90_281 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_282 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_283 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_284 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_285 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_286 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_287 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_288 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_289 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_290 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_291 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_292 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90 = self.input.LA(2) - if LA90 == 62: - LA90_293 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == IDENTIFIER: - LA90_294 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == HEX_LITERAL: - LA90_295 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == OCTAL_LITERAL: - LA90_296 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == DECIMAL_LITERAL: - LA90_297 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == CHARACTER_LITERAL: - LA90_298 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == STRING_LITERAL: - LA90_299 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == FLOATING_POINT_LITERAL: - LA90_300 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 72: - LA90_301 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 73: - LA90_302 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: - LA90_303 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - elif LA90 == 74: - LA90_304 = self.input.LA(3) - - if (self.synpred182()) : - alt90 = 1 - if alt90 == 1: - # C.g:0:0: statement_list - self.following.append(self.FOLLOW_statement_list_in_macro_statement2170) - self.statement_list() - self.following.pop() - if self.failed: - return - - - - # C.g:544:49: ( expression )? - alt91 = 2 - LA91_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA91_0 <= FLOATING_POINT_LITERAL) or LA91_0 == 62 or LA91_0 == 66 or (68 <= LA91_0 <= 69) or (72 <= LA91_0 <= 74) or (77 <= LA91_0 <= 79)) : - alt91 = 1 - if alt91 == 1: - # C.g:0:0: expression - self.following.append(self.FOLLOW_expression_in_macro_statement2173) - self.expression() - self.following.pop() - if self.failed: - return - - - - self.match(self.input, 63, self.FOLLOW_63_in_macro_statement2176) - if self.failed: - return - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 64, macro_statement_StartIndex) - - pass - - return - - # $ANTLR end macro_statement - - - # $ANTLR start labeled_statement - # C.g:547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ); - def labeled_statement(self, ): - - labeled_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 65): - return - - # C.g:548:2: ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ) - alt92 = 3 - LA92 = self.input.LA(1) - if LA92 == IDENTIFIER: - alt92 = 1 - elif LA92 == 106: - alt92 = 2 - elif LA92 == 107: - alt92 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement );", 92, 0, self.input) - - raise nvae - - if alt92 == 1: - # C.g:548:4: IDENTIFIER ':' statement - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_labeled_statement2188) - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2190) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2192) - self.statement() - self.following.pop() - if self.failed: - return - - - elif alt92 == 2: - # C.g:549:4: 'case' constant_expression ':' statement - self.match(self.input, 106, self.FOLLOW_106_in_labeled_statement2197) - if self.failed: - return - self.following.append(self.FOLLOW_constant_expression_in_labeled_statement2199) - self.constant_expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2201) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2203) - self.statement() - self.following.pop() - if self.failed: - return - - - elif alt92 == 3: - # C.g:550:4: 'default' ':' statement - self.match(self.input, 107, self.FOLLOW_107_in_labeled_statement2208) - if self.failed: - return - self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2210) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_labeled_statement2212) - self.statement() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 65, labeled_statement_StartIndex) - - pass - - return - - # $ANTLR end labeled_statement - - class compound_statement_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start compound_statement - # C.g:553:1: compound_statement : '{' ( declaration )* ( statement_list )? '}' ; - def compound_statement(self, ): - - retval = self.compound_statement_return() - retval.start = self.input.LT(1) - compound_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 66): - return retval - - # C.g:554:2: ( '{' ( declaration )* ( statement_list )? '}' ) - # C.g:554:4: '{' ( declaration )* ( statement_list )? '}' - self.match(self.input, 43, self.FOLLOW_43_in_compound_statement2223) - if self.failed: - return retval - # C.g:554:8: ( declaration )* - while True: #loop93 - alt93 = 2 - LA93 = self.input.LA(1) - if LA93 == IDENTIFIER: - LA93 = self.input.LA(2) - if LA93 == 62: - LA93_44 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_47 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 66: - LA93_48 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_49 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_50 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_51 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_52 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_53 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_54 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_55 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_56 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_57 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_58 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_59 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_60 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_61 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_62 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_63 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_64 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_65 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 26: - LA93 = self.input.LA(2) - if LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_86 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_87 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_88 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_89 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_90 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_91 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_92 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_93 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_94 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_95 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_96 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_97 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_98 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_99 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 66: - LA93_100 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_101 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_102 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_103 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_104 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_105 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_106 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_107 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_108 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_109 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_110 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_111 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_112 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_113 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_114 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_115 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_116 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_117 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_118 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_119 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_120 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_121 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_122 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_123 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_124 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 34: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_125 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_126 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_127 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_128 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_129 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_130 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_131 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_132 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_133 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_134 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_135 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_136 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_137 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_138 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_139 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_140 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_141 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_142 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_143 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_144 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 35: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_145 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_146 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_147 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_148 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_149 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_150 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_151 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_152 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_153 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_154 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_155 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_156 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_157 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_158 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_159 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_160 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_161 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_162 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_163 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_164 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 36: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_165 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_166 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_167 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_168 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_169 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_170 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_171 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_172 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_173 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_174 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_175 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_176 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_177 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_178 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_179 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_180 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_181 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_182 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_183 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_184 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 37: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_185 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_186 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_187 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_188 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_189 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_190 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_191 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_192 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_193 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_194 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_195 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_196 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_197 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_198 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_199 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_200 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_201 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_202 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_203 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_204 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 38: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_205 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_206 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_207 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_208 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_209 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_210 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_211 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_212 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_213 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_214 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_215 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_216 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_217 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_218 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_219 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_220 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_221 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_222 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_223 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_224 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 39: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_225 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_226 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_227 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_228 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_229 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_230 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_231 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_232 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_233 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_234 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_235 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_236 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_237 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_238 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_239 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_240 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_241 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_242 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_243 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_244 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 40: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_245 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_246 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_247 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_248 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_249 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_250 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_251 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_252 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_253 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_254 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_255 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_256 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_257 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_258 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_259 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_260 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_261 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_262 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_263 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_264 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 41: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_265 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_266 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_267 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_268 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_269 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_270 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_271 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_272 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_273 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_274 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_275 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_276 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_277 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_278 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_279 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_280 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_281 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_282 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_283 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_284 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 42: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_285 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_286 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_287 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_288 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_289 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_290 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_291 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_292 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_293 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_294 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_295 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_296 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_297 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_298 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_299 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_300 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_301 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_302 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_303 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_304 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - elif LA93 == 45 or LA93 == 46: - LA93_40 = self.input.LA(2) - - if (LA93_40 == IDENTIFIER) : - LA93_305 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif (LA93_40 == 43) : - LA93_306 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - elif LA93 == 48: - LA93_41 = self.input.LA(2) - - if (LA93_41 == 43) : - LA93_307 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif (LA93_41 == IDENTIFIER) : - LA93_308 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 58 or LA93 == 59 or LA93 == 60 or LA93 == 61: - LA93 = self.input.LA(2) - if LA93 == 66: - LA93_309 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 58: - LA93_310 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 59: - LA93_311 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 60: - LA93_312 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == IDENTIFIER: - LA93_313 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 62: - LA93_314 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 25: - LA93_315 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: - LA93_316 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 34: - LA93_317 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 35: - LA93_318 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 36: - LA93_319 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 37: - LA93_320 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 38: - LA93_321 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 39: - LA93_322 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 40: - LA93_323 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 41: - LA93_324 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 42: - LA93_325 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 45 or LA93 == 46: - LA93_326 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 48: - LA93_327 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: - LA93_328 = self.input.LA(3) - - if (self.synpred186()) : - alt93 = 1 - - - - - if alt93 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_compound_statement2225) - self.declaration() - self.following.pop() - if self.failed: - return retval - - - else: - break #loop93 - - - # C.g:554:21: ( statement_list )? - alt94 = 2 - LA94_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA94_0 <= FLOATING_POINT_LITERAL) or (25 <= LA94_0 <= 26) or (29 <= LA94_0 <= 43) or (45 <= LA94_0 <= 46) or (48 <= LA94_0 <= 62) or LA94_0 == 66 or (68 <= LA94_0 <= 69) or (72 <= LA94_0 <= 74) or (77 <= LA94_0 <= 79) or (103 <= LA94_0 <= 108) or (110 <= LA94_0 <= 117)) : - alt94 = 1 - if alt94 == 1: - # C.g:0:0: statement_list - self.following.append(self.FOLLOW_statement_list_in_compound_statement2228) - self.statement_list() - self.following.pop() - if self.failed: - return retval - - - - self.match(self.input, 44, self.FOLLOW_44_in_compound_statement2231) - if self.failed: - return retval - - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 66, compound_statement_StartIndex) - - pass - - return retval - - # $ANTLR end compound_statement - - - # $ANTLR start statement_list - # C.g:557:1: statement_list : ( statement )+ ; - def statement_list(self, ): - - statement_list_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 67): - return - - # C.g:558:2: ( ( statement )+ ) - # C.g:558:4: ( statement )+ - # C.g:558:4: ( statement )+ - cnt95 = 0 - while True: #loop95 - alt95 = 2 - LA95 = self.input.LA(1) - if LA95 == IDENTIFIER: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_46 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 45 or LA95 == 46 or LA95 == 47 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: - alt95 = 1 - elif LA95 == STRING_LITERAL: - LA95_48 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_49 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 64: - LA95_50 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_51 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_52 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_53 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_54 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_55 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_56 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_57 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_58 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_59 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_60 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_61 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_62 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_63 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_64 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_65 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_66 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_67 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_68 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_69 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_88 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == HEX_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_89 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_90 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_91 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_92 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_93 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_94 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_95 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_96 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_97 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_98 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_99 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_100 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_101 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_102 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_103 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_104 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_105 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_106 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_107 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_108 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_109 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_110 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == OCTAL_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_113 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_114 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_115 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_116 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_117 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_118 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_119 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_120 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_121 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_122 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_123 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_124 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_125 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_126 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_127 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_128 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_129 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_130 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_131 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_132 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_133 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_135 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == DECIMAL_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_137 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_138 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_139 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_140 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_141 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_142 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_143 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_144 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_145 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_146 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_147 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_148 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_149 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_150 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_151 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_152 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_153 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_154 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_155 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_156 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_157 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_158 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == CHARACTER_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_161 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_162 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_163 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_164 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_165 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_166 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_167 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_168 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_169 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_170 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_171 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_172 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_173 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_174 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_175 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_176 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_177 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_178 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_179 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_180 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_181 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_182 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - - elif LA95 == STRING_LITERAL: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_185 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 64: - LA95_186 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_187 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_188 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_189 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_190 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_191 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_192 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_193 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_194 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_195 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_196 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_197 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_198 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_199 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_200 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_201 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_202 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_203 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_204 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_205 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_206 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - elif LA95 == STRING_LITERAL: - LA95_208 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_209 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95 = self.input.LA(2) - if LA95 == 64: - LA95_211 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_212 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 75: - LA95_213 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66: - LA95_214 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 76: - LA95_215 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_216 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_217 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 70: - LA95_218 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 71: - LA95_219 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 68: - LA95_220 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 69: - LA95_221 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 101 or LA95 == 102: - LA95_222 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: - LA95_223 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 95 or LA95 == 96: - LA95_224 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 77: - LA95_225 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 94: - LA95_226 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 93: - LA95_227 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 92: - LA95_228 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 91: - LA95_229 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 90: - LA95_230 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 27: - LA95_231 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 25: - alt95 = 1 - elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: - LA95_234 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 62: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_235 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_236 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_237 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_238 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_239 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_240 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_241 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_242 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_243 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_244 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_245 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_246 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: - LA95_247 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 34: - LA95_248 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 35: - LA95_249 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 36: - LA95_250 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 37: - LA95_251 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 38: - LA95_252 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 39: - LA95_253 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 40: - LA95_254 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 41: - LA95_255 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 42: - LA95_256 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 45 or LA95 == 46: - LA95_257 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 48: - LA95_258 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 72: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_259 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_260 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_261 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_262 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_263 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_264 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_265 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_266 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_267 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_268 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_269 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_270 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 73: - LA95 = self.input.LA(2) - if LA95 == IDENTIFIER: - LA95_271 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_272 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_273 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_274 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_275 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_276 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_277 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 62: - LA95_278 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_279 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_280 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_281 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_282 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_283 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_284 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_285 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_286 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_287 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_288 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_289 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_290 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_291 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_292 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_293 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_294 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 74: - LA95 = self.input.LA(2) - if LA95 == 62: - LA95_295 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == IDENTIFIER: - LA95_296 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == HEX_LITERAL: - LA95_297 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == OCTAL_LITERAL: - LA95_298 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == DECIMAL_LITERAL: - LA95_299 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == CHARACTER_LITERAL: - LA95_300 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == STRING_LITERAL: - LA95_301 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == FLOATING_POINT_LITERAL: - LA95_302 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 72: - LA95_303 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 73: - LA95_304 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: - LA95_305 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - elif LA95 == 74: - LA95_306 = self.input.LA(3) - - if (self.synpred188()) : - alt95 = 1 - - - - elif LA95 == 25 or LA95 == 26 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 43 or LA95 == 45 or LA95 == 46 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61 or LA95 == 103 or LA95 == 104 or LA95 == 105 or LA95 == 106 or LA95 == 107 or LA95 == 108 or LA95 == 110 or LA95 == 111 or LA95 == 112 or LA95 == 113 or LA95 == 114 or LA95 == 115 or LA95 == 116 or LA95 == 117: - alt95 = 1 - - if alt95 == 1: - # C.g:0:0: statement - self.following.append(self.FOLLOW_statement_in_statement_list2242) - self.statement() - self.following.pop() - if self.failed: - return - - - else: - if cnt95 >= 1: - break #loop95 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(95, self.input) - raise eee - - cnt95 += 1 - - - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 67, statement_list_StartIndex) - - pass - - return - - # $ANTLR end statement_list - - class expression_statement_return(object): - def __init__(self): - self.start = None - self.stop = None - - - - # $ANTLR start expression_statement - # C.g:561:1: expression_statement : ( ';' | expression ';' ); - def expression_statement(self, ): - - retval = self.expression_statement_return() - retval.start = self.input.LT(1) - expression_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 68): - return retval - - # C.g:562:2: ( ';' | expression ';' ) - alt96 = 2 - LA96_0 = self.input.LA(1) - - if (LA96_0 == 25) : - alt96 = 1 - elif ((IDENTIFIER <= LA96_0 <= FLOATING_POINT_LITERAL) or LA96_0 == 62 or LA96_0 == 66 or (68 <= LA96_0 <= 69) or (72 <= LA96_0 <= 74) or (77 <= LA96_0 <= 79)) : - alt96 = 2 - else: - if self.backtracking > 0: - self.failed = True - return retval - - nvae = NoViableAltException("561:1: expression_statement : ( ';' | expression ';' );", 96, 0, self.input) - - raise nvae - - if alt96 == 1: - # C.g:562:4: ';' - self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2254) - if self.failed: - return retval - - - elif alt96 == 2: - # C.g:563:4: expression ';' - self.following.append(self.FOLLOW_expression_in_expression_statement2259) - self.expression() - self.following.pop() - if self.failed: - return retval - self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2261) - if self.failed: - return retval - - - retval.stop = self.input.LT(-1) - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 68, expression_statement_StartIndex) - - pass - - return retval - - # $ANTLR end expression_statement - - - # $ANTLR start selection_statement - # C.g:566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ); - def selection_statement(self, ): - - selection_statement_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 69): - return - - # C.g:567:2: ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ) - alt98 = 2 - LA98_0 = self.input.LA(1) - - if (LA98_0 == 108) : - alt98 = 1 - elif (LA98_0 == 110) : - alt98 = 2 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement );", 98, 0, self.input) - - raise nvae - - if alt98 == 1: - # C.g:567:4: 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? - self.match(self.input, 108, self.FOLLOW_108_in_selection_statement2272) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2274) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_selection_statement2278) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2280) - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - self.following.append(self.FOLLOW_statement_in_selection_statement2284) - self.statement() - self.following.pop() - if self.failed: - return - # C.g:567:167: ( options {k=1; backtrack=false; } : 'else' statement )? - alt97 = 2 - LA97_0 = self.input.LA(1) - - if (LA97_0 == 109) : - alt97 = 1 - if alt97 == 1: - # C.g:567:200: 'else' statement - self.match(self.input, 109, self.FOLLOW_109_in_selection_statement2299) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_selection_statement2301) - self.statement() - self.following.pop() - if self.failed: - return - - - - - - elif alt98 == 2: - # C.g:568:4: 'switch' '(' expression ')' statement - self.match(self.input, 110, self.FOLLOW_110_in_selection_statement2308) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2310) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_selection_statement2312) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2314) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_selection_statement2316) - self.statement() - self.following.pop() - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 69, selection_statement_StartIndex) - - pass - - return - - # $ANTLR end selection_statement - - - # $ANTLR start iteration_statement - # C.g:571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ); - def iteration_statement(self, ): - - iteration_statement_StartIndex = self.input.index() - e = None - - - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 70): - return - - # C.g:572:2: ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ) - alt100 = 3 - LA100 = self.input.LA(1) - if LA100 == 111: - alt100 = 1 - elif LA100 == 112: - alt100 = 2 - elif LA100 == 113: - alt100 = 3 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement );", 100, 0, self.input) - - raise nvae - - if alt100 == 1: - # C.g:572:4: 'while' '(' e= expression ')' statement - self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2327) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2329) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_iteration_statement2333) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2335) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2337) - self.statement() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - elif alt100 == 2: - # C.g:573:4: 'do' statement 'while' '(' e= expression ')' ';' - self.match(self.input, 112, self.FOLLOW_112_in_iteration_statement2344) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2346) - self.statement() - self.following.pop() - if self.failed: - return - self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2348) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2350) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_iteration_statement2354) - e = self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2356) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_iteration_statement2358) - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - elif alt100 == 3: - # C.g:574:4: 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement - self.match(self.input, 113, self.FOLLOW_113_in_iteration_statement2365) - if self.failed: - return - self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2367) - if self.failed: - return - self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2369) - self.expression_statement() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2373) - e = self.expression_statement() - self.following.pop() - if self.failed: - return - # C.g:574:58: ( expression )? - alt99 = 2 - LA99_0 = self.input.LA(1) - - if ((IDENTIFIER <= LA99_0 <= FLOATING_POINT_LITERAL) or LA99_0 == 62 or LA99_0 == 66 or (68 <= LA99_0 <= 69) or (72 <= LA99_0 <= 74) or (77 <= LA99_0 <= 79)) : - alt99 = 1 - if alt99 == 1: - # C.g:0:0: expression - self.following.append(self.FOLLOW_expression_in_iteration_statement2375) - self.expression() - self.following.pop() - if self.failed: - return - - - - self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2378) - if self.failed: - return - self.following.append(self.FOLLOW_statement_in_iteration_statement2380) - self.statement() - self.following.pop() - if self.failed: - return - if self.backtracking == 0: - self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) - - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 70, iteration_statement_StartIndex) - - pass - - return - - # $ANTLR end iteration_statement - - - # $ANTLR start jump_statement - # C.g:577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ); - def jump_statement(self, ): - - jump_statement_StartIndex = self.input.index() - try: - try: - if self.backtracking > 0 and self.alreadyParsedRule(self.input, 71): - return - - # C.g:578:2: ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ) - alt101 = 5 - LA101 = self.input.LA(1) - if LA101 == 114: - alt101 = 1 - elif LA101 == 115: - alt101 = 2 - elif LA101 == 116: - alt101 = 3 - elif LA101 == 117: - LA101_4 = self.input.LA(2) - - if (LA101_4 == 25) : - alt101 = 4 - elif ((IDENTIFIER <= LA101_4 <= FLOATING_POINT_LITERAL) or LA101_4 == 62 or LA101_4 == 66 or (68 <= LA101_4 <= 69) or (72 <= LA101_4 <= 74) or (77 <= LA101_4 <= 79)) : - alt101 = 5 - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 4, self.input) - - raise nvae - - else: - if self.backtracking > 0: - self.failed = True - return - - nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 0, self.input) - - raise nvae - - if alt101 == 1: - # C.g:578:4: 'goto' IDENTIFIER ';' - self.match(self.input, 114, self.FOLLOW_114_in_jump_statement2393) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_jump_statement2395) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2397) - if self.failed: - return - - - elif alt101 == 2: - # C.g:579:4: 'continue' ';' - self.match(self.input, 115, self.FOLLOW_115_in_jump_statement2402) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2404) - if self.failed: - return - - - elif alt101 == 3: - # C.g:580:4: 'break' ';' - self.match(self.input, 116, self.FOLLOW_116_in_jump_statement2409) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2411) - if self.failed: - return - - - elif alt101 == 4: - # C.g:581:4: 'return' ';' - self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2416) - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2418) - if self.failed: - return - - - elif alt101 == 5: - # C.g:582:4: 'return' expression ';' - self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2423) - if self.failed: - return - self.following.append(self.FOLLOW_expression_in_jump_statement2425) - self.expression() - self.following.pop() - if self.failed: - return - self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2427) - if self.failed: - return - - - - except RecognitionException, re: - self.reportError(re) - self.recover(self.input, re) - finally: - if self.backtracking > 0: - self.memoize(self.input, 71, jump_statement_StartIndex) - - pass - - return - - # $ANTLR end jump_statement - - # $ANTLR start synpred2 - def synpred2_fragment(self, ): - # C.g:119:6: ( declaration_specifiers ) - # C.g:119:6: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred2100) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred2 - - - - # $ANTLR start synpred4 - def synpred4_fragment(self, ): - # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' ) - # C.g:119:6: ( declaration_specifiers )? declarator ( declaration )* '{' - # C.g:119:6: ( declaration_specifiers )? - alt102 = 2 - LA102 = self.input.LA(1) - if LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33 or LA102 == 34 or LA102 == 35 or LA102 == 36 or LA102 == 37 or LA102 == 38 or LA102 == 39 or LA102 == 40 or LA102 == 41 or LA102 == 42 or LA102 == 45 or LA102 == 46 or LA102 == 48 or LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: - alt102 = 1 - elif LA102 == IDENTIFIER: - LA102 = self.input.LA(2) - if LA102 == 62: - LA102_21 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33: - LA102_23 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 34: - LA102_24 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 35: - LA102_25 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 36: - LA102_26 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 37: - LA102_27 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 38: - LA102_28 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 39: - LA102_29 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 40: - LA102_30 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 41: - LA102_31 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 42: - LA102_32 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 45 or LA102 == 46: - LA102_33 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 48: - LA102_34 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == IDENTIFIER: - LA102_35 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 58: - LA102_36 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 66: - alt102 = 1 - elif LA102 == 59: - LA102_39 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 60: - LA102_40 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: - LA102_41 = self.input.LA(3) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 58: - LA102_14 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 59: - LA102_16 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - elif LA102 == 60: - LA102_17 = self.input.LA(2) - - if (self.synpred2()) : - alt102 = 1 - if alt102 == 1: - # C.g:0:0: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred4100) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - - self.following.append(self.FOLLOW_declarator_in_synpred4103) - self.declarator() - self.following.pop() - if self.failed: - return - # C.g:119:41: ( declaration )* - while True: #loop103 - alt103 = 2 - LA103_0 = self.input.LA(1) - - if (LA103_0 == IDENTIFIER or LA103_0 == 26 or (29 <= LA103_0 <= 42) or (45 <= LA103_0 <= 46) or (48 <= LA103_0 <= 61)) : - alt103 = 1 - - - if alt103 == 1: - # C.g:0:0: declaration - self.following.append(self.FOLLOW_declaration_in_synpred4105) - self.declaration() - self.following.pop() - if self.failed: - return - - - else: - break #loop103 - - - self.match(self.input, 43, self.FOLLOW_43_in_synpred4108) - if self.failed: - return - - - # $ANTLR end synpred4 - - - - # $ANTLR start synpred5 - def synpred5_fragment(self, ): - # C.g:120:4: ( declaration ) - # C.g:120:4: declaration - self.following.append(self.FOLLOW_declaration_in_synpred5118) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred5 - - - - # $ANTLR start synpred7 - def synpred7_fragment(self, ): - # C.g:146:6: ( declaration_specifiers ) - # C.g:146:6: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred7157) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred7 - - - - # $ANTLR start synpred10 - def synpred10_fragment(self, ): - # C.g:167:18: ( declaration_specifiers ) - # C.g:167:18: declaration_specifiers - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred10207) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred10 - - - - # $ANTLR start synpred14 - def synpred14_fragment(self, ): - # C.g:184:7: ( type_specifier ) - # C.g:184:7: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_synpred14272) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred14 - - - - # $ANTLR start synpred15 - def synpred15_fragment(self, ): - # C.g:185:13: ( type_qualifier ) - # C.g:185:13: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred15286) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred15 - - - - # $ANTLR start synpred33 - def synpred33_fragment(self, ): - # C.g:225:16: ( type_qualifier ) - # C.g:225:16: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred33444) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred33 - - - - # $ANTLR start synpred34 - def synpred34_fragment(self, ): - # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator ) - # C.g:225:5: IDENTIFIER ( type_qualifier )* declarator - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred34442) - if self.failed: - return - # C.g:225:16: ( type_qualifier )* - while True: #loop106 - alt106 = 2 - LA106 = self.input.LA(1) - if LA106 == 58: - LA106_2 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 59: - LA106_3 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 60: - LA106_4 = self.input.LA(2) - - if (self.synpred33()) : - alt106 = 1 - - - elif LA106 == 49 or LA106 == 50 or LA106 == 51 or LA106 == 52 or LA106 == 53 or LA106 == 54 or LA106 == 55 or LA106 == 56 or LA106 == 57 or LA106 == 61: - alt106 = 1 - - if alt106 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred34444) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - break #loop106 - - - self.following.append(self.FOLLOW_declarator_in_synpred34447) - self.declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred34 - - - - # $ANTLR start synpred39 - def synpred39_fragment(self, ): - # C.g:253:6: ( type_qualifier ) - # C.g:253:6: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred39566) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred39 - - - - # $ANTLR start synpred40 - def synpred40_fragment(self, ): - # C.g:253:23: ( type_specifier ) - # C.g:253:23: type_specifier - self.following.append(self.FOLLOW_type_specifier_in_synpred40570) - self.type_specifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred40 - - - - # $ANTLR start synpred66 - def synpred66_fragment(self, ): - # C.g:297:4: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator ) - # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator - # C.g:297:4: ( pointer )? - alt111 = 2 - LA111_0 = self.input.LA(1) - - if (LA111_0 == 66) : - alt111 = 1 - if alt111 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_synpred66784) - self.pointer() - self.following.pop() - if self.failed: - return - - - - # C.g:297:13: ( 'EFIAPI' )? - alt112 = 2 - LA112_0 = self.input.LA(1) - - if (LA112_0 == 58) : - alt112 = 1 - if alt112 == 1: - # C.g:297:14: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_synpred66788) - if self.failed: - return - - - - # C.g:297:25: ( 'EFI_BOOTSERVICE' )? - alt113 = 2 - LA113_0 = self.input.LA(1) - - if (LA113_0 == 59) : - alt113 = 1 - if alt113 == 1: - # C.g:297:26: 'EFI_BOOTSERVICE' - self.match(self.input, 59, self.FOLLOW_59_in_synpred66793) - if self.failed: - return - - - - # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? - alt114 = 2 - LA114_0 = self.input.LA(1) - - if (LA114_0 == 60) : - alt114 = 1 - if alt114 == 1: - # C.g:297:47: 'EFI_RUNTIMESERVICE' - self.match(self.input, 60, self.FOLLOW_60_in_synpred66798) - if self.failed: - return - - - - self.following.append(self.FOLLOW_direct_declarator_in_synpred66802) - self.direct_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred66 - - - - # $ANTLR start synpred67 - def synpred67_fragment(self, ): - # C.g:303:15: ( declarator_suffix ) - # C.g:303:15: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_synpred67821) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred67 - - - - # $ANTLR start synpred69 - def synpred69_fragment(self, ): - # C.g:304:9: ( 'EFIAPI' ) - # C.g:304:9: 'EFIAPI' - self.match(self.input, 58, self.FOLLOW_58_in_synpred69830) - if self.failed: - return - - - # $ANTLR end synpred69 - - - - # $ANTLR start synpred70 - def synpred70_fragment(self, ): - # C.g:304:35: ( declarator_suffix ) - # C.g:304:35: declarator_suffix - self.following.append(self.FOLLOW_declarator_suffix_in_synpred70838) - self.declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred70 - - - - # $ANTLR start synpred73 - def synpred73_fragment(self, ): - # C.g:310:9: ( '(' parameter_type_list ')' ) - # C.g:310:9: '(' parameter_type_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred73878) - if self.failed: - return - self.following.append(self.FOLLOW_parameter_type_list_in_synpred73880) - self.parameter_type_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred73882) - if self.failed: - return - - - # $ANTLR end synpred73 - - - - # $ANTLR start synpred74 - def synpred74_fragment(self, ): - # C.g:311:9: ( '(' identifier_list ')' ) - # C.g:311:9: '(' identifier_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred74892) - if self.failed: - return - self.following.append(self.FOLLOW_identifier_list_in_synpred74894) - self.identifier_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred74896) - if self.failed: - return - - - # $ANTLR end synpred74 - - - - # $ANTLR start synpred75 - def synpred75_fragment(self, ): - # C.g:316:8: ( type_qualifier ) - # C.g:316:8: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred75921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred75 - - - - # $ANTLR start synpred76 - def synpred76_fragment(self, ): - # C.g:316:24: ( pointer ) - # C.g:316:24: pointer - self.following.append(self.FOLLOW_pointer_in_synpred76924) - self.pointer() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred76 - - - - # $ANTLR start synpred77 - def synpred77_fragment(self, ): - # C.g:316:4: ( '*' ( type_qualifier )+ ( pointer )? ) - # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? - self.match(self.input, 66, self.FOLLOW_66_in_synpred77919) - if self.failed: - return - # C.g:316:8: ( type_qualifier )+ - cnt116 = 0 - while True: #loop116 - alt116 = 2 - LA116_0 = self.input.LA(1) - - if ((49 <= LA116_0 <= 61)) : - alt116 = 1 - - - if alt116 == 1: - # C.g:0:0: type_qualifier - self.following.append(self.FOLLOW_type_qualifier_in_synpred77921) - self.type_qualifier() - self.following.pop() - if self.failed: - return - - - else: - if cnt116 >= 1: - break #loop116 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(116, self.input) - raise eee - - cnt116 += 1 - - - # C.g:316:24: ( pointer )? - alt117 = 2 - LA117_0 = self.input.LA(1) - - if (LA117_0 == 66) : - alt117 = 1 - if alt117 == 1: - # C.g:0:0: pointer - self.following.append(self.FOLLOW_pointer_in_synpred77924) - self.pointer() - self.following.pop() - if self.failed: - return - - - - - - # $ANTLR end synpred77 - - - - # $ANTLR start synpred78 - def synpred78_fragment(self, ): - # C.g:317:4: ( '*' pointer ) - # C.g:317:4: '*' pointer - self.match(self.input, 66, self.FOLLOW_66_in_synpred78930) - if self.failed: - return - self.following.append(self.FOLLOW_pointer_in_synpred78932) - self.pointer() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred78 - - - - # $ANTLR start synpred81 - def synpred81_fragment(self, ): - # C.g:326:32: ( 'OPTIONAL' ) - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred81977) - if self.failed: - return - - - # $ANTLR end synpred81 - - - - # $ANTLR start synpred82 - def synpred82_fragment(self, ): - # C.g:326:27: ( ',' ( 'OPTIONAL' )? parameter_declaration ) - # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration - self.match(self.input, 27, self.FOLLOW_27_in_synpred82974) - if self.failed: - return - # C.g:326:31: ( 'OPTIONAL' )? - alt119 = 2 - LA119_0 = self.input.LA(1) - - if (LA119_0 == 53) : - LA119_1 = self.input.LA(2) - - if (self.synpred81()) : - alt119 = 1 - if alt119 == 1: - # C.g:326:32: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred82977) - if self.failed: - return - - - - self.following.append(self.FOLLOW_parameter_declaration_in_synpred82981) - self.parameter_declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred82 - - - - # $ANTLR start synpred83 - def synpred83_fragment(self, ): - # C.g:330:28: ( declarator ) - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_synpred83997) - self.declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred83 - - - - # $ANTLR start synpred84 - def synpred84_fragment(self, ): - # C.g:330:39: ( abstract_declarator ) - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred84999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred84 - - - - # $ANTLR start synpred86 - def synpred86_fragment(self, ): - # C.g:330:4: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? ) - # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? - self.following.append(self.FOLLOW_declaration_specifiers_in_synpred86994) - self.declaration_specifiers() - self.following.pop() - if self.failed: - return - # C.g:330:27: ( declarator | abstract_declarator )* - while True: #loop120 - alt120 = 3 - LA120 = self.input.LA(1) - if LA120 == 66: - LA120_3 = self.input.LA(2) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == IDENTIFIER or LA120 == 58 or LA120 == 59 or LA120 == 60: - alt120 = 1 - elif LA120 == 62: - LA120 = self.input.LA(2) - if LA120 == 29 or LA120 == 30 or LA120 == 31 or LA120 == 32 or LA120 == 33 or LA120 == 34 or LA120 == 35 or LA120 == 36 or LA120 == 37 or LA120 == 38 or LA120 == 39 or LA120 == 40 or LA120 == 41 or LA120 == 42 or LA120 == 45 or LA120 == 46 or LA120 == 48 or LA120 == 49 or LA120 == 50 or LA120 == 51 or LA120 == 52 or LA120 == 53 or LA120 == 54 or LA120 == 55 or LA120 == 56 or LA120 == 57 or LA120 == 61 or LA120 == 63 or LA120 == 64: - alt120 = 2 - elif LA120 == 58: - LA120_21 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 66: - LA120_22 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 59: - LA120_23 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 60: - LA120_24 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == IDENTIFIER: - LA120_25 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - elif LA120 == 62: - LA120_26 = self.input.LA(3) - - if (self.synpred83()) : - alt120 = 1 - elif (self.synpred84()) : - alt120 = 2 - - - - elif LA120 == 64: - alt120 = 2 - - if alt120 == 1: - # C.g:330:28: declarator - self.following.append(self.FOLLOW_declarator_in_synpred86997) - self.declarator() - self.following.pop() - if self.failed: - return - - - elif alt120 == 2: - # C.g:330:39: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred86999) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - else: - break #loop120 - - - # C.g:330:61: ( 'OPTIONAL' )? - alt121 = 2 - LA121_0 = self.input.LA(1) - - if (LA121_0 == 53) : - alt121 = 1 - if alt121 == 1: - # C.g:330:62: 'OPTIONAL' - self.match(self.input, 53, self.FOLLOW_53_in_synpred861004) - if self.failed: - return - - - - - - # $ANTLR end synpred86 - - - - # $ANTLR start synpred90 - def synpred90_fragment(self, ): - # C.g:341:4: ( specifier_qualifier_list ( abstract_declarator )? ) - # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? - self.following.append(self.FOLLOW_specifier_qualifier_list_in_synpred901046) - self.specifier_qualifier_list() - self.following.pop() - if self.failed: - return - # C.g:341:29: ( abstract_declarator )? - alt122 = 2 - LA122_0 = self.input.LA(1) - - if (LA122_0 == 62 or LA122_0 == 64 or LA122_0 == 66) : - alt122 = 1 - if alt122 == 1: - # C.g:0:0: abstract_declarator - self.following.append(self.FOLLOW_abstract_declarator_in_synpred901048) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - - - - - - # $ANTLR end synpred90 - - - - # $ANTLR start synpred91 - def synpred91_fragment(self, ): - # C.g:346:12: ( direct_abstract_declarator ) - # C.g:346:12: direct_abstract_declarator - self.following.append(self.FOLLOW_direct_abstract_declarator_in_synpred911067) - self.direct_abstract_declarator() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred91 - - - - # $ANTLR start synpred93 - def synpred93_fragment(self, ): - # C.g:351:6: ( '(' abstract_declarator ')' ) - # C.g:351:6: '(' abstract_declarator ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred931086) - if self.failed: - return - self.following.append(self.FOLLOW_abstract_declarator_in_synpred931088) - self.abstract_declarator() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred931090) - if self.failed: - return - - - # $ANTLR end synpred93 - - - - # $ANTLR start synpred94 - def synpred94_fragment(self, ): - # C.g:351:65: ( abstract_declarator_suffix ) - # C.g:351:65: abstract_declarator_suffix - self.following.append(self.FOLLOW_abstract_declarator_suffix_in_synpred941098) - self.abstract_declarator_suffix() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred94 - - - - # $ANTLR start synpred109 - def synpred109_fragment(self, ): - # C.g:386:4: ( '(' type_name ')' cast_expression ) - # C.g:386:4: '(' type_name ')' cast_expression - self.match(self.input, 62, self.FOLLOW_62_in_synpred1091282) - if self.failed: - return - self.following.append(self.FOLLOW_type_name_in_synpred1091284) - self.type_name() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1091286) - if self.failed: - return - self.following.append(self.FOLLOW_cast_expression_in_synpred1091288) - self.cast_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred109 - - - - # $ANTLR start synpred114 - def synpred114_fragment(self, ): - # C.g:395:4: ( 'sizeof' unary_expression ) - # C.g:395:4: 'sizeof' unary_expression - self.match(self.input, 74, self.FOLLOW_74_in_synpred1141330) - if self.failed: - return - self.following.append(self.FOLLOW_unary_expression_in_synpred1141332) - self.unary_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred114 - - - - # $ANTLR start synpred117 - def synpred117_fragment(self, ): - # C.g:409:13: ( '(' argument_expression_list ')' ) - # C.g:409:13: '(' argument_expression_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred1171420) - if self.failed: - return - self.following.append(self.FOLLOW_argument_expression_list_in_synpred1171424) - self.argument_expression_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1171428) - if self.failed: - return - - - # $ANTLR end synpred117 - - - - # $ANTLR start synpred118 - def synpred118_fragment(self, ): - # C.g:410:13: ( '(' macro_parameter_list ')' ) - # C.g:410:13: '(' macro_parameter_list ')' - self.match(self.input, 62, self.FOLLOW_62_in_synpred1181444) - if self.failed: - return - self.following.append(self.FOLLOW_macro_parameter_list_in_synpred1181446) - self.macro_parameter_list() - self.following.pop() - if self.failed: - return - self.match(self.input, 63, self.FOLLOW_63_in_synpred1181448) - if self.failed: - return - - - # $ANTLR end synpred118 - - - - # $ANTLR start synpred120 - def synpred120_fragment(self, ): - # C.g:412:13: ( '*' IDENTIFIER ) - # C.g:412:13: '*' IDENTIFIER - self.match(self.input, 66, self.FOLLOW_66_in_synpred1201482) - if self.failed: - return - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1201486) - if self.failed: - return - - - # $ANTLR end synpred120 - - - - # $ANTLR start synpred137 - def synpred137_fragment(self, ): - # C.g:443:20: ( STRING_LITERAL ) - # C.g:443:20: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1371683) - if self.failed: - return - - - # $ANTLR end synpred137 - - - - # $ANTLR start synpred138 - def synpred138_fragment(self, ): - # C.g:443:8: ( ( IDENTIFIER )* ( STRING_LITERAL )+ ) - # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ - # C.g:443:8: ( IDENTIFIER )* - while True: #loop125 - alt125 = 2 - LA125_0 = self.input.LA(1) - - if (LA125_0 == IDENTIFIER) : - alt125 = 1 - - - if alt125 == 1: - # C.g:0:0: IDENTIFIER - self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1381680) - if self.failed: - return - - - else: - break #loop125 - - - # C.g:443:20: ( STRING_LITERAL )+ - cnt126 = 0 - while True: #loop126 - alt126 = 2 - LA126_0 = self.input.LA(1) - - if (LA126_0 == STRING_LITERAL) : - alt126 = 1 - - - if alt126 == 1: - # C.g:0:0: STRING_LITERAL - self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1381683) - if self.failed: - return - - - else: - if cnt126 >= 1: - break #loop126 - - if self.backtracking > 0: - self.failed = True - return - - eee = EarlyExitException(126, self.input) - raise eee - - cnt126 += 1 - - - - - # $ANTLR end synpred138 - - - - # $ANTLR start synpred142 - def synpred142_fragment(self, ): - # C.g:458:4: ( lvalue assignment_operator assignment_expression ) - # C.g:458:4: lvalue assignment_operator assignment_expression - self.following.append(self.FOLLOW_lvalue_in_synpred1421744) - self.lvalue() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_operator_in_synpred1421746) - self.assignment_operator() - self.following.pop() - if self.failed: - return - self.following.append(self.FOLLOW_assignment_expression_in_synpred1421748) - self.assignment_expression() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred142 - - - - # $ANTLR start synpred169 - def synpred169_fragment(self, ): - # C.g:520:4: ( expression_statement ) - # C.g:520:4: expression_statement - self.following.append(self.FOLLOW_expression_statement_in_synpred1692035) - self.expression_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred169 - - - - # $ANTLR start synpred173 - def synpred173_fragment(self, ): - # C.g:524:4: ( macro_statement ) - # C.g:524:4: macro_statement - self.following.append(self.FOLLOW_macro_statement_in_synpred1732055) - self.macro_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred173 - - - - # $ANTLR start synpred174 - def synpred174_fragment(self, ): - # C.g:525:4: ( asm2_statement ) - # C.g:525:4: asm2_statement - self.following.append(self.FOLLOW_asm2_statement_in_synpred1742060) - self.asm2_statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred174 - - - - # $ANTLR start synpred181 - def synpred181_fragment(self, ): - # C.g:544:19: ( declaration ) - # C.g:544:19: declaration - self.following.append(self.FOLLOW_declaration_in_synpred1812166) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred181 - - - - # $ANTLR start synpred182 - def synpred182_fragment(self, ): - # C.g:544:33: ( statement_list ) - # C.g:544:33: statement_list - self.following.append(self.FOLLOW_statement_list_in_synpred1822170) - self.statement_list() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred182 - - - - # $ANTLR start synpred186 - def synpred186_fragment(self, ): - # C.g:554:8: ( declaration ) - # C.g:554:8: declaration - self.following.append(self.FOLLOW_declaration_in_synpred1862225) - self.declaration() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred186 - - - - # $ANTLR start synpred188 - def synpred188_fragment(self, ): - # C.g:558:4: ( statement ) - # C.g:558:4: statement - self.following.append(self.FOLLOW_statement_in_synpred1882242) - self.statement() - self.following.pop() - if self.failed: - return - - - # $ANTLR end synpred188 - - - - def synpred69(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred69_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred81(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred81_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred82(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred82_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred66(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred66_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred83(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred83_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred84(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred84_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred67(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred67_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred86(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred86_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred120(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred120_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred40(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred40_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred142(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred142_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred182(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred182_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred109(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred109_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred181(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred181_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred186(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred186_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred188(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred188_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred169(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred169_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred117(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred117_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred70(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred70_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred118(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred118_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred34(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred34_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred33(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred33_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred94(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred94_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred39(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred39_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred74(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred74_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred114(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred114_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred93(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred93_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred75(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred75_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred137(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred137_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred90(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred90_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred138(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred138_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred91(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred91_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred73(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred73_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred5(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred5_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred78(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred78_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred7(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred7_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred76(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred76_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred77(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred77_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred2(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred2_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred4(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred4_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred174(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred174_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred173(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred173_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred14(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred14_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred15(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred15_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - def synpred10(self): - self.backtracking += 1 - start = self.input.mark() - self.synpred10_fragment() - success = not self.failed - self.input.rewind(start) - self.backtracking -= 1 - self.failed = False - return success - - - - - - FOLLOW_external_declaration_in_translation_unit74 = frozenset([1, 4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_function_definition_in_external_declaration113 = frozenset([1]) - FOLLOW_declaration_in_external_declaration118 = frozenset([1]) - FOLLOW_macro_statement_in_external_declaration123 = frozenset([1, 25]) - FOLLOW_25_in_external_declaration126 = frozenset([1]) - FOLLOW_declaration_specifiers_in_function_definition157 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_function_definition160 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_declaration_in_function_definition166 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_compound_statement_in_function_definition171 = frozenset([1]) - FOLLOW_compound_statement_in_function_definition180 = frozenset([1]) - FOLLOW_26_in_declaration203 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_declaration_specifiers_in_declaration207 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_list_in_declaration216 = frozenset([25]) - FOLLOW_25_in_declaration220 = frozenset([1]) - FOLLOW_declaration_specifiers_in_declaration234 = frozenset([4, 25, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_list_in_declaration238 = frozenset([25]) - FOLLOW_25_in_declaration243 = frozenset([1]) - FOLLOW_storage_class_specifier_in_declaration_specifiers264 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_specifier_in_declaration_specifiers272 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_declaration_specifiers286 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_init_declarator_in_init_declarator_list308 = frozenset([1, 27]) - FOLLOW_27_in_init_declarator_list311 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_init_declarator_in_init_declarator_list313 = frozenset([1, 27]) - FOLLOW_declarator_in_init_declarator326 = frozenset([1, 28]) - FOLLOW_28_in_init_declarator329 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_in_init_declarator331 = frozenset([1]) - FOLLOW_set_in_storage_class_specifier0 = frozenset([1]) - FOLLOW_34_in_type_specifier376 = frozenset([1]) - FOLLOW_35_in_type_specifier381 = frozenset([1]) - FOLLOW_36_in_type_specifier386 = frozenset([1]) - FOLLOW_37_in_type_specifier391 = frozenset([1]) - FOLLOW_38_in_type_specifier396 = frozenset([1]) - FOLLOW_39_in_type_specifier401 = frozenset([1]) - FOLLOW_40_in_type_specifier406 = frozenset([1]) - FOLLOW_41_in_type_specifier411 = frozenset([1]) - FOLLOW_42_in_type_specifier416 = frozenset([1]) - FOLLOW_struct_or_union_specifier_in_type_specifier423 = frozenset([1]) - FOLLOW_enum_specifier_in_type_specifier433 = frozenset([1]) - FOLLOW_type_id_in_type_specifier451 = frozenset([1]) - FOLLOW_IDENTIFIER_in_type_id467 = frozenset([1]) - FOLLOW_struct_or_union_in_struct_or_union_specifier494 = frozenset([4, 43]) - FOLLOW_IDENTIFIER_in_struct_or_union_specifier496 = frozenset([43]) - FOLLOW_43_in_struct_or_union_specifier499 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_struct_declaration_list_in_struct_or_union_specifier501 = frozenset([44]) - FOLLOW_44_in_struct_or_union_specifier503 = frozenset([1]) - FOLLOW_struct_or_union_in_struct_or_union_specifier508 = frozenset([4]) - FOLLOW_IDENTIFIER_in_struct_or_union_specifier510 = frozenset([1]) - FOLLOW_set_in_struct_or_union0 = frozenset([1]) - FOLLOW_struct_declaration_in_struct_declaration_list537 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_specifier_qualifier_list_in_struct_declaration549 = frozenset([4, 47, 58, 59, 60, 62, 66]) - FOLLOW_struct_declarator_list_in_struct_declaration551 = frozenset([25]) - FOLLOW_25_in_struct_declaration553 = frozenset([1]) - FOLLOW_type_qualifier_in_specifier_qualifier_list566 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_specifier_in_specifier_qualifier_list570 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_struct_declarator_in_struct_declarator_list584 = frozenset([1, 27]) - FOLLOW_27_in_struct_declarator_list587 = frozenset([4, 47, 58, 59, 60, 62, 66]) - FOLLOW_struct_declarator_in_struct_declarator_list589 = frozenset([1, 27]) - FOLLOW_declarator_in_struct_declarator602 = frozenset([1, 47]) - FOLLOW_47_in_struct_declarator605 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_struct_declarator607 = frozenset([1]) - FOLLOW_47_in_struct_declarator614 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_struct_declarator616 = frozenset([1]) - FOLLOW_48_in_enum_specifier634 = frozenset([43]) - FOLLOW_43_in_enum_specifier636 = frozenset([4]) - FOLLOW_enumerator_list_in_enum_specifier638 = frozenset([27, 44]) - FOLLOW_27_in_enum_specifier640 = frozenset([44]) - FOLLOW_44_in_enum_specifier643 = frozenset([1]) - FOLLOW_48_in_enum_specifier648 = frozenset([4]) - FOLLOW_IDENTIFIER_in_enum_specifier650 = frozenset([43]) - FOLLOW_43_in_enum_specifier652 = frozenset([4]) - FOLLOW_enumerator_list_in_enum_specifier654 = frozenset([27, 44]) - FOLLOW_27_in_enum_specifier656 = frozenset([44]) - FOLLOW_44_in_enum_specifier659 = frozenset([1]) - FOLLOW_48_in_enum_specifier664 = frozenset([4]) - FOLLOW_IDENTIFIER_in_enum_specifier666 = frozenset([1]) - FOLLOW_enumerator_in_enumerator_list677 = frozenset([1, 27]) - FOLLOW_27_in_enumerator_list680 = frozenset([4]) - FOLLOW_enumerator_in_enumerator_list682 = frozenset([1, 27]) - FOLLOW_IDENTIFIER_in_enumerator695 = frozenset([1, 28]) - FOLLOW_28_in_enumerator698 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_enumerator700 = frozenset([1]) - FOLLOW_set_in_type_qualifier0 = frozenset([1]) - FOLLOW_pointer_in_declarator784 = frozenset([4, 58, 59, 60, 62]) - FOLLOW_58_in_declarator788 = frozenset([4, 59, 60, 62]) - FOLLOW_59_in_declarator793 = frozenset([4, 60, 62]) - FOLLOW_60_in_declarator798 = frozenset([4, 62]) - FOLLOW_direct_declarator_in_declarator802 = frozenset([1]) - FOLLOW_pointer_in_declarator808 = frozenset([1]) - FOLLOW_IDENTIFIER_in_direct_declarator819 = frozenset([1, 62, 64]) - FOLLOW_declarator_suffix_in_direct_declarator821 = frozenset([1, 62, 64]) - FOLLOW_62_in_direct_declarator827 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_58_in_direct_declarator830 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_direct_declarator834 = frozenset([63]) - FOLLOW_63_in_direct_declarator836 = frozenset([62, 64]) - FOLLOW_declarator_suffix_in_direct_declarator838 = frozenset([1, 62, 64]) - FOLLOW_64_in_declarator_suffix852 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_declarator_suffix854 = frozenset([65]) - FOLLOW_65_in_declarator_suffix856 = frozenset([1]) - FOLLOW_64_in_declarator_suffix866 = frozenset([65]) - FOLLOW_65_in_declarator_suffix868 = frozenset([1]) - FOLLOW_62_in_declarator_suffix878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_declarator_suffix880 = frozenset([63]) - FOLLOW_63_in_declarator_suffix882 = frozenset([1]) - FOLLOW_62_in_declarator_suffix892 = frozenset([4]) - FOLLOW_identifier_list_in_declarator_suffix894 = frozenset([63]) - FOLLOW_63_in_declarator_suffix896 = frozenset([1]) - FOLLOW_62_in_declarator_suffix906 = frozenset([63]) - FOLLOW_63_in_declarator_suffix908 = frozenset([1]) - FOLLOW_66_in_pointer919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_pointer921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_pointer_in_pointer924 = frozenset([1]) - FOLLOW_66_in_pointer930 = frozenset([66]) - FOLLOW_pointer_in_pointer932 = frozenset([1]) - FOLLOW_66_in_pointer937 = frozenset([1]) - FOLLOW_parameter_list_in_parameter_type_list948 = frozenset([1, 27]) - FOLLOW_27_in_parameter_type_list951 = frozenset([53, 67]) - FOLLOW_53_in_parameter_type_list954 = frozenset([67]) - FOLLOW_67_in_parameter_type_list958 = frozenset([1]) - FOLLOW_parameter_declaration_in_parameter_list971 = frozenset([1, 27]) - FOLLOW_27_in_parameter_list974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_53_in_parameter_list977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_parameter_list981 = frozenset([1, 27]) - FOLLOW_declaration_specifiers_in_parameter_declaration994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_declarator_in_parameter_declaration997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_abstract_declarator_in_parameter_declaration999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_53_in_parameter_declaration1004 = frozenset([1]) - FOLLOW_pointer_in_parameter_declaration1013 = frozenset([4, 66]) - FOLLOW_IDENTIFIER_in_parameter_declaration1016 = frozenset([1]) - FOLLOW_IDENTIFIER_in_identifier_list1027 = frozenset([1, 27]) - FOLLOW_27_in_identifier_list1031 = frozenset([4]) - FOLLOW_IDENTIFIER_in_identifier_list1033 = frozenset([1, 27]) - FOLLOW_specifier_qualifier_list_in_type_name1046 = frozenset([1, 62, 64, 66]) - FOLLOW_abstract_declarator_in_type_name1048 = frozenset([1]) - FOLLOW_type_id_in_type_name1054 = frozenset([1]) - FOLLOW_pointer_in_abstract_declarator1065 = frozenset([1, 62, 64]) - FOLLOW_direct_abstract_declarator_in_abstract_declarator1067 = frozenset([1]) - FOLLOW_direct_abstract_declarator_in_abstract_declarator1073 = frozenset([1]) - FOLLOW_62_in_direct_abstract_declarator1086 = frozenset([62, 64, 66]) - FOLLOW_abstract_declarator_in_direct_abstract_declarator1088 = frozenset([63]) - FOLLOW_63_in_direct_abstract_declarator1090 = frozenset([1, 62, 64]) - FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094 = frozenset([1, 62, 64]) - FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098 = frozenset([1, 62, 64]) - FOLLOW_64_in_abstract_declarator_suffix1110 = frozenset([65]) - FOLLOW_65_in_abstract_declarator_suffix1112 = frozenset([1]) - FOLLOW_64_in_abstract_declarator_suffix1117 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_abstract_declarator_suffix1119 = frozenset([65]) - FOLLOW_65_in_abstract_declarator_suffix1121 = frozenset([1]) - FOLLOW_62_in_abstract_declarator_suffix1126 = frozenset([63]) - FOLLOW_63_in_abstract_declarator_suffix1128 = frozenset([1]) - FOLLOW_62_in_abstract_declarator_suffix1133 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135 = frozenset([63]) - FOLLOW_63_in_abstract_declarator_suffix1137 = frozenset([1]) - FOLLOW_assignment_expression_in_initializer1150 = frozenset([1]) - FOLLOW_43_in_initializer1155 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_list_in_initializer1157 = frozenset([27, 44]) - FOLLOW_27_in_initializer1159 = frozenset([44]) - FOLLOW_44_in_initializer1162 = frozenset([1]) - FOLLOW_initializer_in_initializer_list1173 = frozenset([1, 27]) - FOLLOW_27_in_initializer_list1176 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_initializer_in_initializer_list1178 = frozenset([1, 27]) - FOLLOW_assignment_expression_in_argument_expression_list1196 = frozenset([1, 27, 53]) - FOLLOW_53_in_argument_expression_list1199 = frozenset([1, 27]) - FOLLOW_27_in_argument_expression_list1204 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_argument_expression_list1206 = frozenset([1, 27, 53]) - FOLLOW_53_in_argument_expression_list1209 = frozenset([1, 27]) - FOLLOW_multiplicative_expression_in_additive_expression1225 = frozenset([1, 68, 69]) - FOLLOW_68_in_additive_expression1229 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_multiplicative_expression_in_additive_expression1231 = frozenset([1, 68, 69]) - FOLLOW_69_in_additive_expression1235 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_multiplicative_expression_in_additive_expression1237 = frozenset([1, 68, 69]) - FOLLOW_cast_expression_in_multiplicative_expression1251 = frozenset([1, 66, 70, 71]) - FOLLOW_66_in_multiplicative_expression1255 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1257 = frozenset([1, 66, 70, 71]) - FOLLOW_70_in_multiplicative_expression1261 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1263 = frozenset([1, 66, 70, 71]) - FOLLOW_71_in_multiplicative_expression1267 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_multiplicative_expression1269 = frozenset([1, 66, 70, 71]) - FOLLOW_62_in_cast_expression1282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_cast_expression1284 = frozenset([63]) - FOLLOW_63_in_cast_expression1286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_cast_expression1288 = frozenset([1]) - FOLLOW_unary_expression_in_cast_expression1293 = frozenset([1]) - FOLLOW_postfix_expression_in_unary_expression1304 = frozenset([1]) - FOLLOW_72_in_unary_expression1309 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1311 = frozenset([1]) - FOLLOW_73_in_unary_expression1316 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1318 = frozenset([1]) - FOLLOW_unary_operator_in_unary_expression1323 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_unary_expression1325 = frozenset([1]) - FOLLOW_74_in_unary_expression1330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_unary_expression1332 = frozenset([1]) - FOLLOW_74_in_unary_expression1337 = frozenset([62]) - FOLLOW_62_in_unary_expression1339 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_unary_expression1341 = frozenset([63]) - FOLLOW_63_in_unary_expression1343 = frozenset([1]) - FOLLOW_primary_expression_in_postfix_expression1367 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_64_in_postfix_expression1383 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_postfix_expression1385 = frozenset([65]) - FOLLOW_65_in_postfix_expression1387 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1401 = frozenset([63]) - FOLLOW_63_in_postfix_expression1405 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_argument_expression_list_in_postfix_expression1424 = frozenset([63]) - FOLLOW_63_in_postfix_expression1428 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_62_in_postfix_expression1444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_macro_parameter_list_in_postfix_expression1446 = frozenset([63]) - FOLLOW_63_in_postfix_expression1448 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_75_in_postfix_expression1462 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1466 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_66_in_postfix_expression1482 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1486 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_76_in_postfix_expression1502 = frozenset([4]) - FOLLOW_IDENTIFIER_in_postfix_expression1506 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_72_in_postfix_expression1522 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_73_in_postfix_expression1536 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) - FOLLOW_parameter_declaration_in_macro_parameter_list1559 = frozenset([1, 27]) - FOLLOW_27_in_macro_parameter_list1562 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_macro_parameter_list1564 = frozenset([1, 27]) - FOLLOW_set_in_unary_operator0 = frozenset([1]) - FOLLOW_IDENTIFIER_in_primary_expression1613 = frozenset([1]) - FOLLOW_constant_in_primary_expression1618 = frozenset([1]) - FOLLOW_62_in_primary_expression1623 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_primary_expression1625 = frozenset([63]) - FOLLOW_63_in_primary_expression1627 = frozenset([1]) - FOLLOW_HEX_LITERAL_in_constant1643 = frozenset([1]) - FOLLOW_OCTAL_LITERAL_in_constant1653 = frozenset([1]) - FOLLOW_DECIMAL_LITERAL_in_constant1663 = frozenset([1]) - FOLLOW_CHARACTER_LITERAL_in_constant1671 = frozenset([1]) - FOLLOW_IDENTIFIER_in_constant1680 = frozenset([4, 9]) - FOLLOW_STRING_LITERAL_in_constant1683 = frozenset([1, 4, 9]) - FOLLOW_IDENTIFIER_in_constant1688 = frozenset([1, 4]) - FOLLOW_FLOATING_POINT_LITERAL_in_constant1699 = frozenset([1]) - FOLLOW_assignment_expression_in_expression1715 = frozenset([1, 27]) - FOLLOW_27_in_expression1718 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_expression1720 = frozenset([1, 27]) - FOLLOW_conditional_expression_in_constant_expression1733 = frozenset([1]) - FOLLOW_lvalue_in_assignment_expression1744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) - FOLLOW_assignment_operator_in_assignment_expression1746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_assignment_expression1748 = frozenset([1]) - FOLLOW_conditional_expression_in_assignment_expression1753 = frozenset([1]) - FOLLOW_unary_expression_in_lvalue1765 = frozenset([1]) - FOLLOW_set_in_assignment_operator0 = frozenset([1]) - FOLLOW_logical_or_expression_in_conditional_expression1839 = frozenset([1, 90]) - FOLLOW_90_in_conditional_expression1842 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_conditional_expression1844 = frozenset([47]) - FOLLOW_47_in_conditional_expression1846 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_conditional_expression_in_conditional_expression1848 = frozenset([1]) - FOLLOW_logical_and_expression_in_logical_or_expression1863 = frozenset([1, 91]) - FOLLOW_91_in_logical_or_expression1866 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_logical_and_expression_in_logical_or_expression1868 = frozenset([1, 91]) - FOLLOW_inclusive_or_expression_in_logical_and_expression1881 = frozenset([1, 92]) - FOLLOW_92_in_logical_and_expression1884 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_inclusive_or_expression_in_logical_and_expression1886 = frozenset([1, 92]) - FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899 = frozenset([1, 93]) - FOLLOW_93_in_inclusive_or_expression1902 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904 = frozenset([1, 93]) - FOLLOW_and_expression_in_exclusive_or_expression1917 = frozenset([1, 94]) - FOLLOW_94_in_exclusive_or_expression1920 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_and_expression_in_exclusive_or_expression1922 = frozenset([1, 94]) - FOLLOW_equality_expression_in_and_expression1935 = frozenset([1, 77]) - FOLLOW_77_in_and_expression1938 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_equality_expression_in_and_expression1940 = frozenset([1, 77]) - FOLLOW_relational_expression_in_equality_expression1952 = frozenset([1, 95, 96]) - FOLLOW_set_in_equality_expression1955 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_relational_expression_in_equality_expression1961 = frozenset([1, 95, 96]) - FOLLOW_shift_expression_in_relational_expression1975 = frozenset([1, 97, 98, 99, 100]) - FOLLOW_set_in_relational_expression1978 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_shift_expression_in_relational_expression1988 = frozenset([1, 97, 98, 99, 100]) - FOLLOW_additive_expression_in_shift_expression2001 = frozenset([1, 101, 102]) - FOLLOW_set_in_shift_expression2004 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_additive_expression_in_shift_expression2010 = frozenset([1, 101, 102]) - FOLLOW_labeled_statement_in_statement2025 = frozenset([1]) - FOLLOW_compound_statement_in_statement2030 = frozenset([1]) - FOLLOW_expression_statement_in_statement2035 = frozenset([1]) - FOLLOW_selection_statement_in_statement2040 = frozenset([1]) - FOLLOW_iteration_statement_in_statement2045 = frozenset([1]) - FOLLOW_jump_statement_in_statement2050 = frozenset([1]) - FOLLOW_macro_statement_in_statement2055 = frozenset([1]) - FOLLOW_asm2_statement_in_statement2060 = frozenset([1]) - FOLLOW_asm1_statement_in_statement2065 = frozenset([1]) - FOLLOW_asm_statement_in_statement2070 = frozenset([1]) - FOLLOW_declaration_in_statement2075 = frozenset([1]) - FOLLOW_103_in_asm2_statement2086 = frozenset([4]) - FOLLOW_IDENTIFIER_in_asm2_statement2089 = frozenset([62]) - FOLLOW_62_in_asm2_statement2091 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm2_statement2094 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_63_in_asm2_statement2101 = frozenset([25]) - FOLLOW_25_in_asm2_statement2103 = frozenset([1]) - FOLLOW_104_in_asm1_statement2115 = frozenset([43]) - FOLLOW_43_in_asm1_statement2117 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm1_statement2120 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_44_in_asm1_statement2127 = frozenset([1]) - FOLLOW_105_in_asm_statement2138 = frozenset([43]) - FOLLOW_43_in_asm_statement2140 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_set_in_asm_statement2143 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_44_in_asm_statement2150 = frozenset([1]) - FOLLOW_IDENTIFIER_in_macro_statement2162 = frozenset([62]) - FOLLOW_62_in_macro_statement2164 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_declaration_in_macro_statement2166 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_list_in_macro_statement2170 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_macro_statement2173 = frozenset([63]) - FOLLOW_63_in_macro_statement2176 = frozenset([1]) - FOLLOW_IDENTIFIER_in_labeled_statement2188 = frozenset([47]) - FOLLOW_47_in_labeled_statement2190 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2192 = frozenset([1]) - FOLLOW_106_in_labeled_statement2197 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_constant_expression_in_labeled_statement2199 = frozenset([47]) - FOLLOW_47_in_labeled_statement2201 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2203 = frozenset([1]) - FOLLOW_107_in_labeled_statement2208 = frozenset([47]) - FOLLOW_47_in_labeled_statement2210 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_labeled_statement2212 = frozenset([1]) - FOLLOW_43_in_compound_statement2223 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_declaration_in_compound_statement2225 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_list_in_compound_statement2228 = frozenset([44]) - FOLLOW_44_in_compound_statement2231 = frozenset([1]) - FOLLOW_statement_in_statement_list2242 = frozenset([1, 4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_25_in_expression_statement2254 = frozenset([1]) - FOLLOW_expression_in_expression_statement2259 = frozenset([25]) - FOLLOW_25_in_expression_statement2261 = frozenset([1]) - FOLLOW_108_in_selection_statement2272 = frozenset([62]) - FOLLOW_62_in_selection_statement2274 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_selection_statement2278 = frozenset([63]) - FOLLOW_63_in_selection_statement2280 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2284 = frozenset([1, 109]) - FOLLOW_109_in_selection_statement2299 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2301 = frozenset([1]) - FOLLOW_110_in_selection_statement2308 = frozenset([62]) - FOLLOW_62_in_selection_statement2310 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_selection_statement2312 = frozenset([63]) - FOLLOW_63_in_selection_statement2314 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_selection_statement2316 = frozenset([1]) - FOLLOW_111_in_iteration_statement2327 = frozenset([62]) - FOLLOW_62_in_iteration_statement2329 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2333 = frozenset([63]) - FOLLOW_63_in_iteration_statement2335 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2337 = frozenset([1]) - FOLLOW_112_in_iteration_statement2344 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2346 = frozenset([111]) - FOLLOW_111_in_iteration_statement2348 = frozenset([62]) - FOLLOW_62_in_iteration_statement2350 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2354 = frozenset([63]) - FOLLOW_63_in_iteration_statement2356 = frozenset([25]) - FOLLOW_25_in_iteration_statement2358 = frozenset([1]) - FOLLOW_113_in_iteration_statement2365 = frozenset([62]) - FOLLOW_62_in_iteration_statement2367 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_statement_in_iteration_statement2369 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_statement_in_iteration_statement2373 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_iteration_statement2375 = frozenset([63]) - FOLLOW_63_in_iteration_statement2378 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) - FOLLOW_statement_in_iteration_statement2380 = frozenset([1]) - FOLLOW_114_in_jump_statement2393 = frozenset([4]) - FOLLOW_IDENTIFIER_in_jump_statement2395 = frozenset([25]) - FOLLOW_25_in_jump_statement2397 = frozenset([1]) - FOLLOW_115_in_jump_statement2402 = frozenset([25]) - FOLLOW_25_in_jump_statement2404 = frozenset([1]) - FOLLOW_116_in_jump_statement2409 = frozenset([25]) - FOLLOW_25_in_jump_statement2411 = frozenset([1]) - FOLLOW_117_in_jump_statement2416 = frozenset([25]) - FOLLOW_25_in_jump_statement2418 = frozenset([1]) - FOLLOW_117_in_jump_statement2423 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_expression_in_jump_statement2425 = frozenset([25]) - FOLLOW_25_in_jump_statement2427 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred2100 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred4100 = frozenset([4, 58, 59, 60, 62, 66]) - FOLLOW_declarator_in_synpred4103 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_declaration_in_synpred4105 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_43_in_synpred4108 = frozenset([1]) - FOLLOW_declaration_in_synpred5118 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred7157 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred10207 = frozenset([1]) - FOLLOW_type_specifier_in_synpred14272 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred15286 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred33444 = frozenset([1]) - FOLLOW_IDENTIFIER_in_synpred34442 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_type_qualifier_in_synpred34444 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) - FOLLOW_declarator_in_synpred34447 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred39566 = frozenset([1]) - FOLLOW_type_specifier_in_synpred40570 = frozenset([1]) - FOLLOW_pointer_in_synpred66784 = frozenset([4, 58, 59, 60, 62]) - FOLLOW_58_in_synpred66788 = frozenset([4, 59, 60, 62]) - FOLLOW_59_in_synpred66793 = frozenset([4, 60, 62]) - FOLLOW_60_in_synpred66798 = frozenset([4, 62]) - FOLLOW_direct_declarator_in_synpred66802 = frozenset([1]) - FOLLOW_declarator_suffix_in_synpred67821 = frozenset([1]) - FOLLOW_58_in_synpred69830 = frozenset([1]) - FOLLOW_declarator_suffix_in_synpred70838 = frozenset([1]) - FOLLOW_62_in_synpred73878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_type_list_in_synpred73880 = frozenset([63]) - FOLLOW_63_in_synpred73882 = frozenset([1]) - FOLLOW_62_in_synpred74892 = frozenset([4]) - FOLLOW_identifier_list_in_synpred74894 = frozenset([63]) - FOLLOW_63_in_synpred74896 = frozenset([1]) - FOLLOW_type_qualifier_in_synpred75921 = frozenset([1]) - FOLLOW_pointer_in_synpred76924 = frozenset([1]) - FOLLOW_66_in_synpred77919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_qualifier_in_synpred77921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_pointer_in_synpred77924 = frozenset([1]) - FOLLOW_66_in_synpred78930 = frozenset([66]) - FOLLOW_pointer_in_synpred78932 = frozenset([1]) - FOLLOW_53_in_synpred81977 = frozenset([1]) - FOLLOW_27_in_synpred82974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_53_in_synpred82977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_parameter_declaration_in_synpred82981 = frozenset([1]) - FOLLOW_declarator_in_synpred83997 = frozenset([1]) - FOLLOW_abstract_declarator_in_synpred84999 = frozenset([1]) - FOLLOW_declaration_specifiers_in_synpred86994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_declarator_in_synpred86997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred86999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) - FOLLOW_53_in_synpred861004 = frozenset([1]) - FOLLOW_specifier_qualifier_list_in_synpred901046 = frozenset([1, 62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred901048 = frozenset([1]) - FOLLOW_direct_abstract_declarator_in_synpred911067 = frozenset([1]) - FOLLOW_62_in_synpred931086 = frozenset([62, 64, 66]) - FOLLOW_abstract_declarator_in_synpred931088 = frozenset([63]) - FOLLOW_63_in_synpred931090 = frozenset([1]) - FOLLOW_abstract_declarator_suffix_in_synpred941098 = frozenset([1]) - FOLLOW_62_in_synpred1091282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) - FOLLOW_type_name_in_synpred1091284 = frozenset([63]) - FOLLOW_63_in_synpred1091286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_cast_expression_in_synpred1091288 = frozenset([1]) - FOLLOW_74_in_synpred1141330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_unary_expression_in_synpred1141332 = frozenset([1]) - FOLLOW_62_in_synpred1171420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_argument_expression_list_in_synpred1171424 = frozenset([63]) - FOLLOW_63_in_synpred1171428 = frozenset([1]) - FOLLOW_62_in_synpred1181444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) - FOLLOW_macro_parameter_list_in_synpred1181446 = frozenset([63]) - FOLLOW_63_in_synpred1181448 = frozenset([1]) - FOLLOW_66_in_synpred1201482 = frozenset([4]) - FOLLOW_IDENTIFIER_in_synpred1201486 = frozenset([1]) - FOLLOW_STRING_LITERAL_in_synpred1371683 = frozenset([1]) - FOLLOW_IDENTIFIER_in_synpred1381680 = frozenset([4, 9]) - FOLLOW_STRING_LITERAL_in_synpred1381683 = frozenset([1, 9]) - FOLLOW_lvalue_in_synpred1421744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) - FOLLOW_assignment_operator_in_synpred1421746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) - FOLLOW_assignment_expression_in_synpred1421748 = frozenset([1]) - FOLLOW_expression_statement_in_synpred1692035 = frozenset([1]) - FOLLOW_macro_statement_in_synpred1732055 = frozenset([1]) - FOLLOW_asm2_statement_in_synpred1742060 = frozenset([1]) - FOLLOW_declaration_in_synpred1812166 = frozenset([1]) - FOLLOW_statement_list_in_synpred1822170 = frozenset([1]) - FOLLOW_declaration_in_synpred1862225 = frozenset([1]) - FOLLOW_statement_in_synpred1882242 = frozenset([1]) - + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 4, declaration_StartIndex) + + pass + + return + + # $ANTLR end declaration + + class declaration_specifiers_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start declaration_specifiers + # C.g:182:1: declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ; + def declaration_specifiers(self, ): + + retval = self.declaration_specifiers_return() + retval.start = self.input.LT(1) + declaration_specifiers_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 5): + return retval + + # C.g:183:2: ( ( storage_class_specifier | type_specifier | type_qualifier )+ ) + # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ + # C.g:183:6: ( storage_class_specifier | type_specifier | type_qualifier )+ + cnt10 = 0 + while True: #loop10 + alt10 = 4 + LA10 = self.input.LA(1) + if LA10 == 58: + LA10_2 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 59: + LA10_3 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 60: + LA10_4 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == IDENTIFIER: + LA10_5 = self.input.LA(2) + + if (self.synpred14()) : + alt10 = 2 + + + elif LA10 == 53: + LA10_9 = self.input.LA(2) + + if (self.synpred15()) : + alt10 = 3 + + + elif LA10 == 29 or LA10 == 30 or LA10 == 31 or LA10 == 32 or LA10 == 33: + alt10 = 1 + elif LA10 == 34 or LA10 == 35 or LA10 == 36 or LA10 == 37 or LA10 == 38 or LA10 == 39 or LA10 == 40 or LA10 == 41 or LA10 == 42 or LA10 == 45 or LA10 == 46 or LA10 == 48: + alt10 = 2 + elif LA10 == 49 or LA10 == 50 or LA10 == 51 or LA10 == 52 or LA10 == 54 or LA10 == 55 or LA10 == 56 or LA10 == 57 or LA10 == 61: + alt10 = 3 + + if alt10 == 1: + # C.g:183:10: storage_class_specifier + self.following.append(self.FOLLOW_storage_class_specifier_in_declaration_specifiers264) + self.storage_class_specifier() + self.following.pop() + if self.failed: + return retval + + + elif alt10 == 2: + # C.g:184:7: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_declaration_specifiers272) + self.type_specifier() + self.following.pop() + if self.failed: + return retval + + + elif alt10 == 3: + # C.g:185:13: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_declaration_specifiers286) + self.type_qualifier() + self.following.pop() + if self.failed: + return retval + + + else: + if cnt10 >= 1: + break #loop10 + + if self.backtracking > 0: + self.failed = True + return retval + + eee = EarlyExitException(10, self.input) + raise eee + + cnt10 += 1 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 5, declaration_specifiers_StartIndex) + + pass + + return retval + + # $ANTLR end declaration_specifiers + + class init_declarator_list_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start init_declarator_list + # C.g:189:1: init_declarator_list : init_declarator ( ',' init_declarator )* ; + def init_declarator_list(self, ): + + retval = self.init_declarator_list_return() + retval.start = self.input.LT(1) + init_declarator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 6): + return retval + + # C.g:190:2: ( init_declarator ( ',' init_declarator )* ) + # C.g:190:4: init_declarator ( ',' init_declarator )* + self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list308) + self.init_declarator() + self.following.pop() + if self.failed: + return retval + # C.g:190:20: ( ',' init_declarator )* + while True: #loop11 + alt11 = 2 + LA11_0 = self.input.LA(1) + + if (LA11_0 == 27) : + alt11 = 1 + + + if alt11 == 1: + # C.g:190:21: ',' init_declarator + self.match(self.input, 27, self.FOLLOW_27_in_init_declarator_list311) + if self.failed: + return retval + self.following.append(self.FOLLOW_init_declarator_in_init_declarator_list313) + self.init_declarator() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop11 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 6, init_declarator_list_StartIndex) + + pass + + return retval + + # $ANTLR end init_declarator_list + + + # $ANTLR start init_declarator + # C.g:193:1: init_declarator : declarator ( '=' initializer )? ; + def init_declarator(self, ): + + init_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 7): + return + + # C.g:194:2: ( declarator ( '=' initializer )? ) + # C.g:194:4: declarator ( '=' initializer )? + self.following.append(self.FOLLOW_declarator_in_init_declarator326) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:194:15: ( '=' initializer )? + alt12 = 2 + LA12_0 = self.input.LA(1) + + if (LA12_0 == 28) : + alt12 = 1 + if alt12 == 1: + # C.g:194:16: '=' initializer + self.match(self.input, 28, self.FOLLOW_28_in_init_declarator329) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_in_init_declarator331) + self.initializer() + self.following.pop() + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 7, init_declarator_StartIndex) + + pass + + return + + # $ANTLR end init_declarator + + + # $ANTLR start storage_class_specifier + # C.g:197:1: storage_class_specifier : ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ); + def storage_class_specifier(self, ): + + storage_class_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 8): + return + + # C.g:198:2: ( 'extern' | 'static' | 'auto' | 'register' | 'STATIC' ) + # C.g: + if (29 <= self.input.LA(1) <= 33): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_storage_class_specifier0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 8, storage_class_specifier_StartIndex) + + pass + + return + + # $ANTLR end storage_class_specifier + + + # $ANTLR start type_specifier + # C.g:205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ); + def type_specifier(self, ): + + type_specifier_StartIndex = self.input.index() + s = None + + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 9): + return + + # C.g:206:2: ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id ) + alt13 = 12 + LA13_0 = self.input.LA(1) + + if (LA13_0 == 34) : + alt13 = 1 + elif (LA13_0 == 35) : + alt13 = 2 + elif (LA13_0 == 36) : + alt13 = 3 + elif (LA13_0 == 37) : + alt13 = 4 + elif (LA13_0 == 38) : + alt13 = 5 + elif (LA13_0 == 39) : + alt13 = 6 + elif (LA13_0 == 40) : + alt13 = 7 + elif (LA13_0 == 41) : + alt13 = 8 + elif (LA13_0 == 42) : + alt13 = 9 + elif ((45 <= LA13_0 <= 46)) : + alt13 = 10 + elif (LA13_0 == 48) : + alt13 = 11 + elif (LA13_0 == IDENTIFIER) and (self.synpred34()): + alt13 = 12 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("205:1: type_specifier : ( 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned' | s= struct_or_union_specifier | e= enum_specifier | ( IDENTIFIER ( type_qualifier )* declarator )=> type_id );", 13, 0, self.input) + + raise nvae + + if alt13 == 1: + # C.g:206:4: 'void' + self.match(self.input, 34, self.FOLLOW_34_in_type_specifier376) + if self.failed: + return + + + elif alt13 == 2: + # C.g:207:4: 'char' + self.match(self.input, 35, self.FOLLOW_35_in_type_specifier381) + if self.failed: + return + + + elif alt13 == 3: + # C.g:208:4: 'short' + self.match(self.input, 36, self.FOLLOW_36_in_type_specifier386) + if self.failed: + return + + + elif alt13 == 4: + # C.g:209:4: 'int' + self.match(self.input, 37, self.FOLLOW_37_in_type_specifier391) + if self.failed: + return + + + elif alt13 == 5: + # C.g:210:4: 'long' + self.match(self.input, 38, self.FOLLOW_38_in_type_specifier396) + if self.failed: + return + + + elif alt13 == 6: + # C.g:211:4: 'float' + self.match(self.input, 39, self.FOLLOW_39_in_type_specifier401) + if self.failed: + return + + + elif alt13 == 7: + # C.g:212:4: 'double' + self.match(self.input, 40, self.FOLLOW_40_in_type_specifier406) + if self.failed: + return + + + elif alt13 == 8: + # C.g:213:4: 'signed' + self.match(self.input, 41, self.FOLLOW_41_in_type_specifier411) + if self.failed: + return + + + elif alt13 == 9: + # C.g:214:4: 'unsigned' + self.match(self.input, 42, self.FOLLOW_42_in_type_specifier416) + if self.failed: + return + + + elif alt13 == 10: + # C.g:215:4: s= struct_or_union_specifier + self.following.append(self.FOLLOW_struct_or_union_specifier_in_type_specifier423) + s = self.struct_or_union_specifier() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + + if s.stop != None: + self.StoreStructUnionDefinition(s.start.line, s.start.charPositionInLine, s.stop.line, s.stop.charPositionInLine, self.input.toString(s.start,s.stop)) + + + + + elif alt13 == 11: + # C.g:220:4: e= enum_specifier + self.following.append(self.FOLLOW_enum_specifier_in_type_specifier433) + e = self.enum_specifier() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + + if e.stop != None: + self.StoreEnumerationDefinition(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + elif alt13 == 12: + # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator )=> type_id + self.following.append(self.FOLLOW_type_id_in_type_specifier451) + self.type_id() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 9, type_specifier_StartIndex) + + pass + + return + + # $ANTLR end type_specifier + + + # $ANTLR start type_id + # C.g:228:1: type_id : IDENTIFIER ; + def type_id(self, ): + + type_id_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 10): + return + + # C.g:229:5: ( IDENTIFIER ) + # C.g:229:9: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_type_id467) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 10, type_id_StartIndex) + + pass + + return + + # $ANTLR end type_id + + class struct_or_union_specifier_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start struct_or_union_specifier + # C.g:233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ); + def struct_or_union_specifier(self, ): + + retval = self.struct_or_union_specifier_return() + retval.start = self.input.LT(1) + struct_or_union_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 11): + return retval + + # C.g:235:2: ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ) + alt15 = 2 + LA15_0 = self.input.LA(1) + + if ((45 <= LA15_0 <= 46)) : + LA15_1 = self.input.LA(2) + + if (LA15_1 == IDENTIFIER) : + LA15_2 = self.input.LA(3) + + if (LA15_2 == 43) : + alt15 = 1 + elif (LA15_2 == EOF or LA15_2 == IDENTIFIER or LA15_2 == 25 or LA15_2 == 27 or (29 <= LA15_2 <= 42) or (45 <= LA15_2 <= 64) or LA15_2 == 66) : + alt15 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 2, self.input) + + raise nvae + + elif (LA15_1 == 43) : + alt15 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("233:1: struct_or_union_specifier options {k=3; } : ( struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' | struct_or_union IDENTIFIER );", 15, 0, self.input) + + raise nvae + + if alt15 == 1: + # C.g:235:4: struct_or_union ( IDENTIFIER )? '{' struct_declaration_list '}' + self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier494) + self.struct_or_union() + self.following.pop() + if self.failed: + return retval + # C.g:235:20: ( IDENTIFIER )? + alt14 = 2 + LA14_0 = self.input.LA(1) + + if (LA14_0 == IDENTIFIER) : + alt14 = 1 + if alt14 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier496) + if self.failed: + return retval + + + + self.match(self.input, 43, self.FOLLOW_43_in_struct_or_union_specifier499) + if self.failed: + return retval + self.following.append(self.FOLLOW_struct_declaration_list_in_struct_or_union_specifier501) + self.struct_declaration_list() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 44, self.FOLLOW_44_in_struct_or_union_specifier503) + if self.failed: + return retval + + + elif alt15 == 2: + # C.g:236:4: struct_or_union IDENTIFIER + self.following.append(self.FOLLOW_struct_or_union_in_struct_or_union_specifier508) + self.struct_or_union() + self.following.pop() + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_struct_or_union_specifier510) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 11, struct_or_union_specifier_StartIndex) + + pass + + return retval + + # $ANTLR end struct_or_union_specifier + + + # $ANTLR start struct_or_union + # C.g:239:1: struct_or_union : ( 'struct' | 'union' ); + def struct_or_union(self, ): + + struct_or_union_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 12): + return + + # C.g:240:2: ( 'struct' | 'union' ) + # C.g: + if (45 <= self.input.LA(1) <= 46): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_struct_or_union0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 12, struct_or_union_StartIndex) + + pass + + return + + # $ANTLR end struct_or_union + + + # $ANTLR start struct_declaration_list + # C.g:244:1: struct_declaration_list : ( struct_declaration )+ ; + def struct_declaration_list(self, ): + + struct_declaration_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 13): + return + + # C.g:245:2: ( ( struct_declaration )+ ) + # C.g:245:4: ( struct_declaration )+ + # C.g:245:4: ( struct_declaration )+ + cnt16 = 0 + while True: #loop16 + alt16 = 2 + LA16_0 = self.input.LA(1) + + if (LA16_0 == IDENTIFIER or (34 <= LA16_0 <= 42) or (45 <= LA16_0 <= 46) or (48 <= LA16_0 <= 61)) : + alt16 = 1 + + + if alt16 == 1: + # C.g:0:0: struct_declaration + self.following.append(self.FOLLOW_struct_declaration_in_struct_declaration_list537) + self.struct_declaration() + self.following.pop() + if self.failed: + return + + + else: + if cnt16 >= 1: + break #loop16 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(16, self.input) + raise eee + + cnt16 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 13, struct_declaration_list_StartIndex) + + pass + + return + + # $ANTLR end struct_declaration_list + + + # $ANTLR start struct_declaration + # C.g:248:1: struct_declaration : specifier_qualifier_list struct_declarator_list ';' ; + def struct_declaration(self, ): + + struct_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 14): + return + + # C.g:249:2: ( specifier_qualifier_list struct_declarator_list ';' ) + # C.g:249:4: specifier_qualifier_list struct_declarator_list ';' + self.following.append(self.FOLLOW_specifier_qualifier_list_in_struct_declaration549) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_struct_declarator_list_in_struct_declaration551) + self.struct_declarator_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_struct_declaration553) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 14, struct_declaration_StartIndex) + + pass + + return + + # $ANTLR end struct_declaration + + + # $ANTLR start specifier_qualifier_list + # C.g:252:1: specifier_qualifier_list : ( type_qualifier | type_specifier )+ ; + def specifier_qualifier_list(self, ): + + specifier_qualifier_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 15): + return + + # C.g:253:2: ( ( type_qualifier | type_specifier )+ ) + # C.g:253:4: ( type_qualifier | type_specifier )+ + # C.g:253:4: ( type_qualifier | type_specifier )+ + cnt17 = 0 + while True: #loop17 + alt17 = 3 + LA17 = self.input.LA(1) + if LA17 == 58: + LA17_2 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == 59: + LA17_3 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == 60: + LA17_4 = self.input.LA(2) + + if (self.synpred39()) : + alt17 = 1 + + + elif LA17 == IDENTIFIER: + LA17 = self.input.LA(2) + if LA17 == EOF or LA17 == IDENTIFIER or LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48 or LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 58 or LA17 == 59 or LA17 == 60 or LA17 == 61 or LA17 == 63 or LA17 == 66: + alt17 = 2 + elif LA17 == 62: + LA17_94 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + elif LA17 == 47: + LA17_95 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + elif LA17 == 64: + LA17_96 = self.input.LA(3) + + if (self.synpred40()) : + alt17 = 2 + + + + elif LA17 == 49 or LA17 == 50 or LA17 == 51 or LA17 == 52 or LA17 == 53 or LA17 == 54 or LA17 == 55 or LA17 == 56 or LA17 == 57 or LA17 == 61: + alt17 = 1 + elif LA17 == 34 or LA17 == 35 or LA17 == 36 or LA17 == 37 or LA17 == 38 or LA17 == 39 or LA17 == 40 or LA17 == 41 or LA17 == 42 or LA17 == 45 or LA17 == 46 or LA17 == 48: + alt17 = 2 + + if alt17 == 1: + # C.g:253:6: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_specifier_qualifier_list566) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + elif alt17 == 2: + # C.g:253:23: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_specifier_qualifier_list570) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt17 >= 1: + break #loop17 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(17, self.input) + raise eee + + cnt17 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 15, specifier_qualifier_list_StartIndex) + + pass + + return + + # $ANTLR end specifier_qualifier_list + + + # $ANTLR start struct_declarator_list + # C.g:256:1: struct_declarator_list : struct_declarator ( ',' struct_declarator )* ; + def struct_declarator_list(self, ): + + struct_declarator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 16): + return + + # C.g:257:2: ( struct_declarator ( ',' struct_declarator )* ) + # C.g:257:4: struct_declarator ( ',' struct_declarator )* + self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list584) + self.struct_declarator() + self.following.pop() + if self.failed: + return + # C.g:257:22: ( ',' struct_declarator )* + while True: #loop18 + alt18 = 2 + LA18_0 = self.input.LA(1) + + if (LA18_0 == 27) : + alt18 = 1 + + + if alt18 == 1: + # C.g:257:23: ',' struct_declarator + self.match(self.input, 27, self.FOLLOW_27_in_struct_declarator_list587) + if self.failed: + return + self.following.append(self.FOLLOW_struct_declarator_in_struct_declarator_list589) + self.struct_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop18 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 16, struct_declarator_list_StartIndex) + + pass + + return + + # $ANTLR end struct_declarator_list + + + # $ANTLR start struct_declarator + # C.g:260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression ); + def struct_declarator(self, ): + + struct_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 17): + return + + # C.g:261:2: ( declarator ( ':' constant_expression )? | ':' constant_expression ) + alt20 = 2 + LA20_0 = self.input.LA(1) + + if (LA20_0 == IDENTIFIER or (58 <= LA20_0 <= 60) or LA20_0 == 62 or LA20_0 == 66) : + alt20 = 1 + elif (LA20_0 == 47) : + alt20 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("260:1: struct_declarator : ( declarator ( ':' constant_expression )? | ':' constant_expression );", 20, 0, self.input) + + raise nvae + + if alt20 == 1: + # C.g:261:4: declarator ( ':' constant_expression )? + self.following.append(self.FOLLOW_declarator_in_struct_declarator602) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:261:15: ( ':' constant_expression )? + alt19 = 2 + LA19_0 = self.input.LA(1) + + if (LA19_0 == 47) : + alt19 = 1 + if alt19 == 1: + # C.g:261:16: ':' constant_expression + self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator605) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_struct_declarator607) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + + + elif alt20 == 2: + # C.g:262:4: ':' constant_expression + self.match(self.input, 47, self.FOLLOW_47_in_struct_declarator614) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_struct_declarator616) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 17, struct_declarator_StartIndex) + + pass + + return + + # $ANTLR end struct_declarator + + class enum_specifier_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start enum_specifier + # C.g:265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ); + def enum_specifier(self, ): + + retval = self.enum_specifier_return() + retval.start = self.input.LT(1) + enum_specifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 18): + return retval + + # C.g:267:2: ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER ) + alt23 = 3 + LA23_0 = self.input.LA(1) + + if (LA23_0 == 48) : + LA23_1 = self.input.LA(2) + + if (LA23_1 == IDENTIFIER) : + LA23_2 = self.input.LA(3) + + if (LA23_2 == 43) : + alt23 = 2 + elif (LA23_2 == EOF or LA23_2 == IDENTIFIER or LA23_2 == 25 or LA23_2 == 27 or (29 <= LA23_2 <= 42) or (45 <= LA23_2 <= 64) or LA23_2 == 66) : + alt23 = 3 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 2, self.input) + + raise nvae + + elif (LA23_1 == 43) : + alt23 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("265:1: enum_specifier options {k=3; } : ( 'enum' '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' | 'enum' IDENTIFIER );", 23, 0, self.input) + + raise nvae + + if alt23 == 1: + # C.g:267:4: 'enum' '{' enumerator_list ( ',' )? '}' + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier634) + if self.failed: + return retval + self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier636) + if self.failed: + return retval + self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier638) + self.enumerator_list() + self.following.pop() + if self.failed: + return retval + # C.g:267:31: ( ',' )? + alt21 = 2 + LA21_0 = self.input.LA(1) + + if (LA21_0 == 27) : + alt21 = 1 + if alt21 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier640) + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier643) + if self.failed: + return retval + + + elif alt23 == 2: + # C.g:268:4: 'enum' IDENTIFIER '{' enumerator_list ( ',' )? '}' + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier648) + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier650) + if self.failed: + return retval + self.match(self.input, 43, self.FOLLOW_43_in_enum_specifier652) + if self.failed: + return retval + self.following.append(self.FOLLOW_enumerator_list_in_enum_specifier654) + self.enumerator_list() + self.following.pop() + if self.failed: + return retval + # C.g:268:42: ( ',' )? + alt22 = 2 + LA22_0 = self.input.LA(1) + + if (LA22_0 == 27) : + alt22 = 1 + if alt22 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_enum_specifier656) + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_enum_specifier659) + if self.failed: + return retval + + + elif alt23 == 3: + # C.g:269:4: 'enum' IDENTIFIER + self.match(self.input, 48, self.FOLLOW_48_in_enum_specifier664) + if self.failed: + return retval + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enum_specifier666) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 18, enum_specifier_StartIndex) + + pass + + return retval + + # $ANTLR end enum_specifier + + + # $ANTLR start enumerator_list + # C.g:272:1: enumerator_list : enumerator ( ',' enumerator )* ; + def enumerator_list(self, ): + + enumerator_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 19): + return + + # C.g:273:2: ( enumerator ( ',' enumerator )* ) + # C.g:273:4: enumerator ( ',' enumerator )* + self.following.append(self.FOLLOW_enumerator_in_enumerator_list677) + self.enumerator() + self.following.pop() + if self.failed: + return + # C.g:273:15: ( ',' enumerator )* + while True: #loop24 + alt24 = 2 + LA24_0 = self.input.LA(1) + + if (LA24_0 == 27) : + LA24_1 = self.input.LA(2) + + if (LA24_1 == IDENTIFIER) : + alt24 = 1 + + + + + if alt24 == 1: + # C.g:273:16: ',' enumerator + self.match(self.input, 27, self.FOLLOW_27_in_enumerator_list680) + if self.failed: + return + self.following.append(self.FOLLOW_enumerator_in_enumerator_list682) + self.enumerator() + self.following.pop() + if self.failed: + return + + + else: + break #loop24 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 19, enumerator_list_StartIndex) + + pass + + return + + # $ANTLR end enumerator_list + + + # $ANTLR start enumerator + # C.g:276:1: enumerator : IDENTIFIER ( '=' constant_expression )? ; + def enumerator(self, ): + + enumerator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 20): + return + + # C.g:277:2: ( IDENTIFIER ( '=' constant_expression )? ) + # C.g:277:4: IDENTIFIER ( '=' constant_expression )? + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_enumerator695) + if self.failed: + return + # C.g:277:15: ( '=' constant_expression )? + alt25 = 2 + LA25_0 = self.input.LA(1) + + if (LA25_0 == 28) : + alt25 = 1 + if alt25 == 1: + # C.g:277:16: '=' constant_expression + self.match(self.input, 28, self.FOLLOW_28_in_enumerator698) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_enumerator700) + self.constant_expression() + self.following.pop() + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 20, enumerator_StartIndex) + + pass + + return + + # $ANTLR end enumerator + + + # $ANTLR start type_qualifier + # C.g:280:1: type_qualifier : ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ); + def type_qualifier(self, ): + + type_qualifier_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 21): + return + + # C.g:281:2: ( 'const' | 'volatile' | 'IN' | 'OUT' | 'OPTIONAL' | 'CONST' | 'UNALIGNED' | 'VOLATILE' | 'GLOBAL_REMOVE_IF_UNREFERENCED' | 'EFIAPI' | 'EFI_BOOTSERVICE' | 'EFI_RUNTIMESERVICE' | 'PACKED' ) + # C.g: + if (49 <= self.input.LA(1) <= 61): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_type_qualifier0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 21, type_qualifier_StartIndex) + + pass + + return + + # $ANTLR end type_qualifier + + class declarator_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start declarator + # C.g:296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ); + def declarator(self, ): + + retval = self.declarator_return() + retval.start = self.input.LT(1) + declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 22): + return retval + + # C.g:297:2: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer ) + alt30 = 2 + LA30_0 = self.input.LA(1) + + if (LA30_0 == 66) : + LA30_1 = self.input.LA(2) + + if (self.synpred66()) : + alt30 = 1 + elif (True) : + alt30 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 1, self.input) + + raise nvae + + elif (LA30_0 == IDENTIFIER or (58 <= LA30_0 <= 60) or LA30_0 == 62) : + alt30 = 1 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("296:1: declarator : ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator | pointer );", 30, 0, self.input) + + raise nvae + + if alt30 == 1: + # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator + # C.g:297:4: ( pointer )? + alt26 = 2 + LA26_0 = self.input.LA(1) + + if (LA26_0 == 66) : + alt26 = 1 + if alt26 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_declarator784) + self.pointer() + self.following.pop() + if self.failed: + return retval + + + + # C.g:297:13: ( 'EFIAPI' )? + alt27 = 2 + LA27_0 = self.input.LA(1) + + if (LA27_0 == 58) : + alt27 = 1 + if alt27 == 1: + # C.g:297:14: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_declarator788) + if self.failed: + return retval + + + + # C.g:297:25: ( 'EFI_BOOTSERVICE' )? + alt28 = 2 + LA28_0 = self.input.LA(1) + + if (LA28_0 == 59) : + alt28 = 1 + if alt28 == 1: + # C.g:297:26: 'EFI_BOOTSERVICE' + self.match(self.input, 59, self.FOLLOW_59_in_declarator793) + if self.failed: + return retval + + + + # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? + alt29 = 2 + LA29_0 = self.input.LA(1) + + if (LA29_0 == 60) : + alt29 = 1 + if alt29 == 1: + # C.g:297:47: 'EFI_RUNTIMESERVICE' + self.match(self.input, 60, self.FOLLOW_60_in_declarator798) + if self.failed: + return retval + + + + self.following.append(self.FOLLOW_direct_declarator_in_declarator802) + self.direct_declarator() + self.following.pop() + if self.failed: + return retval + + + elif alt30 == 2: + # C.g:299:4: pointer + self.following.append(self.FOLLOW_pointer_in_declarator808) + self.pointer() + self.following.pop() + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 22, declarator_StartIndex) + + pass + + return retval + + # $ANTLR end declarator + + + # $ANTLR start direct_declarator + # C.g:302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ); + def direct_declarator(self, ): + + direct_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 23): + return + + # C.g:303:2: ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ ) + alt34 = 2 + LA34_0 = self.input.LA(1) + + if (LA34_0 == IDENTIFIER) : + alt34 = 1 + elif (LA34_0 == 62) : + alt34 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("302:1: direct_declarator : ( IDENTIFIER ( declarator_suffix )* | '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ );", 34, 0, self.input) + + raise nvae + + if alt34 == 1: + # C.g:303:4: IDENTIFIER ( declarator_suffix )* + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_direct_declarator819) + if self.failed: + return + # C.g:303:15: ( declarator_suffix )* + while True: #loop31 + alt31 = 2 + LA31_0 = self.input.LA(1) + + if (LA31_0 == 62) : + LA31 = self.input.LA(2) + if LA31 == 63: + LA31_30 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 58: + LA31_31 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 66: + LA31_32 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 59: + LA31_33 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 60: + LA31_34 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == IDENTIFIER: + LA31_35 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 29 or LA31 == 30 or LA31 == 31 or LA31 == 32 or LA31 == 33: + LA31_37 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 34: + LA31_38 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 35: + LA31_39 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 36: + LA31_40 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 37: + LA31_41 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 38: + LA31_42 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 39: + LA31_43 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 40: + LA31_44 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 41: + LA31_45 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 42: + LA31_46 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 45 or LA31 == 46: + LA31_47 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 48: + LA31_48 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 49 or LA31 == 50 or LA31 == 51 or LA31 == 52 or LA31 == 53 or LA31 == 54 or LA31 == 55 or LA31 == 56 or LA31 == 57 or LA31 == 61: + LA31_49 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + + elif (LA31_0 == 64) : + LA31 = self.input.LA(2) + if LA31 == 65: + LA31_51 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 62: + LA31_52 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == IDENTIFIER: + LA31_53 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == HEX_LITERAL: + LA31_54 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == OCTAL_LITERAL: + LA31_55 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == DECIMAL_LITERAL: + LA31_56 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == CHARACTER_LITERAL: + LA31_57 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == STRING_LITERAL: + LA31_58 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == FLOATING_POINT_LITERAL: + LA31_59 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 72: + LA31_60 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 73: + LA31_61 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 66 or LA31 == 68 or LA31 == 69 or LA31 == 77 or LA31 == 78 or LA31 == 79: + LA31_62 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + elif LA31 == 74: + LA31_63 = self.input.LA(3) + + if (self.synpred67()) : + alt31 = 1 + + + + + + if alt31 == 1: + # C.g:0:0: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator821) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + break #loop31 + + + + + elif alt34 == 2: + # C.g:304:4: '(' ( 'EFIAPI' )? declarator ')' ( declarator_suffix )+ + self.match(self.input, 62, self.FOLLOW_62_in_direct_declarator827) + if self.failed: + return + # C.g:304:8: ( 'EFIAPI' )? + alt32 = 2 + LA32_0 = self.input.LA(1) + + if (LA32_0 == 58) : + LA32_1 = self.input.LA(2) + + if (self.synpred69()) : + alt32 = 1 + if alt32 == 1: + # C.g:304:9: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_direct_declarator830) + if self.failed: + return + + + + self.following.append(self.FOLLOW_declarator_in_direct_declarator834) + self.declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_direct_declarator836) + if self.failed: + return + # C.g:304:35: ( declarator_suffix )+ + cnt33 = 0 + while True: #loop33 + alt33 = 2 + LA33_0 = self.input.LA(1) + + if (LA33_0 == 62) : + LA33 = self.input.LA(2) + if LA33 == 63: + LA33_30 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 58: + LA33_31 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 66: + LA33_32 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 59: + LA33_33 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 60: + LA33_34 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == IDENTIFIER: + LA33_35 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 29 or LA33 == 30 or LA33 == 31 or LA33 == 32 or LA33 == 33: + LA33_37 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 34: + LA33_38 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 35: + LA33_39 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 36: + LA33_40 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 37: + LA33_41 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 38: + LA33_42 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 39: + LA33_43 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 40: + LA33_44 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 41: + LA33_45 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 42: + LA33_46 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 45 or LA33 == 46: + LA33_47 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 48: + LA33_48 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 49 or LA33 == 50 or LA33 == 51 or LA33 == 52 or LA33 == 53 or LA33 == 54 or LA33 == 55 or LA33 == 56 or LA33 == 57 or LA33 == 61: + LA33_49 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + + elif (LA33_0 == 64) : + LA33 = self.input.LA(2) + if LA33 == 65: + LA33_51 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 62: + LA33_52 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == IDENTIFIER: + LA33_53 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == HEX_LITERAL: + LA33_54 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == OCTAL_LITERAL: + LA33_55 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == DECIMAL_LITERAL: + LA33_56 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == CHARACTER_LITERAL: + LA33_57 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == STRING_LITERAL: + LA33_58 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == FLOATING_POINT_LITERAL: + LA33_59 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 72: + LA33_60 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 73: + LA33_61 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 66 or LA33 == 68 or LA33 == 69 or LA33 == 77 or LA33 == 78 or LA33 == 79: + LA33_62 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + elif LA33 == 74: + LA33_63 = self.input.LA(3) + + if (self.synpred70()) : + alt33 = 1 + + + + + + if alt33 == 1: + # C.g:0:0: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_direct_declarator838) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + if cnt33 >= 1: + break #loop33 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(33, self.input) + raise eee + + cnt33 += 1 + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 23, direct_declarator_StartIndex) + + pass + + return + + # $ANTLR end direct_declarator + + + # $ANTLR start declarator_suffix + # C.g:307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ); + def declarator_suffix(self, ): + + declarator_suffix_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 24): + return + + # C.g:308:2: ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' ) + alt35 = 5 + LA35_0 = self.input.LA(1) + + if (LA35_0 == 64) : + LA35_1 = self.input.LA(2) + + if (LA35_1 == 65) : + alt35 = 2 + elif ((IDENTIFIER <= LA35_1 <= FLOATING_POINT_LITERAL) or LA35_1 == 62 or LA35_1 == 66 or (68 <= LA35_1 <= 69) or (72 <= LA35_1 <= 74) or (77 <= LA35_1 <= 79)) : + alt35 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 1, self.input) + + raise nvae + + elif (LA35_0 == 62) : + LA35 = self.input.LA(2) + if LA35 == 63: + alt35 = 5 + elif LA35 == 29 or LA35 == 30 or LA35 == 31 or LA35 == 32 or LA35 == 33 or LA35 == 34 or LA35 == 35 or LA35 == 36 or LA35 == 37 or LA35 == 38 or LA35 == 39 or LA35 == 40 or LA35 == 41 or LA35 == 42 or LA35 == 45 or LA35 == 46 or LA35 == 48 or LA35 == 49 or LA35 == 50 or LA35 == 51 or LA35 == 52 or LA35 == 53 or LA35 == 54 or LA35 == 55 or LA35 == 56 or LA35 == 57 or LA35 == 58 or LA35 == 59 or LA35 == 60 or LA35 == 61 or LA35 == 66: + alt35 = 3 + elif LA35 == IDENTIFIER: + LA35_29 = self.input.LA(3) + + if (self.synpred73()) : + alt35 = 3 + elif (self.synpred74()) : + alt35 = 4 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 29, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 2, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("307:1: declarator_suffix : ( '[' constant_expression ']' | '[' ']' | '(' parameter_type_list ')' | '(' identifier_list ')' | '(' ')' );", 35, 0, self.input) + + raise nvae + + if alt35 == 1: + # C.g:308:6: '[' constant_expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix852) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_declarator_suffix854) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix856) + if self.failed: + return + + + elif alt35 == 2: + # C.g:309:9: '[' ']' + self.match(self.input, 64, self.FOLLOW_64_in_declarator_suffix866) + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_declarator_suffix868) + if self.failed: + return + + + elif alt35 == 3: + # C.g:310:9: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix878) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_declarator_suffix880) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix882) + if self.failed: + return + + + elif alt35 == 4: + # C.g:311:9: '(' identifier_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix892) + if self.failed: + return + self.following.append(self.FOLLOW_identifier_list_in_declarator_suffix894) + self.identifier_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix896) + if self.failed: + return + + + elif alt35 == 5: + # C.g:312:9: '(' ')' + self.match(self.input, 62, self.FOLLOW_62_in_declarator_suffix906) + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_declarator_suffix908) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 24, declarator_suffix_StartIndex) + + pass + + return + + # $ANTLR end declarator_suffix + + + # $ANTLR start pointer + # C.g:315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ); + def pointer(self, ): + + pointer_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 25): + return + + # C.g:316:2: ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' ) + alt38 = 3 + LA38_0 = self.input.LA(1) + + if (LA38_0 == 66) : + LA38 = self.input.LA(2) + if LA38 == 66: + LA38_2 = self.input.LA(3) + + if (self.synpred78()) : + alt38 = 2 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 2, self.input) + + raise nvae + + elif LA38 == 58: + LA38_3 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 3, self.input) + + raise nvae + + elif LA38 == 59: + LA38_4 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 4, self.input) + + raise nvae + + elif LA38 == 60: + LA38_5 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 5, self.input) + + raise nvae + + elif LA38 == EOF or LA38 == IDENTIFIER or LA38 == 25 or LA38 == 26 or LA38 == 27 or LA38 == 28 or LA38 == 29 or LA38 == 30 or LA38 == 31 or LA38 == 32 or LA38 == 33 or LA38 == 34 or LA38 == 35 or LA38 == 36 or LA38 == 37 or LA38 == 38 or LA38 == 39 or LA38 == 40 or LA38 == 41 or LA38 == 42 or LA38 == 43 or LA38 == 45 or LA38 == 46 or LA38 == 47 or LA38 == 48 or LA38 == 62 or LA38 == 63 or LA38 == 64: + alt38 = 3 + elif LA38 == 53: + LA38_21 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 21, self.input) + + raise nvae + + elif LA38 == 49 or LA38 == 50 or LA38 == 51 or LA38 == 52 or LA38 == 54 or LA38 == 55 or LA38 == 56 or LA38 == 57 or LA38 == 61: + LA38_29 = self.input.LA(3) + + if (self.synpred77()) : + alt38 = 1 + elif (True) : + alt38 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 29, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 1, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("315:1: pointer : ( '*' ( type_qualifier )+ ( pointer )? | '*' pointer | '*' );", 38, 0, self.input) + + raise nvae + + if alt38 == 1: + # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? + self.match(self.input, 66, self.FOLLOW_66_in_pointer919) + if self.failed: + return + # C.g:316:8: ( type_qualifier )+ + cnt36 = 0 + while True: #loop36 + alt36 = 2 + LA36 = self.input.LA(1) + if LA36 == 58: + LA36_2 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 59: + LA36_3 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 60: + LA36_4 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 53: + LA36_20 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + elif LA36 == 49 or LA36 == 50 or LA36 == 51 or LA36 == 52 or LA36 == 54 or LA36 == 55 or LA36 == 56 or LA36 == 57 or LA36 == 61: + LA36_28 = self.input.LA(2) + + if (self.synpred75()) : + alt36 = 1 + + + + if alt36 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_pointer921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt36 >= 1: + break #loop36 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(36, self.input) + raise eee + + cnt36 += 1 + + + # C.g:316:24: ( pointer )? + alt37 = 2 + LA37_0 = self.input.LA(1) + + if (LA37_0 == 66) : + LA37_1 = self.input.LA(2) + + if (self.synpred76()) : + alt37 = 1 + if alt37 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_pointer924) + self.pointer() + self.following.pop() + if self.failed: + return + + + + + + elif alt38 == 2: + # C.g:317:4: '*' pointer + self.match(self.input, 66, self.FOLLOW_66_in_pointer930) + if self.failed: + return + self.following.append(self.FOLLOW_pointer_in_pointer932) + self.pointer() + self.following.pop() + if self.failed: + return + + + elif alt38 == 3: + # C.g:318:4: '*' + self.match(self.input, 66, self.FOLLOW_66_in_pointer937) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 25, pointer_StartIndex) + + pass + + return + + # $ANTLR end pointer + + + # $ANTLR start parameter_type_list + # C.g:321:1: parameter_type_list : parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ; + def parameter_type_list(self, ): + + parameter_type_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 26): + return + + # C.g:322:2: ( parameter_list ( ',' ( 'OPTIONAL' )? '...' )? ) + # C.g:322:4: parameter_list ( ',' ( 'OPTIONAL' )? '...' )? + self.following.append(self.FOLLOW_parameter_list_in_parameter_type_list948) + self.parameter_list() + self.following.pop() + if self.failed: + return + # C.g:322:19: ( ',' ( 'OPTIONAL' )? '...' )? + alt40 = 2 + LA40_0 = self.input.LA(1) + + if (LA40_0 == 27) : + alt40 = 1 + if alt40 == 1: + # C.g:322:20: ',' ( 'OPTIONAL' )? '...' + self.match(self.input, 27, self.FOLLOW_27_in_parameter_type_list951) + if self.failed: + return + # C.g:322:24: ( 'OPTIONAL' )? + alt39 = 2 + LA39_0 = self.input.LA(1) + + if (LA39_0 == 53) : + alt39 = 1 + if alt39 == 1: + # C.g:322:25: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_type_list954) + if self.failed: + return + + + + self.match(self.input, 67, self.FOLLOW_67_in_parameter_type_list958) + if self.failed: + return + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 26, parameter_type_list_StartIndex) + + pass + + return + + # $ANTLR end parameter_type_list + + + # $ANTLR start parameter_list + # C.g:325:1: parameter_list : parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ; + def parameter_list(self, ): + + parameter_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 27): + return + + # C.g:326:2: ( parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* ) + # C.g:326:4: parameter_declaration ( ',' ( 'OPTIONAL' )? parameter_declaration )* + self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list971) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + # C.g:326:26: ( ',' ( 'OPTIONAL' )? parameter_declaration )* + while True: #loop42 + alt42 = 2 + LA42_0 = self.input.LA(1) + + if (LA42_0 == 27) : + LA42_1 = self.input.LA(2) + + if (LA42_1 == 53) : + LA42_3 = self.input.LA(3) + + if (self.synpred82()) : + alt42 = 1 + + + elif (LA42_1 == IDENTIFIER or (29 <= LA42_1 <= 42) or (45 <= LA42_1 <= 46) or (48 <= LA42_1 <= 52) or (54 <= LA42_1 <= 61) or LA42_1 == 66) : + alt42 = 1 + + + + + if alt42 == 1: + # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_parameter_list974) + if self.failed: + return + # C.g:326:31: ( 'OPTIONAL' )? + alt41 = 2 + LA41_0 = self.input.LA(1) + + if (LA41_0 == 53) : + LA41_1 = self.input.LA(2) + + if (self.synpred81()) : + alt41 = 1 + if alt41 == 1: + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_list977) + if self.failed: + return + + + + self.following.append(self.FOLLOW_parameter_declaration_in_parameter_list981) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop42 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 27, parameter_list_StartIndex) + + pass + + return + + # $ANTLR end parameter_list + + + # $ANTLR start parameter_declaration + # C.g:329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ); + def parameter_declaration(self, ): + + parameter_declaration_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 28): + return + + # C.g:330:2: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER ) + alt46 = 2 + LA46 = self.input.LA(1) + if LA46 == 29 or LA46 == 30 or LA46 == 31 or LA46 == 32 or LA46 == 33 or LA46 == 34 or LA46 == 35 or LA46 == 36 or LA46 == 37 or LA46 == 38 or LA46 == 39 or LA46 == 40 or LA46 == 41 or LA46 == 42 or LA46 == 45 or LA46 == 46 or LA46 == 48 or LA46 == 49 or LA46 == 50 or LA46 == 51 or LA46 == 52 or LA46 == 53 or LA46 == 54 or LA46 == 55 or LA46 == 56 or LA46 == 57 or LA46 == 58 or LA46 == 59 or LA46 == 60 or LA46 == 61: + alt46 = 1 + elif LA46 == IDENTIFIER: + LA46_13 = self.input.LA(2) + + if (self.synpred86()) : + alt46 = 1 + elif (True) : + alt46 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 13, self.input) + + raise nvae + + elif LA46 == 66: + alt46 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("329:1: parameter_declaration : ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? | ( pointer )* IDENTIFIER );", 46, 0, self.input) + + raise nvae + + if alt46 == 1: + # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? + self.following.append(self.FOLLOW_declaration_specifiers_in_parameter_declaration994) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:330:27: ( declarator | abstract_declarator )* + while True: #loop43 + alt43 = 3 + LA43 = self.input.LA(1) + if LA43 == 66: + LA43_5 = self.input.LA(2) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == IDENTIFIER or LA43 == 58 or LA43 == 59 or LA43 == 60: + alt43 = 1 + elif LA43 == 62: + LA43 = self.input.LA(2) + if LA43 == 29 or LA43 == 30 or LA43 == 31 or LA43 == 32 or LA43 == 33 or LA43 == 34 or LA43 == 35 or LA43 == 36 or LA43 == 37 or LA43 == 38 or LA43 == 39 or LA43 == 40 or LA43 == 41 or LA43 == 42 or LA43 == 45 or LA43 == 46 or LA43 == 48 or LA43 == 49 or LA43 == 50 or LA43 == 51 or LA43 == 52 or LA43 == 53 or LA43 == 54 or LA43 == 55 or LA43 == 56 or LA43 == 57 or LA43 == 61 or LA43 == 63 or LA43 == 64: + alt43 = 2 + elif LA43 == IDENTIFIER: + LA43_37 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 58: + LA43_38 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 66: + LA43_39 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 59: + LA43_40 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 60: + LA43_41 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + elif LA43 == 62: + LA43_43 = self.input.LA(3) + + if (self.synpred83()) : + alt43 = 1 + elif (self.synpred84()) : + alt43 = 2 + + + + elif LA43 == 64: + alt43 = 2 + + if alt43 == 1: + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_parameter_declaration997) + self.declarator() + self.following.pop() + if self.failed: + return + + + elif alt43 == 2: + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_parameter_declaration999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop43 + + + # C.g:330:61: ( 'OPTIONAL' )? + alt44 = 2 + LA44_0 = self.input.LA(1) + + if (LA44_0 == 53) : + alt44 = 1 + if alt44 == 1: + # C.g:330:62: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_parameter_declaration1004) + if self.failed: + return + + + + + + elif alt46 == 2: + # C.g:332:4: ( pointer )* IDENTIFIER + # C.g:332:4: ( pointer )* + while True: #loop45 + alt45 = 2 + LA45_0 = self.input.LA(1) + + if (LA45_0 == 66) : + alt45 = 1 + + + if alt45 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_parameter_declaration1013) + self.pointer() + self.following.pop() + if self.failed: + return + + + else: + break #loop45 + + + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_parameter_declaration1016) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 28, parameter_declaration_StartIndex) + + pass + + return + + # $ANTLR end parameter_declaration + + + # $ANTLR start identifier_list + # C.g:335:1: identifier_list : IDENTIFIER ( ',' IDENTIFIER )* ; + def identifier_list(self, ): + + identifier_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 29): + return + + # C.g:336:2: ( IDENTIFIER ( ',' IDENTIFIER )* ) + # C.g:336:4: IDENTIFIER ( ',' IDENTIFIER )* + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1027) + if self.failed: + return + # C.g:337:2: ( ',' IDENTIFIER )* + while True: #loop47 + alt47 = 2 + LA47_0 = self.input.LA(1) + + if (LA47_0 == 27) : + alt47 = 1 + + + if alt47 == 1: + # C.g:337:3: ',' IDENTIFIER + self.match(self.input, 27, self.FOLLOW_27_in_identifier_list1031) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_identifier_list1033) + if self.failed: + return + + + else: + break #loop47 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 29, identifier_list_StartIndex) + + pass + + return + + # $ANTLR end identifier_list + + + # $ANTLR start type_name + # C.g:340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id ); + def type_name(self, ): + + type_name_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 30): + return + + # C.g:341:2: ( specifier_qualifier_list ( abstract_declarator )? | type_id ) + alt49 = 2 + LA49_0 = self.input.LA(1) + + if ((34 <= LA49_0 <= 42) or (45 <= LA49_0 <= 46) or (48 <= LA49_0 <= 61)) : + alt49 = 1 + elif (LA49_0 == IDENTIFIER) : + LA49_13 = self.input.LA(2) + + if (self.synpred90()) : + alt49 = 1 + elif (True) : + alt49 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 13, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("340:1: type_name : ( specifier_qualifier_list ( abstract_declarator )? | type_id );", 49, 0, self.input) + + raise nvae + + if alt49 == 1: + # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? + self.following.append(self.FOLLOW_specifier_qualifier_list_in_type_name1046) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + # C.g:341:29: ( abstract_declarator )? + alt48 = 2 + LA48_0 = self.input.LA(1) + + if (LA48_0 == 62 or LA48_0 == 64 or LA48_0 == 66) : + alt48 = 1 + if alt48 == 1: + # C.g:0:0: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_type_name1048) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + elif alt49 == 2: + # C.g:342:4: type_id + self.following.append(self.FOLLOW_type_id_in_type_name1054) + self.type_id() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 30, type_name_StartIndex) + + pass + + return + + # $ANTLR end type_name + + + # $ANTLR start abstract_declarator + # C.g:345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ); + def abstract_declarator(self, ): + + abstract_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 31): + return + + # C.g:346:2: ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator ) + alt51 = 2 + LA51_0 = self.input.LA(1) + + if (LA51_0 == 66) : + alt51 = 1 + elif (LA51_0 == 62 or LA51_0 == 64) : + alt51 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("345:1: abstract_declarator : ( pointer ( direct_abstract_declarator )? | direct_abstract_declarator );", 51, 0, self.input) + + raise nvae + + if alt51 == 1: + # C.g:346:4: pointer ( direct_abstract_declarator )? + self.following.append(self.FOLLOW_pointer_in_abstract_declarator1065) + self.pointer() + self.following.pop() + if self.failed: + return + # C.g:346:12: ( direct_abstract_declarator )? + alt50 = 2 + LA50_0 = self.input.LA(1) + + if (LA50_0 == 62) : + LA50 = self.input.LA(2) + if LA50 == 63: + LA50_12 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 58: + LA50_13 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 66: + LA50_14 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 59: + LA50_15 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 60: + LA50_16 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == IDENTIFIER: + LA50_17 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 62: + LA50_18 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 64: + LA50_19 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 29 or LA50 == 30 or LA50 == 31 or LA50 == 32 or LA50 == 33: + LA50_20 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 34: + LA50_21 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 35: + LA50_22 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 36: + LA50_23 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 37: + LA50_24 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 38: + LA50_25 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 39: + LA50_26 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 40: + LA50_27 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 41: + LA50_28 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 42: + LA50_29 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 45 or LA50 == 46: + LA50_30 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 48: + LA50_31 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 49 or LA50 == 50 or LA50 == 51 or LA50 == 52 or LA50 == 53 or LA50 == 54 or LA50 == 55 or LA50 == 56 or LA50 == 57 or LA50 == 61: + LA50_32 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif (LA50_0 == 64) : + LA50 = self.input.LA(2) + if LA50 == 65: + LA50_33 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 62: + LA50_34 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == IDENTIFIER: + LA50_35 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == HEX_LITERAL: + LA50_36 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == OCTAL_LITERAL: + LA50_37 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == DECIMAL_LITERAL: + LA50_38 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == CHARACTER_LITERAL: + LA50_39 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == STRING_LITERAL: + LA50_40 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == FLOATING_POINT_LITERAL: + LA50_41 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 72: + LA50_42 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 73: + LA50_43 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 66 or LA50 == 68 or LA50 == 69 or LA50 == 77 or LA50 == 78 or LA50 == 79: + LA50_44 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + elif LA50 == 74: + LA50_45 = self.input.LA(3) + + if (self.synpred91()) : + alt50 = 1 + if alt50 == 1: + # C.g:0:0: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1067) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + elif alt51 == 2: + # C.g:347:4: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_abstract_declarator1073) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 31, abstract_declarator_StartIndex) + + pass + + return + + # $ANTLR end abstract_declarator + + + # $ANTLR start direct_abstract_declarator + # C.g:350:1: direct_abstract_declarator : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ; + def direct_abstract_declarator(self, ): + + direct_abstract_declarator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 32): + return + + # C.g:351:2: ( ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* ) + # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) ( abstract_declarator_suffix )* + # C.g:351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix ) + alt52 = 2 + LA52_0 = self.input.LA(1) + + if (LA52_0 == 62) : + LA52 = self.input.LA(2) + if LA52 == IDENTIFIER or LA52 == 29 or LA52 == 30 or LA52 == 31 or LA52 == 32 or LA52 == 33 or LA52 == 34 or LA52 == 35 or LA52 == 36 or LA52 == 37 or LA52 == 38 or LA52 == 39 or LA52 == 40 or LA52 == 41 or LA52 == 42 or LA52 == 45 or LA52 == 46 or LA52 == 48 or LA52 == 49 or LA52 == 50 or LA52 == 51 or LA52 == 52 or LA52 == 53 or LA52 == 54 or LA52 == 55 or LA52 == 56 or LA52 == 57 or LA52 == 58 or LA52 == 59 or LA52 == 60 or LA52 == 61 or LA52 == 63: + alt52 = 2 + elif LA52 == 66: + LA52_18 = self.input.LA(3) + + if (self.synpred93()) : + alt52 = 1 + elif (True) : + alt52 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 18, self.input) + + raise nvae + + elif LA52 == 62 or LA52 == 64: + alt52 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 1, self.input) + + raise nvae + + elif (LA52_0 == 64) : + alt52 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("351:4: ( '(' abstract_declarator ')' | abstract_declarator_suffix )", 52, 0, self.input) + + raise nvae + + if alt52 == 1: + # C.g:351:6: '(' abstract_declarator ')' + self.match(self.input, 62, self.FOLLOW_62_in_direct_abstract_declarator1086) + if self.failed: + return + self.following.append(self.FOLLOW_abstract_declarator_in_direct_abstract_declarator1088) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_direct_abstract_declarator1090) + if self.failed: + return + + + elif alt52 == 2: + # C.g:351:36: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + + # C.g:351:65: ( abstract_declarator_suffix )* + while True: #loop53 + alt53 = 2 + LA53_0 = self.input.LA(1) + + if (LA53_0 == 62) : + LA53 = self.input.LA(2) + if LA53 == 63: + LA53_12 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 58: + LA53_13 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 66: + LA53_14 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 59: + LA53_15 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 60: + LA53_16 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == IDENTIFIER: + LA53_17 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 29 or LA53 == 30 or LA53 == 31 or LA53 == 32 or LA53 == 33: + LA53_19 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 34: + LA53_20 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 35: + LA53_21 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 36: + LA53_22 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 37: + LA53_23 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 38: + LA53_24 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 39: + LA53_25 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 40: + LA53_26 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 41: + LA53_27 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 42: + LA53_28 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 45 or LA53 == 46: + LA53_29 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 48: + LA53_30 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 49 or LA53 == 50 or LA53 == 51 or LA53 == 52 or LA53 == 53 or LA53 == 54 or LA53 == 55 or LA53 == 56 or LA53 == 57 or LA53 == 61: + LA53_31 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + + elif (LA53_0 == 64) : + LA53 = self.input.LA(2) + if LA53 == 65: + LA53_33 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 62: + LA53_34 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == IDENTIFIER: + LA53_35 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == HEX_LITERAL: + LA53_36 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == OCTAL_LITERAL: + LA53_37 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == DECIMAL_LITERAL: + LA53_38 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == CHARACTER_LITERAL: + LA53_39 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == STRING_LITERAL: + LA53_40 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == FLOATING_POINT_LITERAL: + LA53_41 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 72: + LA53_42 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 73: + LA53_43 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 66 or LA53 == 68 or LA53 == 69 or LA53 == 77 or LA53 == 78 or LA53 == 79: + LA53_44 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + elif LA53 == 74: + LA53_45 = self.input.LA(3) + + if (self.synpred94()) : + alt53 = 1 + + + + + + if alt53 == 1: + # C.g:0:0: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + else: + break #loop53 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 32, direct_abstract_declarator_StartIndex) + + pass + + return + + # $ANTLR end direct_abstract_declarator + + + # $ANTLR start abstract_declarator_suffix + # C.g:354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ); + def abstract_declarator_suffix(self, ): + + abstract_declarator_suffix_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 33): + return + + # C.g:355:2: ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' ) + alt54 = 4 + LA54_0 = self.input.LA(1) + + if (LA54_0 == 64) : + LA54_1 = self.input.LA(2) + + if (LA54_1 == 65) : + alt54 = 1 + elif ((IDENTIFIER <= LA54_1 <= FLOATING_POINT_LITERAL) or LA54_1 == 62 or LA54_1 == 66 or (68 <= LA54_1 <= 69) or (72 <= LA54_1 <= 74) or (77 <= LA54_1 <= 79)) : + alt54 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 1, self.input) + + raise nvae + + elif (LA54_0 == 62) : + LA54_2 = self.input.LA(2) + + if (LA54_2 == 63) : + alt54 = 3 + elif (LA54_2 == IDENTIFIER or (29 <= LA54_2 <= 42) or (45 <= LA54_2 <= 46) or (48 <= LA54_2 <= 61) or LA54_2 == 66) : + alt54 = 4 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 2, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("354:1: abstract_declarator_suffix : ( '[' ']' | '[' constant_expression ']' | '(' ')' | '(' parameter_type_list ')' );", 54, 0, self.input) + + raise nvae + + if alt54 == 1: + # C.g:355:4: '[' ']' + self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1110) + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1112) + if self.failed: + return + + + elif alt54 == 2: + # C.g:356:4: '[' constant_expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_abstract_declarator_suffix1117) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_abstract_declarator_suffix1119) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_abstract_declarator_suffix1121) + if self.failed: + return + + + elif alt54 == 3: + # C.g:357:4: '(' ')' + self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1126) + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1128) + if self.failed: + return + + + elif alt54 == 4: + # C.g:358:4: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_abstract_declarator_suffix1133) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_abstract_declarator_suffix1137) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 33, abstract_declarator_suffix_StartIndex) + + pass + + return + + # $ANTLR end abstract_declarator_suffix + + + # $ANTLR start initializer + # C.g:361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' ); + def initializer(self, ): + + initializer_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 34): + return + + # C.g:363:2: ( assignment_expression | '{' initializer_list ( ',' )? '}' ) + alt56 = 2 + LA56_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA56_0 <= FLOATING_POINT_LITERAL) or LA56_0 == 62 or LA56_0 == 66 or (68 <= LA56_0 <= 69) or (72 <= LA56_0 <= 74) or (77 <= LA56_0 <= 79)) : + alt56 = 1 + elif (LA56_0 == 43) : + alt56 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("361:1: initializer : ( assignment_expression | '{' initializer_list ( ',' )? '}' );", 56, 0, self.input) + + raise nvae + + if alt56 == 1: + # C.g:363:4: assignment_expression + self.following.append(self.FOLLOW_assignment_expression_in_initializer1150) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + elif alt56 == 2: + # C.g:364:4: '{' initializer_list ( ',' )? '}' + self.match(self.input, 43, self.FOLLOW_43_in_initializer1155) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_list_in_initializer1157) + self.initializer_list() + self.following.pop() + if self.failed: + return + # C.g:364:25: ( ',' )? + alt55 = 2 + LA55_0 = self.input.LA(1) + + if (LA55_0 == 27) : + alt55 = 1 + if alt55 == 1: + # C.g:0:0: ',' + self.match(self.input, 27, self.FOLLOW_27_in_initializer1159) + if self.failed: + return + + + + self.match(self.input, 44, self.FOLLOW_44_in_initializer1162) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 34, initializer_StartIndex) + + pass + + return + + # $ANTLR end initializer + + + # $ANTLR start initializer_list + # C.g:367:1: initializer_list : initializer ( ',' initializer )* ; + def initializer_list(self, ): + + initializer_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 35): + return + + # C.g:368:2: ( initializer ( ',' initializer )* ) + # C.g:368:4: initializer ( ',' initializer )* + self.following.append(self.FOLLOW_initializer_in_initializer_list1173) + self.initializer() + self.following.pop() + if self.failed: + return + # C.g:368:16: ( ',' initializer )* + while True: #loop57 + alt57 = 2 + LA57_0 = self.input.LA(1) + + if (LA57_0 == 27) : + LA57_1 = self.input.LA(2) + + if ((IDENTIFIER <= LA57_1 <= FLOATING_POINT_LITERAL) or LA57_1 == 43 or LA57_1 == 62 or LA57_1 == 66 or (68 <= LA57_1 <= 69) or (72 <= LA57_1 <= 74) or (77 <= LA57_1 <= 79)) : + alt57 = 1 + + + + + if alt57 == 1: + # C.g:368:17: ',' initializer + self.match(self.input, 27, self.FOLLOW_27_in_initializer_list1176) + if self.failed: + return + self.following.append(self.FOLLOW_initializer_in_initializer_list1178) + self.initializer() + self.following.pop() + if self.failed: + return + + + else: + break #loop57 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 35, initializer_list_StartIndex) + + pass + + return + + # $ANTLR end initializer_list + + class argument_expression_list_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start argument_expression_list + # C.g:373:1: argument_expression_list : assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ; + def argument_expression_list(self, ): + + retval = self.argument_expression_list_return() + retval.start = self.input.LT(1) + argument_expression_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 36): + return retval + + # C.g:374:2: ( assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* ) + # C.g:374:6: assignment_expression ( 'OPTIONAL' )? ( ',' assignment_expression ( 'OPTIONAL' )? )* + self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1196) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:374:28: ( 'OPTIONAL' )? + alt58 = 2 + LA58_0 = self.input.LA(1) + + if (LA58_0 == 53) : + alt58 = 1 + if alt58 == 1: + # C.g:374:29: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1199) + if self.failed: + return retval + + + + # C.g:374:42: ( ',' assignment_expression ( 'OPTIONAL' )? )* + while True: #loop60 + alt60 = 2 + LA60_0 = self.input.LA(1) + + if (LA60_0 == 27) : + alt60 = 1 + + + if alt60 == 1: + # C.g:374:43: ',' assignment_expression ( 'OPTIONAL' )? + self.match(self.input, 27, self.FOLLOW_27_in_argument_expression_list1204) + if self.failed: + return retval + self.following.append(self.FOLLOW_assignment_expression_in_argument_expression_list1206) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:374:69: ( 'OPTIONAL' )? + alt59 = 2 + LA59_0 = self.input.LA(1) + + if (LA59_0 == 53) : + alt59 = 1 + if alt59 == 1: + # C.g:374:70: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_argument_expression_list1209) + if self.failed: + return retval + + + + + + else: + break #loop60 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 36, argument_expression_list_StartIndex) + + pass + + return retval + + # $ANTLR end argument_expression_list + + + # $ANTLR start additive_expression + # C.g:377:1: additive_expression : ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ; + def additive_expression(self, ): + + additive_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 37): + return + + # C.g:378:2: ( ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* ) + # C.g:378:4: ( multiplicative_expression ) ( '+' multiplicative_expression | '-' multiplicative_expression )* + # C.g:378:4: ( multiplicative_expression ) + # C.g:378:5: multiplicative_expression + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1225) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + + # C.g:378:32: ( '+' multiplicative_expression | '-' multiplicative_expression )* + while True: #loop61 + alt61 = 3 + LA61_0 = self.input.LA(1) + + if (LA61_0 == 68) : + alt61 = 1 + elif (LA61_0 == 69) : + alt61 = 2 + + + if alt61 == 1: + # C.g:378:33: '+' multiplicative_expression + self.match(self.input, 68, self.FOLLOW_68_in_additive_expression1229) + if self.failed: + return + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1231) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + elif alt61 == 2: + # C.g:378:65: '-' multiplicative_expression + self.match(self.input, 69, self.FOLLOW_69_in_additive_expression1235) + if self.failed: + return + self.following.append(self.FOLLOW_multiplicative_expression_in_additive_expression1237) + self.multiplicative_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop61 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 37, additive_expression_StartIndex) + + pass + + return + + # $ANTLR end additive_expression + + + # $ANTLR start multiplicative_expression + # C.g:381:1: multiplicative_expression : ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ; + def multiplicative_expression(self, ): + + multiplicative_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 38): + return + + # C.g:382:2: ( ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* ) + # C.g:382:4: ( cast_expression ) ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* + # C.g:382:4: ( cast_expression ) + # C.g:382:5: cast_expression + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1251) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + + # C.g:382:22: ( '*' cast_expression | '/' cast_expression | '%' cast_expression )* + while True: #loop62 + alt62 = 4 + LA62 = self.input.LA(1) + if LA62 == 66: + alt62 = 1 + elif LA62 == 70: + alt62 = 2 + elif LA62 == 71: + alt62 = 3 + + if alt62 == 1: + # C.g:382:23: '*' cast_expression + self.match(self.input, 66, self.FOLLOW_66_in_multiplicative_expression1255) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1257) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt62 == 2: + # C.g:382:45: '/' cast_expression + self.match(self.input, 70, self.FOLLOW_70_in_multiplicative_expression1261) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1263) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt62 == 3: + # C.g:382:67: '%' cast_expression + self.match(self.input, 71, self.FOLLOW_71_in_multiplicative_expression1267) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_multiplicative_expression1269) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop62 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 38, multiplicative_expression_StartIndex) + + pass + + return + + # $ANTLR end multiplicative_expression + + + # $ANTLR start cast_expression + # C.g:385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression ); + def cast_expression(self, ): + + cast_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 39): + return + + # C.g:386:2: ( '(' type_name ')' cast_expression | unary_expression ) + alt63 = 2 + LA63_0 = self.input.LA(1) + + if (LA63_0 == 62) : + LA63 = self.input.LA(2) + if LA63 == 34 or LA63 == 35 or LA63 == 36 or LA63 == 37 or LA63 == 38 or LA63 == 39 or LA63 == 40 or LA63 == 41 or LA63 == 42 or LA63 == 45 or LA63 == 46 or LA63 == 48 or LA63 == 49 or LA63 == 50 or LA63 == 51 or LA63 == 52 or LA63 == 53 or LA63 == 54 or LA63 == 55 or LA63 == 56 or LA63 == 57 or LA63 == 58 or LA63 == 59 or LA63 == 60 or LA63 == 61: + alt63 = 1 + elif LA63 == IDENTIFIER: + LA63_25 = self.input.LA(3) + + if (self.synpred109()) : + alt63 = 1 + elif (True) : + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 25, self.input) + + raise nvae + + elif LA63 == HEX_LITERAL or LA63 == OCTAL_LITERAL or LA63 == DECIMAL_LITERAL or LA63 == CHARACTER_LITERAL or LA63 == STRING_LITERAL or LA63 == FLOATING_POINT_LITERAL or LA63 == 62 or LA63 == 66 or LA63 == 68 or LA63 == 69 or LA63 == 72 or LA63 == 73 or LA63 == 74 or LA63 == 77 or LA63 == 78 or LA63 == 79: + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 1, self.input) + + raise nvae + + elif ((IDENTIFIER <= LA63_0 <= FLOATING_POINT_LITERAL) or LA63_0 == 66 or (68 <= LA63_0 <= 69) or (72 <= LA63_0 <= 74) or (77 <= LA63_0 <= 79)) : + alt63 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("385:1: cast_expression : ( '(' type_name ')' cast_expression | unary_expression );", 63, 0, self.input) + + raise nvae + + if alt63 == 1: + # C.g:386:4: '(' type_name ')' cast_expression + self.match(self.input, 62, self.FOLLOW_62_in_cast_expression1282) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_cast_expression1284) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_cast_expression1286) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_cast_expression1288) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt63 == 2: + # C.g:387:4: unary_expression + self.following.append(self.FOLLOW_unary_expression_in_cast_expression1293) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 39, cast_expression_StartIndex) + + pass + + return + + # $ANTLR end cast_expression + + + # $ANTLR start unary_expression + # C.g:390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ); + def unary_expression(self, ): + + unary_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 40): + return + + # C.g:391:2: ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' ) + alt64 = 6 + LA64 = self.input.LA(1) + if LA64 == IDENTIFIER or LA64 == HEX_LITERAL or LA64 == OCTAL_LITERAL or LA64 == DECIMAL_LITERAL or LA64 == CHARACTER_LITERAL or LA64 == STRING_LITERAL or LA64 == FLOATING_POINT_LITERAL or LA64 == 62: + alt64 = 1 + elif LA64 == 72: + alt64 = 2 + elif LA64 == 73: + alt64 = 3 + elif LA64 == 66 or LA64 == 68 or LA64 == 69 or LA64 == 77 or LA64 == 78 or LA64 == 79: + alt64 = 4 + elif LA64 == 74: + LA64_12 = self.input.LA(2) + + if (LA64_12 == 62) : + LA64_13 = self.input.LA(3) + + if (self.synpred114()) : + alt64 = 5 + elif (True) : + alt64 = 6 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 13, self.input) + + raise nvae + + elif ((IDENTIFIER <= LA64_12 <= FLOATING_POINT_LITERAL) or LA64_12 == 66 or (68 <= LA64_12 <= 69) or (72 <= LA64_12 <= 74) or (77 <= LA64_12 <= 79)) : + alt64 = 5 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 12, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("390:1: unary_expression : ( postfix_expression | '++' unary_expression | '--' unary_expression | unary_operator cast_expression | 'sizeof' unary_expression | 'sizeof' '(' type_name ')' );", 64, 0, self.input) + + raise nvae + + if alt64 == 1: + # C.g:391:4: postfix_expression + self.following.append(self.FOLLOW_postfix_expression_in_unary_expression1304) + self.postfix_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 2: + # C.g:392:4: '++' unary_expression + self.match(self.input, 72, self.FOLLOW_72_in_unary_expression1309) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1311) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 3: + # C.g:393:4: '--' unary_expression + self.match(self.input, 73, self.FOLLOW_73_in_unary_expression1316) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1318) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 4: + # C.g:394:4: unary_operator cast_expression + self.following.append(self.FOLLOW_unary_operator_in_unary_expression1323) + self.unary_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_unary_expression1325) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 5: + # C.g:395:4: 'sizeof' unary_expression + self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1330) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_unary_expression1332) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + elif alt64 == 6: + # C.g:396:4: 'sizeof' '(' type_name ')' + self.match(self.input, 74, self.FOLLOW_74_in_unary_expression1337) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_unary_expression1339) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_unary_expression1341) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_unary_expression1343) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 40, unary_expression_StartIndex) + + pass + + return + + # $ANTLR end unary_expression + + + # $ANTLR start postfix_expression + # C.g:399:1: postfix_expression : p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ; + def postfix_expression(self, ): + self.postfix_expression_stack.append(postfix_expression_scope()) + postfix_expression_StartIndex = self.input.index() + a = None + b = None + x = None + y = None + z = None + p = None + + c = None + + + + self.postfix_expression_stack[-1].FuncCallText = '' + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 41): + return + + # C.g:406:2: (p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* ) + # C.g:406:6: p= primary_expression ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* + self.following.append(self.FOLLOW_primary_expression_in_postfix_expression1367) + p = self.primary_expression() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += self.input.toString(p.start,p.stop) + + # C.g:407:9: ( '[' expression ']' | '(' a= ')' | '(' c= argument_expression_list b= ')' | '(' macro_parameter_list ')' | '.' x= IDENTIFIER | '*' y= IDENTIFIER | '->' z= IDENTIFIER | '++' | '--' )* + while True: #loop65 + alt65 = 10 + LA65 = self.input.LA(1) + if LA65 == 66: + LA65_1 = self.input.LA(2) + + if (LA65_1 == IDENTIFIER) : + LA65_30 = self.input.LA(3) + + if (self.synpred120()) : + alt65 = 6 + + + + + elif LA65 == 64: + alt65 = 1 + elif LA65 == 62: + LA65 = self.input.LA(2) + if LA65 == 63: + alt65 = 2 + elif LA65 == 29 or LA65 == 30 or LA65 == 31 or LA65 == 32 or LA65 == 33 or LA65 == 34 or LA65 == 35 or LA65 == 36 or LA65 == 37 or LA65 == 38 or LA65 == 39 or LA65 == 40 or LA65 == 41 or LA65 == 42 or LA65 == 45 or LA65 == 46 or LA65 == 48 or LA65 == 49 or LA65 == 50 or LA65 == 51 or LA65 == 52 or LA65 == 53 or LA65 == 54 or LA65 == 55 or LA65 == 56 or LA65 == 57 or LA65 == 58 or LA65 == 59 or LA65 == 60 or LA65 == 61: + alt65 = 4 + elif LA65 == IDENTIFIER: + LA65_55 = self.input.LA(3) + + if (self.synpred117()) : + alt65 = 3 + elif (self.synpred118()) : + alt65 = 4 + + + elif LA65 == 66: + LA65_57 = self.input.LA(3) + + if (self.synpred117()) : + alt65 = 3 + elif (self.synpred118()) : + alt65 = 4 + + + elif LA65 == HEX_LITERAL or LA65 == OCTAL_LITERAL or LA65 == DECIMAL_LITERAL or LA65 == CHARACTER_LITERAL or LA65 == STRING_LITERAL or LA65 == FLOATING_POINT_LITERAL or LA65 == 62 or LA65 == 68 or LA65 == 69 or LA65 == 72 or LA65 == 73 or LA65 == 74 or LA65 == 77 or LA65 == 78 or LA65 == 79: + alt65 = 3 + + elif LA65 == 75: + alt65 = 5 + elif LA65 == 76: + alt65 = 7 + elif LA65 == 72: + alt65 = 8 + elif LA65 == 73: + alt65 = 9 + + if alt65 == 1: + # C.g:407:13: '[' expression ']' + self.match(self.input, 64, self.FOLLOW_64_in_postfix_expression1383) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_postfix_expression1385) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 65, self.FOLLOW_65_in_postfix_expression1387) + if self.failed: + return + + + elif alt65 == 2: + # C.g:408:13: '(' a= ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1401) + if self.failed: + return + a = self.input.LT(1) + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1405) + if self.failed: + return + if self.backtracking == 0: + self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, a.line, a.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, '') + + + + elif alt65 == 3: + # C.g:409:13: '(' c= argument_expression_list b= ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1420) + if self.failed: + return + self.following.append(self.FOLLOW_argument_expression_list_in_postfix_expression1424) + c = self.argument_expression_list() + self.following.pop() + if self.failed: + return + b = self.input.LT(1) + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1428) + if self.failed: + return + if self.backtracking == 0: + self.StoreFunctionCalling(p.start.line, p.start.charPositionInLine, b.line, b.charPositionInLine, self.postfix_expression_stack[-1].FuncCallText, self.input.toString(c.start,c.stop)) + + + + elif alt65 == 4: + # C.g:410:13: '(' macro_parameter_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_postfix_expression1444) + if self.failed: + return + self.following.append(self.FOLLOW_macro_parameter_list_in_postfix_expression1446) + self.macro_parameter_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_postfix_expression1448) + if self.failed: + return + + + elif alt65 == 5: + # C.g:411:13: '.' x= IDENTIFIER + self.match(self.input, 75, self.FOLLOW_75_in_postfix_expression1462) + if self.failed: + return + x = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1466) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += '.' + x.text + + + + elif alt65 == 6: + # C.g:412:13: '*' y= IDENTIFIER + self.match(self.input, 66, self.FOLLOW_66_in_postfix_expression1482) + if self.failed: + return + y = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1486) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText = y.text + + + + elif alt65 == 7: + # C.g:413:13: '->' z= IDENTIFIER + self.match(self.input, 76, self.FOLLOW_76_in_postfix_expression1502) + if self.failed: + return + z = self.input.LT(1) + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_postfix_expression1506) + if self.failed: + return + if self.backtracking == 0: + self.postfix_expression_stack[-1].FuncCallText += '->' + z.text + + + + elif alt65 == 8: + # C.g:414:13: '++' + self.match(self.input, 72, self.FOLLOW_72_in_postfix_expression1522) + if self.failed: + return + + + elif alt65 == 9: + # C.g:415:13: '--' + self.match(self.input, 73, self.FOLLOW_73_in_postfix_expression1536) + if self.failed: + return + + + else: + break #loop65 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 41, postfix_expression_StartIndex) + + self.postfix_expression_stack.pop() + pass + + return + + # $ANTLR end postfix_expression + + + # $ANTLR start macro_parameter_list + # C.g:419:1: macro_parameter_list : parameter_declaration ( ',' parameter_declaration )* ; + def macro_parameter_list(self, ): + + macro_parameter_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 42): + return + + # C.g:420:2: ( parameter_declaration ( ',' parameter_declaration )* ) + # C.g:420:4: parameter_declaration ( ',' parameter_declaration )* + self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1559) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + # C.g:420:26: ( ',' parameter_declaration )* + while True: #loop66 + alt66 = 2 + LA66_0 = self.input.LA(1) + + if (LA66_0 == 27) : + alt66 = 1 + + + if alt66 == 1: + # C.g:420:27: ',' parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_macro_parameter_list1562) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_declaration_in_macro_parameter_list1564) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop66 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 42, macro_parameter_list_StartIndex) + + pass + + return + + # $ANTLR end macro_parameter_list + + + # $ANTLR start unary_operator + # C.g:423:1: unary_operator : ( '&' | '*' | '+' | '-' | '~' | '!' ); + def unary_operator(self, ): + + unary_operator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 43): + return + + # C.g:424:2: ( '&' | '*' | '+' | '-' | '~' | '!' ) + # C.g: + if self.input.LA(1) == 66 or (68 <= self.input.LA(1) <= 69) or (77 <= self.input.LA(1) <= 79): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_unary_operator0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 43, unary_operator_StartIndex) + + pass + + return + + # $ANTLR end unary_operator + + class primary_expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start primary_expression + # C.g:432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' ); + def primary_expression(self, ): + + retval = self.primary_expression_return() + retval.start = self.input.LT(1) + primary_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 44): + return retval + + # C.g:433:2: ( IDENTIFIER | constant | '(' expression ')' ) + alt67 = 3 + LA67 = self.input.LA(1) + if LA67 == IDENTIFIER: + LA67_1 = self.input.LA(2) + + if (LA67_1 == EOF or LA67_1 == 25 or (27 <= LA67_1 <= 28) or LA67_1 == 44 or LA67_1 == 47 or LA67_1 == 53 or (62 <= LA67_1 <= 66) or (68 <= LA67_1 <= 73) or (75 <= LA67_1 <= 77) or (80 <= LA67_1 <= 102)) : + alt67 = 1 + elif (LA67_1 == IDENTIFIER or LA67_1 == STRING_LITERAL) : + alt67 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 1, self.input) + + raise nvae + + elif LA67 == HEX_LITERAL or LA67 == OCTAL_LITERAL or LA67 == DECIMAL_LITERAL or LA67 == CHARACTER_LITERAL or LA67 == STRING_LITERAL or LA67 == FLOATING_POINT_LITERAL: + alt67 = 2 + elif LA67 == 62: + alt67 = 3 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("432:1: primary_expression : ( IDENTIFIER | constant | '(' expression ')' );", 67, 0, self.input) + + raise nvae + + if alt67 == 1: + # C.g:433:4: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_primary_expression1613) + if self.failed: + return retval + + + elif alt67 == 2: + # C.g:434:4: constant + self.following.append(self.FOLLOW_constant_in_primary_expression1618) + self.constant() + self.following.pop() + if self.failed: + return retval + + + elif alt67 == 3: + # C.g:435:4: '(' expression ')' + self.match(self.input, 62, self.FOLLOW_62_in_primary_expression1623) + if self.failed: + return retval + self.following.append(self.FOLLOW_expression_in_primary_expression1625) + self.expression() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 63, self.FOLLOW_63_in_primary_expression1627) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 44, primary_expression_StartIndex) + + pass + + return retval + + # $ANTLR end primary_expression + + + # $ANTLR start constant + # C.g:438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ); + def constant(self, ): + + constant_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 45): + return + + # C.g:439:5: ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL ) + alt72 = 6 + LA72 = self.input.LA(1) + if LA72 == HEX_LITERAL: + alt72 = 1 + elif LA72 == OCTAL_LITERAL: + alt72 = 2 + elif LA72 == DECIMAL_LITERAL: + alt72 = 3 + elif LA72 == CHARACTER_LITERAL: + alt72 = 4 + elif LA72 == IDENTIFIER or LA72 == STRING_LITERAL: + alt72 = 5 + elif LA72 == FLOATING_POINT_LITERAL: + alt72 = 6 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("438:1: constant : ( HEX_LITERAL | OCTAL_LITERAL | DECIMAL_LITERAL | CHARACTER_LITERAL | ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* | FLOATING_POINT_LITERAL );", 72, 0, self.input) + + raise nvae + + if alt72 == 1: + # C.g:439:9: HEX_LITERAL + self.match(self.input, HEX_LITERAL, self.FOLLOW_HEX_LITERAL_in_constant1643) + if self.failed: + return + + + elif alt72 == 2: + # C.g:440:9: OCTAL_LITERAL + self.match(self.input, OCTAL_LITERAL, self.FOLLOW_OCTAL_LITERAL_in_constant1653) + if self.failed: + return + + + elif alt72 == 3: + # C.g:441:9: DECIMAL_LITERAL + self.match(self.input, DECIMAL_LITERAL, self.FOLLOW_DECIMAL_LITERAL_in_constant1663) + if self.failed: + return + + + elif alt72 == 4: + # C.g:442:7: CHARACTER_LITERAL + self.match(self.input, CHARACTER_LITERAL, self.FOLLOW_CHARACTER_LITERAL_in_constant1671) + if self.failed: + return + + + elif alt72 == 5: + # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ ( IDENTIFIER )* + # C.g:443:7: ( ( IDENTIFIER )* ( STRING_LITERAL )+ )+ + cnt70 = 0 + while True: #loop70 + alt70 = 2 + LA70_0 = self.input.LA(1) + + if (LA70_0 == IDENTIFIER) : + LA70_1 = self.input.LA(2) + + if (LA70_1 == STRING_LITERAL) : + alt70 = 1 + elif (LA70_1 == IDENTIFIER) : + LA70_33 = self.input.LA(3) + + if (self.synpred138()) : + alt70 = 1 + + + + + elif (LA70_0 == STRING_LITERAL) : + alt70 = 1 + + + if alt70 == 1: + # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ + # C.g:443:8: ( IDENTIFIER )* + while True: #loop68 + alt68 = 2 + LA68_0 = self.input.LA(1) + + if (LA68_0 == IDENTIFIER) : + alt68 = 1 + + + if alt68 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1680) + if self.failed: + return + + + else: + break #loop68 + + + # C.g:443:20: ( STRING_LITERAL )+ + cnt69 = 0 + while True: #loop69 + alt69 = 2 + LA69_0 = self.input.LA(1) + + if (LA69_0 == STRING_LITERAL) : + LA69_31 = self.input.LA(2) + + if (self.synpred137()) : + alt69 = 1 + + + + + if alt69 == 1: + # C.g:0:0: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_constant1683) + if self.failed: + return + + + else: + if cnt69 >= 1: + break #loop69 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(69, self.input) + raise eee + + cnt69 += 1 + + + + + else: + if cnt70 >= 1: + break #loop70 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(70, self.input) + raise eee + + cnt70 += 1 + + + # C.g:443:38: ( IDENTIFIER )* + while True: #loop71 + alt71 = 2 + LA71_0 = self.input.LA(1) + + if (LA71_0 == IDENTIFIER) : + alt71 = 1 + + + if alt71 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_constant1688) + if self.failed: + return + + + else: + break #loop71 + + + + + elif alt72 == 6: + # C.g:444:9: FLOATING_POINT_LITERAL + self.match(self.input, FLOATING_POINT_LITERAL, self.FOLLOW_FLOATING_POINT_LITERAL_in_constant1699) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 45, constant_StartIndex) + + pass + + return + + # $ANTLR end constant + + class expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start expression + # C.g:449:1: expression : assignment_expression ( ',' assignment_expression )* ; + def expression(self, ): + + retval = self.expression_return() + retval.start = self.input.LT(1) + expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 46): + return retval + + # C.g:450:2: ( assignment_expression ( ',' assignment_expression )* ) + # C.g:450:4: assignment_expression ( ',' assignment_expression )* + self.following.append(self.FOLLOW_assignment_expression_in_expression1715) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + # C.g:450:26: ( ',' assignment_expression )* + while True: #loop73 + alt73 = 2 + LA73_0 = self.input.LA(1) + + if (LA73_0 == 27) : + alt73 = 1 + + + if alt73 == 1: + # C.g:450:27: ',' assignment_expression + self.match(self.input, 27, self.FOLLOW_27_in_expression1718) + if self.failed: + return retval + self.following.append(self.FOLLOW_assignment_expression_in_expression1720) + self.assignment_expression() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop73 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 46, expression_StartIndex) + + pass + + return retval + + # $ANTLR end expression + + + # $ANTLR start constant_expression + # C.g:453:1: constant_expression : conditional_expression ; + def constant_expression(self, ): + + constant_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 47): + return + + # C.g:454:2: ( conditional_expression ) + # C.g:454:4: conditional_expression + self.following.append(self.FOLLOW_conditional_expression_in_constant_expression1733) + self.conditional_expression() + self.following.pop() + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 47, constant_expression_StartIndex) + + pass + + return + + # $ANTLR end constant_expression + + + # $ANTLR start assignment_expression + # C.g:457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression ); + def assignment_expression(self, ): + + assignment_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 48): + return + + # C.g:458:2: ( lvalue assignment_operator assignment_expression | conditional_expression ) + alt74 = 2 + LA74 = self.input.LA(1) + if LA74 == IDENTIFIER: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_13 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 13, self.input) + + raise nvae + + elif LA74 == 62: + LA74_14 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 14, self.input) + + raise nvae + + elif LA74 == 75: + LA74_15 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 15, self.input) + + raise nvae + + elif LA74 == 66: + LA74_16 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 16, self.input) + + raise nvae + + elif LA74 == 76: + LA74_17 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 17, self.input) + + raise nvae + + elif LA74 == 72: + LA74_18 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 18, self.input) + + raise nvae + + elif LA74 == 73: + LA74_19 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 19, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + elif LA74 == STRING_LITERAL: + LA74_21 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 21, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_22 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 22, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 1, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_44 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 44, self.input) + + raise nvae + + elif LA74 == 62: + LA74_45 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 45, self.input) + + raise nvae + + elif LA74 == 75: + LA74_46 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 46, self.input) + + raise nvae + + elif LA74 == 66: + LA74_47 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 47, self.input) + + raise nvae + + elif LA74 == 76: + LA74_48 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 48, self.input) + + raise nvae + + elif LA74 == 72: + LA74_49 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 49, self.input) + + raise nvae + + elif LA74 == 73: + LA74_50 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 50, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 2, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_73 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 73, self.input) + + raise nvae + + elif LA74 == 62: + LA74_74 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 74, self.input) + + raise nvae + + elif LA74 == 75: + LA74_75 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 75, self.input) + + raise nvae + + elif LA74 == 66: + LA74_76 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 76, self.input) + + raise nvae + + elif LA74 == 76: + LA74_77 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 77, self.input) + + raise nvae + + elif LA74 == 72: + LA74_78 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 78, self.input) + + raise nvae + + elif LA74 == 73: + LA74_79 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 79, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 3, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_102 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 102, self.input) + + raise nvae + + elif LA74 == 62: + LA74_103 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 103, self.input) + + raise nvae + + elif LA74 == 75: + LA74_104 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 104, self.input) + + raise nvae + + elif LA74 == 66: + LA74_105 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 105, self.input) + + raise nvae + + elif LA74 == 76: + LA74_106 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 106, self.input) + + raise nvae + + elif LA74 == 72: + LA74_107 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 107, self.input) + + raise nvae + + elif LA74 == 73: + LA74_108 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 108, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 4, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_131 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 131, self.input) + + raise nvae + + elif LA74 == 62: + LA74_132 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 132, self.input) + + raise nvae + + elif LA74 == 75: + LA74_133 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 133, self.input) + + raise nvae + + elif LA74 == 66: + LA74_134 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 134, self.input) + + raise nvae + + elif LA74 == 76: + LA74_135 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 135, self.input) + + raise nvae + + elif LA74 == 72: + LA74_136 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 136, self.input) + + raise nvae + + elif LA74 == 73: + LA74_137 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 137, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 5, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_160 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 160, self.input) + + raise nvae + + elif LA74 == 64: + LA74_161 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 161, self.input) + + raise nvae + + elif LA74 == 62: + LA74_162 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 162, self.input) + + raise nvae + + elif LA74 == 75: + LA74_163 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 163, self.input) + + raise nvae + + elif LA74 == 66: + LA74_164 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 164, self.input) + + raise nvae + + elif LA74 == 76: + LA74_165 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 165, self.input) + + raise nvae + + elif LA74 == 72: + LA74_166 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 166, self.input) + + raise nvae + + elif LA74 == 73: + LA74_167 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 167, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == STRING_LITERAL: + LA74_189 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 189, self.input) + + raise nvae + + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 6, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74 = self.input.LA(2) + if LA74 == 64: + LA74_191 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 191, self.input) + + raise nvae + + elif LA74 == 62: + LA74_192 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 192, self.input) + + raise nvae + + elif LA74 == 75: + LA74_193 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 193, self.input) + + raise nvae + + elif LA74 == 66: + LA74_194 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 194, self.input) + + raise nvae + + elif LA74 == 76: + LA74_195 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 195, self.input) + + raise nvae + + elif LA74 == 72: + LA74_196 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 196, self.input) + + raise nvae + + elif LA74 == 73: + LA74_197 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 197, self.input) + + raise nvae + + elif LA74 == EOF or LA74 == 25 or LA74 == 27 or LA74 == 44 or LA74 == 47 or LA74 == 53 or LA74 == 63 or LA74 == 65 or LA74 == 68 or LA74 == 69 or LA74 == 70 or LA74 == 71 or LA74 == 77 or LA74 == 90 or LA74 == 91 or LA74 == 92 or LA74 == 93 or LA74 == 94 or LA74 == 95 or LA74 == 96 or LA74 == 97 or LA74 == 98 or LA74 == 99 or LA74 == 100 or LA74 == 101 or LA74 == 102: + alt74 = 2 + elif LA74 == 28 or LA74 == 80 or LA74 == 81 or LA74 == 82 or LA74 == 83 or LA74 == 84 or LA74 == 85 or LA74 == 86 or LA74 == 87 or LA74 == 88 or LA74 == 89: + alt74 = 1 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 7, self.input) + + raise nvae + + elif LA74 == 62: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_220 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 220, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_221 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 221, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_222 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 222, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_223 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 223, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_224 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 224, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_225 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 225, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_226 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 226, self.input) + + raise nvae + + elif LA74 == 62: + LA74_227 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 227, self.input) + + raise nvae + + elif LA74 == 72: + LA74_228 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 228, self.input) + + raise nvae + + elif LA74 == 73: + LA74_229 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 229, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_230 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 230, self.input) + + raise nvae + + elif LA74 == 74: + LA74_231 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 231, self.input) + + raise nvae + + elif LA74 == 34 or LA74 == 35 or LA74 == 36 or LA74 == 37 or LA74 == 38 or LA74 == 39 or LA74 == 40 or LA74 == 41 or LA74 == 42 or LA74 == 45 or LA74 == 46 or LA74 == 48 or LA74 == 49 or LA74 == 50 or LA74 == 51 or LA74 == 52 or LA74 == 53 or LA74 == 54 or LA74 == 55 or LA74 == 56 or LA74 == 57 or LA74 == 58 or LA74 == 59 or LA74 == 60 or LA74 == 61: + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 8, self.input) + + raise nvae + + elif LA74 == 72: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_244 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 244, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_245 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 245, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_246 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 246, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_247 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 247, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_248 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 248, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_249 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 249, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_250 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 250, self.input) + + raise nvae + + elif LA74 == 62: + LA74_251 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 251, self.input) + + raise nvae + + elif LA74 == 72: + LA74_252 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 252, self.input) + + raise nvae + + elif LA74 == 73: + LA74_253 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 253, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_254 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 254, self.input) + + raise nvae + + elif LA74 == 74: + LA74_255 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 255, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 9, self.input) + + raise nvae + + elif LA74 == 73: + LA74 = self.input.LA(2) + if LA74 == IDENTIFIER: + LA74_256 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 256, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_257 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 257, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_258 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 258, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_259 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 259, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_260 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 260, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_261 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 261, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_262 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 262, self.input) + + raise nvae + + elif LA74 == 62: + LA74_263 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 263, self.input) + + raise nvae + + elif LA74 == 72: + LA74_264 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 264, self.input) + + raise nvae + + elif LA74 == 73: + LA74_265 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 265, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_266 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 266, self.input) + + raise nvae + + elif LA74 == 74: + LA74_267 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 267, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 10, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74 = self.input.LA(2) + if LA74 == 62: + LA74_268 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 268, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_269 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 269, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_270 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 270, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_271 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 271, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_272 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 272, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_273 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 273, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_274 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 274, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_275 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 275, self.input) + + raise nvae + + elif LA74 == 72: + LA74_276 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 276, self.input) + + raise nvae + + elif LA74 == 73: + LA74_277 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 277, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_278 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 278, self.input) + + raise nvae + + elif LA74 == 74: + LA74_279 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 279, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 11, self.input) + + raise nvae + + elif LA74 == 74: + LA74 = self.input.LA(2) + if LA74 == 62: + LA74_280 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 280, self.input) + + raise nvae + + elif LA74 == IDENTIFIER: + LA74_281 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 281, self.input) + + raise nvae + + elif LA74 == HEX_LITERAL: + LA74_282 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 282, self.input) + + raise nvae + + elif LA74 == OCTAL_LITERAL: + LA74_283 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 283, self.input) + + raise nvae + + elif LA74 == DECIMAL_LITERAL: + LA74_284 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 284, self.input) + + raise nvae + + elif LA74 == CHARACTER_LITERAL: + LA74_285 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 285, self.input) + + raise nvae + + elif LA74 == STRING_LITERAL: + LA74_286 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 286, self.input) + + raise nvae + + elif LA74 == FLOATING_POINT_LITERAL: + LA74_287 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 287, self.input) + + raise nvae + + elif LA74 == 72: + LA74_288 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 288, self.input) + + raise nvae + + elif LA74 == 73: + LA74_289 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 289, self.input) + + raise nvae + + elif LA74 == 66 or LA74 == 68 or LA74 == 69 or LA74 == 77 or LA74 == 78 or LA74 == 79: + LA74_290 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 290, self.input) + + raise nvae + + elif LA74 == 74: + LA74_291 = self.input.LA(3) + + if (self.synpred142()) : + alt74 = 1 + elif (True) : + alt74 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 291, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 12, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("457:1: assignment_expression : ( lvalue assignment_operator assignment_expression | conditional_expression );", 74, 0, self.input) + + raise nvae + + if alt74 == 1: + # C.g:458:4: lvalue assignment_operator assignment_expression + self.following.append(self.FOLLOW_lvalue_in_assignment_expression1744) + self.lvalue() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_operator_in_assignment_expression1746) + self.assignment_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_expression_in_assignment_expression1748) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + elif alt74 == 2: + # C.g:459:4: conditional_expression + self.following.append(self.FOLLOW_conditional_expression_in_assignment_expression1753) + self.conditional_expression() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 48, assignment_expression_StartIndex) + + pass + + return + + # $ANTLR end assignment_expression + + + # $ANTLR start lvalue + # C.g:462:1: lvalue : unary_expression ; + def lvalue(self, ): + + lvalue_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 49): + return + + # C.g:463:2: ( unary_expression ) + # C.g:463:4: unary_expression + self.following.append(self.FOLLOW_unary_expression_in_lvalue1765) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 49, lvalue_StartIndex) + + pass + + return + + # $ANTLR end lvalue + + + # $ANTLR start assignment_operator + # C.g:466:1: assignment_operator : ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ); + def assignment_operator(self, ): + + assignment_operator_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 50): + return + + # C.g:467:2: ( '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ) + # C.g: + if self.input.LA(1) == 28 or (80 <= self.input.LA(1) <= 89): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_assignment_operator0 + ) + raise mse + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 50, assignment_operator_StartIndex) + + pass + + return + + # $ANTLR end assignment_operator + + + # $ANTLR start conditional_expression + # C.g:480:1: conditional_expression : e= logical_or_expression ( '?' expression ':' conditional_expression )? ; + def conditional_expression(self, ): + + conditional_expression_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 51): + return + + # C.g:481:2: (e= logical_or_expression ( '?' expression ':' conditional_expression )? ) + # C.g:481:4: e= logical_or_expression ( '?' expression ':' conditional_expression )? + self.following.append(self.FOLLOW_logical_or_expression_in_conditional_expression1839) + e = self.logical_or_expression() + self.following.pop() + if self.failed: + return + # C.g:481:28: ( '?' expression ':' conditional_expression )? + alt75 = 2 + LA75_0 = self.input.LA(1) + + if (LA75_0 == 90) : + alt75 = 1 + if alt75 == 1: + # C.g:481:29: '?' expression ':' conditional_expression + self.match(self.input, 90, self.FOLLOW_90_in_conditional_expression1842) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_conditional_expression1844) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_conditional_expression1846) + if self.failed: + return + self.following.append(self.FOLLOW_conditional_expression_in_conditional_expression1848) + self.conditional_expression() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 51, conditional_expression_StartIndex) + + pass + + return + + # $ANTLR end conditional_expression + + class logical_or_expression_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start logical_or_expression + # C.g:484:1: logical_or_expression : logical_and_expression ( '||' logical_and_expression )* ; + def logical_or_expression(self, ): + + retval = self.logical_or_expression_return() + retval.start = self.input.LT(1) + logical_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 52): + return retval + + # C.g:485:2: ( logical_and_expression ( '||' logical_and_expression )* ) + # C.g:485:4: logical_and_expression ( '||' logical_and_expression )* + self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1863) + self.logical_and_expression() + self.following.pop() + if self.failed: + return retval + # C.g:485:27: ( '||' logical_and_expression )* + while True: #loop76 + alt76 = 2 + LA76_0 = self.input.LA(1) + + if (LA76_0 == 91) : + alt76 = 1 + + + if alt76 == 1: + # C.g:485:28: '||' logical_and_expression + self.match(self.input, 91, self.FOLLOW_91_in_logical_or_expression1866) + if self.failed: + return retval + self.following.append(self.FOLLOW_logical_and_expression_in_logical_or_expression1868) + self.logical_and_expression() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop76 + + + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 52, logical_or_expression_StartIndex) + + pass + + return retval + + # $ANTLR end logical_or_expression + + + # $ANTLR start logical_and_expression + # C.g:488:1: logical_and_expression : inclusive_or_expression ( '&&' inclusive_or_expression )* ; + def logical_and_expression(self, ): + + logical_and_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 53): + return + + # C.g:489:2: ( inclusive_or_expression ( '&&' inclusive_or_expression )* ) + # C.g:489:4: inclusive_or_expression ( '&&' inclusive_or_expression )* + self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1881) + self.inclusive_or_expression() + self.following.pop() + if self.failed: + return + # C.g:489:28: ( '&&' inclusive_or_expression )* + while True: #loop77 + alt77 = 2 + LA77_0 = self.input.LA(1) + + if (LA77_0 == 92) : + alt77 = 1 + + + if alt77 == 1: + # C.g:489:29: '&&' inclusive_or_expression + self.match(self.input, 92, self.FOLLOW_92_in_logical_and_expression1884) + if self.failed: + return + self.following.append(self.FOLLOW_inclusive_or_expression_in_logical_and_expression1886) + self.inclusive_or_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop77 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 53, logical_and_expression_StartIndex) + + pass + + return + + # $ANTLR end logical_and_expression + + + # $ANTLR start inclusive_or_expression + # C.g:492:1: inclusive_or_expression : exclusive_or_expression ( '|' exclusive_or_expression )* ; + def inclusive_or_expression(self, ): + + inclusive_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 54): + return + + # C.g:493:2: ( exclusive_or_expression ( '|' exclusive_or_expression )* ) + # C.g:493:4: exclusive_or_expression ( '|' exclusive_or_expression )* + self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899) + self.exclusive_or_expression() + self.following.pop() + if self.failed: + return + # C.g:493:28: ( '|' exclusive_or_expression )* + while True: #loop78 + alt78 = 2 + LA78_0 = self.input.LA(1) + + if (LA78_0 == 93) : + alt78 = 1 + + + if alt78 == 1: + # C.g:493:29: '|' exclusive_or_expression + self.match(self.input, 93, self.FOLLOW_93_in_inclusive_or_expression1902) + if self.failed: + return + self.following.append(self.FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904) + self.exclusive_or_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop78 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 54, inclusive_or_expression_StartIndex) + + pass + + return + + # $ANTLR end inclusive_or_expression + + + # $ANTLR start exclusive_or_expression + # C.g:496:1: exclusive_or_expression : and_expression ( '^' and_expression )* ; + def exclusive_or_expression(self, ): + + exclusive_or_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 55): + return + + # C.g:497:2: ( and_expression ( '^' and_expression )* ) + # C.g:497:4: and_expression ( '^' and_expression )* + self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1917) + self.and_expression() + self.following.pop() + if self.failed: + return + # C.g:497:19: ( '^' and_expression )* + while True: #loop79 + alt79 = 2 + LA79_0 = self.input.LA(1) + + if (LA79_0 == 94) : + alt79 = 1 + + + if alt79 == 1: + # C.g:497:20: '^' and_expression + self.match(self.input, 94, self.FOLLOW_94_in_exclusive_or_expression1920) + if self.failed: + return + self.following.append(self.FOLLOW_and_expression_in_exclusive_or_expression1922) + self.and_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop79 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 55, exclusive_or_expression_StartIndex) + + pass + + return + + # $ANTLR end exclusive_or_expression + + + # $ANTLR start and_expression + # C.g:500:1: and_expression : equality_expression ( '&' equality_expression )* ; + def and_expression(self, ): + + and_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 56): + return + + # C.g:501:2: ( equality_expression ( '&' equality_expression )* ) + # C.g:501:4: equality_expression ( '&' equality_expression )* + self.following.append(self.FOLLOW_equality_expression_in_and_expression1935) + self.equality_expression() + self.following.pop() + if self.failed: + return + # C.g:501:24: ( '&' equality_expression )* + while True: #loop80 + alt80 = 2 + LA80_0 = self.input.LA(1) + + if (LA80_0 == 77) : + alt80 = 1 + + + if alt80 == 1: + # C.g:501:25: '&' equality_expression + self.match(self.input, 77, self.FOLLOW_77_in_and_expression1938) + if self.failed: + return + self.following.append(self.FOLLOW_equality_expression_in_and_expression1940) + self.equality_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop80 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 56, and_expression_StartIndex) + + pass + + return + + # $ANTLR end and_expression + + + # $ANTLR start equality_expression + # C.g:503:1: equality_expression : relational_expression ( ( '==' | '!=' ) relational_expression )* ; + def equality_expression(self, ): + + equality_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 57): + return + + # C.g:504:2: ( relational_expression ( ( '==' | '!=' ) relational_expression )* ) + # C.g:504:4: relational_expression ( ( '==' | '!=' ) relational_expression )* + self.following.append(self.FOLLOW_relational_expression_in_equality_expression1952) + self.relational_expression() + self.following.pop() + if self.failed: + return + # C.g:504:26: ( ( '==' | '!=' ) relational_expression )* + while True: #loop81 + alt81 = 2 + LA81_0 = self.input.LA(1) + + if ((95 <= LA81_0 <= 96)) : + alt81 = 1 + + + if alt81 == 1: + # C.g:504:27: ( '==' | '!=' ) relational_expression + if (95 <= self.input.LA(1) <= 96): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_equality_expression1955 + ) + raise mse + + + self.following.append(self.FOLLOW_relational_expression_in_equality_expression1961) + self.relational_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop81 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 57, equality_expression_StartIndex) + + pass + + return + + # $ANTLR end equality_expression + + + # $ANTLR start relational_expression + # C.g:507:1: relational_expression : shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ; + def relational_expression(self, ): + + relational_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 58): + return + + # C.g:508:2: ( shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* ) + # C.g:508:4: shift_expression ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* + self.following.append(self.FOLLOW_shift_expression_in_relational_expression1975) + self.shift_expression() + self.following.pop() + if self.failed: + return + # C.g:508:21: ( ( '<' | '>' | '<=' | '>=' ) shift_expression )* + while True: #loop82 + alt82 = 2 + LA82_0 = self.input.LA(1) + + if ((97 <= LA82_0 <= 100)) : + alt82 = 1 + + + if alt82 == 1: + # C.g:508:22: ( '<' | '>' | '<=' | '>=' ) shift_expression + if (97 <= self.input.LA(1) <= 100): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_relational_expression1978 + ) + raise mse + + + self.following.append(self.FOLLOW_shift_expression_in_relational_expression1988) + self.shift_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop82 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 58, relational_expression_StartIndex) + + pass + + return + + # $ANTLR end relational_expression + + + # $ANTLR start shift_expression + # C.g:511:1: shift_expression : additive_expression ( ( '<<' | '>>' ) additive_expression )* ; + def shift_expression(self, ): + + shift_expression_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 59): + return + + # C.g:512:2: ( additive_expression ( ( '<<' | '>>' ) additive_expression )* ) + # C.g:512:4: additive_expression ( ( '<<' | '>>' ) additive_expression )* + self.following.append(self.FOLLOW_additive_expression_in_shift_expression2001) + self.additive_expression() + self.following.pop() + if self.failed: + return + # C.g:512:24: ( ( '<<' | '>>' ) additive_expression )* + while True: #loop83 + alt83 = 2 + LA83_0 = self.input.LA(1) + + if ((101 <= LA83_0 <= 102)) : + alt83 = 1 + + + if alt83 == 1: + # C.g:512:25: ( '<<' | '>>' ) additive_expression + if (101 <= self.input.LA(1) <= 102): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_shift_expression2004 + ) + raise mse + + + self.following.append(self.FOLLOW_additive_expression_in_shift_expression2010) + self.additive_expression() + self.following.pop() + if self.failed: + return + + + else: + break #loop83 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 59, shift_expression_StartIndex) + + pass + + return + + # $ANTLR end shift_expression + + + # $ANTLR start statement + # C.g:517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ); + def statement(self, ): + + statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 60): + return + + # C.g:518:2: ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration ) + alt84 = 11 + LA84 = self.input.LA(1) + if LA84 == IDENTIFIER: + LA84 = self.input.LA(2) + if LA84 == 62: + LA84_43 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (self.synpred173()) : + alt84 = 7 + elif (self.synpred174()) : + alt84 = 8 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 43, self.input) + + raise nvae + + elif LA84 == 47: + alt84 = 1 + elif LA84 == STRING_LITERAL or LA84 == 27 or LA84 == 28 or LA84 == 64 or LA84 == 68 or LA84 == 69 or LA84 == 70 or LA84 == 71 or LA84 == 72 or LA84 == 73 or LA84 == 75 or LA84 == 76 or LA84 == 77 or LA84 == 80 or LA84 == 81 or LA84 == 82 or LA84 == 83 or LA84 == 84 or LA84 == 85 or LA84 == 86 or LA84 == 87 or LA84 == 88 or LA84 == 89 or LA84 == 90 or LA84 == 91 or LA84 == 92 or LA84 == 93 or LA84 == 94 or LA84 == 95 or LA84 == 96 or LA84 == 97 or LA84 == 98 or LA84 == 99 or LA84 == 100 or LA84 == 101 or LA84 == 102: + alt84 = 3 + elif LA84 == 66: + LA84_47 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 47, self.input) + + raise nvae + + elif LA84 == IDENTIFIER: + LA84_53 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 53, self.input) + + raise nvae + + elif LA84 == 25: + LA84_68 = self.input.LA(3) + + if (self.synpred169()) : + alt84 = 3 + elif (True) : + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 68, self.input) + + raise nvae + + elif LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 1, self.input) + + raise nvae + + elif LA84 == 106 or LA84 == 107: + alt84 = 1 + elif LA84 == 43: + alt84 = 2 + elif LA84 == HEX_LITERAL or LA84 == OCTAL_LITERAL or LA84 == DECIMAL_LITERAL or LA84 == CHARACTER_LITERAL or LA84 == STRING_LITERAL or LA84 == FLOATING_POINT_LITERAL or LA84 == 25 or LA84 == 62 or LA84 == 66 or LA84 == 68 or LA84 == 69 or LA84 == 72 or LA84 == 73 or LA84 == 74 or LA84 == 77 or LA84 == 78 or LA84 == 79: + alt84 = 3 + elif LA84 == 108 or LA84 == 110: + alt84 = 4 + elif LA84 == 111 or LA84 == 112 or LA84 == 113: + alt84 = 5 + elif LA84 == 114 or LA84 == 115 or LA84 == 116 or LA84 == 117: + alt84 = 6 + elif LA84 == 103: + alt84 = 8 + elif LA84 == 104: + alt84 = 9 + elif LA84 == 105: + alt84 = 10 + elif LA84 == 26 or LA84 == 29 or LA84 == 30 or LA84 == 31 or LA84 == 32 or LA84 == 33 or LA84 == 34 or LA84 == 35 or LA84 == 36 or LA84 == 37 or LA84 == 38 or LA84 == 39 or LA84 == 40 or LA84 == 41 or LA84 == 42 or LA84 == 45 or LA84 == 46 or LA84 == 48 or LA84 == 49 or LA84 == 50 or LA84 == 51 or LA84 == 52 or LA84 == 53 or LA84 == 54 or LA84 == 55 or LA84 == 56 or LA84 == 57 or LA84 == 58 or LA84 == 59 or LA84 == 60 or LA84 == 61: + alt84 = 11 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("517:1: statement : ( labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement | macro_statement | asm2_statement | asm1_statement | asm_statement | declaration );", 84, 0, self.input) + + raise nvae + + if alt84 == 1: + # C.g:518:4: labeled_statement + self.following.append(self.FOLLOW_labeled_statement_in_statement2025) + self.labeled_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 2: + # C.g:519:4: compound_statement + self.following.append(self.FOLLOW_compound_statement_in_statement2030) + self.compound_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 3: + # C.g:520:4: expression_statement + self.following.append(self.FOLLOW_expression_statement_in_statement2035) + self.expression_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 4: + # C.g:521:4: selection_statement + self.following.append(self.FOLLOW_selection_statement_in_statement2040) + self.selection_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 5: + # C.g:522:4: iteration_statement + self.following.append(self.FOLLOW_iteration_statement_in_statement2045) + self.iteration_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 6: + # C.g:523:4: jump_statement + self.following.append(self.FOLLOW_jump_statement_in_statement2050) + self.jump_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 7: + # C.g:524:4: macro_statement + self.following.append(self.FOLLOW_macro_statement_in_statement2055) + self.macro_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 8: + # C.g:525:4: asm2_statement + self.following.append(self.FOLLOW_asm2_statement_in_statement2060) + self.asm2_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 9: + # C.g:526:4: asm1_statement + self.following.append(self.FOLLOW_asm1_statement_in_statement2065) + self.asm1_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 10: + # C.g:527:4: asm_statement + self.following.append(self.FOLLOW_asm_statement_in_statement2070) + self.asm_statement() + self.following.pop() + if self.failed: + return + + + elif alt84 == 11: + # C.g:528:4: declaration + self.following.append(self.FOLLOW_declaration_in_statement2075) + self.declaration() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 60, statement_StartIndex) + + pass + + return + + # $ANTLR end statement + + + # $ANTLR start asm2_statement + # C.g:531:1: asm2_statement : ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ; + def asm2_statement(self, ): + + asm2_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 61): + return + + # C.g:532:2: ( ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' ) + # C.g:532:4: ( '__asm__' )? IDENTIFIER '(' (~ ( ';' ) )* ')' ';' + # C.g:532:4: ( '__asm__' )? + alt85 = 2 + LA85_0 = self.input.LA(1) + + if (LA85_0 == 103) : + alt85 = 1 + if alt85 == 1: + # C.g:0:0: '__asm__' + self.match(self.input, 103, self.FOLLOW_103_in_asm2_statement2086) + if self.failed: + return + + + + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_asm2_statement2089) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_asm2_statement2091) + if self.failed: + return + # C.g:532:30: (~ ( ';' ) )* + while True: #loop86 + alt86 = 2 + LA86_0 = self.input.LA(1) + + if (LA86_0 == 63) : + LA86_1 = self.input.LA(2) + + if ((IDENTIFIER <= LA86_1 <= LINE_COMMAND) or (26 <= LA86_1 <= 117)) : + alt86 = 1 + + + elif ((IDENTIFIER <= LA86_0 <= LINE_COMMAND) or (26 <= LA86_0 <= 62) or (64 <= LA86_0 <= 117)) : + alt86 = 1 + + + if alt86 == 1: + # C.g:532:31: ~ ( ';' ) + if (IDENTIFIER <= self.input.LA(1) <= LINE_COMMAND) or (26 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm2_statement2094 + ) + raise mse + + + + + else: + break #loop86 + + + self.match(self.input, 63, self.FOLLOW_63_in_asm2_statement2101) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_asm2_statement2103) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 61, asm2_statement_StartIndex) + + pass + + return + + # $ANTLR end asm2_statement + + + # $ANTLR start asm1_statement + # C.g:535:1: asm1_statement : '_asm' '{' (~ ( '}' ) )* '}' ; + def asm1_statement(self, ): + + asm1_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 62): + return + + # C.g:536:2: ( '_asm' '{' (~ ( '}' ) )* '}' ) + # C.g:536:4: '_asm' '{' (~ ( '}' ) )* '}' + self.match(self.input, 104, self.FOLLOW_104_in_asm1_statement2115) + if self.failed: + return + self.match(self.input, 43, self.FOLLOW_43_in_asm1_statement2117) + if self.failed: + return + # C.g:536:15: (~ ( '}' ) )* + while True: #loop87 + alt87 = 2 + LA87_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA87_0 <= 43) or (45 <= LA87_0 <= 117)) : + alt87 = 1 + + + if alt87 == 1: + # C.g:536:16: ~ ( '}' ) + if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm1_statement2120 + ) + raise mse + + + + + else: + break #loop87 + + + self.match(self.input, 44, self.FOLLOW_44_in_asm1_statement2127) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 62, asm1_statement_StartIndex) + + pass + + return + + # $ANTLR end asm1_statement + + + # $ANTLR start asm_statement + # C.g:539:1: asm_statement : '__asm' '{' (~ ( '}' ) )* '}' ; + def asm_statement(self, ): + + asm_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 63): + return + + # C.g:540:2: ( '__asm' '{' (~ ( '}' ) )* '}' ) + # C.g:540:4: '__asm' '{' (~ ( '}' ) )* '}' + self.match(self.input, 105, self.FOLLOW_105_in_asm_statement2138) + if self.failed: + return + self.match(self.input, 43, self.FOLLOW_43_in_asm_statement2140) + if self.failed: + return + # C.g:540:16: (~ ( '}' ) )* + while True: #loop88 + alt88 = 2 + LA88_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA88_0 <= 43) or (45 <= LA88_0 <= 117)) : + alt88 = 1 + + + if alt88 == 1: + # C.g:540:17: ~ ( '}' ) + if (IDENTIFIER <= self.input.LA(1) <= 43) or (45 <= self.input.LA(1) <= 117): + self.input.consume(); + self.errorRecovery = False + self.failed = False + + else: + if self.backtracking > 0: + self.failed = True + return + + mse = MismatchedSetException(None, self.input) + self.recoverFromMismatchedSet( + self.input, mse, self.FOLLOW_set_in_asm_statement2143 + ) + raise mse + + + + + else: + break #loop88 + + + self.match(self.input, 44, self.FOLLOW_44_in_asm_statement2150) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 63, asm_statement_StartIndex) + + pass + + return + + # $ANTLR end asm_statement + + + # $ANTLR start macro_statement + # C.g:543:1: macro_statement : IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ; + def macro_statement(self, ): + + macro_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 64): + return + + # C.g:544:2: ( IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' ) + # C.g:544:4: IDENTIFIER '(' ( declaration )* ( statement_list )? ( expression )? ')' + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_macro_statement2162) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_macro_statement2164) + if self.failed: + return + # C.g:544:19: ( declaration )* + while True: #loop89 + alt89 = 2 + LA89 = self.input.LA(1) + if LA89 == IDENTIFIER: + LA89 = self.input.LA(2) + if LA89 == 62: + LA89_45 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_47 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 66: + LA89_50 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_68 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_71 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_72 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_73 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_74 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_75 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_76 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_77 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_78 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_79 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_80 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_81 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_82 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_83 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_84 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_85 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_86 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 26: + LA89 = self.input.LA(2) + if LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_87 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_88 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_89 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_90 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_91 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_92 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_93 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_94 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_95 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_96 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_97 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_98 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_99 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_100 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 66: + LA89_101 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_102 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_103 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_104 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_105 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_106 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_107 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_108 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_109 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_110 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_111 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_112 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_113 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_114 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_115 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_116 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_117 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_118 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_119 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_120 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_121 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_122 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_123 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_124 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_125 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 34: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_126 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_127 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_128 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_129 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_130 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_131 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_132 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_133 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_134 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_135 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_136 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_137 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_138 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_139 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_140 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_141 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_142 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_143 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_144 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_145 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 35: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_146 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_147 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_148 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_149 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_150 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_151 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_152 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_153 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_154 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_155 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_156 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_157 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_158 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_159 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_160 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_161 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_162 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_163 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_164 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_165 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 36: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_166 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_167 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_168 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_169 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_170 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_171 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_172 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_173 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_174 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_175 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_176 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_177 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_178 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_179 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_180 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_181 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_182 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_183 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_184 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_185 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 37: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_186 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_187 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_188 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_189 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_190 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_191 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_192 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_193 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_194 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_195 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_196 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_197 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_198 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_199 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_200 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_201 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_202 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_203 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_204 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_205 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 38: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_206 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_207 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_208 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_209 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_210 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_211 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_212 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_213 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_214 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_215 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_216 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_217 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_218 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_219 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_220 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_221 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_222 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_223 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_224 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_225 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 39: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_226 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_227 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_228 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_229 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_230 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_231 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_232 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_233 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_234 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_235 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_236 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_237 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_238 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_239 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_240 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_241 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_242 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_243 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_244 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_245 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 40: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_246 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_247 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_248 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_249 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_250 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_251 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_252 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_253 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_254 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_255 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_256 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_257 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_258 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_259 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_260 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_261 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_262 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_263 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_264 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_265 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 41: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_266 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_267 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_268 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_269 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_270 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_271 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_272 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_273 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_274 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_275 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_276 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_277 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_278 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_279 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_280 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_281 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_282 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_283 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_284 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_285 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 42: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_286 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_287 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_288 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_289 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_290 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_291 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_292 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_293 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_294 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_295 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_296 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_297 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_298 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_299 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_300 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_301 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_302 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_303 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_304 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_305 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + elif LA89 == 45 or LA89 == 46: + LA89_40 = self.input.LA(2) + + if (LA89_40 == IDENTIFIER) : + LA89_306 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif (LA89_40 == 43) : + LA89_307 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + elif LA89 == 48: + LA89_41 = self.input.LA(2) + + if (LA89_41 == 43) : + LA89_308 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif (LA89_41 == IDENTIFIER) : + LA89_309 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 58 or LA89 == 59 or LA89 == 60 or LA89 == 61: + LA89 = self.input.LA(2) + if LA89 == 66: + LA89_310 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 58: + LA89_311 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 59: + LA89_312 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 60: + LA89_313 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == IDENTIFIER: + LA89_314 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 62: + LA89_315 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 25: + LA89_316 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 29 or LA89 == 30 or LA89 == 31 or LA89 == 32 or LA89 == 33: + LA89_317 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 34: + LA89_318 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 35: + LA89_319 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 36: + LA89_320 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 37: + LA89_321 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 38: + LA89_322 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 39: + LA89_323 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 40: + LA89_324 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 41: + LA89_325 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 42: + LA89_326 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 45 or LA89 == 46: + LA89_327 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 48: + LA89_328 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + elif LA89 == 49 or LA89 == 50 or LA89 == 51 or LA89 == 52 or LA89 == 53 or LA89 == 54 or LA89 == 55 or LA89 == 56 or LA89 == 57 or LA89 == 61: + LA89_329 = self.input.LA(3) + + if (self.synpred181()) : + alt89 = 1 + + + + + if alt89 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_macro_statement2166) + self.declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop89 + + + # C.g:544:33: ( statement_list )? + alt90 = 2 + LA90 = self.input.LA(1) + if LA90 == IDENTIFIER: + LA90 = self.input.LA(2) + if LA90 == 25 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 45 or LA90 == 46 or LA90 == 47 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: + alt90 = 1 + elif LA90 == 62: + LA90_45 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_46 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_47 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 64: + LA90_48 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_49 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_50 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_51 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_52 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_53 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_54 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_55 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_56 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_57 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_58 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_59 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_60 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_61 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_62 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_63 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_64 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_65 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_66 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_67 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_70 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25 or LA90 == 26 or LA90 == 29 or LA90 == 30 or LA90 == 31 or LA90 == 32 or LA90 == 33 or LA90 == 34 or LA90 == 35 or LA90 == 36 or LA90 == 37 or LA90 == 38 or LA90 == 39 or LA90 == 40 or LA90 == 41 or LA90 == 42 or LA90 == 43 or LA90 == 45 or LA90 == 46 or LA90 == 48 or LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61 or LA90 == 103 or LA90 == 104 or LA90 == 105 or LA90 == 106 or LA90 == 107 or LA90 == 108 or LA90 == 110 or LA90 == 111 or LA90 == 112 or LA90 == 113 or LA90 == 114 or LA90 == 115 or LA90 == 116 or LA90 == 117: + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_87 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_88 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_89 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_90 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_91 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_92 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_93 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_94 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_95 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_96 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_97 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_98 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_99 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_100 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_101 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_102 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_103 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_104 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_105 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_106 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_107 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_108 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_111 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_112 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_113 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_114 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_115 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_116 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_117 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_118 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_119 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_120 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_121 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_122 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_123 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_124 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_125 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_126 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_127 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_128 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_129 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_130 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_131 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_134 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_135 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_136 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_137 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_138 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_139 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_140 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_141 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_142 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_143 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_144 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_145 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_146 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_147 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_148 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_149 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_150 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_151 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_152 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_153 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_154 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_155 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_156 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_159 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_160 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_161 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_162 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_163 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_164 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_165 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_166 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_167 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_168 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_169 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_170 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_171 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_172 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_173 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_174 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_175 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_176 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_177 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_178 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_179 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_181 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_183 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 64: + LA90_184 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_185 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_186 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_187 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_188 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_189 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_190 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_191 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_192 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_193 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_194 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_195 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_196 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_197 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_198 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_199 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_200 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_201 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_202 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_203 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_204 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_205 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_206 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90 = self.input.LA(2) + if LA90 == 64: + LA90_209 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_210 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 75: + LA90_211 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66: + LA90_212 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 76: + LA90_213 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_214 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_215 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 28 or LA90 == 80 or LA90 == 81 or LA90 == 82 or LA90 == 83 or LA90 == 84 or LA90 == 85 or LA90 == 86 or LA90 == 87 or LA90 == 88 or LA90 == 89: + LA90_216 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 70: + LA90_217 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 71: + LA90_218 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 68: + LA90_219 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 69: + LA90_220 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 101 or LA90 == 102: + LA90_221 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 97 or LA90 == 98 or LA90 == 99 or LA90 == 100: + LA90_222 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 95 or LA90 == 96: + LA90_223 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 77: + LA90_224 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 94: + LA90_225 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 93: + LA90_226 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 92: + LA90_227 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 91: + LA90_228 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 90: + LA90_229 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 27: + LA90_230 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 25: + alt90 = 1 + elif LA90 == 62: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_233 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_234 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_235 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_236 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_237 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_238 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_239 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_240 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_241 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_242 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_243 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_244 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 49 or LA90 == 50 or LA90 == 51 or LA90 == 52 or LA90 == 53 or LA90 == 54 or LA90 == 55 or LA90 == 56 or LA90 == 57 or LA90 == 58 or LA90 == 59 or LA90 == 60 or LA90 == 61: + LA90_245 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 34: + LA90_246 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 35: + LA90_247 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 36: + LA90_248 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 37: + LA90_249 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 38: + LA90_250 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 39: + LA90_251 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 40: + LA90_252 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 41: + LA90_253 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 42: + LA90_254 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 45 or LA90 == 46: + LA90_255 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 48: + LA90_256 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_257 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_258 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_259 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_260 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_261 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_262 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_263 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_264 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_265 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_266 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_267 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_268 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90 = self.input.LA(2) + if LA90 == IDENTIFIER: + LA90_269 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_270 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_271 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_272 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_273 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_274 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_275 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 62: + LA90_276 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_277 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_278 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_279 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_280 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90 = self.input.LA(2) + if LA90 == 62: + LA90_281 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_282 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_283 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_284 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_285 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_286 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_287 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_288 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_289 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_290 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_291 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_292 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90 = self.input.LA(2) + if LA90 == 62: + LA90_293 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == IDENTIFIER: + LA90_294 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == HEX_LITERAL: + LA90_295 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == OCTAL_LITERAL: + LA90_296 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == DECIMAL_LITERAL: + LA90_297 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == CHARACTER_LITERAL: + LA90_298 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == STRING_LITERAL: + LA90_299 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == FLOATING_POINT_LITERAL: + LA90_300 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 72: + LA90_301 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 73: + LA90_302 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 66 or LA90 == 68 or LA90 == 69 or LA90 == 77 or LA90 == 78 or LA90 == 79: + LA90_303 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + elif LA90 == 74: + LA90_304 = self.input.LA(3) + + if (self.synpred182()) : + alt90 = 1 + if alt90 == 1: + # C.g:0:0: statement_list + self.following.append(self.FOLLOW_statement_list_in_macro_statement2170) + self.statement_list() + self.following.pop() + if self.failed: + return + + + + # C.g:544:49: ( expression )? + alt91 = 2 + LA91_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA91_0 <= FLOATING_POINT_LITERAL) or LA91_0 == 62 or LA91_0 == 66 or (68 <= LA91_0 <= 69) or (72 <= LA91_0 <= 74) or (77 <= LA91_0 <= 79)) : + alt91 = 1 + if alt91 == 1: + # C.g:0:0: expression + self.following.append(self.FOLLOW_expression_in_macro_statement2173) + self.expression() + self.following.pop() + if self.failed: + return + + + + self.match(self.input, 63, self.FOLLOW_63_in_macro_statement2176) + if self.failed: + return + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 64, macro_statement_StartIndex) + + pass + + return + + # $ANTLR end macro_statement + + + # $ANTLR start labeled_statement + # C.g:547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ); + def labeled_statement(self, ): + + labeled_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 65): + return + + # C.g:548:2: ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement ) + alt92 = 3 + LA92 = self.input.LA(1) + if LA92 == IDENTIFIER: + alt92 = 1 + elif LA92 == 106: + alt92 = 2 + elif LA92 == 107: + alt92 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("547:1: labeled_statement : ( IDENTIFIER ':' statement | 'case' constant_expression ':' statement | 'default' ':' statement );", 92, 0, self.input) + + raise nvae + + if alt92 == 1: + # C.g:548:4: IDENTIFIER ':' statement + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_labeled_statement2188) + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2190) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2192) + self.statement() + self.following.pop() + if self.failed: + return + + + elif alt92 == 2: + # C.g:549:4: 'case' constant_expression ':' statement + self.match(self.input, 106, self.FOLLOW_106_in_labeled_statement2197) + if self.failed: + return + self.following.append(self.FOLLOW_constant_expression_in_labeled_statement2199) + self.constant_expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2201) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2203) + self.statement() + self.following.pop() + if self.failed: + return + + + elif alt92 == 3: + # C.g:550:4: 'default' ':' statement + self.match(self.input, 107, self.FOLLOW_107_in_labeled_statement2208) + if self.failed: + return + self.match(self.input, 47, self.FOLLOW_47_in_labeled_statement2210) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_labeled_statement2212) + self.statement() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 65, labeled_statement_StartIndex) + + pass + + return + + # $ANTLR end labeled_statement + + class compound_statement_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start compound_statement + # C.g:553:1: compound_statement : '{' ( declaration )* ( statement_list )? '}' ; + def compound_statement(self, ): + + retval = self.compound_statement_return() + retval.start = self.input.LT(1) + compound_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 66): + return retval + + # C.g:554:2: ( '{' ( declaration )* ( statement_list )? '}' ) + # C.g:554:4: '{' ( declaration )* ( statement_list )? '}' + self.match(self.input, 43, self.FOLLOW_43_in_compound_statement2223) + if self.failed: + return retval + # C.g:554:8: ( declaration )* + while True: #loop93 + alt93 = 2 + LA93 = self.input.LA(1) + if LA93 == IDENTIFIER: + LA93 = self.input.LA(2) + if LA93 == 62: + LA93_44 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_47 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 66: + LA93_48 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_49 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_50 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_51 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_52 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_53 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_54 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_55 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_56 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_57 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_58 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_59 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_60 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_61 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_62 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_63 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_64 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_65 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 26: + LA93 = self.input.LA(2) + if LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_86 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_87 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_88 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_89 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_90 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_91 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_92 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_93 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_94 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_95 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_96 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_97 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_98 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_99 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 66: + LA93_100 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_101 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_102 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_103 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_104 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_105 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_106 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_107 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_108 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_109 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_110 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_111 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_112 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_113 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_114 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_115 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_116 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_117 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_118 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_119 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_120 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_121 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_122 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_123 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_124 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 34: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_125 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_126 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_127 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_128 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_129 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_130 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_131 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_132 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_133 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_134 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_135 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_136 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_137 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_138 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_139 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_140 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_141 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_142 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_143 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_144 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 35: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_145 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_146 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_147 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_148 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_149 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_150 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_151 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_152 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_153 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_154 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_155 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_156 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_157 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_158 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_159 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_160 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_161 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_162 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_163 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_164 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 36: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_165 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_166 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_167 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_168 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_169 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_170 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_171 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_172 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_173 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_174 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_175 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_176 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_177 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_178 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_179 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_180 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_181 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_182 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_183 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_184 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 37: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_185 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_186 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_187 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_188 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_189 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_190 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_191 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_192 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_193 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_194 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_195 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_196 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_197 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_198 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_199 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_200 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_201 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_202 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_203 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_204 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 38: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_205 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_206 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_207 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_208 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_209 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_210 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_211 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_212 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_213 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_214 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_215 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_216 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_217 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_218 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_219 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_220 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_221 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_222 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_223 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_224 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 39: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_225 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_226 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_227 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_228 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_229 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_230 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_231 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_232 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_233 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_234 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_235 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_236 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_237 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_238 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_239 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_240 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_241 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_242 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_243 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_244 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 40: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_245 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_246 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_247 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_248 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_249 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_250 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_251 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_252 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_253 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_254 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_255 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_256 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_257 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_258 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_259 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_260 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_261 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_262 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_263 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_264 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 41: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_265 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_266 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_267 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_268 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_269 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_270 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_271 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_272 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_273 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_274 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_275 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_276 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_277 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_278 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_279 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_280 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_281 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_282 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_283 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_284 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 42: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_285 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_286 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_287 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_288 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_289 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_290 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_291 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_292 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_293 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_294 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_295 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_296 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_297 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_298 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_299 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_300 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_301 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_302 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_303 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_304 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + elif LA93 == 45 or LA93 == 46: + LA93_40 = self.input.LA(2) + + if (LA93_40 == IDENTIFIER) : + LA93_305 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif (LA93_40 == 43) : + LA93_306 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + elif LA93 == 48: + LA93_41 = self.input.LA(2) + + if (LA93_41 == 43) : + LA93_307 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif (LA93_41 == IDENTIFIER) : + LA93_308 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 58 or LA93 == 59 or LA93 == 60 or LA93 == 61: + LA93 = self.input.LA(2) + if LA93 == 66: + LA93_309 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 58: + LA93_310 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 59: + LA93_311 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 60: + LA93_312 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == IDENTIFIER: + LA93_313 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 62: + LA93_314 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 25: + LA93_315 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 29 or LA93 == 30 or LA93 == 31 or LA93 == 32 or LA93 == 33: + LA93_316 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 34: + LA93_317 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 35: + LA93_318 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 36: + LA93_319 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 37: + LA93_320 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 38: + LA93_321 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 39: + LA93_322 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 40: + LA93_323 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 41: + LA93_324 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 42: + LA93_325 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 45 or LA93 == 46: + LA93_326 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 48: + LA93_327 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + elif LA93 == 49 or LA93 == 50 or LA93 == 51 or LA93 == 52 or LA93 == 53 or LA93 == 54 or LA93 == 55 or LA93 == 56 or LA93 == 57 or LA93 == 61: + LA93_328 = self.input.LA(3) + + if (self.synpred186()) : + alt93 = 1 + + + + + if alt93 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_compound_statement2225) + self.declaration() + self.following.pop() + if self.failed: + return retval + + + else: + break #loop93 + + + # C.g:554:21: ( statement_list )? + alt94 = 2 + LA94_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA94_0 <= FLOATING_POINT_LITERAL) or (25 <= LA94_0 <= 26) or (29 <= LA94_0 <= 43) or (45 <= LA94_0 <= 46) or (48 <= LA94_0 <= 62) or LA94_0 == 66 or (68 <= LA94_0 <= 69) or (72 <= LA94_0 <= 74) or (77 <= LA94_0 <= 79) or (103 <= LA94_0 <= 108) or (110 <= LA94_0 <= 117)) : + alt94 = 1 + if alt94 == 1: + # C.g:0:0: statement_list + self.following.append(self.FOLLOW_statement_list_in_compound_statement2228) + self.statement_list() + self.following.pop() + if self.failed: + return retval + + + + self.match(self.input, 44, self.FOLLOW_44_in_compound_statement2231) + if self.failed: + return retval + + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 66, compound_statement_StartIndex) + + pass + + return retval + + # $ANTLR end compound_statement + + + # $ANTLR start statement_list + # C.g:557:1: statement_list : ( statement )+ ; + def statement_list(self, ): + + statement_list_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 67): + return + + # C.g:558:2: ( ( statement )+ ) + # C.g:558:4: ( statement )+ + # C.g:558:4: ( statement )+ + cnt95 = 0 + while True: #loop95 + alt95 = 2 + LA95 = self.input.LA(1) + if LA95 == IDENTIFIER: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_46 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 45 or LA95 == 46 or LA95 == 47 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: + alt95 = 1 + elif LA95 == STRING_LITERAL: + LA95_48 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_49 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 64: + LA95_50 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_51 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_52 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_53 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_54 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_55 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_56 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_57 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_58 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_59 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_60 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_61 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_62 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_63 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_64 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_65 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_66 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_67 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_68 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_69 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_88 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == HEX_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_89 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_90 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_91 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_92 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_93 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_94 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_95 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_96 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_97 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_98 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_99 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_100 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_101 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_102 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_103 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_104 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_105 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_106 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_107 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_108 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_109 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_110 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == OCTAL_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_113 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_114 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_115 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_116 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_117 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_118 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_119 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_120 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_121 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_122 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_123 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_124 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_125 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_126 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_127 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_128 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_129 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_130 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_131 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_132 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_133 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_135 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == DECIMAL_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_137 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_138 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_139 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_140 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_141 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_142 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_143 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_144 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_145 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_146 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_147 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_148 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_149 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_150 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_151 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_152 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_153 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_154 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_155 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_156 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_157 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_158 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == CHARACTER_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_161 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_162 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_163 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_164 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_165 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_166 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_167 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_168 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_169 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_170 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_171 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_172 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_173 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_174 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_175 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_176 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_177 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_178 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_179 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_180 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_181 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_182 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + + elif LA95 == STRING_LITERAL: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_185 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 64: + LA95_186 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_187 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_188 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_189 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_190 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_191 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_192 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_193 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_194 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_195 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_196 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_197 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_198 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_199 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_200 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_201 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_202 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_203 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_204 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_205 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_206 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + elif LA95 == STRING_LITERAL: + LA95_208 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_209 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95 = self.input.LA(2) + if LA95 == 64: + LA95_211 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_212 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 75: + LA95_213 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66: + LA95_214 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 76: + LA95_215 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_216 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_217 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 70: + LA95_218 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 71: + LA95_219 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 68: + LA95_220 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 69: + LA95_221 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 101 or LA95 == 102: + LA95_222 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 97 or LA95 == 98 or LA95 == 99 or LA95 == 100: + LA95_223 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 95 or LA95 == 96: + LA95_224 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 77: + LA95_225 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 94: + LA95_226 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 93: + LA95_227 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 92: + LA95_228 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 91: + LA95_229 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 90: + LA95_230 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 27: + LA95_231 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 25: + alt95 = 1 + elif LA95 == 28 or LA95 == 80 or LA95 == 81 or LA95 == 82 or LA95 == 83 or LA95 == 84 or LA95 == 85 or LA95 == 86 or LA95 == 87 or LA95 == 88 or LA95 == 89: + LA95_234 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 62: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_235 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_236 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_237 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_238 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_239 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_240 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_241 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_242 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_243 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_244 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_245 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_246 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61: + LA95_247 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 34: + LA95_248 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 35: + LA95_249 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 36: + LA95_250 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 37: + LA95_251 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 38: + LA95_252 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 39: + LA95_253 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 40: + LA95_254 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 41: + LA95_255 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 42: + LA95_256 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 45 or LA95 == 46: + LA95_257 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 48: + LA95_258 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 72: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_259 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_260 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_261 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_262 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_263 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_264 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_265 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_266 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_267 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_268 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_269 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_270 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 73: + LA95 = self.input.LA(2) + if LA95 == IDENTIFIER: + LA95_271 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_272 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_273 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_274 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_275 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_276 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_277 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 62: + LA95_278 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_279 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_280 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_281 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_282 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_283 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_284 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_285 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_286 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_287 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_288 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_289 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_290 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_291 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_292 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_293 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_294 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 74: + LA95 = self.input.LA(2) + if LA95 == 62: + LA95_295 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == IDENTIFIER: + LA95_296 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == HEX_LITERAL: + LA95_297 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == OCTAL_LITERAL: + LA95_298 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == DECIMAL_LITERAL: + LA95_299 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == CHARACTER_LITERAL: + LA95_300 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == STRING_LITERAL: + LA95_301 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == FLOATING_POINT_LITERAL: + LA95_302 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 72: + LA95_303 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 73: + LA95_304 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 66 or LA95 == 68 or LA95 == 69 or LA95 == 77 or LA95 == 78 or LA95 == 79: + LA95_305 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + elif LA95 == 74: + LA95_306 = self.input.LA(3) + + if (self.synpred188()) : + alt95 = 1 + + + + elif LA95 == 25 or LA95 == 26 or LA95 == 29 or LA95 == 30 or LA95 == 31 or LA95 == 32 or LA95 == 33 or LA95 == 34 or LA95 == 35 or LA95 == 36 or LA95 == 37 or LA95 == 38 or LA95 == 39 or LA95 == 40 or LA95 == 41 or LA95 == 42 or LA95 == 43 or LA95 == 45 or LA95 == 46 or LA95 == 48 or LA95 == 49 or LA95 == 50 or LA95 == 51 or LA95 == 52 or LA95 == 53 or LA95 == 54 or LA95 == 55 or LA95 == 56 or LA95 == 57 or LA95 == 58 or LA95 == 59 or LA95 == 60 or LA95 == 61 or LA95 == 103 or LA95 == 104 or LA95 == 105 or LA95 == 106 or LA95 == 107 or LA95 == 108 or LA95 == 110 or LA95 == 111 or LA95 == 112 or LA95 == 113 or LA95 == 114 or LA95 == 115 or LA95 == 116 or LA95 == 117: + alt95 = 1 + + if alt95 == 1: + # C.g:0:0: statement + self.following.append(self.FOLLOW_statement_in_statement_list2242) + self.statement() + self.following.pop() + if self.failed: + return + + + else: + if cnt95 >= 1: + break #loop95 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(95, self.input) + raise eee + + cnt95 += 1 + + + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 67, statement_list_StartIndex) + + pass + + return + + # $ANTLR end statement_list + + class expression_statement_return(object): + def __init__(self): + self.start = None + self.stop = None + + + + # $ANTLR start expression_statement + # C.g:561:1: expression_statement : ( ';' | expression ';' ); + def expression_statement(self, ): + + retval = self.expression_statement_return() + retval.start = self.input.LT(1) + expression_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 68): + return retval + + # C.g:562:2: ( ';' | expression ';' ) + alt96 = 2 + LA96_0 = self.input.LA(1) + + if (LA96_0 == 25) : + alt96 = 1 + elif ((IDENTIFIER <= LA96_0 <= FLOATING_POINT_LITERAL) or LA96_0 == 62 or LA96_0 == 66 or (68 <= LA96_0 <= 69) or (72 <= LA96_0 <= 74) or (77 <= LA96_0 <= 79)) : + alt96 = 2 + else: + if self.backtracking > 0: + self.failed = True + return retval + + nvae = NoViableAltException("561:1: expression_statement : ( ';' | expression ';' );", 96, 0, self.input) + + raise nvae + + if alt96 == 1: + # C.g:562:4: ';' + self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2254) + if self.failed: + return retval + + + elif alt96 == 2: + # C.g:563:4: expression ';' + self.following.append(self.FOLLOW_expression_in_expression_statement2259) + self.expression() + self.following.pop() + if self.failed: + return retval + self.match(self.input, 25, self.FOLLOW_25_in_expression_statement2261) + if self.failed: + return retval + + + retval.stop = self.input.LT(-1) + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 68, expression_statement_StartIndex) + + pass + + return retval + + # $ANTLR end expression_statement + + + # $ANTLR start selection_statement + # C.g:566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ); + def selection_statement(self, ): + + selection_statement_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 69): + return + + # C.g:567:2: ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement ) + alt98 = 2 + LA98_0 = self.input.LA(1) + + if (LA98_0 == 108) : + alt98 = 1 + elif (LA98_0 == 110) : + alt98 = 2 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("566:1: selection_statement : ( 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? | 'switch' '(' expression ')' statement );", 98, 0, self.input) + + raise nvae + + if alt98 == 1: + # C.g:567:4: 'if' '(' e= expression ')' statement ( options {k=1; backtrack=false; } : 'else' statement )? + self.match(self.input, 108, self.FOLLOW_108_in_selection_statement2272) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2274) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_selection_statement2278) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2280) + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + self.following.append(self.FOLLOW_statement_in_selection_statement2284) + self.statement() + self.following.pop() + if self.failed: + return + # C.g:567:167: ( options {k=1; backtrack=false; } : 'else' statement )? + alt97 = 2 + LA97_0 = self.input.LA(1) + + if (LA97_0 == 109) : + alt97 = 1 + if alt97 == 1: + # C.g:567:200: 'else' statement + self.match(self.input, 109, self.FOLLOW_109_in_selection_statement2299) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_selection_statement2301) + self.statement() + self.following.pop() + if self.failed: + return + + + + + + elif alt98 == 2: + # C.g:568:4: 'switch' '(' expression ')' statement + self.match(self.input, 110, self.FOLLOW_110_in_selection_statement2308) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_selection_statement2310) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_selection_statement2312) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_selection_statement2314) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_selection_statement2316) + self.statement() + self.following.pop() + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 69, selection_statement_StartIndex) + + pass + + return + + # $ANTLR end selection_statement + + + # $ANTLR start iteration_statement + # C.g:571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ); + def iteration_statement(self, ): + + iteration_statement_StartIndex = self.input.index() + e = None + + + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 70): + return + + # C.g:572:2: ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement ) + alt100 = 3 + LA100 = self.input.LA(1) + if LA100 == 111: + alt100 = 1 + elif LA100 == 112: + alt100 = 2 + elif LA100 == 113: + alt100 = 3 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("571:1: iteration_statement : ( 'while' '(' e= expression ')' statement | 'do' statement 'while' '(' e= expression ')' ';' | 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement );", 100, 0, self.input) + + raise nvae + + if alt100 == 1: + # C.g:572:4: 'while' '(' e= expression ')' statement + self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2327) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2329) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_iteration_statement2333) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2335) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2337) + self.statement() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + elif alt100 == 2: + # C.g:573:4: 'do' statement 'while' '(' e= expression ')' ';' + self.match(self.input, 112, self.FOLLOW_112_in_iteration_statement2344) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2346) + self.statement() + self.following.pop() + if self.failed: + return + self.match(self.input, 111, self.FOLLOW_111_in_iteration_statement2348) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2350) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_iteration_statement2354) + e = self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2356) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_iteration_statement2358) + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + elif alt100 == 3: + # C.g:574:4: 'for' '(' expression_statement e= expression_statement ( expression )? ')' statement + self.match(self.input, 113, self.FOLLOW_113_in_iteration_statement2365) + if self.failed: + return + self.match(self.input, 62, self.FOLLOW_62_in_iteration_statement2367) + if self.failed: + return + self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2369) + self.expression_statement() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_expression_statement_in_iteration_statement2373) + e = self.expression_statement() + self.following.pop() + if self.failed: + return + # C.g:574:58: ( expression )? + alt99 = 2 + LA99_0 = self.input.LA(1) + + if ((IDENTIFIER <= LA99_0 <= FLOATING_POINT_LITERAL) or LA99_0 == 62 or LA99_0 == 66 or (68 <= LA99_0 <= 69) or (72 <= LA99_0 <= 74) or (77 <= LA99_0 <= 79)) : + alt99 = 1 + if alt99 == 1: + # C.g:0:0: expression + self.following.append(self.FOLLOW_expression_in_iteration_statement2375) + self.expression() + self.following.pop() + if self.failed: + return + + + + self.match(self.input, 63, self.FOLLOW_63_in_iteration_statement2378) + if self.failed: + return + self.following.append(self.FOLLOW_statement_in_iteration_statement2380) + self.statement() + self.following.pop() + if self.failed: + return + if self.backtracking == 0: + self.StorePredicateExpression(e.start.line, e.start.charPositionInLine, e.stop.line, e.stop.charPositionInLine, self.input.toString(e.start,e.stop)) + + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 70, iteration_statement_StartIndex) + + pass + + return + + # $ANTLR end iteration_statement + + + # $ANTLR start jump_statement + # C.g:577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ); + def jump_statement(self, ): + + jump_statement_StartIndex = self.input.index() + try: + try: + if self.backtracking > 0 and self.alreadyParsedRule(self.input, 71): + return + + # C.g:578:2: ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' ) + alt101 = 5 + LA101 = self.input.LA(1) + if LA101 == 114: + alt101 = 1 + elif LA101 == 115: + alt101 = 2 + elif LA101 == 116: + alt101 = 3 + elif LA101 == 117: + LA101_4 = self.input.LA(2) + + if (LA101_4 == 25) : + alt101 = 4 + elif ((IDENTIFIER <= LA101_4 <= FLOATING_POINT_LITERAL) or LA101_4 == 62 or LA101_4 == 66 or (68 <= LA101_4 <= 69) or (72 <= LA101_4 <= 74) or (77 <= LA101_4 <= 79)) : + alt101 = 5 + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 4, self.input) + + raise nvae + + else: + if self.backtracking > 0: + self.failed = True + return + + nvae = NoViableAltException("577:1: jump_statement : ( 'goto' IDENTIFIER ';' | 'continue' ';' | 'break' ';' | 'return' ';' | 'return' expression ';' );", 101, 0, self.input) + + raise nvae + + if alt101 == 1: + # C.g:578:4: 'goto' IDENTIFIER ';' + self.match(self.input, 114, self.FOLLOW_114_in_jump_statement2393) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_jump_statement2395) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2397) + if self.failed: + return + + + elif alt101 == 2: + # C.g:579:4: 'continue' ';' + self.match(self.input, 115, self.FOLLOW_115_in_jump_statement2402) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2404) + if self.failed: + return + + + elif alt101 == 3: + # C.g:580:4: 'break' ';' + self.match(self.input, 116, self.FOLLOW_116_in_jump_statement2409) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2411) + if self.failed: + return + + + elif alt101 == 4: + # C.g:581:4: 'return' ';' + self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2416) + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2418) + if self.failed: + return + + + elif alt101 == 5: + # C.g:582:4: 'return' expression ';' + self.match(self.input, 117, self.FOLLOW_117_in_jump_statement2423) + if self.failed: + return + self.following.append(self.FOLLOW_expression_in_jump_statement2425) + self.expression() + self.following.pop() + if self.failed: + return + self.match(self.input, 25, self.FOLLOW_25_in_jump_statement2427) + if self.failed: + return + + + + except RecognitionException, re: + self.reportError(re) + self.recover(self.input, re) + finally: + if self.backtracking > 0: + self.memoize(self.input, 71, jump_statement_StartIndex) + + pass + + return + + # $ANTLR end jump_statement + + # $ANTLR start synpred2 + def synpred2_fragment(self, ): + # C.g:119:6: ( declaration_specifiers ) + # C.g:119:6: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred2100) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred2 + + + + # $ANTLR start synpred4 + def synpred4_fragment(self, ): + # C.g:119:4: ( ( declaration_specifiers )? declarator ( declaration )* '{' ) + # C.g:119:6: ( declaration_specifiers )? declarator ( declaration )* '{' + # C.g:119:6: ( declaration_specifiers )? + alt102 = 2 + LA102 = self.input.LA(1) + if LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33 or LA102 == 34 or LA102 == 35 or LA102 == 36 or LA102 == 37 or LA102 == 38 or LA102 == 39 or LA102 == 40 or LA102 == 41 or LA102 == 42 or LA102 == 45 or LA102 == 46 or LA102 == 48 or LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: + alt102 = 1 + elif LA102 == IDENTIFIER: + LA102 = self.input.LA(2) + if LA102 == 62: + LA102_21 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 29 or LA102 == 30 or LA102 == 31 or LA102 == 32 or LA102 == 33: + LA102_23 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 34: + LA102_24 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 35: + LA102_25 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 36: + LA102_26 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 37: + LA102_27 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 38: + LA102_28 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 39: + LA102_29 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 40: + LA102_30 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 41: + LA102_31 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 42: + LA102_32 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 45 or LA102 == 46: + LA102_33 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 48: + LA102_34 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == IDENTIFIER: + LA102_35 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 58: + LA102_36 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 66: + alt102 = 1 + elif LA102 == 59: + LA102_39 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 60: + LA102_40 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 49 or LA102 == 50 or LA102 == 51 or LA102 == 52 or LA102 == 53 or LA102 == 54 or LA102 == 55 or LA102 == 56 or LA102 == 57 or LA102 == 61: + LA102_41 = self.input.LA(3) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 58: + LA102_14 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 59: + LA102_16 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + elif LA102 == 60: + LA102_17 = self.input.LA(2) + + if (self.synpred2()) : + alt102 = 1 + if alt102 == 1: + # C.g:0:0: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred4100) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + + self.following.append(self.FOLLOW_declarator_in_synpred4103) + self.declarator() + self.following.pop() + if self.failed: + return + # C.g:119:41: ( declaration )* + while True: #loop103 + alt103 = 2 + LA103_0 = self.input.LA(1) + + if (LA103_0 == IDENTIFIER or LA103_0 == 26 or (29 <= LA103_0 <= 42) or (45 <= LA103_0 <= 46) or (48 <= LA103_0 <= 61)) : + alt103 = 1 + + + if alt103 == 1: + # C.g:0:0: declaration + self.following.append(self.FOLLOW_declaration_in_synpred4105) + self.declaration() + self.following.pop() + if self.failed: + return + + + else: + break #loop103 + + + self.match(self.input, 43, self.FOLLOW_43_in_synpred4108) + if self.failed: + return + + + # $ANTLR end synpred4 + + + + # $ANTLR start synpred5 + def synpred5_fragment(self, ): + # C.g:120:4: ( declaration ) + # C.g:120:4: declaration + self.following.append(self.FOLLOW_declaration_in_synpred5118) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred5 + + + + # $ANTLR start synpred7 + def synpred7_fragment(self, ): + # C.g:146:6: ( declaration_specifiers ) + # C.g:146:6: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred7157) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred7 + + + + # $ANTLR start synpred10 + def synpred10_fragment(self, ): + # C.g:167:18: ( declaration_specifiers ) + # C.g:167:18: declaration_specifiers + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred10207) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred10 + + + + # $ANTLR start synpred14 + def synpred14_fragment(self, ): + # C.g:184:7: ( type_specifier ) + # C.g:184:7: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_synpred14272) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred14 + + + + # $ANTLR start synpred15 + def synpred15_fragment(self, ): + # C.g:185:13: ( type_qualifier ) + # C.g:185:13: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred15286) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred15 + + + + # $ANTLR start synpred33 + def synpred33_fragment(self, ): + # C.g:225:16: ( type_qualifier ) + # C.g:225:16: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred33444) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred33 + + + + # $ANTLR start synpred34 + def synpred34_fragment(self, ): + # C.g:225:4: ( IDENTIFIER ( type_qualifier )* declarator ) + # C.g:225:5: IDENTIFIER ( type_qualifier )* declarator + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred34442) + if self.failed: + return + # C.g:225:16: ( type_qualifier )* + while True: #loop106 + alt106 = 2 + LA106 = self.input.LA(1) + if LA106 == 58: + LA106_2 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 59: + LA106_3 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 60: + LA106_4 = self.input.LA(2) + + if (self.synpred33()) : + alt106 = 1 + + + elif LA106 == 49 or LA106 == 50 or LA106 == 51 or LA106 == 52 or LA106 == 53 or LA106 == 54 or LA106 == 55 or LA106 == 56 or LA106 == 57 or LA106 == 61: + alt106 = 1 + + if alt106 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred34444) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + break #loop106 + + + self.following.append(self.FOLLOW_declarator_in_synpred34447) + self.declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred34 + + + + # $ANTLR start synpred39 + def synpred39_fragment(self, ): + # C.g:253:6: ( type_qualifier ) + # C.g:253:6: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred39566) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred39 + + + + # $ANTLR start synpred40 + def synpred40_fragment(self, ): + # C.g:253:23: ( type_specifier ) + # C.g:253:23: type_specifier + self.following.append(self.FOLLOW_type_specifier_in_synpred40570) + self.type_specifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred40 + + + + # $ANTLR start synpred66 + def synpred66_fragment(self, ): + # C.g:297:4: ( ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator ) + # C.g:297:4: ( pointer )? ( 'EFIAPI' )? ( 'EFI_BOOTSERVICE' )? ( 'EFI_RUNTIMESERVICE' )? direct_declarator + # C.g:297:4: ( pointer )? + alt111 = 2 + LA111_0 = self.input.LA(1) + + if (LA111_0 == 66) : + alt111 = 1 + if alt111 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_synpred66784) + self.pointer() + self.following.pop() + if self.failed: + return + + + + # C.g:297:13: ( 'EFIAPI' )? + alt112 = 2 + LA112_0 = self.input.LA(1) + + if (LA112_0 == 58) : + alt112 = 1 + if alt112 == 1: + # C.g:297:14: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_synpred66788) + if self.failed: + return + + + + # C.g:297:25: ( 'EFI_BOOTSERVICE' )? + alt113 = 2 + LA113_0 = self.input.LA(1) + + if (LA113_0 == 59) : + alt113 = 1 + if alt113 == 1: + # C.g:297:26: 'EFI_BOOTSERVICE' + self.match(self.input, 59, self.FOLLOW_59_in_synpred66793) + if self.failed: + return + + + + # C.g:297:46: ( 'EFI_RUNTIMESERVICE' )? + alt114 = 2 + LA114_0 = self.input.LA(1) + + if (LA114_0 == 60) : + alt114 = 1 + if alt114 == 1: + # C.g:297:47: 'EFI_RUNTIMESERVICE' + self.match(self.input, 60, self.FOLLOW_60_in_synpred66798) + if self.failed: + return + + + + self.following.append(self.FOLLOW_direct_declarator_in_synpred66802) + self.direct_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred66 + + + + # $ANTLR start synpred67 + def synpred67_fragment(self, ): + # C.g:303:15: ( declarator_suffix ) + # C.g:303:15: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_synpred67821) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred67 + + + + # $ANTLR start synpred69 + def synpred69_fragment(self, ): + # C.g:304:9: ( 'EFIAPI' ) + # C.g:304:9: 'EFIAPI' + self.match(self.input, 58, self.FOLLOW_58_in_synpred69830) + if self.failed: + return + + + # $ANTLR end synpred69 + + + + # $ANTLR start synpred70 + def synpred70_fragment(self, ): + # C.g:304:35: ( declarator_suffix ) + # C.g:304:35: declarator_suffix + self.following.append(self.FOLLOW_declarator_suffix_in_synpred70838) + self.declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred70 + + + + # $ANTLR start synpred73 + def synpred73_fragment(self, ): + # C.g:310:9: ( '(' parameter_type_list ')' ) + # C.g:310:9: '(' parameter_type_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred73878) + if self.failed: + return + self.following.append(self.FOLLOW_parameter_type_list_in_synpred73880) + self.parameter_type_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred73882) + if self.failed: + return + + + # $ANTLR end synpred73 + + + + # $ANTLR start synpred74 + def synpred74_fragment(self, ): + # C.g:311:9: ( '(' identifier_list ')' ) + # C.g:311:9: '(' identifier_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred74892) + if self.failed: + return + self.following.append(self.FOLLOW_identifier_list_in_synpred74894) + self.identifier_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred74896) + if self.failed: + return + + + # $ANTLR end synpred74 + + + + # $ANTLR start synpred75 + def synpred75_fragment(self, ): + # C.g:316:8: ( type_qualifier ) + # C.g:316:8: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred75921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred75 + + + + # $ANTLR start synpred76 + def synpred76_fragment(self, ): + # C.g:316:24: ( pointer ) + # C.g:316:24: pointer + self.following.append(self.FOLLOW_pointer_in_synpred76924) + self.pointer() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred76 + + + + # $ANTLR start synpred77 + def synpred77_fragment(self, ): + # C.g:316:4: ( '*' ( type_qualifier )+ ( pointer )? ) + # C.g:316:4: '*' ( type_qualifier )+ ( pointer )? + self.match(self.input, 66, self.FOLLOW_66_in_synpred77919) + if self.failed: + return + # C.g:316:8: ( type_qualifier )+ + cnt116 = 0 + while True: #loop116 + alt116 = 2 + LA116_0 = self.input.LA(1) + + if ((49 <= LA116_0 <= 61)) : + alt116 = 1 + + + if alt116 == 1: + # C.g:0:0: type_qualifier + self.following.append(self.FOLLOW_type_qualifier_in_synpred77921) + self.type_qualifier() + self.following.pop() + if self.failed: + return + + + else: + if cnt116 >= 1: + break #loop116 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(116, self.input) + raise eee + + cnt116 += 1 + + + # C.g:316:24: ( pointer )? + alt117 = 2 + LA117_0 = self.input.LA(1) + + if (LA117_0 == 66) : + alt117 = 1 + if alt117 == 1: + # C.g:0:0: pointer + self.following.append(self.FOLLOW_pointer_in_synpred77924) + self.pointer() + self.following.pop() + if self.failed: + return + + + + + + # $ANTLR end synpred77 + + + + # $ANTLR start synpred78 + def synpred78_fragment(self, ): + # C.g:317:4: ( '*' pointer ) + # C.g:317:4: '*' pointer + self.match(self.input, 66, self.FOLLOW_66_in_synpred78930) + if self.failed: + return + self.following.append(self.FOLLOW_pointer_in_synpred78932) + self.pointer() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred78 + + + + # $ANTLR start synpred81 + def synpred81_fragment(self, ): + # C.g:326:32: ( 'OPTIONAL' ) + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred81977) + if self.failed: + return + + + # $ANTLR end synpred81 + + + + # $ANTLR start synpred82 + def synpred82_fragment(self, ): + # C.g:326:27: ( ',' ( 'OPTIONAL' )? parameter_declaration ) + # C.g:326:27: ',' ( 'OPTIONAL' )? parameter_declaration + self.match(self.input, 27, self.FOLLOW_27_in_synpred82974) + if self.failed: + return + # C.g:326:31: ( 'OPTIONAL' )? + alt119 = 2 + LA119_0 = self.input.LA(1) + + if (LA119_0 == 53) : + LA119_1 = self.input.LA(2) + + if (self.synpred81()) : + alt119 = 1 + if alt119 == 1: + # C.g:326:32: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred82977) + if self.failed: + return + + + + self.following.append(self.FOLLOW_parameter_declaration_in_synpred82981) + self.parameter_declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred82 + + + + # $ANTLR start synpred83 + def synpred83_fragment(self, ): + # C.g:330:28: ( declarator ) + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_synpred83997) + self.declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred83 + + + + # $ANTLR start synpred84 + def synpred84_fragment(self, ): + # C.g:330:39: ( abstract_declarator ) + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred84999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred84 + + + + # $ANTLR start synpred86 + def synpred86_fragment(self, ): + # C.g:330:4: ( declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? ) + # C.g:330:4: declaration_specifiers ( declarator | abstract_declarator )* ( 'OPTIONAL' )? + self.following.append(self.FOLLOW_declaration_specifiers_in_synpred86994) + self.declaration_specifiers() + self.following.pop() + if self.failed: + return + # C.g:330:27: ( declarator | abstract_declarator )* + while True: #loop120 + alt120 = 3 + LA120 = self.input.LA(1) + if LA120 == 66: + LA120_3 = self.input.LA(2) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == IDENTIFIER or LA120 == 58 or LA120 == 59 or LA120 == 60: + alt120 = 1 + elif LA120 == 62: + LA120 = self.input.LA(2) + if LA120 == 29 or LA120 == 30 or LA120 == 31 or LA120 == 32 or LA120 == 33 or LA120 == 34 or LA120 == 35 or LA120 == 36 or LA120 == 37 or LA120 == 38 or LA120 == 39 or LA120 == 40 or LA120 == 41 or LA120 == 42 or LA120 == 45 or LA120 == 46 or LA120 == 48 or LA120 == 49 or LA120 == 50 or LA120 == 51 or LA120 == 52 or LA120 == 53 or LA120 == 54 or LA120 == 55 or LA120 == 56 or LA120 == 57 or LA120 == 61 or LA120 == 63 or LA120 == 64: + alt120 = 2 + elif LA120 == 58: + LA120_21 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 66: + LA120_22 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 59: + LA120_23 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 60: + LA120_24 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == IDENTIFIER: + LA120_25 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + elif LA120 == 62: + LA120_26 = self.input.LA(3) + + if (self.synpred83()) : + alt120 = 1 + elif (self.synpred84()) : + alt120 = 2 + + + + elif LA120 == 64: + alt120 = 2 + + if alt120 == 1: + # C.g:330:28: declarator + self.following.append(self.FOLLOW_declarator_in_synpred86997) + self.declarator() + self.following.pop() + if self.failed: + return + + + elif alt120 == 2: + # C.g:330:39: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred86999) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + else: + break #loop120 + + + # C.g:330:61: ( 'OPTIONAL' )? + alt121 = 2 + LA121_0 = self.input.LA(1) + + if (LA121_0 == 53) : + alt121 = 1 + if alt121 == 1: + # C.g:330:62: 'OPTIONAL' + self.match(self.input, 53, self.FOLLOW_53_in_synpred861004) + if self.failed: + return + + + + + + # $ANTLR end synpred86 + + + + # $ANTLR start synpred90 + def synpred90_fragment(self, ): + # C.g:341:4: ( specifier_qualifier_list ( abstract_declarator )? ) + # C.g:341:4: specifier_qualifier_list ( abstract_declarator )? + self.following.append(self.FOLLOW_specifier_qualifier_list_in_synpred901046) + self.specifier_qualifier_list() + self.following.pop() + if self.failed: + return + # C.g:341:29: ( abstract_declarator )? + alt122 = 2 + LA122_0 = self.input.LA(1) + + if (LA122_0 == 62 or LA122_0 == 64 or LA122_0 == 66) : + alt122 = 1 + if alt122 == 1: + # C.g:0:0: abstract_declarator + self.following.append(self.FOLLOW_abstract_declarator_in_synpred901048) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + + + + + + # $ANTLR end synpred90 + + + + # $ANTLR start synpred91 + def synpred91_fragment(self, ): + # C.g:346:12: ( direct_abstract_declarator ) + # C.g:346:12: direct_abstract_declarator + self.following.append(self.FOLLOW_direct_abstract_declarator_in_synpred911067) + self.direct_abstract_declarator() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred91 + + + + # $ANTLR start synpred93 + def synpred93_fragment(self, ): + # C.g:351:6: ( '(' abstract_declarator ')' ) + # C.g:351:6: '(' abstract_declarator ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred931086) + if self.failed: + return + self.following.append(self.FOLLOW_abstract_declarator_in_synpred931088) + self.abstract_declarator() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred931090) + if self.failed: + return + + + # $ANTLR end synpred93 + + + + # $ANTLR start synpred94 + def synpred94_fragment(self, ): + # C.g:351:65: ( abstract_declarator_suffix ) + # C.g:351:65: abstract_declarator_suffix + self.following.append(self.FOLLOW_abstract_declarator_suffix_in_synpred941098) + self.abstract_declarator_suffix() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred94 + + + + # $ANTLR start synpred109 + def synpred109_fragment(self, ): + # C.g:386:4: ( '(' type_name ')' cast_expression ) + # C.g:386:4: '(' type_name ')' cast_expression + self.match(self.input, 62, self.FOLLOW_62_in_synpred1091282) + if self.failed: + return + self.following.append(self.FOLLOW_type_name_in_synpred1091284) + self.type_name() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1091286) + if self.failed: + return + self.following.append(self.FOLLOW_cast_expression_in_synpred1091288) + self.cast_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred109 + + + + # $ANTLR start synpred114 + def synpred114_fragment(self, ): + # C.g:395:4: ( 'sizeof' unary_expression ) + # C.g:395:4: 'sizeof' unary_expression + self.match(self.input, 74, self.FOLLOW_74_in_synpred1141330) + if self.failed: + return + self.following.append(self.FOLLOW_unary_expression_in_synpred1141332) + self.unary_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred114 + + + + # $ANTLR start synpred117 + def synpred117_fragment(self, ): + # C.g:409:13: ( '(' argument_expression_list ')' ) + # C.g:409:13: '(' argument_expression_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred1171420) + if self.failed: + return + self.following.append(self.FOLLOW_argument_expression_list_in_synpred1171424) + self.argument_expression_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1171428) + if self.failed: + return + + + # $ANTLR end synpred117 + + + + # $ANTLR start synpred118 + def synpred118_fragment(self, ): + # C.g:410:13: ( '(' macro_parameter_list ')' ) + # C.g:410:13: '(' macro_parameter_list ')' + self.match(self.input, 62, self.FOLLOW_62_in_synpred1181444) + if self.failed: + return + self.following.append(self.FOLLOW_macro_parameter_list_in_synpred1181446) + self.macro_parameter_list() + self.following.pop() + if self.failed: + return + self.match(self.input, 63, self.FOLLOW_63_in_synpred1181448) + if self.failed: + return + + + # $ANTLR end synpred118 + + + + # $ANTLR start synpred120 + def synpred120_fragment(self, ): + # C.g:412:13: ( '*' IDENTIFIER ) + # C.g:412:13: '*' IDENTIFIER + self.match(self.input, 66, self.FOLLOW_66_in_synpred1201482) + if self.failed: + return + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1201486) + if self.failed: + return + + + # $ANTLR end synpred120 + + + + # $ANTLR start synpred137 + def synpred137_fragment(self, ): + # C.g:443:20: ( STRING_LITERAL ) + # C.g:443:20: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1371683) + if self.failed: + return + + + # $ANTLR end synpred137 + + + + # $ANTLR start synpred138 + def synpred138_fragment(self, ): + # C.g:443:8: ( ( IDENTIFIER )* ( STRING_LITERAL )+ ) + # C.g:443:8: ( IDENTIFIER )* ( STRING_LITERAL )+ + # C.g:443:8: ( IDENTIFIER )* + while True: #loop125 + alt125 = 2 + LA125_0 = self.input.LA(1) + + if (LA125_0 == IDENTIFIER) : + alt125 = 1 + + + if alt125 == 1: + # C.g:0:0: IDENTIFIER + self.match(self.input, IDENTIFIER, self.FOLLOW_IDENTIFIER_in_synpred1381680) + if self.failed: + return + + + else: + break #loop125 + + + # C.g:443:20: ( STRING_LITERAL )+ + cnt126 = 0 + while True: #loop126 + alt126 = 2 + LA126_0 = self.input.LA(1) + + if (LA126_0 == STRING_LITERAL) : + alt126 = 1 + + + if alt126 == 1: + # C.g:0:0: STRING_LITERAL + self.match(self.input, STRING_LITERAL, self.FOLLOW_STRING_LITERAL_in_synpred1381683) + if self.failed: + return + + + else: + if cnt126 >= 1: + break #loop126 + + if self.backtracking > 0: + self.failed = True + return + + eee = EarlyExitException(126, self.input) + raise eee + + cnt126 += 1 + + + + + # $ANTLR end synpred138 + + + + # $ANTLR start synpred142 + def synpred142_fragment(self, ): + # C.g:458:4: ( lvalue assignment_operator assignment_expression ) + # C.g:458:4: lvalue assignment_operator assignment_expression + self.following.append(self.FOLLOW_lvalue_in_synpred1421744) + self.lvalue() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_operator_in_synpred1421746) + self.assignment_operator() + self.following.pop() + if self.failed: + return + self.following.append(self.FOLLOW_assignment_expression_in_synpred1421748) + self.assignment_expression() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred142 + + + + # $ANTLR start synpred169 + def synpred169_fragment(self, ): + # C.g:520:4: ( expression_statement ) + # C.g:520:4: expression_statement + self.following.append(self.FOLLOW_expression_statement_in_synpred1692035) + self.expression_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred169 + + + + # $ANTLR start synpred173 + def synpred173_fragment(self, ): + # C.g:524:4: ( macro_statement ) + # C.g:524:4: macro_statement + self.following.append(self.FOLLOW_macro_statement_in_synpred1732055) + self.macro_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred173 + + + + # $ANTLR start synpred174 + def synpred174_fragment(self, ): + # C.g:525:4: ( asm2_statement ) + # C.g:525:4: asm2_statement + self.following.append(self.FOLLOW_asm2_statement_in_synpred1742060) + self.asm2_statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred174 + + + + # $ANTLR start synpred181 + def synpred181_fragment(self, ): + # C.g:544:19: ( declaration ) + # C.g:544:19: declaration + self.following.append(self.FOLLOW_declaration_in_synpred1812166) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred181 + + + + # $ANTLR start synpred182 + def synpred182_fragment(self, ): + # C.g:544:33: ( statement_list ) + # C.g:544:33: statement_list + self.following.append(self.FOLLOW_statement_list_in_synpred1822170) + self.statement_list() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred182 + + + + # $ANTLR start synpred186 + def synpred186_fragment(self, ): + # C.g:554:8: ( declaration ) + # C.g:554:8: declaration + self.following.append(self.FOLLOW_declaration_in_synpred1862225) + self.declaration() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred186 + + + + # $ANTLR start synpred188 + def synpred188_fragment(self, ): + # C.g:558:4: ( statement ) + # C.g:558:4: statement + self.following.append(self.FOLLOW_statement_in_synpred1882242) + self.statement() + self.following.pop() + if self.failed: + return + + + # $ANTLR end synpred188 + + + + def synpred69(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred69_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred81(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred81_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred82(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred82_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred66(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred66_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred83(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred83_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred84(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred84_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred67(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred67_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred86(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred86_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred120(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred120_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred40(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred40_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred142(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred142_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred182(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred182_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred109(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred109_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred181(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred181_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred186(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred186_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred188(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred188_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred169(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred169_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred117(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred117_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred70(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred70_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred118(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred118_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred34(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred34_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred33(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred33_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred94(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred94_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred39(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred39_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred74(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred74_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred114(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred114_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred93(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred93_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred75(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred75_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred137(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred137_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred90(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred90_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred138(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred138_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred91(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred91_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred73(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred73_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred5(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred5_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred78(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred78_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred7(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred7_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred76(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred76_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred77(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred77_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred2(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred2_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred4(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred4_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred174(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred174_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred173(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred173_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred14(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred14_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred15(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred15_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + def synpred10(self): + self.backtracking += 1 + start = self.input.mark() + self.synpred10_fragment() + success = not self.failed + self.input.rewind(start) + self.backtracking -= 1 + self.failed = False + return success + + + + + + FOLLOW_external_declaration_in_translation_unit74 = frozenset([1, 4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_function_definition_in_external_declaration113 = frozenset([1]) + FOLLOW_declaration_in_external_declaration118 = frozenset([1]) + FOLLOW_macro_statement_in_external_declaration123 = frozenset([1, 25]) + FOLLOW_25_in_external_declaration126 = frozenset([1]) + FOLLOW_declaration_specifiers_in_function_definition157 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_function_definition160 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_declaration_in_function_definition166 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_compound_statement_in_function_definition171 = frozenset([1]) + FOLLOW_compound_statement_in_function_definition180 = frozenset([1]) + FOLLOW_26_in_declaration203 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_declaration_specifiers_in_declaration207 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_list_in_declaration216 = frozenset([25]) + FOLLOW_25_in_declaration220 = frozenset([1]) + FOLLOW_declaration_specifiers_in_declaration234 = frozenset([4, 25, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_list_in_declaration238 = frozenset([25]) + FOLLOW_25_in_declaration243 = frozenset([1]) + FOLLOW_storage_class_specifier_in_declaration_specifiers264 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_specifier_in_declaration_specifiers272 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_declaration_specifiers286 = frozenset([1, 4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_init_declarator_in_init_declarator_list308 = frozenset([1, 27]) + FOLLOW_27_in_init_declarator_list311 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_init_declarator_in_init_declarator_list313 = frozenset([1, 27]) + FOLLOW_declarator_in_init_declarator326 = frozenset([1, 28]) + FOLLOW_28_in_init_declarator329 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_in_init_declarator331 = frozenset([1]) + FOLLOW_set_in_storage_class_specifier0 = frozenset([1]) + FOLLOW_34_in_type_specifier376 = frozenset([1]) + FOLLOW_35_in_type_specifier381 = frozenset([1]) + FOLLOW_36_in_type_specifier386 = frozenset([1]) + FOLLOW_37_in_type_specifier391 = frozenset([1]) + FOLLOW_38_in_type_specifier396 = frozenset([1]) + FOLLOW_39_in_type_specifier401 = frozenset([1]) + FOLLOW_40_in_type_specifier406 = frozenset([1]) + FOLLOW_41_in_type_specifier411 = frozenset([1]) + FOLLOW_42_in_type_specifier416 = frozenset([1]) + FOLLOW_struct_or_union_specifier_in_type_specifier423 = frozenset([1]) + FOLLOW_enum_specifier_in_type_specifier433 = frozenset([1]) + FOLLOW_type_id_in_type_specifier451 = frozenset([1]) + FOLLOW_IDENTIFIER_in_type_id467 = frozenset([1]) + FOLLOW_struct_or_union_in_struct_or_union_specifier494 = frozenset([4, 43]) + FOLLOW_IDENTIFIER_in_struct_or_union_specifier496 = frozenset([43]) + FOLLOW_43_in_struct_or_union_specifier499 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_struct_declaration_list_in_struct_or_union_specifier501 = frozenset([44]) + FOLLOW_44_in_struct_or_union_specifier503 = frozenset([1]) + FOLLOW_struct_or_union_in_struct_or_union_specifier508 = frozenset([4]) + FOLLOW_IDENTIFIER_in_struct_or_union_specifier510 = frozenset([1]) + FOLLOW_set_in_struct_or_union0 = frozenset([1]) + FOLLOW_struct_declaration_in_struct_declaration_list537 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_specifier_qualifier_list_in_struct_declaration549 = frozenset([4, 47, 58, 59, 60, 62, 66]) + FOLLOW_struct_declarator_list_in_struct_declaration551 = frozenset([25]) + FOLLOW_25_in_struct_declaration553 = frozenset([1]) + FOLLOW_type_qualifier_in_specifier_qualifier_list566 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_specifier_in_specifier_qualifier_list570 = frozenset([1, 4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_struct_declarator_in_struct_declarator_list584 = frozenset([1, 27]) + FOLLOW_27_in_struct_declarator_list587 = frozenset([4, 47, 58, 59, 60, 62, 66]) + FOLLOW_struct_declarator_in_struct_declarator_list589 = frozenset([1, 27]) + FOLLOW_declarator_in_struct_declarator602 = frozenset([1, 47]) + FOLLOW_47_in_struct_declarator605 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_struct_declarator607 = frozenset([1]) + FOLLOW_47_in_struct_declarator614 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_struct_declarator616 = frozenset([1]) + FOLLOW_48_in_enum_specifier634 = frozenset([43]) + FOLLOW_43_in_enum_specifier636 = frozenset([4]) + FOLLOW_enumerator_list_in_enum_specifier638 = frozenset([27, 44]) + FOLLOW_27_in_enum_specifier640 = frozenset([44]) + FOLLOW_44_in_enum_specifier643 = frozenset([1]) + FOLLOW_48_in_enum_specifier648 = frozenset([4]) + FOLLOW_IDENTIFIER_in_enum_specifier650 = frozenset([43]) + FOLLOW_43_in_enum_specifier652 = frozenset([4]) + FOLLOW_enumerator_list_in_enum_specifier654 = frozenset([27, 44]) + FOLLOW_27_in_enum_specifier656 = frozenset([44]) + FOLLOW_44_in_enum_specifier659 = frozenset([1]) + FOLLOW_48_in_enum_specifier664 = frozenset([4]) + FOLLOW_IDENTIFIER_in_enum_specifier666 = frozenset([1]) + FOLLOW_enumerator_in_enumerator_list677 = frozenset([1, 27]) + FOLLOW_27_in_enumerator_list680 = frozenset([4]) + FOLLOW_enumerator_in_enumerator_list682 = frozenset([1, 27]) + FOLLOW_IDENTIFIER_in_enumerator695 = frozenset([1, 28]) + FOLLOW_28_in_enumerator698 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_enumerator700 = frozenset([1]) + FOLLOW_set_in_type_qualifier0 = frozenset([1]) + FOLLOW_pointer_in_declarator784 = frozenset([4, 58, 59, 60, 62]) + FOLLOW_58_in_declarator788 = frozenset([4, 59, 60, 62]) + FOLLOW_59_in_declarator793 = frozenset([4, 60, 62]) + FOLLOW_60_in_declarator798 = frozenset([4, 62]) + FOLLOW_direct_declarator_in_declarator802 = frozenset([1]) + FOLLOW_pointer_in_declarator808 = frozenset([1]) + FOLLOW_IDENTIFIER_in_direct_declarator819 = frozenset([1, 62, 64]) + FOLLOW_declarator_suffix_in_direct_declarator821 = frozenset([1, 62, 64]) + FOLLOW_62_in_direct_declarator827 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_58_in_direct_declarator830 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_direct_declarator834 = frozenset([63]) + FOLLOW_63_in_direct_declarator836 = frozenset([62, 64]) + FOLLOW_declarator_suffix_in_direct_declarator838 = frozenset([1, 62, 64]) + FOLLOW_64_in_declarator_suffix852 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_declarator_suffix854 = frozenset([65]) + FOLLOW_65_in_declarator_suffix856 = frozenset([1]) + FOLLOW_64_in_declarator_suffix866 = frozenset([65]) + FOLLOW_65_in_declarator_suffix868 = frozenset([1]) + FOLLOW_62_in_declarator_suffix878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_declarator_suffix880 = frozenset([63]) + FOLLOW_63_in_declarator_suffix882 = frozenset([1]) + FOLLOW_62_in_declarator_suffix892 = frozenset([4]) + FOLLOW_identifier_list_in_declarator_suffix894 = frozenset([63]) + FOLLOW_63_in_declarator_suffix896 = frozenset([1]) + FOLLOW_62_in_declarator_suffix906 = frozenset([63]) + FOLLOW_63_in_declarator_suffix908 = frozenset([1]) + FOLLOW_66_in_pointer919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_pointer921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_pointer_in_pointer924 = frozenset([1]) + FOLLOW_66_in_pointer930 = frozenset([66]) + FOLLOW_pointer_in_pointer932 = frozenset([1]) + FOLLOW_66_in_pointer937 = frozenset([1]) + FOLLOW_parameter_list_in_parameter_type_list948 = frozenset([1, 27]) + FOLLOW_27_in_parameter_type_list951 = frozenset([53, 67]) + FOLLOW_53_in_parameter_type_list954 = frozenset([67]) + FOLLOW_67_in_parameter_type_list958 = frozenset([1]) + FOLLOW_parameter_declaration_in_parameter_list971 = frozenset([1, 27]) + FOLLOW_27_in_parameter_list974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_53_in_parameter_list977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_parameter_list981 = frozenset([1, 27]) + FOLLOW_declaration_specifiers_in_parameter_declaration994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_declarator_in_parameter_declaration997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_abstract_declarator_in_parameter_declaration999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_53_in_parameter_declaration1004 = frozenset([1]) + FOLLOW_pointer_in_parameter_declaration1013 = frozenset([4, 66]) + FOLLOW_IDENTIFIER_in_parameter_declaration1016 = frozenset([1]) + FOLLOW_IDENTIFIER_in_identifier_list1027 = frozenset([1, 27]) + FOLLOW_27_in_identifier_list1031 = frozenset([4]) + FOLLOW_IDENTIFIER_in_identifier_list1033 = frozenset([1, 27]) + FOLLOW_specifier_qualifier_list_in_type_name1046 = frozenset([1, 62, 64, 66]) + FOLLOW_abstract_declarator_in_type_name1048 = frozenset([1]) + FOLLOW_type_id_in_type_name1054 = frozenset([1]) + FOLLOW_pointer_in_abstract_declarator1065 = frozenset([1, 62, 64]) + FOLLOW_direct_abstract_declarator_in_abstract_declarator1067 = frozenset([1]) + FOLLOW_direct_abstract_declarator_in_abstract_declarator1073 = frozenset([1]) + FOLLOW_62_in_direct_abstract_declarator1086 = frozenset([62, 64, 66]) + FOLLOW_abstract_declarator_in_direct_abstract_declarator1088 = frozenset([63]) + FOLLOW_63_in_direct_abstract_declarator1090 = frozenset([1, 62, 64]) + FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1094 = frozenset([1, 62, 64]) + FOLLOW_abstract_declarator_suffix_in_direct_abstract_declarator1098 = frozenset([1, 62, 64]) + FOLLOW_64_in_abstract_declarator_suffix1110 = frozenset([65]) + FOLLOW_65_in_abstract_declarator_suffix1112 = frozenset([1]) + FOLLOW_64_in_abstract_declarator_suffix1117 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_abstract_declarator_suffix1119 = frozenset([65]) + FOLLOW_65_in_abstract_declarator_suffix1121 = frozenset([1]) + FOLLOW_62_in_abstract_declarator_suffix1126 = frozenset([63]) + FOLLOW_63_in_abstract_declarator_suffix1128 = frozenset([1]) + FOLLOW_62_in_abstract_declarator_suffix1133 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_abstract_declarator_suffix1135 = frozenset([63]) + FOLLOW_63_in_abstract_declarator_suffix1137 = frozenset([1]) + FOLLOW_assignment_expression_in_initializer1150 = frozenset([1]) + FOLLOW_43_in_initializer1155 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_list_in_initializer1157 = frozenset([27, 44]) + FOLLOW_27_in_initializer1159 = frozenset([44]) + FOLLOW_44_in_initializer1162 = frozenset([1]) + FOLLOW_initializer_in_initializer_list1173 = frozenset([1, 27]) + FOLLOW_27_in_initializer_list1176 = frozenset([4, 5, 6, 7, 8, 9, 10, 43, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_initializer_in_initializer_list1178 = frozenset([1, 27]) + FOLLOW_assignment_expression_in_argument_expression_list1196 = frozenset([1, 27, 53]) + FOLLOW_53_in_argument_expression_list1199 = frozenset([1, 27]) + FOLLOW_27_in_argument_expression_list1204 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_argument_expression_list1206 = frozenset([1, 27, 53]) + FOLLOW_53_in_argument_expression_list1209 = frozenset([1, 27]) + FOLLOW_multiplicative_expression_in_additive_expression1225 = frozenset([1, 68, 69]) + FOLLOW_68_in_additive_expression1229 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_multiplicative_expression_in_additive_expression1231 = frozenset([1, 68, 69]) + FOLLOW_69_in_additive_expression1235 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_multiplicative_expression_in_additive_expression1237 = frozenset([1, 68, 69]) + FOLLOW_cast_expression_in_multiplicative_expression1251 = frozenset([1, 66, 70, 71]) + FOLLOW_66_in_multiplicative_expression1255 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1257 = frozenset([1, 66, 70, 71]) + FOLLOW_70_in_multiplicative_expression1261 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1263 = frozenset([1, 66, 70, 71]) + FOLLOW_71_in_multiplicative_expression1267 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_multiplicative_expression1269 = frozenset([1, 66, 70, 71]) + FOLLOW_62_in_cast_expression1282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_cast_expression1284 = frozenset([63]) + FOLLOW_63_in_cast_expression1286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_cast_expression1288 = frozenset([1]) + FOLLOW_unary_expression_in_cast_expression1293 = frozenset([1]) + FOLLOW_postfix_expression_in_unary_expression1304 = frozenset([1]) + FOLLOW_72_in_unary_expression1309 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1311 = frozenset([1]) + FOLLOW_73_in_unary_expression1316 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1318 = frozenset([1]) + FOLLOW_unary_operator_in_unary_expression1323 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_unary_expression1325 = frozenset([1]) + FOLLOW_74_in_unary_expression1330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_unary_expression1332 = frozenset([1]) + FOLLOW_74_in_unary_expression1337 = frozenset([62]) + FOLLOW_62_in_unary_expression1339 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_unary_expression1341 = frozenset([63]) + FOLLOW_63_in_unary_expression1343 = frozenset([1]) + FOLLOW_primary_expression_in_postfix_expression1367 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_64_in_postfix_expression1383 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_postfix_expression1385 = frozenset([65]) + FOLLOW_65_in_postfix_expression1387 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1401 = frozenset([63]) + FOLLOW_63_in_postfix_expression1405 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_argument_expression_list_in_postfix_expression1424 = frozenset([63]) + FOLLOW_63_in_postfix_expression1428 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_62_in_postfix_expression1444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_macro_parameter_list_in_postfix_expression1446 = frozenset([63]) + FOLLOW_63_in_postfix_expression1448 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_75_in_postfix_expression1462 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1466 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_66_in_postfix_expression1482 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1486 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_76_in_postfix_expression1502 = frozenset([4]) + FOLLOW_IDENTIFIER_in_postfix_expression1506 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_72_in_postfix_expression1522 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_73_in_postfix_expression1536 = frozenset([1, 62, 64, 66, 72, 73, 75, 76]) + FOLLOW_parameter_declaration_in_macro_parameter_list1559 = frozenset([1, 27]) + FOLLOW_27_in_macro_parameter_list1562 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_macro_parameter_list1564 = frozenset([1, 27]) + FOLLOW_set_in_unary_operator0 = frozenset([1]) + FOLLOW_IDENTIFIER_in_primary_expression1613 = frozenset([1]) + FOLLOW_constant_in_primary_expression1618 = frozenset([1]) + FOLLOW_62_in_primary_expression1623 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_primary_expression1625 = frozenset([63]) + FOLLOW_63_in_primary_expression1627 = frozenset([1]) + FOLLOW_HEX_LITERAL_in_constant1643 = frozenset([1]) + FOLLOW_OCTAL_LITERAL_in_constant1653 = frozenset([1]) + FOLLOW_DECIMAL_LITERAL_in_constant1663 = frozenset([1]) + FOLLOW_CHARACTER_LITERAL_in_constant1671 = frozenset([1]) + FOLLOW_IDENTIFIER_in_constant1680 = frozenset([4, 9]) + FOLLOW_STRING_LITERAL_in_constant1683 = frozenset([1, 4, 9]) + FOLLOW_IDENTIFIER_in_constant1688 = frozenset([1, 4]) + FOLLOW_FLOATING_POINT_LITERAL_in_constant1699 = frozenset([1]) + FOLLOW_assignment_expression_in_expression1715 = frozenset([1, 27]) + FOLLOW_27_in_expression1718 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_expression1720 = frozenset([1, 27]) + FOLLOW_conditional_expression_in_constant_expression1733 = frozenset([1]) + FOLLOW_lvalue_in_assignment_expression1744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) + FOLLOW_assignment_operator_in_assignment_expression1746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_assignment_expression1748 = frozenset([1]) + FOLLOW_conditional_expression_in_assignment_expression1753 = frozenset([1]) + FOLLOW_unary_expression_in_lvalue1765 = frozenset([1]) + FOLLOW_set_in_assignment_operator0 = frozenset([1]) + FOLLOW_logical_or_expression_in_conditional_expression1839 = frozenset([1, 90]) + FOLLOW_90_in_conditional_expression1842 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_conditional_expression1844 = frozenset([47]) + FOLLOW_47_in_conditional_expression1846 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_conditional_expression_in_conditional_expression1848 = frozenset([1]) + FOLLOW_logical_and_expression_in_logical_or_expression1863 = frozenset([1, 91]) + FOLLOW_91_in_logical_or_expression1866 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_logical_and_expression_in_logical_or_expression1868 = frozenset([1, 91]) + FOLLOW_inclusive_or_expression_in_logical_and_expression1881 = frozenset([1, 92]) + FOLLOW_92_in_logical_and_expression1884 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_inclusive_or_expression_in_logical_and_expression1886 = frozenset([1, 92]) + FOLLOW_exclusive_or_expression_in_inclusive_or_expression1899 = frozenset([1, 93]) + FOLLOW_93_in_inclusive_or_expression1902 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_exclusive_or_expression_in_inclusive_or_expression1904 = frozenset([1, 93]) + FOLLOW_and_expression_in_exclusive_or_expression1917 = frozenset([1, 94]) + FOLLOW_94_in_exclusive_or_expression1920 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_and_expression_in_exclusive_or_expression1922 = frozenset([1, 94]) + FOLLOW_equality_expression_in_and_expression1935 = frozenset([1, 77]) + FOLLOW_77_in_and_expression1938 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_equality_expression_in_and_expression1940 = frozenset([1, 77]) + FOLLOW_relational_expression_in_equality_expression1952 = frozenset([1, 95, 96]) + FOLLOW_set_in_equality_expression1955 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_relational_expression_in_equality_expression1961 = frozenset([1, 95, 96]) + FOLLOW_shift_expression_in_relational_expression1975 = frozenset([1, 97, 98, 99, 100]) + FOLLOW_set_in_relational_expression1978 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_shift_expression_in_relational_expression1988 = frozenset([1, 97, 98, 99, 100]) + FOLLOW_additive_expression_in_shift_expression2001 = frozenset([1, 101, 102]) + FOLLOW_set_in_shift_expression2004 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_additive_expression_in_shift_expression2010 = frozenset([1, 101, 102]) + FOLLOW_labeled_statement_in_statement2025 = frozenset([1]) + FOLLOW_compound_statement_in_statement2030 = frozenset([1]) + FOLLOW_expression_statement_in_statement2035 = frozenset([1]) + FOLLOW_selection_statement_in_statement2040 = frozenset([1]) + FOLLOW_iteration_statement_in_statement2045 = frozenset([1]) + FOLLOW_jump_statement_in_statement2050 = frozenset([1]) + FOLLOW_macro_statement_in_statement2055 = frozenset([1]) + FOLLOW_asm2_statement_in_statement2060 = frozenset([1]) + FOLLOW_asm1_statement_in_statement2065 = frozenset([1]) + FOLLOW_asm_statement_in_statement2070 = frozenset([1]) + FOLLOW_declaration_in_statement2075 = frozenset([1]) + FOLLOW_103_in_asm2_statement2086 = frozenset([4]) + FOLLOW_IDENTIFIER_in_asm2_statement2089 = frozenset([62]) + FOLLOW_62_in_asm2_statement2091 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm2_statement2094 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_63_in_asm2_statement2101 = frozenset([25]) + FOLLOW_25_in_asm2_statement2103 = frozenset([1]) + FOLLOW_104_in_asm1_statement2115 = frozenset([43]) + FOLLOW_43_in_asm1_statement2117 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm1_statement2120 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_44_in_asm1_statement2127 = frozenset([1]) + FOLLOW_105_in_asm_statement2138 = frozenset([43]) + FOLLOW_43_in_asm_statement2140 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_set_in_asm_statement2143 = frozenset([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_44_in_asm_statement2150 = frozenset([1]) + FOLLOW_IDENTIFIER_in_macro_statement2162 = frozenset([62]) + FOLLOW_62_in_macro_statement2164 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_declaration_in_macro_statement2166 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_list_in_macro_statement2170 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_macro_statement2173 = frozenset([63]) + FOLLOW_63_in_macro_statement2176 = frozenset([1]) + FOLLOW_IDENTIFIER_in_labeled_statement2188 = frozenset([47]) + FOLLOW_47_in_labeled_statement2190 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2192 = frozenset([1]) + FOLLOW_106_in_labeled_statement2197 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_constant_expression_in_labeled_statement2199 = frozenset([47]) + FOLLOW_47_in_labeled_statement2201 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2203 = frozenset([1]) + FOLLOW_107_in_labeled_statement2208 = frozenset([47]) + FOLLOW_47_in_labeled_statement2210 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_labeled_statement2212 = frozenset([1]) + FOLLOW_43_in_compound_statement2223 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_declaration_in_compound_statement2225 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_list_in_compound_statement2228 = frozenset([44]) + FOLLOW_44_in_compound_statement2231 = frozenset([1]) + FOLLOW_statement_in_statement_list2242 = frozenset([1, 4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_25_in_expression_statement2254 = frozenset([1]) + FOLLOW_expression_in_expression_statement2259 = frozenset([25]) + FOLLOW_25_in_expression_statement2261 = frozenset([1]) + FOLLOW_108_in_selection_statement2272 = frozenset([62]) + FOLLOW_62_in_selection_statement2274 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_selection_statement2278 = frozenset([63]) + FOLLOW_63_in_selection_statement2280 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2284 = frozenset([1, 109]) + FOLLOW_109_in_selection_statement2299 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2301 = frozenset([1]) + FOLLOW_110_in_selection_statement2308 = frozenset([62]) + FOLLOW_62_in_selection_statement2310 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_selection_statement2312 = frozenset([63]) + FOLLOW_63_in_selection_statement2314 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_selection_statement2316 = frozenset([1]) + FOLLOW_111_in_iteration_statement2327 = frozenset([62]) + FOLLOW_62_in_iteration_statement2329 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2333 = frozenset([63]) + FOLLOW_63_in_iteration_statement2335 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2337 = frozenset([1]) + FOLLOW_112_in_iteration_statement2344 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2346 = frozenset([111]) + FOLLOW_111_in_iteration_statement2348 = frozenset([62]) + FOLLOW_62_in_iteration_statement2350 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2354 = frozenset([63]) + FOLLOW_63_in_iteration_statement2356 = frozenset([25]) + FOLLOW_25_in_iteration_statement2358 = frozenset([1]) + FOLLOW_113_in_iteration_statement2365 = frozenset([62]) + FOLLOW_62_in_iteration_statement2367 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_statement_in_iteration_statement2369 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_statement_in_iteration_statement2373 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 63, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_iteration_statement2375 = frozenset([63]) + FOLLOW_63_in_iteration_statement2378 = frozenset([4, 5, 6, 7, 8, 9, 10, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79, 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, 117]) + FOLLOW_statement_in_iteration_statement2380 = frozenset([1]) + FOLLOW_114_in_jump_statement2393 = frozenset([4]) + FOLLOW_IDENTIFIER_in_jump_statement2395 = frozenset([25]) + FOLLOW_25_in_jump_statement2397 = frozenset([1]) + FOLLOW_115_in_jump_statement2402 = frozenset([25]) + FOLLOW_25_in_jump_statement2404 = frozenset([1]) + FOLLOW_116_in_jump_statement2409 = frozenset([25]) + FOLLOW_25_in_jump_statement2411 = frozenset([1]) + FOLLOW_117_in_jump_statement2416 = frozenset([25]) + FOLLOW_25_in_jump_statement2418 = frozenset([1]) + FOLLOW_117_in_jump_statement2423 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_expression_in_jump_statement2425 = frozenset([25]) + FOLLOW_25_in_jump_statement2427 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred2100 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred4100 = frozenset([4, 58, 59, 60, 62, 66]) + FOLLOW_declarator_in_synpred4103 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_declaration_in_synpred4105 = frozenset([4, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_43_in_synpred4108 = frozenset([1]) + FOLLOW_declaration_in_synpred5118 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred7157 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred10207 = frozenset([1]) + FOLLOW_type_specifier_in_synpred14272 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred15286 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred33444 = frozenset([1]) + FOLLOW_IDENTIFIER_in_synpred34442 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_type_qualifier_in_synpred34444 = frozenset([4, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 66]) + FOLLOW_declarator_in_synpred34447 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred39566 = frozenset([1]) + FOLLOW_type_specifier_in_synpred40570 = frozenset([1]) + FOLLOW_pointer_in_synpred66784 = frozenset([4, 58, 59, 60, 62]) + FOLLOW_58_in_synpred66788 = frozenset([4, 59, 60, 62]) + FOLLOW_59_in_synpred66793 = frozenset([4, 60, 62]) + FOLLOW_60_in_synpred66798 = frozenset([4, 62]) + FOLLOW_direct_declarator_in_synpred66802 = frozenset([1]) + FOLLOW_declarator_suffix_in_synpred67821 = frozenset([1]) + FOLLOW_58_in_synpred69830 = frozenset([1]) + FOLLOW_declarator_suffix_in_synpred70838 = frozenset([1]) + FOLLOW_62_in_synpred73878 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_type_list_in_synpred73880 = frozenset([63]) + FOLLOW_63_in_synpred73882 = frozenset([1]) + FOLLOW_62_in_synpred74892 = frozenset([4]) + FOLLOW_identifier_list_in_synpred74894 = frozenset([63]) + FOLLOW_63_in_synpred74896 = frozenset([1]) + FOLLOW_type_qualifier_in_synpred75921 = frozenset([1]) + FOLLOW_pointer_in_synpred76924 = frozenset([1]) + FOLLOW_66_in_synpred77919 = frozenset([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_qualifier_in_synpred77921 = frozenset([1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_pointer_in_synpred77924 = frozenset([1]) + FOLLOW_66_in_synpred78930 = frozenset([66]) + FOLLOW_pointer_in_synpred78932 = frozenset([1]) + FOLLOW_53_in_synpred81977 = frozenset([1]) + FOLLOW_27_in_synpred82974 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_53_in_synpred82977 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_parameter_declaration_in_synpred82981 = frozenset([1]) + FOLLOW_declarator_in_synpred83997 = frozenset([1]) + FOLLOW_abstract_declarator_in_synpred84999 = frozenset([1]) + FOLLOW_declaration_specifiers_in_synpred86994 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_declarator_in_synpred86997 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred86999 = frozenset([1, 4, 53, 58, 59, 60, 62, 64, 66]) + FOLLOW_53_in_synpred861004 = frozenset([1]) + FOLLOW_specifier_qualifier_list_in_synpred901046 = frozenset([1, 62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred901048 = frozenset([1]) + FOLLOW_direct_abstract_declarator_in_synpred911067 = frozenset([1]) + FOLLOW_62_in_synpred931086 = frozenset([62, 64, 66]) + FOLLOW_abstract_declarator_in_synpred931088 = frozenset([63]) + FOLLOW_63_in_synpred931090 = frozenset([1]) + FOLLOW_abstract_declarator_suffix_in_synpred941098 = frozenset([1]) + FOLLOW_62_in_synpred1091282 = frozenset([4, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61]) + FOLLOW_type_name_in_synpred1091284 = frozenset([63]) + FOLLOW_63_in_synpred1091286 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_cast_expression_in_synpred1091288 = frozenset([1]) + FOLLOW_74_in_synpred1141330 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_unary_expression_in_synpred1141332 = frozenset([1]) + FOLLOW_62_in_synpred1171420 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_argument_expression_list_in_synpred1171424 = frozenset([63]) + FOLLOW_63_in_synpred1171428 = frozenset([1]) + FOLLOW_62_in_synpred1181444 = frozenset([4, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 66]) + FOLLOW_macro_parameter_list_in_synpred1181446 = frozenset([63]) + FOLLOW_63_in_synpred1181448 = frozenset([1]) + FOLLOW_66_in_synpred1201482 = frozenset([4]) + FOLLOW_IDENTIFIER_in_synpred1201486 = frozenset([1]) + FOLLOW_STRING_LITERAL_in_synpred1371683 = frozenset([1]) + FOLLOW_IDENTIFIER_in_synpred1381680 = frozenset([4, 9]) + FOLLOW_STRING_LITERAL_in_synpred1381683 = frozenset([1, 9]) + FOLLOW_lvalue_in_synpred1421744 = frozenset([28, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89]) + FOLLOW_assignment_operator_in_synpred1421746 = frozenset([4, 5, 6, 7, 8, 9, 10, 62, 66, 68, 69, 72, 73, 74, 77, 78, 79]) + FOLLOW_assignment_expression_in_synpred1421748 = frozenset([1]) + FOLLOW_expression_statement_in_synpred1692035 = frozenset([1]) + FOLLOW_macro_statement_in_synpred1732055 = frozenset([1]) + FOLLOW_asm2_statement_in_synpred1742060 = frozenset([1]) + FOLLOW_declaration_in_synpred1812166 = frozenset([1]) + FOLLOW_statement_list_in_synpred1822170 = frozenset([1]) + FOLLOW_declaration_in_synpred1862225 = frozenset([1]) + FOLLOW_statement_in_synpred1882242 = frozenset([1]) + diff --git a/BaseTools/Source/Python/Eot/FvImage.py b/BaseTools/Source/Python/Eot/FvImage.py index d54c2233d8..f668a17c09 100644 --- a/BaseTools/Source/Python/Eot/FvImage.py +++ b/BaseTools/Source/Python/Eot/FvImage.py @@ -1,1453 +1,1453 @@ -## @file -# Parse FV image -# -# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## Import Modules -# -import os -import re -import sys -import uuid -import struct -import codecs -import copy - -from UserDict import IterableUserDict -from cStringIO import StringIO -from array import array - -from CommonDataClass import * -from Common.Misc import sdict, GuidStructureStringToGuidString - -import Common.EdkLogger as EdkLogger - -import EotGlobalData - -# Global definiton -gFfsPrintTitle = "%-36s %-21s %8s %8s %8s %-4s %-36s" % ("GUID", "TYPE", "OFFSET", "SIZE", "FREE", "ALIGN", "NAME") -gFfsPrintFormat = "%36s %-21s %8X %8X %8X %4s %-36s" -gGuidStringFormat = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X" -gPeiAprioriFileNameGuid = '1b45cc0a-156a-428a-af62-49864da0e6e6' -gAprioriGuid = 'fc510ee7-ffdc-11d4-bd41-0080c73c8881' -gIndention = -4 - -## Image() class -# -# A class for Image -# -class Image(array): - _HEADER_ = struct.Struct("") - _HEADER_SIZE_ = _HEADER_.size - - def __new__(cls, *args, **kwargs): - return array.__new__(cls, 'B') - - def __init__(m, ID=None): - if ID == None: - m._ID_ = str(uuid.uuid1()).upper() - else: - m._ID_ = ID - m._BUF_ = None - m._LEN_ = None - m._OFF_ = None - - m._SubImages = sdict() # {offset: Image()} - - array.__init__(m, 'B') - - def __repr__(m): - return m._ID_ - - def __len__(m): - Len = array.__len__(m) - for Offset in m._SubImages: - Len += len(m._SubImages[Offset]) - return Len - - def _Unpack(m): - m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) - return len(m) - - def _Pack(m, PadByte=0xFF): - raise NotImplementedError - - def frombuffer(m, Buffer, Offset=0, Size=None): - m._BUF_ = Buffer - m._OFF_ = Offset - # we may need the Size information in advance if it's given - m._LEN_ = Size - m._LEN_ = m._Unpack() - - def empty(m): - del m[0:] - - def GetField(m, FieldStruct, Offset=0): - return FieldStruct.unpack_from(m, Offset) - - def SetField(m, FieldStruct, Offset, *args): - # check if there's enough space - Size = FieldStruct.size - if Size > len(m): - m.extend([0] * (Size - len(m))) - FieldStruct.pack_into(m, Offset, *args) - - def _SetData(m, Data): - if len(m) < m._HEADER_SIZE_: - m.extend([0] * (m._HEADER_SIZE_ - len(m))) - else: - del m[m._HEADER_SIZE_:] - m.extend(Data) - - def _GetData(m): - if len(m) > m._HEADER_SIZE_: - return m[m._HEADER_SIZE_:] - return None - - Data = property(_GetData, _SetData) - -## FirmwareVolume() class -# -# A class for Firmware Volume -# -class FirmwareVolume(Image): - # Read FvLength, Attributes, HeaderLength, Checksum - _HEADER_ = struct.Struct("16x 1I2H8B 1Q 4x 1I 1H 1H") - _HEADER_SIZE_ = _HEADER_.size - - _FfsGuid = "8C8CE578-8A3D-4F1C-9935-896185C32DD3" - - _GUID_ = struct.Struct("16x 1I2H8B") - _LENGTH_ = struct.Struct("16x 16x 1Q") - _SIG_ = struct.Struct("16x 16x 8x 1I") - _ATTR_ = struct.Struct("16x 16x 8x 4x 1I") - _HLEN_ = struct.Struct("16x 16x 8x 4x 4x 1H") - _CHECKSUM_ = struct.Struct("16x 16x 8x 4x 4x 2x 1H") - - def __init__(self, Name=''): - Image.__init__(self) - self.Name = Name - self.FfsDict = sdict() - self.OrderedFfsDict = sdict() - self.UnDispatchedFfsDict = sdict() - self.NoDepexFfsDict = sdict() - self.ProtocolList = sdict() - - def CheckArchProtocol(self): - for Item in EotGlobalData.gArchProtocolGuids: - if Item.lower() not in EotGlobalData.gProtocolList: - - return False - - return True - - def ParseDepex(self, Depex, Type): - List = None - if Type == 'Ppi': - List = EotGlobalData.gPpiList - if Type == 'Protocol': - List = EotGlobalData.gProtocolList - DepexStack = [] - DepexList = [] - DepexString = '' - FileDepex = None - CouldBeLoaded = True - for Index in range(0, len(Depex.Expression)): - Item = Depex.Expression[Index] - if Item == 0x00: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: - return (True, 'BEFORE %s' % Guid, [Guid, 'BEFORE']) - elif Item == 0x01: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: - return (True, 'AFTER %s' % Guid, [Guid, 'AFTER']) - elif Item == 0x02: - Index = Index + 1 - Guid = gGuidStringFormat % Depex.Expression[Index] - if Guid.lower() in List: - DepexStack.append(True) - DepexList.append(Guid) - else: - DepexStack.append(False) - DepexList.append(Guid) - continue - elif Item == 0x03 or Item == 0x04: - DepexStack.append(eval(str(DepexStack.pop()) + ' ' + Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) - DepexList.append(str(DepexList.pop()) + ' ' + Depex._OPCODE_STRING_[Item].upper() + ' ' + str(DepexList.pop())) - elif Item == 0x05: - DepexStack.append(eval(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) - DepexList.append(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexList.pop())) - elif Item == 0x06: - DepexStack.append(True) - DepexList.append('TRUE') - DepexString = DepexString + 'TRUE' + ' ' - elif Item == 0x07: - DepexStack.append(False) - DepexList.append('False') - DepexString = DepexString + 'FALSE' + ' ' - elif Item == 0x08: - if Index != len(Depex.Expression) - 1: - CouldBeLoaded = False - else: - CouldBeLoaded = DepexStack.pop() - else: - CouldBeLoaded = False - if DepexList != []: - DepexString = DepexList[0].strip() - return (CouldBeLoaded, DepexString, FileDepex) - - def Dispatch(self, Db = None): - if Db == None: - return False - self.UnDispatchedFfsDict = copy.copy(self.FfsDict) - # Find PeiCore, DexCore, PeiPriori, DxePriori first - FfsSecCoreGuid = None - FfsPeiCoreGuid = None - FfsDxeCoreGuid = None - FfsPeiPrioriGuid = None - FfsDxePrioriGuid = None - for FfsID in self.UnDispatchedFfsDict: - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x03: - FfsSecCoreGuid = FfsID - continue - if Ffs.Type == 0x04: - FfsPeiCoreGuid = FfsID - continue - if Ffs.Type == 0x05: - FfsDxeCoreGuid = FfsID - continue - if Ffs.Guid.lower() == gPeiAprioriFileNameGuid: - FfsPeiPrioriGuid = FfsID - continue - if Ffs.Guid.lower() == gAprioriGuid: - FfsDxePrioriGuid = FfsID - continue - - # Parse SEC_CORE first - if FfsSecCoreGuid != None: - self.OrderedFfsDict[FfsSecCoreGuid] = self.UnDispatchedFfsDict.pop(FfsSecCoreGuid) - self.LoadPpi(Db, FfsSecCoreGuid) - - # Parse PEI first - if FfsPeiCoreGuid != None: - self.OrderedFfsDict[FfsPeiCoreGuid] = self.UnDispatchedFfsDict.pop(FfsPeiCoreGuid) - self.LoadPpi(Db, FfsPeiCoreGuid) - if FfsPeiPrioriGuid != None: - # Load PEIM described in priori file - FfsPeiPriori = self.UnDispatchedFfsDict.pop(FfsPeiPrioriGuid) - if len(FfsPeiPriori.Sections) == 1: - Section = FfsPeiPriori.Sections.popitem()[1] - if Section.Type == 0x19: - GuidStruct = struct.Struct('1I2H8B') - Start = 4 - while len(Section) > Start: - Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) - GuidString = gGuidStringFormat % Guid - Start = Start + 16 - if GuidString in self.UnDispatchedFfsDict: - self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) - self.LoadPpi(Db, GuidString) - - self.DisPatchPei(Db) - - # Parse DXE then - if FfsDxeCoreGuid != None: - self.OrderedFfsDict[FfsDxeCoreGuid] = self.UnDispatchedFfsDict.pop(FfsDxeCoreGuid) - self.LoadProtocol(Db, FfsDxeCoreGuid) - if FfsDxePrioriGuid != None: - # Load PEIM described in priori file - FfsDxePriori = self.UnDispatchedFfsDict.pop(FfsDxePrioriGuid) - if len(FfsDxePriori.Sections) == 1: - Section = FfsDxePriori.Sections.popitem()[1] - if Section.Type == 0x19: - GuidStruct = struct.Struct('1I2H8B') - Start = 4 - while len(Section) > Start: - Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) - GuidString = gGuidStringFormat % Guid - Start = Start + 16 - if GuidString in self.UnDispatchedFfsDict: - self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) - self.LoadProtocol(Db, GuidString) - - self.DisPatchDxe(Db) - - def DisPatchNoDepexFfs(self, Db): - # Last Load Drivers without Depex - for FfsID in self.NoDepexFfsDict: - NewFfs = self.NoDepexFfsDict.pop(FfsID) - self.OrderedFfsDict[FfsID] = NewFfs - self.LoadProtocol(Db, FfsID) - - return True - - def LoadCallbackProtocol(self): - IsLoad = True - for Protocol in self.ProtocolList: - for Callback in self.ProtocolList[Protocol][1]: - if Callback[0] not in self.OrderedFfsDict.keys(): - IsLoad = False - continue - if IsLoad: - EotGlobalData.gProtocolList[Protocol.lower()] = self.ProtocolList[Protocol][0] - self.ProtocolList.pop(Protocol) - - def LoadProtocol(self, Db, ModuleGuid): - SqlCommand = """select GuidValue from Report - where SourceFileFullPath in - (select Value1 from Inf where BelongsToFile = - (select BelongsToFile from Inf - where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) - and Model = %s) - and ItemType = 'Protocol' and ItemMode = 'Produced'""" \ - % (ModuleGuid, 5001, 3007) - RecordSet = Db.TblReport.Exec(SqlCommand) - for Record in RecordSet: - SqlCommand = """select Value2 from Inf where BelongsToFile = - (select DISTINCT BelongsToFile from Inf - where Value1 = - (select SourceFileFullPath from Report - where GuidValue like '%s' and ItemMode = 'Callback')) - and Value1 = 'FILE_GUID'""" % Record[0] - CallBackSet = Db.TblReport.Exec(SqlCommand) - if CallBackSet != []: - EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid - else: - EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid - - def LoadPpi(self, Db, ModuleGuid): - SqlCommand = """select GuidValue from Report - where SourceFileFullPath in - (select Value1 from Inf where BelongsToFile = - (select BelongsToFile from Inf - where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) - and Model = %s) - and ItemType = 'Ppi' and ItemMode = 'Produced'""" \ - % (ModuleGuid, 5001, 3007) - RecordSet = Db.TblReport.Exec(SqlCommand) - for Record in RecordSet: - EotGlobalData.gPpiList[Record[0].lower()] = ModuleGuid - - def DisPatchDxe(self, Db): - IsInstalled = False - ScheduleList = sdict() - for FfsID in self.UnDispatchedFfsDict: - CouldBeLoaded = False - DepexString = '' - FileDepex = None - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x07: - # Get Depex - IsFoundDepex = False - for Section in Ffs.Sections.values(): - # Find Depex - if Section.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Protocol') - break - if Section.Type == 0x01: - CompressSections = Section._SubImages[4] - for CompressSection in CompressSections.Sections: - if CompressSection.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Protocol') - break - if CompressSection.Type == 0x02: - NewSections = CompressSection._SubImages[4] - for NewSection in NewSections.Sections: - if NewSection.Type == 0x13: - IsFoundDepex = True - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Protocol') - break - - # Not find Depex - if not IsFoundDepex: - CouldBeLoaded = self.CheckArchProtocol() - DepexString = '' - FileDepex = None - - # Append New Ffs - if CouldBeLoaded: - IsInstalled = True - NewFfs = self.UnDispatchedFfsDict.pop(FfsID) - NewFfs.Depex = DepexString - if FileDepex != None: - ScheduleList.insert.insert(FileDepex[1], FfsID, NewFfs, FileDepex[0]) - else: - ScheduleList[FfsID] = NewFfs - else: - self.UnDispatchedFfsDict[FfsID].Depex = DepexString - - for FfsID in ScheduleList: - NewFfs = ScheduleList.pop(FfsID) - FfsName = 'UnKnown' - self.OrderedFfsDict[FfsID] = NewFfs - self.LoadProtocol(Db, FfsID) - - SqlCommand = """select Value2 from Inf - where BelongsToFile = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s) - and Model = %s and Value1='BASE_NAME'""" % (FfsID, 5001, 5001) - RecordSet = Db.TblReport.Exec(SqlCommand) - if RecordSet != []: - FfsName = RecordSet[0][0] - - if IsInstalled: - self.DisPatchDxe(Db) - - def DisPatchPei(self, Db): - IsInstalled = False - for FfsID in self.UnDispatchedFfsDict: - CouldBeLoaded = True - DepexString = '' - FileDepex = None - Ffs = self.UnDispatchedFfsDict[FfsID] - if Ffs.Type == 0x06 or Ffs.Type == 0x08: - # Get Depex - for Section in Ffs.Sections.values(): - if Section.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Ppi') - break - - if Section.Type == 0x01: - CompressSections = Section._SubImages[4] - for CompressSection in CompressSections.Sections: - if CompressSection.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Ppi') - break - if CompressSection.Type == 0x02: - NewSections = CompressSection._SubImages[4] - for NewSection in NewSections.Sections: - if NewSection.Type == 0x1B: - CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Ppi') - break - - # Append New Ffs - if CouldBeLoaded: - IsInstalled = True - NewFfs = self.UnDispatchedFfsDict.pop(FfsID) - NewFfs.Depex = DepexString - self.OrderedFfsDict[FfsID] = NewFfs - self.LoadPpi(Db, FfsID) - else: - self.UnDispatchedFfsDict[FfsID].Depex = DepexString - - if IsInstalled: - self.DisPatchPei(Db) - - - def __str__(self): - global gIndention - gIndention += 4 - FvInfo = '\n' + ' ' * gIndention - FvInfo += "[FV:%s] file_system=%s size=%x checksum=%s\n" % (self.Name, self.FileSystemGuid, self.Size, self.Checksum) - FfsInfo = "\n".join([str(self.FfsDict[FfsId]) for FfsId in self.FfsDict]) - gIndention -= 4 - return FvInfo + FfsInfo - - def _Unpack(self): - Size = self._LENGTH_.unpack_from(self._BUF_, self._OFF_)[0] - self.empty() - self.extend(self._BUF_[self._OFF_:self._OFF_+Size]) - - # traverse the FFS - EndOfFv = Size - FfsStartAddress = self.HeaderSize - LastFfsObj = None - while FfsStartAddress < EndOfFv: - FfsObj = Ffs() - FfsObj.frombuffer(self, FfsStartAddress) - FfsId = repr(FfsObj) - if ((self.Attributes & 0x00000800) != 0 and len(FfsObj) == 0xFFFFFF) \ - or ((self.Attributes & 0x00000800) == 0 and len(FfsObj) == 0): - if LastFfsObj != None: - LastFfsObj.FreeSpace = EndOfFv - LastFfsObj._OFF_ - len(LastFfsObj) - else: - if FfsId in self.FfsDict: - EdkLogger.error("FV", 0, "Duplicate GUID in FFS", - ExtraData="\t%s @ %s\n\t%s @ %s" \ - % (FfsObj.Guid, FfsObj.Offset, - self.FfsDict[FfsId].Guid, self.FfsDict[FfsId].Offset)) - self.FfsDict[FfsId] = FfsObj - if LastFfsObj != None: - LastFfsObj.FreeSpace = FfsStartAddress - LastFfsObj._OFF_ - len(LastFfsObj) - - FfsStartAddress += len(FfsObj) - # - # align to next 8-byte aligned address: A = (A + 8 - 1) & (~(8 - 1)) - # The next FFS must be at the latest next 8-byte aligned address - # - FfsStartAddress = (FfsStartAddress + 7) & (~7) - LastFfsObj = FfsObj - - def _GetAttributes(self): - return self.GetField(self._ATTR_, 0)[0] - - def _GetSize(self): - return self.GetField(self._LENGTH_, 0)[0] - - def _GetChecksum(self): - return self.GetField(self._CHECKSUM_, 0)[0] - - def _GetHeaderLength(self): - return self.GetField(self._HLEN_, 0)[0] - - def _GetFileSystemGuid(self): - return gGuidStringFormat % self.GetField(self._GUID_, 0) - - Attributes = property(_GetAttributes) - Size = property(_GetSize) - Checksum = property(_GetChecksum) - HeaderSize = property(_GetHeaderLength) - FileSystemGuid = property(_GetFileSystemGuid) - -## CompressedImage() class -# -# A class for Compressed Image -# -class CompressedImage(Image): - # UncompressedLength = 4-byte - # CompressionType = 1-byte - _HEADER_ = struct.Struct("1I 1B") - _HEADER_SIZE_ = _HEADER_.size - - _ORIG_SIZE_ = struct.Struct("1I") - _CMPRS_TYPE_ = struct.Struct("4x 1B") - - def __init__(m, CompressedData=None, CompressionType=None, UncompressedLength=None): - Image.__init__(m) - if UncompressedLength != None: - m.UncompressedLength = UncompressedLength - if CompressionType != None: - m.CompressionType = CompressionType - if CompressedData != None: - m.Data = CompressedData - - def __str__(m): - global gIndention - S = "algorithm=%s uncompressed=%x" % (m.CompressionType, m.UncompressedLength) - for Sec in m.Sections: - S += '\n' + str(Sec) - - return S - - def _SetOriginalSize(m, Size): - m.SetField(m._ORIG_SIZE_, 0, Size) - - def _GetOriginalSize(m): - return m.GetField(m._ORIG_SIZE_)[0] - - def _SetCompressionType(m, Type): - m.SetField(m._CMPRS_TYPE_, 0, Type) - - def _GetCompressionType(m): - return m.GetField(m._CMPRS_TYPE_)[0] - - def _GetSections(m): - try: - import EfiCompressor - TmpData = EfiCompressor.FrameworkDecompress( - m[m._HEADER_SIZE_:], - len(m) - m._HEADER_SIZE_ - ) - DecData = array('B') - DecData.fromstring(TmpData) - except: - import EfiCompressor - TmpData = EfiCompressor.UefiDecompress( - m[m._HEADER_SIZE_:], - len(m) - m._HEADER_SIZE_ - ) - DecData = array('B') - DecData.fromstring(TmpData) - - SectionList = [] - Offset = 0 - while Offset < len(DecData): - Sec = Section() - try: - Sec.frombuffer(DecData, Offset) - Offset += Sec.Size - # the section is aligned to 4-byte boundary - except: - break - SectionList.append(Sec) - return SectionList - - UncompressedLength = property(_GetOriginalSize, _SetOriginalSize) - CompressionType = property(_GetCompressionType, _SetCompressionType) - Sections = property(_GetSections) - -## GuidDefinedImage() class -# -# A class for GUID Defined Image -# -class GuidDefinedImage(Image): - _HEADER_ = struct.Struct("1I2H8B 1H 1H") - _HEADER_SIZE_ = _HEADER_.size - - _GUID_ = struct.Struct("1I2H8B") - _DATA_OFFSET_ = struct.Struct("16x 1H") - _ATTR_ = struct.Struct("18x 1H") - - CRC32_GUID = "FC1BCDB0-7D31-49AA-936A-A4600D9DD083" - TIANO_COMPRESS_GUID = 'A31280AD-481E-41B6-95E8-127F4C984779' - LZMA_COMPRESS_GUID = 'EE4E5898-3914-4259-9D6E-DC7BD79403CF' - - def __init__(m, SectionDefinitionGuid=None, DataOffset=None, Attributes=None, Data=None): - Image.__init__(m) - if SectionDefinitionGuid != None: - m.SectionDefinitionGuid = SectionDefinitionGuid - if DataOffset != None: - m.DataOffset = DataOffset - if Attributes != None: - m.Attributes = Attributes - if Data != None: - m.Data = Data - - def __str__(m): - S = "guid=%s" % (gGuidStringFormat % m.SectionDefinitionGuid) - for Sec in m.Sections: - S += "\n" + str(Sec) - return S - - def _Unpack(m): - # keep header in this Image object - m.empty() - m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) - return len(m) - - def _SetAttribute(m, Attribute): - m.SetField(m._ATTR_, 0, Attribute) - - def _GetAttribute(m): - return m.GetField(m._ATTR_)[0] - - def _SetGuid(m, Guid): - m.SetField(m._GUID_, 0, Guid) - - def _GetGuid(m): - return m.GetField(m._GUID_) - - def _SetDataOffset(m, Offset): - m.SetField(m._DATA_OFFSET_, 0, Offset) - - def _GetDataOffset(m): - return m.GetField(m._DATA_OFFSET_)[0] - - def _GetSections(m): - SectionList = [] - Guid = gGuidStringFormat % m.SectionDefinitionGuid - if Guid == m.CRC32_GUID: - # skip the CRC32 value, we don't do CRC32 verification here - Offset = m.DataOffset - 4 - while Offset < len(m): - Sec = Section() - try: - Sec.frombuffer(m, Offset) - Offset += Sec.Size - # the section is aligned to 4-byte boundary - Offset = (Offset + 3) & (~3) - except: - break - SectionList.append(Sec) - elif Guid == m.TIANO_COMPRESS_GUID: - try: - import EfiCompressor - # skip the header - Offset = m.DataOffset - 4 - TmpData = EfiCompressor.FrameworkDecompress(m[Offset:], len(m)-Offset) - DecData = array('B') - DecData.fromstring(TmpData) - Offset = 0 - while Offset < len(DecData): - Sec = Section() - try: - Sec.frombuffer(DecData, Offset) - Offset += Sec.Size - # the section is aligned to 4-byte boundary - Offset = (Offset + 3) & (~3) - except: - break - SectionList.append(Sec) - except: - pass - elif Guid == m.LZMA_COMPRESS_GUID: - try: - import LzmaCompressor - # skip the header - Offset = m.DataOffset - 4 - TmpData = LzmaCompressor.LzmaDecompress(m[Offset:], len(m)-Offset) - DecData = array('B') - DecData.fromstring(TmpData) - Offset = 0 - while Offset < len(DecData): - Sec = Section() - try: - Sec.frombuffer(DecData, Offset) - Offset += Sec.Size - # the section is aligned to 4-byte boundary - Offset = (Offset + 3) & (~3) - except: - break - SectionList.append(Sec) - except: - pass - - return SectionList - - Attributes = property(_GetAttribute, _SetAttribute) - SectionDefinitionGuid = property(_GetGuid, _SetGuid) - DataOffset = property(_GetDataOffset, _SetDataOffset) - Sections = property(_GetSections) - -## Depex() class -# -# A class for Depex -# -class Depex(Image): - _HEADER_ = struct.Struct("") - _HEADER_SIZE_ = 0 - - _GUID_ = struct.Struct("1I2H8B") - _OPCODE_ = struct.Struct("1B") - - _OPCODE_STRING_ = { - 0x00 : "BEFORE", - 0x01 : "AFTER", - 0x02 : "PUSH", - 0x03 : "AND", - 0x04 : "OR", - 0x05 : "NOT", - 0x06 : "TRUE", - 0x07 : "FALSE", - 0x08 : "END", - 0x09 : "SOR" - } - - _NEXT_ = { - -1 : _OPCODE_, # first one in depex must be an opcdoe - 0x00 : _GUID_, #"BEFORE", - 0x01 : _GUID_, #"AFTER", - 0x02 : _GUID_, #"PUSH", - 0x03 : _OPCODE_, #"AND", - 0x04 : _OPCODE_, #"OR", - 0x05 : _OPCODE_, #"NOT", - 0x06 : _OPCODE_, #"TRUE", - 0x07 : _OPCODE_, #"FALSE", - 0x08 : None, #"END", - 0x09 : _OPCODE_, #"SOR" - } - - def __init__(m): - Image.__init__(m) - m._ExprList = [] - - def __str__(m): - global gIndention - gIndention += 4 - Indention = ' ' * gIndention - S = '\n' - for T in m.Expression: - if T in m._OPCODE_STRING_: - S += Indention + m._OPCODE_STRING_[T] - if T not in [0x00, 0x01, 0x02]: - S += '\n' - else: - S += ' ' + gGuidStringFormat % T + '\n' - gIndention -= 4 - return S - - def _Unpack(m): - # keep header in this Image object - m.empty() - m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) - return len(m) - - def _GetExpression(m): - if m._ExprList == []: - Offset = 0 - CurrentData = m._OPCODE_ - while Offset < len(m): - Token = CurrentData.unpack_from(m, Offset) - Offset += CurrentData.size - if len(Token) == 1: - Token = Token[0] - if Token in m._NEXT_: - CurrentData = m._NEXT_[Token] - else: - CurrentData = m._GUID_ - else: - CurrentData = m._OPCODE_ - m._ExprList.append(Token) - if CurrentData == None: - break - return m._ExprList - - Expression = property(_GetExpression) - -## Ui() class -# -# A class for Ui -# -class Ui(Image): - _HEADER_ = struct.Struct("") - _HEADER_SIZE_ = 0 - - def __init__(m): - Image.__init__(m) - - def __str__(m): - return m.String - - def _Unpack(m): - # keep header in this Image object - m.empty() - m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) - return len(m) - - def _GetUiString(m): - return codecs.utf_16_decode(m[0:-2].tostring())[0] - - String = property(_GetUiString) - -## Section() class -# -# A class for Section -# -class Section(Image): - _TypeName = { - 0x00 : "", - 0x01 : "COMPRESSION", - 0x02 : "GUID_DEFINED", - 0x10 : "PE32", - 0x11 : "PIC", - 0x12 : "TE", - 0x13 : "DXE_DEPEX", - 0x14 : "VERSION", - 0x15 : "USER_INTERFACE", - 0x16 : "COMPATIBILITY16", - 0x17 : "FIRMWARE_VOLUME_IMAGE", - 0x18 : "FREEFORM_SUBTYPE_GUID", - 0x19 : "RAW", - 0x1B : "PEI_DEPEX" - } - - _SectionSubImages = { - 0x01 : CompressedImage, - 0x02 : GuidDefinedImage, - 0x17 : FirmwareVolume, - 0x13 : Depex, - 0x1B : Depex, - 0x15 : Ui - } - - # Size = 3-byte - # Type = 1-byte - _HEADER_ = struct.Struct("3B 1B") - _HEADER_SIZE_ = _HEADER_.size - - # SubTypeGuid - # _FREE_FORM_SUBTYPE_GUID_HEADER_ = struct.Struct("1I2H8B") - - _SIZE_ = struct.Struct("3B") - _TYPE_ = struct.Struct("3x 1B") - - def __init__(m, Type=None, Size=None): - Image.__init__(m) - m._Alignment = 1 - if Type != None: - m.Type = Type - if Size != None: - m.Size = Size - - def __str__(m): - global gIndention - gIndention += 4 - SectionInfo = ' ' * gIndention - if m.Type in m._TypeName: - SectionInfo += "[SECTION:%s] offset=%x size=%x" % (m._TypeName[m.Type], m._OFF_, m.Size) - else: - SectionInfo += "[SECTION:%x] offset=%x size=%x " % (m.Type, m._OFF_, m.Size) - for Offset in m._SubImages: - SectionInfo += ", " + str(m._SubImages[Offset]) - gIndention -= 4 - return SectionInfo - - def _Unpack(m): - m.empty() - Type, = m._TYPE_.unpack_from(m._BUF_, m._OFF_) - Size1, Size2, Size3 = m._SIZE_.unpack_from(m._BUF_, m._OFF_) - Size = Size1 + (Size2 << 8) + (Size3 << 16) - - if Type not in m._SectionSubImages: - # no need to extract sub-image, keep all in this Image object - m.extend(m._BUF_[m._OFF_ : m._OFF_ + Size]) - else: - # keep header in this Image object - m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._HEADER_SIZE_]) - # - # use new Image object to represent payload, which may be another kind - # of image such as PE32 - # - PayloadOffset = m._HEADER_SIZE_ - PayloadLen = m.Size - m._HEADER_SIZE_ - Payload = m._SectionSubImages[m.Type]() - Payload.frombuffer(m._BUF_, m._OFF_ + m._HEADER_SIZE_, PayloadLen) - m._SubImages[PayloadOffset] = Payload - - return Size - - def _SetSize(m, Size): - Size1 = Size & 0xFF - Size2 = (Size & 0xFF00) >> 8 - Size3 = (Size & 0xFF0000) >> 16 - m.SetField(m._SIZE_, 0, Size1, Size2, Size3) - - def _GetSize(m): - Size1, Size2, Size3 = m.GetField(m._SIZE_) - return Size1 + (Size2 << 8) + (Size3 << 16) - - def _SetType(m, Type): - m.SetField(m._TYPE_, 0, Type) - - def _GetType(m): - return m.GetField(m._TYPE_)[0] - - def _GetAlignment(m): - return m._Alignment - - def _SetAlignment(m, Alignment): - m._Alignment = Alignment - AlignmentMask = Alignment - 1 - # section alignment is actually for payload, so we need to add header size - PayloadOffset = m._OFF_ + m._HEADER_SIZE_ - if (PayloadOffset & (~AlignmentMask)) == 0: - return - NewOffset = (PayloadOffset + AlignmentMask) & (~AlignmentMask) - while (NewOffset - PayloadOffset) < m._HEADER_SIZE_: - NewOffset += m._Alignment - - def tofile(m, f): - m.Size = len(m) - Image.tofile(m, f) - for Offset in m._SubImages: - m._SubImages[Offset].tofile(f) - - Type = property(_GetType, _SetType) - Size = property(_GetSize, _SetSize) - Alignment = property(_GetAlignment, _SetAlignment) - # SubTypeGuid = property(_GetGuid, _SetGuid) - -## PadSection() class -# -# A class for Pad Section -# -class PadSection(Section): - def __init__(m, Size): - Section.__init__(m) - m.Type = 0x19 - m.Size = Size - m.Data = [0] * (Size - m._HEADER_SIZE_) - -## Ffs() class -# -# A class for Ffs Section -# -class Ffs(Image): - _FfsFormat = "24B%(payload_size)sB" - # skip IntegrityCheck - _HEADER_ = struct.Struct("1I2H8B 2x 1B 1B 3B 1B") - _HEADER_SIZE_ = _HEADER_.size - - _NAME_ = struct.Struct("1I2H8B") - _INT_CHECK_ = struct.Struct("16x 1H") - _TYPE_ = struct.Struct("18x 1B") - _ATTR_ = struct.Struct("19x 1B") - _SIZE_ = struct.Struct("20x 3B") - _STATE_ = struct.Struct("23x 1B") - - VTF_GUID = "1BA0062E-C779-4582-8566-336AE8F78F09" - - FFS_ATTRIB_FIXED = 0x04 - FFS_ATTRIB_DATA_ALIGNMENT = 0x38 - FFS_ATTRIB_CHECKSUM = 0x40 - - _TypeName = { - 0x00 : "", - 0x01 : "RAW", - 0x02 : "FREEFORM", - 0x03 : "SECURITY_CORE", - 0x04 : "PEI_CORE", - 0x05 : "DXE_CORE", - 0x06 : "PEIM", - 0x07 : "DRIVER", - 0x08 : "COMBINED_PEIM_DRIVER", - 0x09 : "APPLICATION", - 0x0A : "SMM", - 0x0B : "FIRMWARE_VOLUME_IMAGE", - 0x0C : "COMBINED_SMM_DXE", - 0x0D : "SMM_CORE", - 0xc0 : "OEM_MIN", - 0xdf : "OEM_MAX", - 0xe0 : "DEBUG_MIN", - 0xef : "DEBUG_MAX", - 0xf0 : "FFS_MIN", - 0xff : "FFS_MAX", - 0xf0 : "FFS_PAD", - } - - def __init__(self): - Image.__init__(self) - self.FreeSpace = 0 - - self.Sections = sdict() - self.Depex = '' - - self.__ID__ = None - - def __str__(self): - global gIndention - gIndention += 4 - Indention = ' ' * gIndention - FfsInfo = Indention - FfsInfo += "[FFS:%s] offset=%x size=%x guid=%s free_space=%x alignment=%s\n" % \ - (Ffs._TypeName[self.Type], self._OFF_, self.Size, self.Guid, self.FreeSpace, self.Alignment) - SectionInfo = '\n'.join([str(self.Sections[Offset]) for Offset in self.Sections]) - gIndention -= 4 - return FfsInfo + SectionInfo + "\n" - - def __len__(self): - return self.Size - - def __repr__(self): - return self.__ID__ - - def _Unpack(self): - Size1, Size2, Size3 = self._SIZE_.unpack_from(self._BUF_, self._OFF_) - Size = Size1 + (Size2 << 8) + (Size3 << 16) - self.empty() - self.extend(self._BUF_[self._OFF_ : self._OFF_ + Size]) - - # Pad FFS may use the same GUID. We need to avoid it. - if self.Type == 0xf0: - self.__ID__ = str(uuid.uuid1()).upper() - else: - self.__ID__ = self.Guid - - # Traverse the SECTION. RAW and PAD do not have sections - if self.Type not in [0xf0, 0x01] and Size > 0 and Size < 0xFFFFFF: - EndOfFfs = Size - SectionStartAddress = self._HEADER_SIZE_ - while SectionStartAddress < EndOfFfs: - SectionObj = Section() - SectionObj.frombuffer(self, SectionStartAddress) - #f = open(repr(SectionObj), 'wb') - #SectionObj.Size = 0 - #SectionObj.tofile(f) - #f.close() - self.Sections[SectionStartAddress] = SectionObj - SectionStartAddress += len(SectionObj) - SectionStartAddress = (SectionStartAddress + 3) & (~3) - - def Pack(self): - pass - - def SetFreeSpace(self, Size): - self.FreeSpace = Size - - def _GetGuid(self): - return gGuidStringFormat % self.Name - - def _SetName(self, Value): - # Guid1, Guid2, Guid3, Guid4, Guid5, Guid6, Guid7, Guid8, Guid9, Guid10, Guid11 - self.SetField(self._NAME_, 0, Value) - - def _GetName(self): - # Guid1, Guid2, Guid3, Guid4, Guid5, Guid6, Guid7, Guid8, Guid9, Guid10, Guid11 - return self.GetField(self._NAME_) - - def _SetSize(m, Size): - Size1 = Size & 0xFF - Size2 = (Size & 0xFF00) >> 8 - Size3 = (Size & 0xFF0000) >> 16 - m.SetField(m._SIZE_, 0, Size1, Size2, Size3) - - def _GetSize(m): - Size1, Size2, Size3 = m.GetField(m._SIZE_) - return Size1 + (Size2 << 8) + (Size3 << 16) - - def _SetType(m, Type): - m.SetField(m._TYPE_, 0, Type) - - def _GetType(m): - return m.GetField(m._TYPE_)[0] - - def _SetAttributes(self, Value): - self.SetField(m._ATTR_, 0, Value) - - def _GetAttributes(self): - return self.GetField(self._ATTR_)[0] - - def _GetFixed(self): - if (self.Attributes & self.FFS_ATTRIB_FIXED) != 0: - return True - return False - - def _GetCheckSum(self): - if (self.Attributes & self.FFS_ATTRIB_CHECKSUM) != 0: - return True - return False - - def _GetAlignment(self): - return (self.Attributes & self.FFS_ATTRIB_DATA_ALIGNMENT) >> 3 - - def _SetState(self, Value): - self.SetField(m._STATE_, 0, Value) - - def _GetState(self): - return self.GetField(m._STATE_)[0] - - Name = property(_GetName, _SetName) - Guid = property(_GetGuid) - Type = property(_GetType, _SetType) - Size = property(_GetSize, _SetSize) - Attributes = property(_GetAttributes, _SetAttributes) - Fixed = property(_GetFixed) - Checksum = property(_GetCheckSum) - Alignment = property(_GetAlignment) - State = property(_GetState, _SetState) - -## PeImage() class -# -# A class for PE Image -# -class PeImage: - # - # just extract e_lfanew - # - _DosHeaderFormat = "60x 1I" - # - # Machine - # NumberOfSections - # SizeOfOptionalHeader - # - _FileHeaderFormat = "4x 1H 1H 4x 4x 4x 1H 2x" - # - # Magic - # SizeOfImage - # SizeOfHeaders - # CheckSum - # NumberOfRvaAndSizes - # - _OptionalHeader32Format = "1H 54x 1I 1I 1I 24x 1I" - _OptionalHeader64Format = "" - def __init__(self, Buf, Offset, Size): - self.Offset = Offset - self.Size = Size - self.Machine = 0x014c # IA32 - self.NumberOfSections = 0 - self.SizeOfImage = 0 - self.SizeOfOptionalHeader = 0 - self.Checksum = 0 - self._PeImageBuf = Buf - self._SectionList = [] - - self._DosHeader = struct.Struct(PeImage._DosHeaderFormat) - self._FileHeader = struct.Struct(PeImage._FileHeaderFormat) - self._OptionalHeader32 = struct.Struct(PeImage._OptionalHeader32Format) - - self.Buffer = None - - self._Unpack() - - def __str__(self): - pass - - def __len__(self): - return self.Size - - def _Unpack(self): - # from DOS header, get the offset of PE header - FileHeaderOffset, = self._DosHeader.unpack_from(self._PeImageBuf, self.Offset) - if FileHeaderOffset < struct.calcsize(self._DosHeaderFormat): - EdkLogger.error("PE+", 0, "Invalid offset of IMAGE_FILE_HEADER: %s" % FileHeaderOffset) - - # from FILE header, get the optional header size - self.Machine, self.NumberOfSections, self.SizeOfOptionalHeader = \ - self._FileHeader.unpack_from(self._PeImageBuf, self.Offset + FileHeaderOffset) - - print "Machine=%x NumberOfSections=%x SizeOfOptionalHeader=%x" % (self.Machine, self.NumberOfSections, self.SizeOfOptionalHeader) - # optional header follows the FILE header - OptionalHeaderOffset = FileHeaderOffset + struct.calcsize(self._FileHeaderFormat) - Magic, self.SizeOfImage, SizeOfHeaders, self.Checksum, NumberOfRvaAndSizes = \ - self._OptionalHeader32.unpack_from(self._PeImageBuf, self.Offset + OptionalHeaderOffset) - print "Magic=%x SizeOfImage=%x SizeOfHeaders=%x, Checksum=%x, NumberOfRvaAndSizes=%x" % (Magic, self.SizeOfImage, SizeOfHeaders, self.Checksum, NumberOfRvaAndSizes) - - PeImageSectionTableOffset = OptionalHeaderOffset + self.SizeOfOptionalHeader - PeSections = PeSectionTable(self._PeImageBuf, self.Offset + PeImageSectionTableOffset, self.NumberOfSections) - - print "%x" % PeSections.GetFileAddress(0x3920) - -## PeSectionTable() class -# -# A class for PE Section Table -# -class PeSectionTable: - def __init__(self, Buf, Offset, NumberOfSections): - self._SectionList = [] - - SectionHeaderOffset = Offset - for TableIndex in range(0, NumberOfSections): - SectionHeader = PeSectionHeader(Buf, SectionHeaderOffset) - self._SectionList.append(SectionHeader) - SectionHeaderOffset += len(SectionHeader) - print SectionHeader - - def GetFileAddress(self, Rva): - for PeSection in self._SectionList: - if Rva in PeSection: - return PeSection[Rva] - -## PeSectionHeader() class -# -# A class for PE Section Header -# -class PeSectionHeader: - # - # VirtualAddress - # SizeOfRawData - # PointerToRawData - # - _HeaderFormat = "12x 1I 1I 1I 16x" - _HeaderLength = struct.calcsize(_HeaderFormat) - - def __init__(self, Buf, Offset): - self.VirtualAddressStart, self.SizeOfRawData, self.PointerToRawData = \ - struct.unpack_from(self._HeaderFormat, Buf, Offset) - self.VirtualAddressEnd = self.VirtualAddressStart + self.SizeOfRawData - 1 - - def __str__(self): - return "VirtualAddress=%x, SizeOfRawData=%x, PointerToRawData=%x" % (self.VirtualAddressStart, self.SizeOfRawData, self.PointerToRawData) - - def __len__(self): - return self._HeaderLength - - def __contains__(self, Rva): - return Rva >= self.VirtualAddressStart and Rva <= self.VirtualAddressEnd - - def __getitem__(self, Rva): - return Rva - self.VirtualAddressStart + self.PointerToRawData - -## LinkMap() class -# -# A class for Link Map -# -class LinkMap: - _StartFlag = { - "MSFT" : re.compile("Address +Publics by Value +Rva\+Base +Lib:Object"), - "GCC" : re.compile("^\.(text|bss|data|edata)"), - } - - _MappingFormat = { - "MSFT" : re.compile("([0-9a-f]+):([0-9a-f]+)\s+_+([0-9A-Za-z]+)\s+([0-9a-f]+)\s+"), - "GCC" : re.compile("^(\.\w)?\s+(0x[0-9a-f]+)\s+_+([0-9A-Za-z]+)"), - } - - def __init__(self, MapFile, MapType="MSFT"): - self.File = MapFile - self.MapType = MapType - self._Globals = {} # global:RVA - - self._Parse() - - def _Parse(self): - MapFile = open(self.File, 'r') - MappingTitle = self._StartFlag[self.MapType] - MappingFormat = self._MappingFormat[self.MapType] - MappingStart = False - try: - for Line in MapFile: - Line = Line.strip() - if not MappingStart: - if MappingTitle.match(Line) != None: - MappingStart = True - continue - ResultList = MappingFormat.findall(Line) - if len(ResultList) == 0 or len(ResultList[0]) != 4: - continue - self._Globals[ResultList[2]] = int(ResultList[3], 16) - EdkLogger.verbose(ResultList[0]) - finally: - MapFile.close() - - def __contains__(self, Var): - return Var in self._Globals - - def __getitem__(self, Var): - if Var not in self._Globals: - return None - return self._Globals[Var] - -## MultipleFv() class -# -# A class for Multiple FV -# -class MultipleFv(FirmwareVolume): - def __init__(self, FvList): - FirmwareVolume.__init__(self) - self.BasicInfo = [] - for FvPath in FvList: - FvName = os.path.splitext(os.path.split(FvPath)[1])[0] - Fd = open(FvPath, 'rb') - Buf = array('B') - try: - Buf.fromfile(Fd, os.path.getsize(FvPath)) - except EOFError: - pass - - Fv = FirmwareVolume(FvName) - Fv.frombuffer(Buf, 0, len(Buf)) - - self.BasicInfo.append([Fv.Name, Fv.FileSystemGuid, Fv.Size]) - self.FfsDict.append(Fv.FfsDict) - -# Version and Copyright -__version_number__ = "0.01" -__version__ = "%prog Version " + __version_number__ -__copyright__ = "Copyright (c) 2008, Intel Corporation. All rights reserved." - -## Parse command line options -# -# Using standard Python module optparse to parse command line option of this tool. -# -# @retval Options A optparse.Values object containing the parsed options -# @retval InputFile Path of file to be trimmed -# -def GetOptions(): - OptionList = [ - make_option("-a", "--arch", dest="Arch", - help="The input file is preprocessed source code, including C or assembly code"), - make_option("-p", "--platform", dest="ActivePlatform", - help="The input file is preprocessed VFR file"), - make_option("-m", "--module", dest="ActiveModule", - help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), - make_option("-f", "--FDF-file", dest="FdfFile", - help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), - make_option("-o", "--output", dest="OutputDirectory", - help="File to store the trimmed content"), - make_option("-t", "--toolchain-tag", dest="ToolChain", - help=""), - make_option("-k", "--msft", dest="MakefileType", action="store_const", const="nmake", - help=""), - make_option("-g", "--gcc", dest="MakefileType", action="store_const", const="gmake", - help=""), - make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, - help="Run verbosely"), - make_option("-d", "--debug", dest="LogLevel", type="int", - help="Run with debug information"), - make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, - help="Run quietly"), - make_option("-?", action="help", help="show this help message and exit"), - ] - - # use clearer usage to override default usage message - UsageString = "%prog [-a ARCH] [-p PLATFORM] [-m MODULE] [-t TOOLCHAIN_TAG] [-k] [-g] [-v|-d |-q] [-o ] [GenC|GenMake]" - - Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) - Parser.set_defaults(Arch=[]) - Parser.set_defaults(ActivePlatform=None) - Parser.set_defaults(ActiveModule=None) - Parser.set_defaults(OutputDirectory="build") - Parser.set_defaults(FdfFile=None) - Parser.set_defaults(ToolChain="MYTOOLS") - if sys.platform == "win32": - Parser.set_defaults(MakefileType="nmake") - else: - Parser.set_defaults(MakefileType="gmake") - Parser.set_defaults(LogLevel=EdkLogger.INFO) - - Options, Args = Parser.parse_args() - - # error check - if len(Args) == 0: - Options.Target = "genmake" - sys.argv.append("genmake") - elif len(Args) == 1: - Options.Target = Args[0].lower() - if Options.Target not in ["genc", "genmake"]: - EdkLogger.error("AutoGen", OPTION_NOT_SUPPORTED, "Not supported target", - ExtraData="%s\n\n%s" % (Options.Target, Parser.get_usage())) - else: - EdkLogger.error("AutoGen", OPTION_NOT_SUPPORTED, "Too many targets", - ExtraData=Parser.get_usage()) - - return Options - -## Entrance method -# -# This method mainly dispatch specific methods per the command line options. -# If no error found, return zero value so the caller of this tool can know -# if it's executed successfully or not. -# -# @retval 0 Tool was successful -# @retval 1 Tool failed -# -def Main(): - from build import build - try: - Option = GetOptions() - build.main() - except Exception, e: - print e - return 1 - - return 0 - -# This acts like the main() function for the script, unless it is 'import'ed into another script. -if __name__ == '__main__': - EdkLogger.Initialize() - # sys.exit(Main()) - - if len(sys.argv) > 1: - FilePath = sys.argv[1] - if FilePath.lower().endswith(".fv"): - fd = open(FilePath, 'rb') - buf = array('B') - try: - buf.fromfile(fd, os.path.getsize(FilePath)) - except EOFError: - pass - - fv = FirmwareVolume("FVRECOVERY") - fv.frombuffer(buf, 0, len(buf)) - #fv.Dispatch(None) - print fv - elif FilePath.endswith(".efi"): - fd = open(FilePath, 'rb') - buf = array('B') - Size = os.path.getsize(FilePath) - - try: - buf.fromfile(fd, Size) - except EOFError: - pass - - PeSection = Section(Type=0x10) - PeSection.Data = buf - sf, ext = os.path.splitext(os.path.basename(FilePath)) - sf += ".sec" - PeSection.tofile(open(sf, 'wb')) - elif FilePath.endswith(".map"): - mf = LinkMap(FilePath) +## @file +# Parse FV image +# +# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## Import Modules +# +import os +import re +import sys +import uuid +import struct +import codecs +import copy + +from UserDict import IterableUserDict +from cStringIO import StringIO +from array import array + +from CommonDataClass import * +from Common.Misc import sdict, GuidStructureStringToGuidString + +import Common.EdkLogger as EdkLogger + +import EotGlobalData + +# Global definiton +gFfsPrintTitle = "%-36s %-21s %8s %8s %8s %-4s %-36s" % ("GUID", "TYPE", "OFFSET", "SIZE", "FREE", "ALIGN", "NAME") +gFfsPrintFormat = "%36s %-21s %8X %8X %8X %4s %-36s" +gGuidStringFormat = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X" +gPeiAprioriFileNameGuid = '1b45cc0a-156a-428a-af62-49864da0e6e6' +gAprioriGuid = 'fc510ee7-ffdc-11d4-bd41-0080c73c8881' +gIndention = -4 + +## Image() class +# +# A class for Image +# +class Image(array): + _HEADER_ = struct.Struct("") + _HEADER_SIZE_ = _HEADER_.size + + def __new__(cls, *args, **kwargs): + return array.__new__(cls, 'B') + + def __init__(m, ID=None): + if ID == None: + m._ID_ = str(uuid.uuid1()).upper() + else: + m._ID_ = ID + m._BUF_ = None + m._LEN_ = None + m._OFF_ = None + + m._SubImages = sdict() # {offset: Image()} + + array.__init__(m, 'B') + + def __repr__(m): + return m._ID_ + + def __len__(m): + Len = array.__len__(m) + for Offset in m._SubImages: + Len += len(m._SubImages[Offset]) + return Len + + def _Unpack(m): + m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) + return len(m) + + def _Pack(m, PadByte=0xFF): + raise NotImplementedError + + def frombuffer(m, Buffer, Offset=0, Size=None): + m._BUF_ = Buffer + m._OFF_ = Offset + # we may need the Size information in advance if it's given + m._LEN_ = Size + m._LEN_ = m._Unpack() + + def empty(m): + del m[0:] + + def GetField(m, FieldStruct, Offset=0): + return FieldStruct.unpack_from(m, Offset) + + def SetField(m, FieldStruct, Offset, *args): + # check if there's enough space + Size = FieldStruct.size + if Size > len(m): + m.extend([0] * (Size - len(m))) + FieldStruct.pack_into(m, Offset, *args) + + def _SetData(m, Data): + if len(m) < m._HEADER_SIZE_: + m.extend([0] * (m._HEADER_SIZE_ - len(m))) + else: + del m[m._HEADER_SIZE_:] + m.extend(Data) + + def _GetData(m): + if len(m) > m._HEADER_SIZE_: + return m[m._HEADER_SIZE_:] + return None + + Data = property(_GetData, _SetData) + +## FirmwareVolume() class +# +# A class for Firmware Volume +# +class FirmwareVolume(Image): + # Read FvLength, Attributes, HeaderLength, Checksum + _HEADER_ = struct.Struct("16x 1I2H8B 1Q 4x 1I 1H 1H") + _HEADER_SIZE_ = _HEADER_.size + + _FfsGuid = "8C8CE578-8A3D-4F1C-9935-896185C32DD3" + + _GUID_ = struct.Struct("16x 1I2H8B") + _LENGTH_ = struct.Struct("16x 16x 1Q") + _SIG_ = struct.Struct("16x 16x 8x 1I") + _ATTR_ = struct.Struct("16x 16x 8x 4x 1I") + _HLEN_ = struct.Struct("16x 16x 8x 4x 4x 1H") + _CHECKSUM_ = struct.Struct("16x 16x 8x 4x 4x 2x 1H") + + def __init__(self, Name=''): + Image.__init__(self) + self.Name = Name + self.FfsDict = sdict() + self.OrderedFfsDict = sdict() + self.UnDispatchedFfsDict = sdict() + self.NoDepexFfsDict = sdict() + self.ProtocolList = sdict() + + def CheckArchProtocol(self): + for Item in EotGlobalData.gArchProtocolGuids: + if Item.lower() not in EotGlobalData.gProtocolList: + + return False + + return True + + def ParseDepex(self, Depex, Type): + List = None + if Type == 'Ppi': + List = EotGlobalData.gPpiList + if Type == 'Protocol': + List = EotGlobalData.gProtocolList + DepexStack = [] + DepexList = [] + DepexString = '' + FileDepex = None + CouldBeLoaded = True + for Index in range(0, len(Depex.Expression)): + Item = Depex.Expression[Index] + if Item == 0x00: + Index = Index + 1 + Guid = gGuidStringFormat % Depex.Expression[Index] + if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: + return (True, 'BEFORE %s' % Guid, [Guid, 'BEFORE']) + elif Item == 0x01: + Index = Index + 1 + Guid = gGuidStringFormat % Depex.Expression[Index] + if Guid in self.OrderedFfsDict and Depex.Expression[Index + 1] == 0x08: + return (True, 'AFTER %s' % Guid, [Guid, 'AFTER']) + elif Item == 0x02: + Index = Index + 1 + Guid = gGuidStringFormat % Depex.Expression[Index] + if Guid.lower() in List: + DepexStack.append(True) + DepexList.append(Guid) + else: + DepexStack.append(False) + DepexList.append(Guid) + continue + elif Item == 0x03 or Item == 0x04: + DepexStack.append(eval(str(DepexStack.pop()) + ' ' + Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) + DepexList.append(str(DepexList.pop()) + ' ' + Depex._OPCODE_STRING_[Item].upper() + ' ' + str(DepexList.pop())) + elif Item == 0x05: + DepexStack.append(eval(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexStack.pop()))) + DepexList.append(Depex._OPCODE_STRING_[Item].lower() + ' ' + str(DepexList.pop())) + elif Item == 0x06: + DepexStack.append(True) + DepexList.append('TRUE') + DepexString = DepexString + 'TRUE' + ' ' + elif Item == 0x07: + DepexStack.append(False) + DepexList.append('False') + DepexString = DepexString + 'FALSE' + ' ' + elif Item == 0x08: + if Index != len(Depex.Expression) - 1: + CouldBeLoaded = False + else: + CouldBeLoaded = DepexStack.pop() + else: + CouldBeLoaded = False + if DepexList != []: + DepexString = DepexList[0].strip() + return (CouldBeLoaded, DepexString, FileDepex) + + def Dispatch(self, Db = None): + if Db == None: + return False + self.UnDispatchedFfsDict = copy.copy(self.FfsDict) + # Find PeiCore, DexCore, PeiPriori, DxePriori first + FfsSecCoreGuid = None + FfsPeiCoreGuid = None + FfsDxeCoreGuid = None + FfsPeiPrioriGuid = None + FfsDxePrioriGuid = None + for FfsID in self.UnDispatchedFfsDict: + Ffs = self.UnDispatchedFfsDict[FfsID] + if Ffs.Type == 0x03: + FfsSecCoreGuid = FfsID + continue + if Ffs.Type == 0x04: + FfsPeiCoreGuid = FfsID + continue + if Ffs.Type == 0x05: + FfsDxeCoreGuid = FfsID + continue + if Ffs.Guid.lower() == gPeiAprioriFileNameGuid: + FfsPeiPrioriGuid = FfsID + continue + if Ffs.Guid.lower() == gAprioriGuid: + FfsDxePrioriGuid = FfsID + continue + + # Parse SEC_CORE first + if FfsSecCoreGuid != None: + self.OrderedFfsDict[FfsSecCoreGuid] = self.UnDispatchedFfsDict.pop(FfsSecCoreGuid) + self.LoadPpi(Db, FfsSecCoreGuid) + + # Parse PEI first + if FfsPeiCoreGuid != None: + self.OrderedFfsDict[FfsPeiCoreGuid] = self.UnDispatchedFfsDict.pop(FfsPeiCoreGuid) + self.LoadPpi(Db, FfsPeiCoreGuid) + if FfsPeiPrioriGuid != None: + # Load PEIM described in priori file + FfsPeiPriori = self.UnDispatchedFfsDict.pop(FfsPeiPrioriGuid) + if len(FfsPeiPriori.Sections) == 1: + Section = FfsPeiPriori.Sections.popitem()[1] + if Section.Type == 0x19: + GuidStruct = struct.Struct('1I2H8B') + Start = 4 + while len(Section) > Start: + Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) + GuidString = gGuidStringFormat % Guid + Start = Start + 16 + if GuidString in self.UnDispatchedFfsDict: + self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) + self.LoadPpi(Db, GuidString) + + self.DisPatchPei(Db) + + # Parse DXE then + if FfsDxeCoreGuid != None: + self.OrderedFfsDict[FfsDxeCoreGuid] = self.UnDispatchedFfsDict.pop(FfsDxeCoreGuid) + self.LoadProtocol(Db, FfsDxeCoreGuid) + if FfsDxePrioriGuid != None: + # Load PEIM described in priori file + FfsDxePriori = self.UnDispatchedFfsDict.pop(FfsDxePrioriGuid) + if len(FfsDxePriori.Sections) == 1: + Section = FfsDxePriori.Sections.popitem()[1] + if Section.Type == 0x19: + GuidStruct = struct.Struct('1I2H8B') + Start = 4 + while len(Section) > Start: + Guid = GuidStruct.unpack_from(Section[Start : Start + 16]) + GuidString = gGuidStringFormat % Guid + Start = Start + 16 + if GuidString in self.UnDispatchedFfsDict: + self.OrderedFfsDict[GuidString] = self.UnDispatchedFfsDict.pop(GuidString) + self.LoadProtocol(Db, GuidString) + + self.DisPatchDxe(Db) + + def DisPatchNoDepexFfs(self, Db): + # Last Load Drivers without Depex + for FfsID in self.NoDepexFfsDict: + NewFfs = self.NoDepexFfsDict.pop(FfsID) + self.OrderedFfsDict[FfsID] = NewFfs + self.LoadProtocol(Db, FfsID) + + return True + + def LoadCallbackProtocol(self): + IsLoad = True + for Protocol in self.ProtocolList: + for Callback in self.ProtocolList[Protocol][1]: + if Callback[0] not in self.OrderedFfsDict.keys(): + IsLoad = False + continue + if IsLoad: + EotGlobalData.gProtocolList[Protocol.lower()] = self.ProtocolList[Protocol][0] + self.ProtocolList.pop(Protocol) + + def LoadProtocol(self, Db, ModuleGuid): + SqlCommand = """select GuidValue from Report + where SourceFileFullPath in + (select Value1 from Inf where BelongsToFile = + (select BelongsToFile from Inf + where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) + and Model = %s) + and ItemType = 'Protocol' and ItemMode = 'Produced'""" \ + % (ModuleGuid, 5001, 3007) + RecordSet = Db.TblReport.Exec(SqlCommand) + for Record in RecordSet: + SqlCommand = """select Value2 from Inf where BelongsToFile = + (select DISTINCT BelongsToFile from Inf + where Value1 = + (select SourceFileFullPath from Report + where GuidValue like '%s' and ItemMode = 'Callback')) + and Value1 = 'FILE_GUID'""" % Record[0] + CallBackSet = Db.TblReport.Exec(SqlCommand) + if CallBackSet != []: + EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid + else: + EotGlobalData.gProtocolList[Record[0].lower()] = ModuleGuid + + def LoadPpi(self, Db, ModuleGuid): + SqlCommand = """select GuidValue from Report + where SourceFileFullPath in + (select Value1 from Inf where BelongsToFile = + (select BelongsToFile from Inf + where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s) + and Model = %s) + and ItemType = 'Ppi' and ItemMode = 'Produced'""" \ + % (ModuleGuid, 5001, 3007) + RecordSet = Db.TblReport.Exec(SqlCommand) + for Record in RecordSet: + EotGlobalData.gPpiList[Record[0].lower()] = ModuleGuid + + def DisPatchDxe(self, Db): + IsInstalled = False + ScheduleList = sdict() + for FfsID in self.UnDispatchedFfsDict: + CouldBeLoaded = False + DepexString = '' + FileDepex = None + Ffs = self.UnDispatchedFfsDict[FfsID] + if Ffs.Type == 0x07: + # Get Depex + IsFoundDepex = False + for Section in Ffs.Sections.values(): + # Find Depex + if Section.Type == 0x13: + IsFoundDepex = True + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Protocol') + break + if Section.Type == 0x01: + CompressSections = Section._SubImages[4] + for CompressSection in CompressSections.Sections: + if CompressSection.Type == 0x13: + IsFoundDepex = True + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Protocol') + break + if CompressSection.Type == 0x02: + NewSections = CompressSection._SubImages[4] + for NewSection in NewSections.Sections: + if NewSection.Type == 0x13: + IsFoundDepex = True + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Protocol') + break + + # Not find Depex + if not IsFoundDepex: + CouldBeLoaded = self.CheckArchProtocol() + DepexString = '' + FileDepex = None + + # Append New Ffs + if CouldBeLoaded: + IsInstalled = True + NewFfs = self.UnDispatchedFfsDict.pop(FfsID) + NewFfs.Depex = DepexString + if FileDepex != None: + ScheduleList.insert.insert(FileDepex[1], FfsID, NewFfs, FileDepex[0]) + else: + ScheduleList[FfsID] = NewFfs + else: + self.UnDispatchedFfsDict[FfsID].Depex = DepexString + + for FfsID in ScheduleList: + NewFfs = ScheduleList.pop(FfsID) + FfsName = 'UnKnown' + self.OrderedFfsDict[FfsID] = NewFfs + self.LoadProtocol(Db, FfsID) + + SqlCommand = """select Value2 from Inf + where BelongsToFile = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s) + and Model = %s and Value1='BASE_NAME'""" % (FfsID, 5001, 5001) + RecordSet = Db.TblReport.Exec(SqlCommand) + if RecordSet != []: + FfsName = RecordSet[0][0] + + if IsInstalled: + self.DisPatchDxe(Db) + + def DisPatchPei(self, Db): + IsInstalled = False + for FfsID in self.UnDispatchedFfsDict: + CouldBeLoaded = True + DepexString = '' + FileDepex = None + Ffs = self.UnDispatchedFfsDict[FfsID] + if Ffs.Type == 0x06 or Ffs.Type == 0x08: + # Get Depex + for Section in Ffs.Sections.values(): + if Section.Type == 0x1B: + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(Section._SubImages[4], 'Ppi') + break + + if Section.Type == 0x01: + CompressSections = Section._SubImages[4] + for CompressSection in CompressSections.Sections: + if CompressSection.Type == 0x1B: + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(CompressSection._SubImages[4], 'Ppi') + break + if CompressSection.Type == 0x02: + NewSections = CompressSection._SubImages[4] + for NewSection in NewSections.Sections: + if NewSection.Type == 0x1B: + CouldBeLoaded, DepexString, FileDepex = self.ParseDepex(NewSection._SubImages[4], 'Ppi') + break + + # Append New Ffs + if CouldBeLoaded: + IsInstalled = True + NewFfs = self.UnDispatchedFfsDict.pop(FfsID) + NewFfs.Depex = DepexString + self.OrderedFfsDict[FfsID] = NewFfs + self.LoadPpi(Db, FfsID) + else: + self.UnDispatchedFfsDict[FfsID].Depex = DepexString + + if IsInstalled: + self.DisPatchPei(Db) + + + def __str__(self): + global gIndention + gIndention += 4 + FvInfo = '\n' + ' ' * gIndention + FvInfo += "[FV:%s] file_system=%s size=%x checksum=%s\n" % (self.Name, self.FileSystemGuid, self.Size, self.Checksum) + FfsInfo = "\n".join([str(self.FfsDict[FfsId]) for FfsId in self.FfsDict]) + gIndention -= 4 + return FvInfo + FfsInfo + + def _Unpack(self): + Size = self._LENGTH_.unpack_from(self._BUF_, self._OFF_)[0] + self.empty() + self.extend(self._BUF_[self._OFF_:self._OFF_+Size]) + + # traverse the FFS + EndOfFv = Size + FfsStartAddress = self.HeaderSize + LastFfsObj = None + while FfsStartAddress < EndOfFv: + FfsObj = Ffs() + FfsObj.frombuffer(self, FfsStartAddress) + FfsId = repr(FfsObj) + if ((self.Attributes & 0x00000800) != 0 and len(FfsObj) == 0xFFFFFF) \ + or ((self.Attributes & 0x00000800) == 0 and len(FfsObj) == 0): + if LastFfsObj != None: + LastFfsObj.FreeSpace = EndOfFv - LastFfsObj._OFF_ - len(LastFfsObj) + else: + if FfsId in self.FfsDict: + EdkLogger.error("FV", 0, "Duplicate GUID in FFS", + ExtraData="\t%s @ %s\n\t%s @ %s" \ + % (FfsObj.Guid, FfsObj.Offset, + self.FfsDict[FfsId].Guid, self.FfsDict[FfsId].Offset)) + self.FfsDict[FfsId] = FfsObj + if LastFfsObj != None: + LastFfsObj.FreeSpace = FfsStartAddress - LastFfsObj._OFF_ - len(LastFfsObj) + + FfsStartAddress += len(FfsObj) + # + # align to next 8-byte aligned address: A = (A + 8 - 1) & (~(8 - 1)) + # The next FFS must be at the latest next 8-byte aligned address + # + FfsStartAddress = (FfsStartAddress + 7) & (~7) + LastFfsObj = FfsObj + + def _GetAttributes(self): + return self.GetField(self._ATTR_, 0)[0] + + def _GetSize(self): + return self.GetField(self._LENGTH_, 0)[0] + + def _GetChecksum(self): + return self.GetField(self._CHECKSUM_, 0)[0] + + def _GetHeaderLength(self): + return self.GetField(self._HLEN_, 0)[0] + + def _GetFileSystemGuid(self): + return gGuidStringFormat % self.GetField(self._GUID_, 0) + + Attributes = property(_GetAttributes) + Size = property(_GetSize) + Checksum = property(_GetChecksum) + HeaderSize = property(_GetHeaderLength) + FileSystemGuid = property(_GetFileSystemGuid) + +## CompressedImage() class +# +# A class for Compressed Image +# +class CompressedImage(Image): + # UncompressedLength = 4-byte + # CompressionType = 1-byte + _HEADER_ = struct.Struct("1I 1B") + _HEADER_SIZE_ = _HEADER_.size + + _ORIG_SIZE_ = struct.Struct("1I") + _CMPRS_TYPE_ = struct.Struct("4x 1B") + + def __init__(m, CompressedData=None, CompressionType=None, UncompressedLength=None): + Image.__init__(m) + if UncompressedLength != None: + m.UncompressedLength = UncompressedLength + if CompressionType != None: + m.CompressionType = CompressionType + if CompressedData != None: + m.Data = CompressedData + + def __str__(m): + global gIndention + S = "algorithm=%s uncompressed=%x" % (m.CompressionType, m.UncompressedLength) + for Sec in m.Sections: + S += '\n' + str(Sec) + + return S + + def _SetOriginalSize(m, Size): + m.SetField(m._ORIG_SIZE_, 0, Size) + + def _GetOriginalSize(m): + return m.GetField(m._ORIG_SIZE_)[0] + + def _SetCompressionType(m, Type): + m.SetField(m._CMPRS_TYPE_, 0, Type) + + def _GetCompressionType(m): + return m.GetField(m._CMPRS_TYPE_)[0] + + def _GetSections(m): + try: + import EfiCompressor + TmpData = EfiCompressor.FrameworkDecompress( + m[m._HEADER_SIZE_:], + len(m) - m._HEADER_SIZE_ + ) + DecData = array('B') + DecData.fromstring(TmpData) + except: + import EfiCompressor + TmpData = EfiCompressor.UefiDecompress( + m[m._HEADER_SIZE_:], + len(m) - m._HEADER_SIZE_ + ) + DecData = array('B') + DecData.fromstring(TmpData) + + SectionList = [] + Offset = 0 + while Offset < len(DecData): + Sec = Section() + try: + Sec.frombuffer(DecData, Offset) + Offset += Sec.Size + # the section is aligned to 4-byte boundary + except: + break + SectionList.append(Sec) + return SectionList + + UncompressedLength = property(_GetOriginalSize, _SetOriginalSize) + CompressionType = property(_GetCompressionType, _SetCompressionType) + Sections = property(_GetSections) + +## GuidDefinedImage() class +# +# A class for GUID Defined Image +# +class GuidDefinedImage(Image): + _HEADER_ = struct.Struct("1I2H8B 1H 1H") + _HEADER_SIZE_ = _HEADER_.size + + _GUID_ = struct.Struct("1I2H8B") + _DATA_OFFSET_ = struct.Struct("16x 1H") + _ATTR_ = struct.Struct("18x 1H") + + CRC32_GUID = "FC1BCDB0-7D31-49AA-936A-A4600D9DD083" + TIANO_COMPRESS_GUID = 'A31280AD-481E-41B6-95E8-127F4C984779' + LZMA_COMPRESS_GUID = 'EE4E5898-3914-4259-9D6E-DC7BD79403CF' + + def __init__(m, SectionDefinitionGuid=None, DataOffset=None, Attributes=None, Data=None): + Image.__init__(m) + if SectionDefinitionGuid != None: + m.SectionDefinitionGuid = SectionDefinitionGuid + if DataOffset != None: + m.DataOffset = DataOffset + if Attributes != None: + m.Attributes = Attributes + if Data != None: + m.Data = Data + + def __str__(m): + S = "guid=%s" % (gGuidStringFormat % m.SectionDefinitionGuid) + for Sec in m.Sections: + S += "\n" + str(Sec) + return S + + def _Unpack(m): + # keep header in this Image object + m.empty() + m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) + return len(m) + + def _SetAttribute(m, Attribute): + m.SetField(m._ATTR_, 0, Attribute) + + def _GetAttribute(m): + return m.GetField(m._ATTR_)[0] + + def _SetGuid(m, Guid): + m.SetField(m._GUID_, 0, Guid) + + def _GetGuid(m): + return m.GetField(m._GUID_) + + def _SetDataOffset(m, Offset): + m.SetField(m._DATA_OFFSET_, 0, Offset) + + def _GetDataOffset(m): + return m.GetField(m._DATA_OFFSET_)[0] + + def _GetSections(m): + SectionList = [] + Guid = gGuidStringFormat % m.SectionDefinitionGuid + if Guid == m.CRC32_GUID: + # skip the CRC32 value, we don't do CRC32 verification here + Offset = m.DataOffset - 4 + while Offset < len(m): + Sec = Section() + try: + Sec.frombuffer(m, Offset) + Offset += Sec.Size + # the section is aligned to 4-byte boundary + Offset = (Offset + 3) & (~3) + except: + break + SectionList.append(Sec) + elif Guid == m.TIANO_COMPRESS_GUID: + try: + import EfiCompressor + # skip the header + Offset = m.DataOffset - 4 + TmpData = EfiCompressor.FrameworkDecompress(m[Offset:], len(m)-Offset) + DecData = array('B') + DecData.fromstring(TmpData) + Offset = 0 + while Offset < len(DecData): + Sec = Section() + try: + Sec.frombuffer(DecData, Offset) + Offset += Sec.Size + # the section is aligned to 4-byte boundary + Offset = (Offset + 3) & (~3) + except: + break + SectionList.append(Sec) + except: + pass + elif Guid == m.LZMA_COMPRESS_GUID: + try: + import LzmaCompressor + # skip the header + Offset = m.DataOffset - 4 + TmpData = LzmaCompressor.LzmaDecompress(m[Offset:], len(m)-Offset) + DecData = array('B') + DecData.fromstring(TmpData) + Offset = 0 + while Offset < len(DecData): + Sec = Section() + try: + Sec.frombuffer(DecData, Offset) + Offset += Sec.Size + # the section is aligned to 4-byte boundary + Offset = (Offset + 3) & (~3) + except: + break + SectionList.append(Sec) + except: + pass + + return SectionList + + Attributes = property(_GetAttribute, _SetAttribute) + SectionDefinitionGuid = property(_GetGuid, _SetGuid) + DataOffset = property(_GetDataOffset, _SetDataOffset) + Sections = property(_GetSections) + +## Depex() class +# +# A class for Depex +# +class Depex(Image): + _HEADER_ = struct.Struct("") + _HEADER_SIZE_ = 0 + + _GUID_ = struct.Struct("1I2H8B") + _OPCODE_ = struct.Struct("1B") + + _OPCODE_STRING_ = { + 0x00 : "BEFORE", + 0x01 : "AFTER", + 0x02 : "PUSH", + 0x03 : "AND", + 0x04 : "OR", + 0x05 : "NOT", + 0x06 : "TRUE", + 0x07 : "FALSE", + 0x08 : "END", + 0x09 : "SOR" + } + + _NEXT_ = { + -1 : _OPCODE_, # first one in depex must be an opcdoe + 0x00 : _GUID_, #"BEFORE", + 0x01 : _GUID_, #"AFTER", + 0x02 : _GUID_, #"PUSH", + 0x03 : _OPCODE_, #"AND", + 0x04 : _OPCODE_, #"OR", + 0x05 : _OPCODE_, #"NOT", + 0x06 : _OPCODE_, #"TRUE", + 0x07 : _OPCODE_, #"FALSE", + 0x08 : None, #"END", + 0x09 : _OPCODE_, #"SOR" + } + + def __init__(m): + Image.__init__(m) + m._ExprList = [] + + def __str__(m): + global gIndention + gIndention += 4 + Indention = ' ' * gIndention + S = '\n' + for T in m.Expression: + if T in m._OPCODE_STRING_: + S += Indention + m._OPCODE_STRING_[T] + if T not in [0x00, 0x01, 0x02]: + S += '\n' + else: + S += ' ' + gGuidStringFormat % T + '\n' + gIndention -= 4 + return S + + def _Unpack(m): + # keep header in this Image object + m.empty() + m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) + return len(m) + + def _GetExpression(m): + if m._ExprList == []: + Offset = 0 + CurrentData = m._OPCODE_ + while Offset < len(m): + Token = CurrentData.unpack_from(m, Offset) + Offset += CurrentData.size + if len(Token) == 1: + Token = Token[0] + if Token in m._NEXT_: + CurrentData = m._NEXT_[Token] + else: + CurrentData = m._GUID_ + else: + CurrentData = m._OPCODE_ + m._ExprList.append(Token) + if CurrentData == None: + break + return m._ExprList + + Expression = property(_GetExpression) + +## Ui() class +# +# A class for Ui +# +class Ui(Image): + _HEADER_ = struct.Struct("") + _HEADER_SIZE_ = 0 + + def __init__(m): + Image.__init__(m) + + def __str__(m): + return m.String + + def _Unpack(m): + # keep header in this Image object + m.empty() + m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._LEN_]) + return len(m) + + def _GetUiString(m): + return codecs.utf_16_decode(m[0:-2].tostring())[0] + + String = property(_GetUiString) + +## Section() class +# +# A class for Section +# +class Section(Image): + _TypeName = { + 0x00 : "", + 0x01 : "COMPRESSION", + 0x02 : "GUID_DEFINED", + 0x10 : "PE32", + 0x11 : "PIC", + 0x12 : "TE", + 0x13 : "DXE_DEPEX", + 0x14 : "VERSION", + 0x15 : "USER_INTERFACE", + 0x16 : "COMPATIBILITY16", + 0x17 : "FIRMWARE_VOLUME_IMAGE", + 0x18 : "FREEFORM_SUBTYPE_GUID", + 0x19 : "RAW", + 0x1B : "PEI_DEPEX" + } + + _SectionSubImages = { + 0x01 : CompressedImage, + 0x02 : GuidDefinedImage, + 0x17 : FirmwareVolume, + 0x13 : Depex, + 0x1B : Depex, + 0x15 : Ui + } + + # Size = 3-byte + # Type = 1-byte + _HEADER_ = struct.Struct("3B 1B") + _HEADER_SIZE_ = _HEADER_.size + + # SubTypeGuid + # _FREE_FORM_SUBTYPE_GUID_HEADER_ = struct.Struct("1I2H8B") + + _SIZE_ = struct.Struct("3B") + _TYPE_ = struct.Struct("3x 1B") + + def __init__(m, Type=None, Size=None): + Image.__init__(m) + m._Alignment = 1 + if Type != None: + m.Type = Type + if Size != None: + m.Size = Size + + def __str__(m): + global gIndention + gIndention += 4 + SectionInfo = ' ' * gIndention + if m.Type in m._TypeName: + SectionInfo += "[SECTION:%s] offset=%x size=%x" % (m._TypeName[m.Type], m._OFF_, m.Size) + else: + SectionInfo += "[SECTION:%x] offset=%x size=%x " % (m.Type, m._OFF_, m.Size) + for Offset in m._SubImages: + SectionInfo += ", " + str(m._SubImages[Offset]) + gIndention -= 4 + return SectionInfo + + def _Unpack(m): + m.empty() + Type, = m._TYPE_.unpack_from(m._BUF_, m._OFF_) + Size1, Size2, Size3 = m._SIZE_.unpack_from(m._BUF_, m._OFF_) + Size = Size1 + (Size2 << 8) + (Size3 << 16) + + if Type not in m._SectionSubImages: + # no need to extract sub-image, keep all in this Image object + m.extend(m._BUF_[m._OFF_ : m._OFF_ + Size]) + else: + # keep header in this Image object + m.extend(m._BUF_[m._OFF_ : m._OFF_ + m._HEADER_SIZE_]) + # + # use new Image object to represent payload, which may be another kind + # of image such as PE32 + # + PayloadOffset = m._HEADER_SIZE_ + PayloadLen = m.Size - m._HEADER_SIZE_ + Payload = m._SectionSubImages[m.Type]() + Payload.frombuffer(m._BUF_, m._OFF_ + m._HEADER_SIZE_, PayloadLen) + m._SubImages[PayloadOffset] = Payload + + return Size + + def _SetSize(m, Size): + Size1 = Size & 0xFF + Size2 = (Size & 0xFF00) >> 8 + Size3 = (Size & 0xFF0000) >> 16 + m.SetField(m._SIZE_, 0, Size1, Size2, Size3) + + def _GetSize(m): + Size1, Size2, Size3 = m.GetField(m._SIZE_) + return Size1 + (Size2 << 8) + (Size3 << 16) + + def _SetType(m, Type): + m.SetField(m._TYPE_, 0, Type) + + def _GetType(m): + return m.GetField(m._TYPE_)[0] + + def _GetAlignment(m): + return m._Alignment + + def _SetAlignment(m, Alignment): + m._Alignment = Alignment + AlignmentMask = Alignment - 1 + # section alignment is actually for payload, so we need to add header size + PayloadOffset = m._OFF_ + m._HEADER_SIZE_ + if (PayloadOffset & (~AlignmentMask)) == 0: + return + NewOffset = (PayloadOffset + AlignmentMask) & (~AlignmentMask) + while (NewOffset - PayloadOffset) < m._HEADER_SIZE_: + NewOffset += m._Alignment + + def tofile(m, f): + m.Size = len(m) + Image.tofile(m, f) + for Offset in m._SubImages: + m._SubImages[Offset].tofile(f) + + Type = property(_GetType, _SetType) + Size = property(_GetSize, _SetSize) + Alignment = property(_GetAlignment, _SetAlignment) + # SubTypeGuid = property(_GetGuid, _SetGuid) + +## PadSection() class +# +# A class for Pad Section +# +class PadSection(Section): + def __init__(m, Size): + Section.__init__(m) + m.Type = 0x19 + m.Size = Size + m.Data = [0] * (Size - m._HEADER_SIZE_) + +## Ffs() class +# +# A class for Ffs Section +# +class Ffs(Image): + _FfsFormat = "24B%(payload_size)sB" + # skip IntegrityCheck + _HEADER_ = struct.Struct("1I2H8B 2x 1B 1B 3B 1B") + _HEADER_SIZE_ = _HEADER_.size + + _NAME_ = struct.Struct("1I2H8B") + _INT_CHECK_ = struct.Struct("16x 1H") + _TYPE_ = struct.Struct("18x 1B") + _ATTR_ = struct.Struct("19x 1B") + _SIZE_ = struct.Struct("20x 3B") + _STATE_ = struct.Struct("23x 1B") + + VTF_GUID = "1BA0062E-C779-4582-8566-336AE8F78F09" + + FFS_ATTRIB_FIXED = 0x04 + FFS_ATTRIB_DATA_ALIGNMENT = 0x38 + FFS_ATTRIB_CHECKSUM = 0x40 + + _TypeName = { + 0x00 : "", + 0x01 : "RAW", + 0x02 : "FREEFORM", + 0x03 : "SECURITY_CORE", + 0x04 : "PEI_CORE", + 0x05 : "DXE_CORE", + 0x06 : "PEIM", + 0x07 : "DRIVER", + 0x08 : "COMBINED_PEIM_DRIVER", + 0x09 : "APPLICATION", + 0x0A : "SMM", + 0x0B : "FIRMWARE_VOLUME_IMAGE", + 0x0C : "COMBINED_SMM_DXE", + 0x0D : "SMM_CORE", + 0xc0 : "OEM_MIN", + 0xdf : "OEM_MAX", + 0xe0 : "DEBUG_MIN", + 0xef : "DEBUG_MAX", + 0xf0 : "FFS_MIN", + 0xff : "FFS_MAX", + 0xf0 : "FFS_PAD", + } + + def __init__(self): + Image.__init__(self) + self.FreeSpace = 0 + + self.Sections = sdict() + self.Depex = '' + + self.__ID__ = None + + def __str__(self): + global gIndention + gIndention += 4 + Indention = ' ' * gIndention + FfsInfo = Indention + FfsInfo += "[FFS:%s] offset=%x size=%x guid=%s free_space=%x alignment=%s\n" % \ + (Ffs._TypeName[self.Type], self._OFF_, self.Size, self.Guid, self.FreeSpace, self.Alignment) + SectionInfo = '\n'.join([str(self.Sections[Offset]) for Offset in self.Sections]) + gIndention -= 4 + return FfsInfo + SectionInfo + "\n" + + def __len__(self): + return self.Size + + def __repr__(self): + return self.__ID__ + + def _Unpack(self): + Size1, Size2, Size3 = self._SIZE_.unpack_from(self._BUF_, self._OFF_) + Size = Size1 + (Size2 << 8) + (Size3 << 16) + self.empty() + self.extend(self._BUF_[self._OFF_ : self._OFF_ + Size]) + + # Pad FFS may use the same GUID. We need to avoid it. + if self.Type == 0xf0: + self.__ID__ = str(uuid.uuid1()).upper() + else: + self.__ID__ = self.Guid + + # Traverse the SECTION. RAW and PAD do not have sections + if self.Type not in [0xf0, 0x01] and Size > 0 and Size < 0xFFFFFF: + EndOfFfs = Size + SectionStartAddress = self._HEADER_SIZE_ + while SectionStartAddress < EndOfFfs: + SectionObj = Section() + SectionObj.frombuffer(self, SectionStartAddress) + #f = open(repr(SectionObj), 'wb') + #SectionObj.Size = 0 + #SectionObj.tofile(f) + #f.close() + self.Sections[SectionStartAddress] = SectionObj + SectionStartAddress += len(SectionObj) + SectionStartAddress = (SectionStartAddress + 3) & (~3) + + def Pack(self): + pass + + def SetFreeSpace(self, Size): + self.FreeSpace = Size + + def _GetGuid(self): + return gGuidStringFormat % self.Name + + def _SetName(self, Value): + # Guid1, Guid2, Guid3, Guid4, Guid5, Guid6, Guid7, Guid8, Guid9, Guid10, Guid11 + self.SetField(self._NAME_, 0, Value) + + def _GetName(self): + # Guid1, Guid2, Guid3, Guid4, Guid5, Guid6, Guid7, Guid8, Guid9, Guid10, Guid11 + return self.GetField(self._NAME_) + + def _SetSize(m, Size): + Size1 = Size & 0xFF + Size2 = (Size & 0xFF00) >> 8 + Size3 = (Size & 0xFF0000) >> 16 + m.SetField(m._SIZE_, 0, Size1, Size2, Size3) + + def _GetSize(m): + Size1, Size2, Size3 = m.GetField(m._SIZE_) + return Size1 + (Size2 << 8) + (Size3 << 16) + + def _SetType(m, Type): + m.SetField(m._TYPE_, 0, Type) + + def _GetType(m): + return m.GetField(m._TYPE_)[0] + + def _SetAttributes(self, Value): + self.SetField(m._ATTR_, 0, Value) + + def _GetAttributes(self): + return self.GetField(self._ATTR_)[0] + + def _GetFixed(self): + if (self.Attributes & self.FFS_ATTRIB_FIXED) != 0: + return True + return False + + def _GetCheckSum(self): + if (self.Attributes & self.FFS_ATTRIB_CHECKSUM) != 0: + return True + return False + + def _GetAlignment(self): + return (self.Attributes & self.FFS_ATTRIB_DATA_ALIGNMENT) >> 3 + + def _SetState(self, Value): + self.SetField(m._STATE_, 0, Value) + + def _GetState(self): + return self.GetField(m._STATE_)[0] + + Name = property(_GetName, _SetName) + Guid = property(_GetGuid) + Type = property(_GetType, _SetType) + Size = property(_GetSize, _SetSize) + Attributes = property(_GetAttributes, _SetAttributes) + Fixed = property(_GetFixed) + Checksum = property(_GetCheckSum) + Alignment = property(_GetAlignment) + State = property(_GetState, _SetState) + +## PeImage() class +# +# A class for PE Image +# +class PeImage: + # + # just extract e_lfanew + # + _DosHeaderFormat = "60x 1I" + # + # Machine + # NumberOfSections + # SizeOfOptionalHeader + # + _FileHeaderFormat = "4x 1H 1H 4x 4x 4x 1H 2x" + # + # Magic + # SizeOfImage + # SizeOfHeaders + # CheckSum + # NumberOfRvaAndSizes + # + _OptionalHeader32Format = "1H 54x 1I 1I 1I 24x 1I" + _OptionalHeader64Format = "" + def __init__(self, Buf, Offset, Size): + self.Offset = Offset + self.Size = Size + self.Machine = 0x014c # IA32 + self.NumberOfSections = 0 + self.SizeOfImage = 0 + self.SizeOfOptionalHeader = 0 + self.Checksum = 0 + self._PeImageBuf = Buf + self._SectionList = [] + + self._DosHeader = struct.Struct(PeImage._DosHeaderFormat) + self._FileHeader = struct.Struct(PeImage._FileHeaderFormat) + self._OptionalHeader32 = struct.Struct(PeImage._OptionalHeader32Format) + + self.Buffer = None + + self._Unpack() + + def __str__(self): + pass + + def __len__(self): + return self.Size + + def _Unpack(self): + # from DOS header, get the offset of PE header + FileHeaderOffset, = self._DosHeader.unpack_from(self._PeImageBuf, self.Offset) + if FileHeaderOffset < struct.calcsize(self._DosHeaderFormat): + EdkLogger.error("PE+", 0, "Invalid offset of IMAGE_FILE_HEADER: %s" % FileHeaderOffset) + + # from FILE header, get the optional header size + self.Machine, self.NumberOfSections, self.SizeOfOptionalHeader = \ + self._FileHeader.unpack_from(self._PeImageBuf, self.Offset + FileHeaderOffset) + + print "Machine=%x NumberOfSections=%x SizeOfOptionalHeader=%x" % (self.Machine, self.NumberOfSections, self.SizeOfOptionalHeader) + # optional header follows the FILE header + OptionalHeaderOffset = FileHeaderOffset + struct.calcsize(self._FileHeaderFormat) + Magic, self.SizeOfImage, SizeOfHeaders, self.Checksum, NumberOfRvaAndSizes = \ + self._OptionalHeader32.unpack_from(self._PeImageBuf, self.Offset + OptionalHeaderOffset) + print "Magic=%x SizeOfImage=%x SizeOfHeaders=%x, Checksum=%x, NumberOfRvaAndSizes=%x" % (Magic, self.SizeOfImage, SizeOfHeaders, self.Checksum, NumberOfRvaAndSizes) + + PeImageSectionTableOffset = OptionalHeaderOffset + self.SizeOfOptionalHeader + PeSections = PeSectionTable(self._PeImageBuf, self.Offset + PeImageSectionTableOffset, self.NumberOfSections) + + print "%x" % PeSections.GetFileAddress(0x3920) + +## PeSectionTable() class +# +# A class for PE Section Table +# +class PeSectionTable: + def __init__(self, Buf, Offset, NumberOfSections): + self._SectionList = [] + + SectionHeaderOffset = Offset + for TableIndex in range(0, NumberOfSections): + SectionHeader = PeSectionHeader(Buf, SectionHeaderOffset) + self._SectionList.append(SectionHeader) + SectionHeaderOffset += len(SectionHeader) + print SectionHeader + + def GetFileAddress(self, Rva): + for PeSection in self._SectionList: + if Rva in PeSection: + return PeSection[Rva] + +## PeSectionHeader() class +# +# A class for PE Section Header +# +class PeSectionHeader: + # + # VirtualAddress + # SizeOfRawData + # PointerToRawData + # + _HeaderFormat = "12x 1I 1I 1I 16x" + _HeaderLength = struct.calcsize(_HeaderFormat) + + def __init__(self, Buf, Offset): + self.VirtualAddressStart, self.SizeOfRawData, self.PointerToRawData = \ + struct.unpack_from(self._HeaderFormat, Buf, Offset) + self.VirtualAddressEnd = self.VirtualAddressStart + self.SizeOfRawData - 1 + + def __str__(self): + return "VirtualAddress=%x, SizeOfRawData=%x, PointerToRawData=%x" % (self.VirtualAddressStart, self.SizeOfRawData, self.PointerToRawData) + + def __len__(self): + return self._HeaderLength + + def __contains__(self, Rva): + return Rva >= self.VirtualAddressStart and Rva <= self.VirtualAddressEnd + + def __getitem__(self, Rva): + return Rva - self.VirtualAddressStart + self.PointerToRawData + +## LinkMap() class +# +# A class for Link Map +# +class LinkMap: + _StartFlag = { + "MSFT" : re.compile("Address +Publics by Value +Rva\+Base +Lib:Object"), + "GCC" : re.compile("^\.(text|bss|data|edata)"), + } + + _MappingFormat = { + "MSFT" : re.compile("([0-9a-f]+):([0-9a-f]+)\s+_+([0-9A-Za-z]+)\s+([0-9a-f]+)\s+"), + "GCC" : re.compile("^(\.\w)?\s+(0x[0-9a-f]+)\s+_+([0-9A-Za-z]+)"), + } + + def __init__(self, MapFile, MapType="MSFT"): + self.File = MapFile + self.MapType = MapType + self._Globals = {} # global:RVA + + self._Parse() + + def _Parse(self): + MapFile = open(self.File, 'r') + MappingTitle = self._StartFlag[self.MapType] + MappingFormat = self._MappingFormat[self.MapType] + MappingStart = False + try: + for Line in MapFile: + Line = Line.strip() + if not MappingStart: + if MappingTitle.match(Line) != None: + MappingStart = True + continue + ResultList = MappingFormat.findall(Line) + if len(ResultList) == 0 or len(ResultList[0]) != 4: + continue + self._Globals[ResultList[2]] = int(ResultList[3], 16) + EdkLogger.verbose(ResultList[0]) + finally: + MapFile.close() + + def __contains__(self, Var): + return Var in self._Globals + + def __getitem__(self, Var): + if Var not in self._Globals: + return None + return self._Globals[Var] + +## MultipleFv() class +# +# A class for Multiple FV +# +class MultipleFv(FirmwareVolume): + def __init__(self, FvList): + FirmwareVolume.__init__(self) + self.BasicInfo = [] + for FvPath in FvList: + FvName = os.path.splitext(os.path.split(FvPath)[1])[0] + Fd = open(FvPath, 'rb') + Buf = array('B') + try: + Buf.fromfile(Fd, os.path.getsize(FvPath)) + except EOFError: + pass + + Fv = FirmwareVolume(FvName) + Fv.frombuffer(Buf, 0, len(Buf)) + + self.BasicInfo.append([Fv.Name, Fv.FileSystemGuid, Fv.Size]) + self.FfsDict.append(Fv.FfsDict) + +# Version and Copyright +__version_number__ = "0.01" +__version__ = "%prog Version " + __version_number__ +__copyright__ = "Copyright (c) 2008, Intel Corporation. All rights reserved." + +## Parse command line options +# +# Using standard Python module optparse to parse command line option of this tool. +# +# @retval Options A optparse.Values object containing the parsed options +# @retval InputFile Path of file to be trimmed +# +def GetOptions(): + OptionList = [ + make_option("-a", "--arch", dest="Arch", + help="The input file is preprocessed source code, including C or assembly code"), + make_option("-p", "--platform", dest="ActivePlatform", + help="The input file is preprocessed VFR file"), + make_option("-m", "--module", dest="ActiveModule", + help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), + make_option("-f", "--FDF-file", dest="FdfFile", + help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), + make_option("-o", "--output", dest="OutputDirectory", + help="File to store the trimmed content"), + make_option("-t", "--toolchain-tag", dest="ToolChain", + help=""), + make_option("-k", "--msft", dest="MakefileType", action="store_const", const="nmake", + help=""), + make_option("-g", "--gcc", dest="MakefileType", action="store_const", const="gmake", + help=""), + make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, + help="Run verbosely"), + make_option("-d", "--debug", dest="LogLevel", type="int", + help="Run with debug information"), + make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, + help="Run quietly"), + make_option("-?", action="help", help="show this help message and exit"), + ] + + # use clearer usage to override default usage message + UsageString = "%prog [-a ARCH] [-p PLATFORM] [-m MODULE] [-t TOOLCHAIN_TAG] [-k] [-g] [-v|-d |-q] [-o ] [GenC|GenMake]" + + Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) + Parser.set_defaults(Arch=[]) + Parser.set_defaults(ActivePlatform=None) + Parser.set_defaults(ActiveModule=None) + Parser.set_defaults(OutputDirectory="build") + Parser.set_defaults(FdfFile=None) + Parser.set_defaults(ToolChain="MYTOOLS") + if sys.platform == "win32": + Parser.set_defaults(MakefileType="nmake") + else: + Parser.set_defaults(MakefileType="gmake") + Parser.set_defaults(LogLevel=EdkLogger.INFO) + + Options, Args = Parser.parse_args() + + # error check + if len(Args) == 0: + Options.Target = "genmake" + sys.argv.append("genmake") + elif len(Args) == 1: + Options.Target = Args[0].lower() + if Options.Target not in ["genc", "genmake"]: + EdkLogger.error("AutoGen", OPTION_NOT_SUPPORTED, "Not supported target", + ExtraData="%s\n\n%s" % (Options.Target, Parser.get_usage())) + else: + EdkLogger.error("AutoGen", OPTION_NOT_SUPPORTED, "Too many targets", + ExtraData=Parser.get_usage()) + + return Options + +## Entrance method +# +# This method mainly dispatch specific methods per the command line options. +# If no error found, return zero value so the caller of this tool can know +# if it's executed successfully or not. +# +# @retval 0 Tool was successful +# @retval 1 Tool failed +# +def Main(): + from build import build + try: + Option = GetOptions() + build.main() + except Exception, e: + print e + return 1 + + return 0 + +# This acts like the main() function for the script, unless it is 'import'ed into another script. +if __name__ == '__main__': + EdkLogger.Initialize() + # sys.exit(Main()) + + if len(sys.argv) > 1: + FilePath = sys.argv[1] + if FilePath.lower().endswith(".fv"): + fd = open(FilePath, 'rb') + buf = array('B') + try: + buf.fromfile(fd, os.path.getsize(FilePath)) + except EOFError: + pass + + fv = FirmwareVolume("FVRECOVERY") + fv.frombuffer(buf, 0, len(buf)) + #fv.Dispatch(None) + print fv + elif FilePath.endswith(".efi"): + fd = open(FilePath, 'rb') + buf = array('B') + Size = os.path.getsize(FilePath) + + try: + buf.fromfile(fd, Size) + except EOFError: + pass + + PeSection = Section(Type=0x10) + PeSection.Data = buf + sf, ext = os.path.splitext(os.path.basename(FilePath)) + sf += ".sec" + PeSection.tofile(open(sf, 'wb')) + elif FilePath.endswith(".map"): + mf = LinkMap(FilePath) diff --git a/BaseTools/Source/Python/GenFds/EfiSection.py b/BaseTools/Source/Python/GenFds/EfiSection.py index 5419e11fce..3eb4e23842 100644 --- a/BaseTools/Source/Python/GenFds/EfiSection.py +++ b/BaseTools/Source/Python/GenFds/EfiSection.py @@ -80,11 +80,11 @@ class EfiSection (EfiSectionClassObject): FileList = [] if Filename != None: Filename = GenFdsGlobalVariable.MacroExtend(Filename, Dict) - # check if the path is absolute or relative - if os.path.isabs(Filename): - Filename = os.path.normpath(Filename) - else: - Filename = os.path.normpath(os.path.join(FfsInf.EfiOutputPath, Filename)) + # check if the path is absolute or relative + if os.path.isabs(Filename): + Filename = os.path.normpath(Filename) + else: + Filename = os.path.normpath(os.path.join(FfsInf.EfiOutputPath, Filename)) if not self.Optional: FileList.append(Filename) diff --git a/BaseTools/Source/Python/GenFds/Fv.py b/BaseTools/Source/Python/GenFds/Fv.py index d79bed2b28..781c1a045d 100644 --- a/BaseTools/Source/Python/GenFds/Fv.py +++ b/BaseTools/Source/Python/GenFds/Fv.py @@ -296,13 +296,13 @@ class FV (FvClassObject): Buffer = '' for Index in range (0, len(self.FvExtEntryType)): if self.FvExtEntryType[Index] == 'FILE': - # check if the path is absolute or relative - if os.path.isabs(self.FvExtEntryData[Index]): - FileFullPath = os.path.normpath(self.FvExtEntryData[Index]) - else: - FileFullPath = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, self.FvExtEntryData[Index])) - # check if the file path exists or not - if not os.path.isfile(FileFullPath): + # check if the path is absolute or relative + if os.path.isabs(self.FvExtEntryData[Index]): + FileFullPath = os.path.normpath(self.FvExtEntryData[Index]) + else: + FileFullPath = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, self.FvExtEntryData[Index])) + # check if the file path exists or not + if not os.path.isfile(FileFullPath): GenFdsGlobalVariable.ErrorLogger("Error opening FV Extension Header Entry file %s." % (self.FvExtEntryData[Index])) FvExtFile = open (FileFullPath,'rb') FvExtFile.seek(0,2) diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index eca21642c8..058fa0c6a0 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -1,538 +1,538 @@ -## @file -# generate flash image -# -# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -from optparse import OptionParser -import sys -import os -import linecache -import FdfParser -import Common.BuildToolError as BuildToolError -from GenFdsGlobalVariable import GenFdsGlobalVariable -from Workspace.WorkspaceDatabase import WorkspaceDatabase -from Workspace.BuildClassObject import PcdClassObject -from Workspace.BuildClassObject import ModuleBuildClassObject -import RuleComplexFile -from EfiSection import EfiSection -import StringIO -import Common.TargetTxtClassObject as TargetTxtClassObject -import Common.ToolDefClassObject as ToolDefClassObject -import Common.DataType -import Common.GlobalData as GlobalData -from Common import EdkLogger -from Common.String import * -from Common.Misc import DirCache,PathClass -from Common.Misc import SaveFileOnChange -from Common.BuildVersion import gBUILD_VERSION - -## Version and Copyright -versionNumber = "1.0" + ' ' + gBUILD_VERSION -__version__ = "%prog Version " + versionNumber -__copyright__ = "Copyright (c) 2007 - 2013, Intel Corporation All rights reserved." - -## Tool entrance method -# -# This method mainly dispatch specific methods per the command line options. -# If no error found, return zero value so the caller of this tool can know -# if it's executed successfully or not. -# -# @retval 0 Tool was successful -# @retval 1 Tool failed -# -def main(): - global Options - Options = myOptionParser() - - global Workspace - Workspace = "" - ArchList = None - ReturnCode = 0 - - EdkLogger.Initialize() - try: - if Options.verbose != None: - EdkLogger.SetLevel(EdkLogger.VERBOSE) - GenFdsGlobalVariable.VerboseMode = True - - if Options.FixedAddress != None: - GenFdsGlobalVariable.FixedLoadAddress = True - - if Options.quiet != None: - EdkLogger.SetLevel(EdkLogger.QUIET) - if Options.debug != None: - EdkLogger.SetLevel(Options.debug + 1) - GenFdsGlobalVariable.DebugLevel = Options.debug - else: - EdkLogger.SetLevel(EdkLogger.INFO) - - if (Options.Workspace == None): - EdkLogger.error("GenFds", OPTION_MISSING, "WORKSPACE not defined", - ExtraData="Please use '-w' switch to pass it or set the WORKSPACE environment variable.") - elif not os.path.exists(Options.Workspace): - EdkLogger.error("GenFds", PARAMETER_INVALID, "WORKSPACE is invalid", - ExtraData="Please use '-w' switch to pass it or set the WORKSPACE environment variable.") - else: - Workspace = os.path.normcase(Options.Workspace) - GenFdsGlobalVariable.WorkSpaceDir = Workspace - if 'EDK_SOURCE' in os.environ.keys(): - GenFdsGlobalVariable.EdkSourceDir = os.path.normcase(os.environ['EDK_SOURCE']) - if (Options.debug): - GenFdsGlobalVariable.VerboseLogger( "Using Workspace:" + Workspace) - os.chdir(GenFdsGlobalVariable.WorkSpaceDir) - - if (Options.filename): - FdfFilename = Options.filename - FdfFilename = GenFdsGlobalVariable.ReplaceWorkspaceMacro(FdfFilename) - - if FdfFilename[0:2] == '..': - FdfFilename = os.path.realpath(FdfFilename) - if not os.path.isabs (FdfFilename): - FdfFilename = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, FdfFilename) - if not os.path.exists(FdfFilename): - EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=FdfFilename) - if os.path.normcase (FdfFilename).find(Workspace) != 0: - EdkLogger.error("GenFds", FILE_NOT_FOUND, "FdfFile doesn't exist in Workspace!") - - GenFdsGlobalVariable.FdfFile = FdfFilename - GenFdsGlobalVariable.FdfFileTimeStamp = os.path.getmtime(FdfFilename) - else: - EdkLogger.error("GenFds", OPTION_MISSING, "Missing FDF filename") - - if (Options.BuildTarget): - GenFdsGlobalVariable.TargetName = Options.BuildTarget - else: - EdkLogger.error("GenFds", OPTION_MISSING, "Missing build target") - - if (Options.ToolChain): - GenFdsGlobalVariable.ToolChainTag = Options.ToolChain - else: - EdkLogger.error("GenFds", OPTION_MISSING, "Missing tool chain tag") - - if (Options.activePlatform): - ActivePlatform = Options.activePlatform - ActivePlatform = GenFdsGlobalVariable.ReplaceWorkspaceMacro(ActivePlatform) - - if ActivePlatform[0:2] == '..': - ActivePlatform = os.path.realpath(ActivePlatform) - - if not os.path.isabs (ActivePlatform): - ActivePlatform = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, ActivePlatform) - - if not os.path.exists(ActivePlatform) : - EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist!") - - if os.path.normcase (ActivePlatform).find(Workspace) != 0: - EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist in Workspace!") - - ActivePlatform = ActivePlatform[len(Workspace):] - if len(ActivePlatform) > 0 : - if ActivePlatform[0] == '\\' or ActivePlatform[0] == '/': - ActivePlatform = ActivePlatform[1:] - else: - EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist!") - else: - EdkLogger.error("GenFds", OPTION_MISSING, "Missing active platform") - - GenFdsGlobalVariable.ActivePlatform = PathClass(NormPath(ActivePlatform), Workspace) - - BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, "Conf/target.txt")) - if os.path.isfile(BuildConfigurationFile) == True: - TargetTxtClassObject.TargetTxtClassObject(BuildConfigurationFile) - else: - EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=BuildConfigurationFile) - - if Options.Macros: - for Pair in Options.Macros: - Pair.strip('"') - List = Pair.split('=') - if len(List) == 2: - if List[0].strip() == "EFI_SOURCE": - GlobalData.gEfiSource = List[1].strip() - GlobalData.gGlobalDefines["EFI_SOURCE"] = GlobalData.gEfiSource - continue - elif List[0].strip() == "EDK_SOURCE": - GlobalData.gEdkSource = List[1].strip() - GlobalData.gGlobalDefines["EDK_SOURCE"] = GlobalData.gEdkSource - continue - elif List[0].strip() in ["WORKSPACE", "TARGET", "TOOLCHAIN"]: - GlobalData.gGlobalDefines[List[0].strip()] = List[1].strip() - else: - GlobalData.gCommandLineDefines[List[0].strip()] = List[1].strip() - else: - GlobalData.gCommandLineDefines[List[0].strip()] = "TRUE" - os.environ["WORKSPACE"] = Workspace - - """call Workspace build create database""" - BuildWorkSpace = WorkspaceDatabase(None) - BuildWorkSpace.InitDatabase() - - # - # Get files real name in workspace dir - # - GlobalData.gAllFiles = DirCache(Workspace) - GlobalData.gWorkspace = Workspace - - if (Options.archList) : - ArchList = Options.archList.split(',') - else: -# EdkLogger.error("GenFds", OPTION_MISSING, "Missing build ARCH") - ArchList = BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON', Options.BuildTarget, Options.ToolChain].SupArchList - - TargetArchList = set(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON', Options.BuildTarget, Options.ToolChain].SupArchList) & set(ArchList) - if len(TargetArchList) == 0: - EdkLogger.error("GenFds", GENFDS_ERROR, "Target ARCH %s not in platform supported ARCH %s" % (str(ArchList), str(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON'].SupArchList))) - - for Arch in ArchList: - GenFdsGlobalVariable.OutputDirFromDscDict[Arch] = NormPath(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, Options.BuildTarget, Options.ToolChain].OutputDirectory) - GenFdsGlobalVariable.PlatformName = BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, Options.BuildTarget, Options.ToolChain].PlatformName - - if (Options.outputDir): - OutputDirFromCommandLine = GenFdsGlobalVariable.ReplaceWorkspaceMacro(Options.outputDir) - if not os.path.isabs (OutputDirFromCommandLine): - OutputDirFromCommandLine = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, OutputDirFromCommandLine) - for Arch in ArchList: - GenFdsGlobalVariable.OutputDirDict[Arch] = OutputDirFromCommandLine - else: - for Arch in ArchList: - GenFdsGlobalVariable.OutputDirDict[Arch] = os.path.join(GenFdsGlobalVariable.OutputDirFromDscDict[Arch], GenFdsGlobalVariable.TargetName + '_' + GenFdsGlobalVariable.ToolChainTag) - - for Key in GenFdsGlobalVariable.OutputDirDict: - OutputDir = GenFdsGlobalVariable.OutputDirDict[Key] - if OutputDir[0:2] == '..': - OutputDir = os.path.realpath(OutputDir) - - if OutputDir[1] != ':': - OutputDir = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, OutputDir) - - if not os.path.exists(OutputDir): - EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=OutputDir) - GenFdsGlobalVariable.OutputDirDict[Key] = OutputDir - - """ Parse Fdf file, has to place after build Workspace as FDF may contain macros from DSC file """ - FdfParserObj = FdfParser.FdfParser(FdfFilename) - FdfParserObj.ParseFile() - - if FdfParserObj.CycleReferenceCheck(): - EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "Cycle Reference Detected in FDF file") - - if (Options.uiFdName) : - if Options.uiFdName.upper() in FdfParserObj.Profile.FdDict.keys(): - GenFds.OnlyGenerateThisFd = Options.uiFdName - else: - EdkLogger.error("GenFds", OPTION_VALUE_INVALID, - "No such an FD in FDF file: %s" % Options.uiFdName) - - if (Options.uiFvName) : - if Options.uiFvName.upper() in FdfParserObj.Profile.FvDict.keys(): - GenFds.OnlyGenerateThisFv = Options.uiFvName - else: - EdkLogger.error("GenFds", OPTION_VALUE_INVALID, - "No such an FV in FDF file: %s" % Options.uiFvName) - - if (Options.uiCapName) : - if Options.uiCapName.upper() in FdfParserObj.Profile.CapsuleDict.keys(): - GenFds.OnlyGenerateThisCap = Options.uiCapName - else: - EdkLogger.error("GenFds", OPTION_VALUE_INVALID, - "No such a Capsule in FDF file: %s" % Options.uiCapName) - - """Modify images from build output if the feature of loading driver at fixed address is on.""" - if GenFdsGlobalVariable.FixedLoadAddress: - GenFds.PreprocessImage(BuildWorkSpace, GenFdsGlobalVariable.ActivePlatform) - """Call GenFds""" - GenFds.GenFd('', FdfParserObj, BuildWorkSpace, ArchList) - - """Generate GUID cross reference file""" - GenFds.GenerateGuidXRefFile(BuildWorkSpace, ArchList) - - """Display FV space info.""" - GenFds.DisplayFvSpaceInfo(FdfParserObj) - - except FdfParser.Warning, X: - EdkLogger.error(X.ToolName, FORMAT_INVALID, File=X.FileName, Line=X.LineNumber, ExtraData=X.Message, RaiseError = False) - ReturnCode = FORMAT_INVALID - except FatalError, X: - if Options.debug != None: - import traceback - EdkLogger.quiet(traceback.format_exc()) - ReturnCode = X.args[0] - except: - import traceback - EdkLogger.error( - "\nPython", - CODE_ERROR, - "Tools code failure", - ExtraData="Please send email to edk2-buildtools-devel@lists.sourceforge.net for help, attaching following call stack trace!\n", - RaiseError=False - ) - EdkLogger.quiet(traceback.format_exc()) - ReturnCode = CODE_ERROR - return ReturnCode - -gParamCheck = [] -def SingleCheckCallback(option, opt_str, value, parser): - if option not in gParamCheck: - setattr(parser.values, option.dest, value) - gParamCheck.append(option) - else: - parser.error("Option %s only allows one instance in command line!" % option) - -## Parse command line options -# -# Using standard Python module optparse to parse command line option of this tool. -# -# @retval Opt A optparse.Values object containing the parsed options -# @retval Args Target of build command -# -def myOptionParser(): - usage = "%prog [options] -f input_file -a arch_list -b build_target -p active_platform -t tool_chain_tag -D \"MacroName [= MacroValue]\"" - Parser = OptionParser(usage=usage,description=__copyright__,version="%prog " + str(versionNumber)) - Parser.add_option("-f", "--file", dest="filename", type="string", help="Name of FDF file to convert", action="callback", callback=SingleCheckCallback) - Parser.add_option("-a", "--arch", dest="archList", help="comma separated list containing one or more of: IA32, X64, IPF, ARM, AARCH64 or EBC which should be built, overrides target.txt?s TARGET_ARCH") - Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.") - Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed.") - Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.") - Parser.add_option("-p", "--platform", type="string", dest="activePlatform", help="Set the ACTIVE_PLATFORM, overrides target.txt ACTIVE_PLATFORM setting.", - action="callback", callback=SingleCheckCallback) - Parser.add_option("-w", "--workspace", type="string", dest="Workspace", default=os.environ.get('WORKSPACE'), help="Set the WORKSPACE", - action="callback", callback=SingleCheckCallback) - Parser.add_option("-o", "--outputDir", type="string", dest="outputDir", help="Name of Build Output directory", - action="callback", callback=SingleCheckCallback) - Parser.add_option("-r", "--rom_image", dest="uiFdName", help="Build the image using the [FD] section named by FdUiName.") - Parser.add_option("-i", "--FvImage", dest="uiFvName", help="Build the FV image using the [FV] section named by UiFvName") - Parser.add_option("-C", "--CapsuleImage", dest="uiCapName", help="Build the Capsule image using the [Capsule] section named by UiCapName") - Parser.add_option("-b", "--buildtarget", type="string", dest="BuildTarget", help="Set the build TARGET, overrides target.txt TARGET setting.", - action="callback", callback=SingleCheckCallback) - Parser.add_option("-t", "--tagname", type="string", dest="ToolChain", help="Using the tools: TOOL_CHAIN_TAG name to build the platform.", - action="callback", callback=SingleCheckCallback) - Parser.add_option("-D", "--define", action="append", type="string", dest="Macros", help="Macro: \"Name [= Value]\".") - Parser.add_option("-s", "--specifyaddress", dest="FixedAddress", action="store_true", type=None, help="Specify driver load address.") - (Options, args) = Parser.parse_args() - return Options - -## The class implementing the EDK2 flash image generation process -# -# This process includes: -# 1. Collect workspace information, includes platform and module information -# 2. Call methods of Fd class to generate FD -# 3. Call methods of Fv class to generate FV that not belong to FD -# -class GenFds : - FdfParsef = None - # FvName, FdName, CapName in FDF, Image file name - ImageBinDict = {} - OnlyGenerateThisFd = None - OnlyGenerateThisFv = None - OnlyGenerateThisCap = None - - ## GenFd() - # - # @param OutputDir Output directory - # @param FdfParser FDF contents parser - # @param Workspace The directory of workspace - # @param ArchList The Arch list of platform - # - def GenFd (OutputDir, FdfParser, WorkSpace, ArchList): - GenFdsGlobalVariable.SetDir ('', FdfParser, WorkSpace, ArchList) - - GenFdsGlobalVariable.VerboseLogger(" Generate all Fd images and their required FV and Capsule images!") - if GenFds.OnlyGenerateThisCap != None and GenFds.OnlyGenerateThisCap.upper() in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): - CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.get(GenFds.OnlyGenerateThisCap.upper()) - if CapsuleObj != None: - CapsuleObj.GenCapsule() - return - - if GenFds.OnlyGenerateThisFd != None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): - FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(GenFds.OnlyGenerateThisFd.upper()) - if FdObj != None: - FdObj.GenFd() - return - elif GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisFv == None: - for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): - FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName] - FdObj.GenFd() - - GenFdsGlobalVariable.VerboseLogger("\n Generate other FV images! ") - if GenFds.OnlyGenerateThisFv != None and GenFds.OnlyGenerateThisFv.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): - FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(GenFds.OnlyGenerateThisFv.upper()) - if FvObj != None: - Buffer = StringIO.StringIO() - FvObj.AddToBuffer(Buffer) - Buffer.close() - return - elif GenFds.OnlyGenerateThisFv == None: - for FvName in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): - Buffer = StringIO.StringIO('') - FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[FvName] - FvObj.AddToBuffer(Buffer) - Buffer.close() - - if GenFds.OnlyGenerateThisFv == None and GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisCap == None: - if GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict != {}: - GenFdsGlobalVariable.VerboseLogger("\n Generate other Capsule images!") - for CapsuleName in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): - CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict[CapsuleName] - CapsuleObj.GenCapsule() - - if GenFdsGlobalVariable.FdfParser.Profile.OptRomDict != {}: - GenFdsGlobalVariable.VerboseLogger("\n Generate all Option ROM!") - for DriverName in GenFdsGlobalVariable.FdfParser.Profile.OptRomDict.keys(): - OptRomObj = GenFdsGlobalVariable.FdfParser.Profile.OptRomDict[DriverName] - OptRomObj.AddToBuffer(None) - - ## GetFvBlockSize() - # - # @param FvObj Whose block size to get - # @retval int Block size value - # - def GetFvBlockSize(FvObj): - DefaultBlockSize = 0x1 - FdObj = None - if GenFds.OnlyGenerateThisFd != None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): - FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[GenFds.OnlyGenerateThisFd.upper()] - if FdObj == None: - for ElementFd in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values(): - for ElementRegion in ElementFd.RegionList: - if ElementRegion.RegionType == 'FV': - for ElementRegionData in ElementRegion.RegionDataList: - if ElementRegionData != None and ElementRegionData.upper() == FvObj.UiFvName: - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - else: - return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - return DefaultBlockSize - else: - for ElementRegion in FdObj.RegionList: - if ElementRegion.RegionType == 'FV': - for ElementRegionData in ElementRegion.RegionDataList: - if ElementRegionData != None and ElementRegionData.upper() == FvObj.UiFvName: - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - else: - return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) - return DefaultBlockSize - - ## DisplayFvSpaceInfo() - # - # @param FvObj Whose block size to get - # @retval None - # - def DisplayFvSpaceInfo(FdfParser): - - FvSpaceInfoList = [] - MaxFvNameLength = 0 - for FvName in FdfParser.Profile.FvDict: - if len(FvName) > MaxFvNameLength: - MaxFvNameLength = len(FvName) - FvSpaceInfoFileName = os.path.join(GenFdsGlobalVariable.FvDir, FvName.upper() + '.Fv.map') - if os.path.exists(FvSpaceInfoFileName): - FileLinesList = linecache.getlines(FvSpaceInfoFileName) - TotalFound = False - Total = '' - UsedFound = False - Used = '' - FreeFound = False - Free = '' - for Line in FileLinesList: - NameValue = Line.split('=') - if len(NameValue) == 2: - if NameValue[0].strip() == 'EFI_FV_TOTAL_SIZE': - TotalFound = True - Total = NameValue[1].strip() - if NameValue[0].strip() == 'EFI_FV_TAKEN_SIZE': - UsedFound = True - Used = NameValue[1].strip() - if NameValue[0].strip() == 'EFI_FV_SPACE_SIZE': - FreeFound = True - Free = NameValue[1].strip() - - if TotalFound and UsedFound and FreeFound: - FvSpaceInfoList.append((FvName, Total, Used, Free)) - - GenFdsGlobalVariable.InfLogger('\nFV Space Information') - for FvSpaceInfo in FvSpaceInfoList: - Name = FvSpaceInfo[0] - TotalSizeValue = long(FvSpaceInfo[1], 0) - UsedSizeValue = long(FvSpaceInfo[2], 0) - FreeSizeValue = long(FvSpaceInfo[3], 0) - if UsedSizeValue == TotalSizeValue: - Percentage = '100' - else: - Percentage = str((UsedSizeValue+0.0)/TotalSizeValue)[0:4].lstrip('0.') - - GenFdsGlobalVariable.InfLogger(Name + ' ' + '[' + Percentage + '%Full] ' + str(TotalSizeValue) + ' total, ' + str(UsedSizeValue) + ' used, ' + str(FreeSizeValue) + ' free') - - ## PreprocessImage() - # - # @param BuildDb Database from build meta data files - # @param DscFile modules from dsc file will be preprocessed - # @retval None - # - def PreprocessImage(BuildDb, DscFile): - PcdDict = BuildDb.BuildObject[DscFile, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].Pcds - PcdValue = '' - for Key in PcdDict: - PcdObj = PcdDict[Key] - if PcdObj.TokenCName == 'PcdBsBaseAddress': - PcdValue = PcdObj.DefaultValue - break - - if PcdValue == '': - return - - Int64PcdValue = long(PcdValue, 0) - if Int64PcdValue == 0 or Int64PcdValue < -1: - return - - TopAddress = 0 - if Int64PcdValue > 0: - TopAddress = Int64PcdValue - - ModuleDict = BuildDb.BuildObject[DscFile, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].Modules - for Key in ModuleDict: - ModuleObj = BuildDb.BuildObject[Key, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] - print ModuleObj.BaseName + ' ' + ModuleObj.ModuleType - - def GenerateGuidXRefFile(BuildDb, ArchList): - GuidXRefFileName = os.path.join(GenFdsGlobalVariable.FvDir, "Guid.xref") - GuidXRefFile = StringIO.StringIO('') - for Arch in ArchList: - PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] - for ModuleFile in PlatformDataBase.Modules: - Module = BuildDb.BuildObject[ModuleFile, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] - GuidXRefFile.write("%s %s\n" % (Module.Guid, Module.BaseName)) - if GuidXRefFile.getvalue(): - SaveFileOnChange(GuidXRefFileName, GuidXRefFile.getvalue(), False) - GenFdsGlobalVariable.InfLogger("\nGUID cross reference file can be found at %s" % GuidXRefFileName) - elif os.path.exists(GuidXRefFileName): - os.remove(GuidXRefFileName) - GuidXRefFile.close() - - ##Define GenFd as static function - GenFd = staticmethod(GenFd) - GetFvBlockSize = staticmethod(GetFvBlockSize) - DisplayFvSpaceInfo = staticmethod(DisplayFvSpaceInfo) - PreprocessImage = staticmethod(PreprocessImage) - GenerateGuidXRefFile = staticmethod(GenerateGuidXRefFile) - -if __name__ == '__main__': - r = main() - ## 0-127 is a safe return range, and 1 is a standard default error - if r < 0 or r > 127: r = 1 - sys.exit(r) - +## @file +# generate flash image +# +# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +from optparse import OptionParser +import sys +import os +import linecache +import FdfParser +import Common.BuildToolError as BuildToolError +from GenFdsGlobalVariable import GenFdsGlobalVariable +from Workspace.WorkspaceDatabase import WorkspaceDatabase +from Workspace.BuildClassObject import PcdClassObject +from Workspace.BuildClassObject import ModuleBuildClassObject +import RuleComplexFile +from EfiSection import EfiSection +import StringIO +import Common.TargetTxtClassObject as TargetTxtClassObject +import Common.ToolDefClassObject as ToolDefClassObject +import Common.DataType +import Common.GlobalData as GlobalData +from Common import EdkLogger +from Common.String import * +from Common.Misc import DirCache,PathClass +from Common.Misc import SaveFileOnChange +from Common.BuildVersion import gBUILD_VERSION + +## Version and Copyright +versionNumber = "1.0" + ' ' + gBUILD_VERSION +__version__ = "%prog Version " + versionNumber +__copyright__ = "Copyright (c) 2007 - 2013, Intel Corporation All rights reserved." + +## Tool entrance method +# +# This method mainly dispatch specific methods per the command line options. +# If no error found, return zero value so the caller of this tool can know +# if it's executed successfully or not. +# +# @retval 0 Tool was successful +# @retval 1 Tool failed +# +def main(): + global Options + Options = myOptionParser() + + global Workspace + Workspace = "" + ArchList = None + ReturnCode = 0 + + EdkLogger.Initialize() + try: + if Options.verbose != None: + EdkLogger.SetLevel(EdkLogger.VERBOSE) + GenFdsGlobalVariable.VerboseMode = True + + if Options.FixedAddress != None: + GenFdsGlobalVariable.FixedLoadAddress = True + + if Options.quiet != None: + EdkLogger.SetLevel(EdkLogger.QUIET) + if Options.debug != None: + EdkLogger.SetLevel(Options.debug + 1) + GenFdsGlobalVariable.DebugLevel = Options.debug + else: + EdkLogger.SetLevel(EdkLogger.INFO) + + if (Options.Workspace == None): + EdkLogger.error("GenFds", OPTION_MISSING, "WORKSPACE not defined", + ExtraData="Please use '-w' switch to pass it or set the WORKSPACE environment variable.") + elif not os.path.exists(Options.Workspace): + EdkLogger.error("GenFds", PARAMETER_INVALID, "WORKSPACE is invalid", + ExtraData="Please use '-w' switch to pass it or set the WORKSPACE environment variable.") + else: + Workspace = os.path.normcase(Options.Workspace) + GenFdsGlobalVariable.WorkSpaceDir = Workspace + if 'EDK_SOURCE' in os.environ.keys(): + GenFdsGlobalVariable.EdkSourceDir = os.path.normcase(os.environ['EDK_SOURCE']) + if (Options.debug): + GenFdsGlobalVariable.VerboseLogger( "Using Workspace:" + Workspace) + os.chdir(GenFdsGlobalVariable.WorkSpaceDir) + + if (Options.filename): + FdfFilename = Options.filename + FdfFilename = GenFdsGlobalVariable.ReplaceWorkspaceMacro(FdfFilename) + + if FdfFilename[0:2] == '..': + FdfFilename = os.path.realpath(FdfFilename) + if not os.path.isabs (FdfFilename): + FdfFilename = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, FdfFilename) + if not os.path.exists(FdfFilename): + EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=FdfFilename) + if os.path.normcase (FdfFilename).find(Workspace) != 0: + EdkLogger.error("GenFds", FILE_NOT_FOUND, "FdfFile doesn't exist in Workspace!") + + GenFdsGlobalVariable.FdfFile = FdfFilename + GenFdsGlobalVariable.FdfFileTimeStamp = os.path.getmtime(FdfFilename) + else: + EdkLogger.error("GenFds", OPTION_MISSING, "Missing FDF filename") + + if (Options.BuildTarget): + GenFdsGlobalVariable.TargetName = Options.BuildTarget + else: + EdkLogger.error("GenFds", OPTION_MISSING, "Missing build target") + + if (Options.ToolChain): + GenFdsGlobalVariable.ToolChainTag = Options.ToolChain + else: + EdkLogger.error("GenFds", OPTION_MISSING, "Missing tool chain tag") + + if (Options.activePlatform): + ActivePlatform = Options.activePlatform + ActivePlatform = GenFdsGlobalVariable.ReplaceWorkspaceMacro(ActivePlatform) + + if ActivePlatform[0:2] == '..': + ActivePlatform = os.path.realpath(ActivePlatform) + + if not os.path.isabs (ActivePlatform): + ActivePlatform = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, ActivePlatform) + + if not os.path.exists(ActivePlatform) : + EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist!") + + if os.path.normcase (ActivePlatform).find(Workspace) != 0: + EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist in Workspace!") + + ActivePlatform = ActivePlatform[len(Workspace):] + if len(ActivePlatform) > 0 : + if ActivePlatform[0] == '\\' or ActivePlatform[0] == '/': + ActivePlatform = ActivePlatform[1:] + else: + EdkLogger.error("GenFds", FILE_NOT_FOUND, "ActivePlatform doesn't exist!") + else: + EdkLogger.error("GenFds", OPTION_MISSING, "Missing active platform") + + GenFdsGlobalVariable.ActivePlatform = PathClass(NormPath(ActivePlatform), Workspace) + + BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, "Conf/target.txt")) + if os.path.isfile(BuildConfigurationFile) == True: + TargetTxtClassObject.TargetTxtClassObject(BuildConfigurationFile) + else: + EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=BuildConfigurationFile) + + if Options.Macros: + for Pair in Options.Macros: + Pair.strip('"') + List = Pair.split('=') + if len(List) == 2: + if List[0].strip() == "EFI_SOURCE": + GlobalData.gEfiSource = List[1].strip() + GlobalData.gGlobalDefines["EFI_SOURCE"] = GlobalData.gEfiSource + continue + elif List[0].strip() == "EDK_SOURCE": + GlobalData.gEdkSource = List[1].strip() + GlobalData.gGlobalDefines["EDK_SOURCE"] = GlobalData.gEdkSource + continue + elif List[0].strip() in ["WORKSPACE", "TARGET", "TOOLCHAIN"]: + GlobalData.gGlobalDefines[List[0].strip()] = List[1].strip() + else: + GlobalData.gCommandLineDefines[List[0].strip()] = List[1].strip() + else: + GlobalData.gCommandLineDefines[List[0].strip()] = "TRUE" + os.environ["WORKSPACE"] = Workspace + + """call Workspace build create database""" + BuildWorkSpace = WorkspaceDatabase(None) + BuildWorkSpace.InitDatabase() + + # + # Get files real name in workspace dir + # + GlobalData.gAllFiles = DirCache(Workspace) + GlobalData.gWorkspace = Workspace + + if (Options.archList) : + ArchList = Options.archList.split(',') + else: +# EdkLogger.error("GenFds", OPTION_MISSING, "Missing build ARCH") + ArchList = BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON', Options.BuildTarget, Options.ToolChain].SupArchList + + TargetArchList = set(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON', Options.BuildTarget, Options.ToolChain].SupArchList) & set(ArchList) + if len(TargetArchList) == 0: + EdkLogger.error("GenFds", GENFDS_ERROR, "Target ARCH %s not in platform supported ARCH %s" % (str(ArchList), str(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, 'COMMON'].SupArchList))) + + for Arch in ArchList: + GenFdsGlobalVariable.OutputDirFromDscDict[Arch] = NormPath(BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, Options.BuildTarget, Options.ToolChain].OutputDirectory) + GenFdsGlobalVariable.PlatformName = BuildWorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, Options.BuildTarget, Options.ToolChain].PlatformName + + if (Options.outputDir): + OutputDirFromCommandLine = GenFdsGlobalVariable.ReplaceWorkspaceMacro(Options.outputDir) + if not os.path.isabs (OutputDirFromCommandLine): + OutputDirFromCommandLine = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, OutputDirFromCommandLine) + for Arch in ArchList: + GenFdsGlobalVariable.OutputDirDict[Arch] = OutputDirFromCommandLine + else: + for Arch in ArchList: + GenFdsGlobalVariable.OutputDirDict[Arch] = os.path.join(GenFdsGlobalVariable.OutputDirFromDscDict[Arch], GenFdsGlobalVariable.TargetName + '_' + GenFdsGlobalVariable.ToolChainTag) + + for Key in GenFdsGlobalVariable.OutputDirDict: + OutputDir = GenFdsGlobalVariable.OutputDirDict[Key] + if OutputDir[0:2] == '..': + OutputDir = os.path.realpath(OutputDir) + + if OutputDir[1] != ':': + OutputDir = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, OutputDir) + + if not os.path.exists(OutputDir): + EdkLogger.error("GenFds", FILE_NOT_FOUND, ExtraData=OutputDir) + GenFdsGlobalVariable.OutputDirDict[Key] = OutputDir + + """ Parse Fdf file, has to place after build Workspace as FDF may contain macros from DSC file """ + FdfParserObj = FdfParser.FdfParser(FdfFilename) + FdfParserObj.ParseFile() + + if FdfParserObj.CycleReferenceCheck(): + EdkLogger.error("GenFds", FORMAT_NOT_SUPPORTED, "Cycle Reference Detected in FDF file") + + if (Options.uiFdName) : + if Options.uiFdName.upper() in FdfParserObj.Profile.FdDict.keys(): + GenFds.OnlyGenerateThisFd = Options.uiFdName + else: + EdkLogger.error("GenFds", OPTION_VALUE_INVALID, + "No such an FD in FDF file: %s" % Options.uiFdName) + + if (Options.uiFvName) : + if Options.uiFvName.upper() in FdfParserObj.Profile.FvDict.keys(): + GenFds.OnlyGenerateThisFv = Options.uiFvName + else: + EdkLogger.error("GenFds", OPTION_VALUE_INVALID, + "No such an FV in FDF file: %s" % Options.uiFvName) + + if (Options.uiCapName) : + if Options.uiCapName.upper() in FdfParserObj.Profile.CapsuleDict.keys(): + GenFds.OnlyGenerateThisCap = Options.uiCapName + else: + EdkLogger.error("GenFds", OPTION_VALUE_INVALID, + "No such a Capsule in FDF file: %s" % Options.uiCapName) + + """Modify images from build output if the feature of loading driver at fixed address is on.""" + if GenFdsGlobalVariable.FixedLoadAddress: + GenFds.PreprocessImage(BuildWorkSpace, GenFdsGlobalVariable.ActivePlatform) + """Call GenFds""" + GenFds.GenFd('', FdfParserObj, BuildWorkSpace, ArchList) + + """Generate GUID cross reference file""" + GenFds.GenerateGuidXRefFile(BuildWorkSpace, ArchList) + + """Display FV space info.""" + GenFds.DisplayFvSpaceInfo(FdfParserObj) + + except FdfParser.Warning, X: + EdkLogger.error(X.ToolName, FORMAT_INVALID, File=X.FileName, Line=X.LineNumber, ExtraData=X.Message, RaiseError = False) + ReturnCode = FORMAT_INVALID + except FatalError, X: + if Options.debug != None: + import traceback + EdkLogger.quiet(traceback.format_exc()) + ReturnCode = X.args[0] + except: + import traceback + EdkLogger.error( + "\nPython", + CODE_ERROR, + "Tools code failure", + ExtraData="Please send email to edk2-buildtools-devel@lists.sourceforge.net for help, attaching following call stack trace!\n", + RaiseError=False + ) + EdkLogger.quiet(traceback.format_exc()) + ReturnCode = CODE_ERROR + return ReturnCode + +gParamCheck = [] +def SingleCheckCallback(option, opt_str, value, parser): + if option not in gParamCheck: + setattr(parser.values, option.dest, value) + gParamCheck.append(option) + else: + parser.error("Option %s only allows one instance in command line!" % option) + +## Parse command line options +# +# Using standard Python module optparse to parse command line option of this tool. +# +# @retval Opt A optparse.Values object containing the parsed options +# @retval Args Target of build command +# +def myOptionParser(): + usage = "%prog [options] -f input_file -a arch_list -b build_target -p active_platform -t tool_chain_tag -D \"MacroName [= MacroValue]\"" + Parser = OptionParser(usage=usage,description=__copyright__,version="%prog " + str(versionNumber)) + Parser.add_option("-f", "--file", dest="filename", type="string", help="Name of FDF file to convert", action="callback", callback=SingleCheckCallback) + Parser.add_option("-a", "--arch", dest="archList", help="comma separated list containing one or more of: IA32, X64, IPF, ARM, AARCH64 or EBC which should be built, overrides target.txt?s TARGET_ARCH") + Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.") + Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed.") + Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.") + Parser.add_option("-p", "--platform", type="string", dest="activePlatform", help="Set the ACTIVE_PLATFORM, overrides target.txt ACTIVE_PLATFORM setting.", + action="callback", callback=SingleCheckCallback) + Parser.add_option("-w", "--workspace", type="string", dest="Workspace", default=os.environ.get('WORKSPACE'), help="Set the WORKSPACE", + action="callback", callback=SingleCheckCallback) + Parser.add_option("-o", "--outputDir", type="string", dest="outputDir", help="Name of Build Output directory", + action="callback", callback=SingleCheckCallback) + Parser.add_option("-r", "--rom_image", dest="uiFdName", help="Build the image using the [FD] section named by FdUiName.") + Parser.add_option("-i", "--FvImage", dest="uiFvName", help="Build the FV image using the [FV] section named by UiFvName") + Parser.add_option("-C", "--CapsuleImage", dest="uiCapName", help="Build the Capsule image using the [Capsule] section named by UiCapName") + Parser.add_option("-b", "--buildtarget", type="string", dest="BuildTarget", help="Set the build TARGET, overrides target.txt TARGET setting.", + action="callback", callback=SingleCheckCallback) + Parser.add_option("-t", "--tagname", type="string", dest="ToolChain", help="Using the tools: TOOL_CHAIN_TAG name to build the platform.", + action="callback", callback=SingleCheckCallback) + Parser.add_option("-D", "--define", action="append", type="string", dest="Macros", help="Macro: \"Name [= Value]\".") + Parser.add_option("-s", "--specifyaddress", dest="FixedAddress", action="store_true", type=None, help="Specify driver load address.") + (Options, args) = Parser.parse_args() + return Options + +## The class implementing the EDK2 flash image generation process +# +# This process includes: +# 1. Collect workspace information, includes platform and module information +# 2. Call methods of Fd class to generate FD +# 3. Call methods of Fv class to generate FV that not belong to FD +# +class GenFds : + FdfParsef = None + # FvName, FdName, CapName in FDF, Image file name + ImageBinDict = {} + OnlyGenerateThisFd = None + OnlyGenerateThisFv = None + OnlyGenerateThisCap = None + + ## GenFd() + # + # @param OutputDir Output directory + # @param FdfParser FDF contents parser + # @param Workspace The directory of workspace + # @param ArchList The Arch list of platform + # + def GenFd (OutputDir, FdfParser, WorkSpace, ArchList): + GenFdsGlobalVariable.SetDir ('', FdfParser, WorkSpace, ArchList) + + GenFdsGlobalVariable.VerboseLogger(" Generate all Fd images and their required FV and Capsule images!") + if GenFds.OnlyGenerateThisCap != None and GenFds.OnlyGenerateThisCap.upper() in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): + CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.get(GenFds.OnlyGenerateThisCap.upper()) + if CapsuleObj != None: + CapsuleObj.GenCapsule() + return + + if GenFds.OnlyGenerateThisFd != None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): + FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(GenFds.OnlyGenerateThisFd.upper()) + if FdObj != None: + FdObj.GenFd() + return + elif GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisFv == None: + for FdName in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): + FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[FdName] + FdObj.GenFd() + + GenFdsGlobalVariable.VerboseLogger("\n Generate other FV images! ") + if GenFds.OnlyGenerateThisFv != None and GenFds.OnlyGenerateThisFv.upper() in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): + FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(GenFds.OnlyGenerateThisFv.upper()) + if FvObj != None: + Buffer = StringIO.StringIO() + FvObj.AddToBuffer(Buffer) + Buffer.close() + return + elif GenFds.OnlyGenerateThisFv == None: + for FvName in GenFdsGlobalVariable.FdfParser.Profile.FvDict.keys(): + Buffer = StringIO.StringIO('') + FvObj = GenFdsGlobalVariable.FdfParser.Profile.FvDict[FvName] + FvObj.AddToBuffer(Buffer) + Buffer.close() + + if GenFds.OnlyGenerateThisFv == None and GenFds.OnlyGenerateThisFd == None and GenFds.OnlyGenerateThisCap == None: + if GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict != {}: + GenFdsGlobalVariable.VerboseLogger("\n Generate other Capsule images!") + for CapsuleName in GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict.keys(): + CapsuleObj = GenFdsGlobalVariable.FdfParser.Profile.CapsuleDict[CapsuleName] + CapsuleObj.GenCapsule() + + if GenFdsGlobalVariable.FdfParser.Profile.OptRomDict != {}: + GenFdsGlobalVariable.VerboseLogger("\n Generate all Option ROM!") + for DriverName in GenFdsGlobalVariable.FdfParser.Profile.OptRomDict.keys(): + OptRomObj = GenFdsGlobalVariable.FdfParser.Profile.OptRomDict[DriverName] + OptRomObj.AddToBuffer(None) + + ## GetFvBlockSize() + # + # @param FvObj Whose block size to get + # @retval int Block size value + # + def GetFvBlockSize(FvObj): + DefaultBlockSize = 0x1 + FdObj = None + if GenFds.OnlyGenerateThisFd != None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict.keys(): + FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[GenFds.OnlyGenerateThisFd.upper()] + if FdObj == None: + for ElementFd in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values(): + for ElementRegion in ElementFd.RegionList: + if ElementRegion.RegionType == 'FV': + for ElementRegionData in ElementRegion.RegionDataList: + if ElementRegionData != None and ElementRegionData.upper() == FvObj.UiFvName: + if FvObj.BlockSizeList != []: + return FvObj.BlockSizeList[0][0] + else: + return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) + if FvObj.BlockSizeList != []: + return FvObj.BlockSizeList[0][0] + return DefaultBlockSize + else: + for ElementRegion in FdObj.RegionList: + if ElementRegion.RegionType == 'FV': + for ElementRegionData in ElementRegion.RegionDataList: + if ElementRegionData != None and ElementRegionData.upper() == FvObj.UiFvName: + if FvObj.BlockSizeList != []: + return FvObj.BlockSizeList[0][0] + else: + return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) + return DefaultBlockSize + + ## DisplayFvSpaceInfo() + # + # @param FvObj Whose block size to get + # @retval None + # + def DisplayFvSpaceInfo(FdfParser): + + FvSpaceInfoList = [] + MaxFvNameLength = 0 + for FvName in FdfParser.Profile.FvDict: + if len(FvName) > MaxFvNameLength: + MaxFvNameLength = len(FvName) + FvSpaceInfoFileName = os.path.join(GenFdsGlobalVariable.FvDir, FvName.upper() + '.Fv.map') + if os.path.exists(FvSpaceInfoFileName): + FileLinesList = linecache.getlines(FvSpaceInfoFileName) + TotalFound = False + Total = '' + UsedFound = False + Used = '' + FreeFound = False + Free = '' + for Line in FileLinesList: + NameValue = Line.split('=') + if len(NameValue) == 2: + if NameValue[0].strip() == 'EFI_FV_TOTAL_SIZE': + TotalFound = True + Total = NameValue[1].strip() + if NameValue[0].strip() == 'EFI_FV_TAKEN_SIZE': + UsedFound = True + Used = NameValue[1].strip() + if NameValue[0].strip() == 'EFI_FV_SPACE_SIZE': + FreeFound = True + Free = NameValue[1].strip() + + if TotalFound and UsedFound and FreeFound: + FvSpaceInfoList.append((FvName, Total, Used, Free)) + + GenFdsGlobalVariable.InfLogger('\nFV Space Information') + for FvSpaceInfo in FvSpaceInfoList: + Name = FvSpaceInfo[0] + TotalSizeValue = long(FvSpaceInfo[1], 0) + UsedSizeValue = long(FvSpaceInfo[2], 0) + FreeSizeValue = long(FvSpaceInfo[3], 0) + if UsedSizeValue == TotalSizeValue: + Percentage = '100' + else: + Percentage = str((UsedSizeValue+0.0)/TotalSizeValue)[0:4].lstrip('0.') + + GenFdsGlobalVariable.InfLogger(Name + ' ' + '[' + Percentage + '%Full] ' + str(TotalSizeValue) + ' total, ' + str(UsedSizeValue) + ' used, ' + str(FreeSizeValue) + ' free') + + ## PreprocessImage() + # + # @param BuildDb Database from build meta data files + # @param DscFile modules from dsc file will be preprocessed + # @retval None + # + def PreprocessImage(BuildDb, DscFile): + PcdDict = BuildDb.BuildObject[DscFile, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].Pcds + PcdValue = '' + for Key in PcdDict: + PcdObj = PcdDict[Key] + if PcdObj.TokenCName == 'PcdBsBaseAddress': + PcdValue = PcdObj.DefaultValue + break + + if PcdValue == '': + return + + Int64PcdValue = long(PcdValue, 0) + if Int64PcdValue == 0 or Int64PcdValue < -1: + return + + TopAddress = 0 + if Int64PcdValue > 0: + TopAddress = Int64PcdValue + + ModuleDict = BuildDb.BuildObject[DscFile, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].Modules + for Key in ModuleDict: + ModuleObj = BuildDb.BuildObject[Key, 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] + print ModuleObj.BaseName + ' ' + ModuleObj.ModuleType + + def GenerateGuidXRefFile(BuildDb, ArchList): + GuidXRefFileName = os.path.join(GenFdsGlobalVariable.FvDir, "Guid.xref") + GuidXRefFile = StringIO.StringIO('') + for Arch in ArchList: + PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] + for ModuleFile in PlatformDataBase.Modules: + Module = BuildDb.BuildObject[ModuleFile, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] + GuidXRefFile.write("%s %s\n" % (Module.Guid, Module.BaseName)) + if GuidXRefFile.getvalue(): + SaveFileOnChange(GuidXRefFileName, GuidXRefFile.getvalue(), False) + GenFdsGlobalVariable.InfLogger("\nGUID cross reference file can be found at %s" % GuidXRefFileName) + elif os.path.exists(GuidXRefFileName): + os.remove(GuidXRefFileName) + GuidXRefFile.close() + + ##Define GenFd as static function + GenFd = staticmethod(GenFd) + GetFvBlockSize = staticmethod(GetFvBlockSize) + DisplayFvSpaceInfo = staticmethod(DisplayFvSpaceInfo) + PreprocessImage = staticmethod(PreprocessImage) + GenerateGuidXRefFile = staticmethod(GenerateGuidXRefFile) + +if __name__ == '__main__': + r = main() + ## 0-127 is a safe return range, and 1 is a standard default error + if r < 0 or r > 127: r = 1 + sys.exit(r) + diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py index 1cd31bccc3..cbf3d980a8 100644 --- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py @@ -1,722 +1,722 @@ -## @file -# Global variables for GenFds -# -# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import subprocess -import struct -import array - -from Common.BuildToolError import * -from Common import EdkLogger -from Common.Misc import SaveFileOnChange - -from Common.TargetTxtClassObject import TargetTxtClassObject -from Common.ToolDefClassObject import ToolDefClassObject -from AutoGen.BuildEngine import BuildRule -import Common.DataType as DataType -from Common.Misc import PathClass - -## Global variables -# -# -class GenFdsGlobalVariable: - FvDir = '' - OutputDirDict = {} - BinDir = '' - # will be FvDir + os.sep + 'Ffs' - FfsDir = '' - FdfParser = None - LibDir = '' - WorkSpace = None - WorkSpaceDir = '' - EdkSourceDir = '' - OutputDirFromDscDict = {} - TargetName = '' - ToolChainTag = '' - RuleDict = {} - ArchList = None - VtfDict = {} - ActivePlatform = None - FvAddressFileName = '' - VerboseMode = False - DebugLevel = -1 - SharpCounter = 0 - SharpNumberPerLine = 40 - FdfFile = '' - FdfFileTimeStamp = 0 - FixedLoadAddress = False - PlatformName = '' - - BuildRuleFamily = "MSFT" - ToolChainFamily = "MSFT" - __BuildRuleDatabase = None - - # - # The list whose element are flags to indicate if large FFS or SECTION files exist in FV. - # At the beginning of each generation of FV, false flag is appended to the list, - # after the call to GenerateSection returns, check the size of the output file, - # if it is greater than 0xFFFFFF, the tail flag in list is set to true, - # and EFI_FIRMWARE_FILE_SYSTEM3_GUID is passed to C GenFv. - # At the end of generation of FV, pop the flag. - # List is used as a stack to handle nested FV generation. - # - LargeFileInFvFlags = [] - EFI_FIRMWARE_FILE_SYSTEM3_GUID = '5473C07A-3DCB-4dca-BD6F-1E9689E7349A' - LARGE_FILE_SIZE = 0x1000000 - - SectionHeader = struct.Struct("3B 1B") - - ## LoadBuildRule - # - @staticmethod - def __LoadBuildRule(): - if GenFdsGlobalVariable.__BuildRuleDatabase: - return GenFdsGlobalVariable.__BuildRuleDatabase - BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, "Conf/target.txt")) - TargetTxt = TargetTxtClassObject() - if os.path.isfile(BuildConfigurationFile) == True: - TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) - if DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary: - BuildRuleFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF] - if BuildRuleFile in [None, '']: - BuildRuleFile = 'Conf/build_rule.txt' - GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) - ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] - if ToolDefinitionFile == '': - ToolDefinitionFile = "Conf/tools_def.txt" - if os.path.isfile(ToolDefinitionFile): - ToolDef = ToolDefClassObject() - ToolDef.LoadToolDefFile(ToolDefinitionFile) - ToolDefinition = ToolDef.ToolsDefTxtDatabase - if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \ - and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \ - and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]: - GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag] - - if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \ - and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \ - and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]: - GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag] - return GenFdsGlobalVariable.__BuildRuleDatabase - - ## GetBuildRules - # @param Inf: object of InfBuildData - # @param Arch: current arch - # - @staticmethod - def GetBuildRules(Inf, Arch): - if not Arch: - Arch = 'COMMON' - - if not Arch in GenFdsGlobalVariable.OutputDirDict: - return {} - - BuildRuleDatabase = GenFdsGlobalVariable.__LoadBuildRule() - if not BuildRuleDatabase: - return {} - - PathClassObj = PathClass(Inf.MetaFile.File, - GenFdsGlobalVariable.WorkSpaceDir) - Macro = {} - Macro["WORKSPACE" ] = GenFdsGlobalVariable.WorkSpaceDir - Macro["MODULE_NAME" ] = Inf.BaseName - Macro["MODULE_GUID" ] = Inf.Guid - Macro["MODULE_VERSION" ] = Inf.Version - Macro["MODULE_TYPE" ] = Inf.ModuleType - Macro["MODULE_FILE" ] = str(PathClassObj) - Macro["MODULE_FILE_BASE_NAME" ] = PathClassObj.BaseName - Macro["MODULE_RELATIVE_DIR" ] = PathClassObj.SubDir - Macro["MODULE_DIR" ] = PathClassObj.SubDir - - Macro["BASE_NAME" ] = Inf.BaseName - - Macro["ARCH" ] = Arch - Macro["TOOLCHAIN" ] = GenFdsGlobalVariable.ToolChainTag - Macro["TOOLCHAIN_TAG" ] = GenFdsGlobalVariable.ToolChainTag - Macro["TOOL_CHAIN_TAG" ] = GenFdsGlobalVariable.ToolChainTag - Macro["TARGET" ] = GenFdsGlobalVariable.TargetName - - Macro["BUILD_DIR" ] = GenFdsGlobalVariable.OutputDirDict[Arch] - Macro["BIN_DIR" ] = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch], Arch) - Macro["LIB_DIR" ] = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch], Arch) - BuildDir = os.path.join( - GenFdsGlobalVariable.OutputDirDict[Arch], - Arch, - PathClassObj.SubDir, - PathClassObj.BaseName - ) - Macro["MODULE_BUILD_DIR" ] = BuildDir - Macro["OUTPUT_DIR" ] = os.path.join(BuildDir, "OUTPUT") - Macro["DEBUG_DIR" ] = os.path.join(BuildDir, "DEBUG") - - BuildRules = {} - for Type in BuildRuleDatabase.FileTypeList: - #first try getting build rule by BuildRuleFamily - RuleObject = BuildRuleDatabase[Type, Inf.BuildType, Arch, GenFdsGlobalVariable.BuildRuleFamily] - if not RuleObject: - # build type is always module type, but ... - if Inf.ModuleType != Inf.BuildType: - RuleObject = BuildRuleDatabase[Type, Inf.ModuleType, Arch, GenFdsGlobalVariable.BuildRuleFamily] - #second try getting build rule by ToolChainFamily - if not RuleObject: - RuleObject = BuildRuleDatabase[Type, Inf.BuildType, Arch, GenFdsGlobalVariable.ToolChainFamily] - if not RuleObject: - # build type is always module type, but ... - if Inf.ModuleType != Inf.BuildType: - RuleObject = BuildRuleDatabase[Type, Inf.ModuleType, Arch, GenFdsGlobalVariable.ToolChainFamily] - if not RuleObject: - continue - RuleObject = RuleObject.Instantiate(Macro) - BuildRules[Type] = RuleObject - for Ext in RuleObject.SourceFileExtList: - BuildRules[Ext] = RuleObject - return BuildRules - - ## GetModuleCodaTargetList - # - # @param Inf: object of InfBuildData - # @param Arch: current arch - # - @staticmethod - def GetModuleCodaTargetList(Inf, Arch): - BuildRules = GenFdsGlobalVariable.GetBuildRules(Inf, Arch) - if not BuildRules: - return [] - - TargetList = set() - FileList = [] - for File in Inf.Sources: - if File.TagName in ("", "*", GenFdsGlobalVariable.ToolChainTag) and \ - File.ToolChainFamily in ("", "*", GenFdsGlobalVariable.ToolChainFamily): - FileList.append((File, DataType.TAB_UNKNOWN_FILE)) - - for File in Inf.Binaries: - if File.Target in ['COMMON', '*', GenFdsGlobalVariable.TargetName]: - FileList.append((File, File.Type)) - - for File, FileType in FileList: - LastTarget = None - RuleChain = [] - SourceList = [File] - Index = 0 - while Index < len(SourceList): - Source = SourceList[Index] - Index = Index + 1 - - if File.IsBinary and File == Source and Inf.Binaries != None and File in Inf.Binaries: - # Skip all files that are not binary libraries - if not Inf.LibraryClass: - continue - RuleObject = BuildRules[DataType.TAB_DEFAULT_BINARY_FILE] - elif FileType in BuildRules: - RuleObject = BuildRules[FileType] - elif Source.Ext in BuildRules: - RuleObject = BuildRules[Source.Ext] - else: - # stop at no more rules - if LastTarget: - TargetList.add(str(LastTarget)) - break - - FileType = RuleObject.SourceFileType - - # stop at STATIC_LIBRARY for library - if Inf.LibraryClass and FileType == DataType.TAB_STATIC_LIBRARY: - if LastTarget: - TargetList.add(str(LastTarget)) - break - - Target = RuleObject.Apply(Source) - if not Target: - if LastTarget: - TargetList.add(str(LastTarget)) - break - elif not Target.Outputs: - # Only do build for target with outputs - TargetList.add(str(Target)) - - # to avoid cyclic rule - if FileType in RuleChain: - break - - RuleChain.append(FileType) - SourceList.extend(Target.Outputs) - LastTarget = Target - FileType = DataType.TAB_UNKNOWN_FILE - - return list(TargetList) - - ## SetDir() - # - # @param OutputDir Output directory - # @param FdfParser FDF contents parser - # @param Workspace The directory of workspace - # @param ArchList The Arch list of platform - # - def SetDir (OutputDir, FdfParser, WorkSpace, ArchList): - GenFdsGlobalVariable.VerboseLogger( "GenFdsGlobalVariable.OutputDir :%s" %OutputDir) -# GenFdsGlobalVariable.OutputDirDict = OutputDir - GenFdsGlobalVariable.FdfParser = FdfParser - GenFdsGlobalVariable.WorkSpace = WorkSpace - GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], 'FV') - if not os.path.exists(GenFdsGlobalVariable.FvDir) : - os.makedirs(GenFdsGlobalVariable.FvDir) - GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs') - if not os.path.exists(GenFdsGlobalVariable.FfsDir) : - os.makedirs(GenFdsGlobalVariable.FfsDir) - if ArchList != None: - GenFdsGlobalVariable.ArchList = ArchList - - T_CHAR_LF = '\n' - # - # Create FV Address inf file - # - GenFdsGlobalVariable.FvAddressFileName = os.path.join(GenFdsGlobalVariable.FfsDir, 'FvAddress.inf') - FvAddressFile = open (GenFdsGlobalVariable.FvAddressFileName, 'w') - # - # Add [Options] - # - FvAddressFile.writelines("[options]" + T_CHAR_LF) - BsAddress = '0' - for Arch in ArchList: - if GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].BsBaseAddress: - BsAddress = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].BsBaseAddress - break - - FvAddressFile.writelines("EFI_BOOT_DRIVER_BASE_ADDRESS = " + \ - BsAddress + \ - T_CHAR_LF) - - RtAddress = '0' - for Arch in ArchList: - if GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].RtBaseAddress: - RtAddress = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].RtBaseAddress - - FvAddressFile.writelines("EFI_RUNTIME_DRIVER_BASE_ADDRESS = " + \ - RtAddress + \ - T_CHAR_LF) - - FvAddressFile.close() - - ## ReplaceWorkspaceMacro() - # - # @param String String that may contain macro - # - def ReplaceWorkspaceMacro(String): - Str = String.replace('$(WORKSPACE)', GenFdsGlobalVariable.WorkSpaceDir) - if os.path.exists(Str): - if not os.path.isabs(Str): - Str = os.path.abspath(Str) - else: - Str = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, String) - return os.path.normpath(Str) - - ## Check if the input files are newer than output files - # - # @param Output Path of output file - # @param Input Path list of input files - # - # @retval True if Output doesn't exist, or any Input is newer - # @retval False if all Input is older than Output - # - @staticmethod - def NeedsUpdate(Output, Input): - if not os.path.exists(Output): - return True - # always update "Output" if no "Input" given - if Input == None or len(Input) == 0: - return True - - # if fdf file is changed after the 'Output" is generated, update the 'Output' - OutputTime = os.path.getmtime(Output) - if GenFdsGlobalVariable.FdfFileTimeStamp > OutputTime: - return True - - for F in Input: - # always update "Output" if any "Input" doesn't exist - if not os.path.exists(F): - return True - # always update "Output" if any "Input" is newer than "Output" - if os.path.getmtime(F) > OutputTime: - return True - return False - - @staticmethod - def GenerateSection(Output, Input, Type=None, CompressionType=None, Guid=None, - GuidHdrLen=None, GuidAttr=[], Ui=None, Ver=None, InputAlign=None, BuildNumber=None): - Cmd = ["GenSec"] - if Type not in [None, '']: - Cmd += ["-s", Type] - if CompressionType not in [None, '']: - Cmd += ["-c", CompressionType] - if Guid != None: - Cmd += ["-g", Guid] - if GuidHdrLen not in [None, '']: - Cmd += ["-l", GuidHdrLen] - if len(GuidAttr) != 0: - #Add each guided attribute - for Attr in GuidAttr: - Cmd += ["-r", Attr] - if InputAlign != None: - #Section Align is only for dummy section without section type - for SecAlign in InputAlign: - Cmd += ["--sectionalign", SecAlign] - - CommandFile = Output + '.txt' - if Ui not in [None, '']: - #Cmd += ["-n", '"' + Ui + '"'] - SectionData = array.array('B', [0,0,0,0]) - SectionData.fromstring(Ui.encode("utf_16_le")) - SectionData.append(0) - SectionData.append(0) - Len = len(SectionData) - GenFdsGlobalVariable.SectionHeader.pack_into(SectionData, 0, Len & 0xff, (Len >> 8) & 0xff, (Len >> 16) & 0xff, 0x15) - SaveFileOnChange(Output, SectionData.tostring()) - elif Ver not in [None, '']: - Cmd += ["-n", Ver] - if BuildNumber: - Cmd += ["-j", BuildNumber] - Cmd += ["-o", Output] - - SaveFileOnChange(CommandFile, ' '.join(Cmd), False) - if not GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): - return - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate section") - else: - Cmd += ["-o", Output] - Cmd += Input - - SaveFileOnChange(CommandFile, ' '.join(Cmd), False) - if GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate section") - - if (os.path.getsize(Output) >= GenFdsGlobalVariable.LARGE_FILE_SIZE and - GenFdsGlobalVariable.LargeFileInFvFlags): - GenFdsGlobalVariable.LargeFileInFvFlags[-1] = True - - @staticmethod - def GetAlignment (AlignString): - if AlignString == None: - return 0 +## @file +# Global variables for GenFds +# +# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import subprocess +import struct +import array + +from Common.BuildToolError import * +from Common import EdkLogger +from Common.Misc import SaveFileOnChange + +from Common.TargetTxtClassObject import TargetTxtClassObject +from Common.ToolDefClassObject import ToolDefClassObject +from AutoGen.BuildEngine import BuildRule +import Common.DataType as DataType +from Common.Misc import PathClass + +## Global variables +# +# +class GenFdsGlobalVariable: + FvDir = '' + OutputDirDict = {} + BinDir = '' + # will be FvDir + os.sep + 'Ffs' + FfsDir = '' + FdfParser = None + LibDir = '' + WorkSpace = None + WorkSpaceDir = '' + EdkSourceDir = '' + OutputDirFromDscDict = {} + TargetName = '' + ToolChainTag = '' + RuleDict = {} + ArchList = None + VtfDict = {} + ActivePlatform = None + FvAddressFileName = '' + VerboseMode = False + DebugLevel = -1 + SharpCounter = 0 + SharpNumberPerLine = 40 + FdfFile = '' + FdfFileTimeStamp = 0 + FixedLoadAddress = False + PlatformName = '' + + BuildRuleFamily = "MSFT" + ToolChainFamily = "MSFT" + __BuildRuleDatabase = None + + # + # The list whose element are flags to indicate if large FFS or SECTION files exist in FV. + # At the beginning of each generation of FV, false flag is appended to the list, + # after the call to GenerateSection returns, check the size of the output file, + # if it is greater than 0xFFFFFF, the tail flag in list is set to true, + # and EFI_FIRMWARE_FILE_SYSTEM3_GUID is passed to C GenFv. + # At the end of generation of FV, pop the flag. + # List is used as a stack to handle nested FV generation. + # + LargeFileInFvFlags = [] + EFI_FIRMWARE_FILE_SYSTEM3_GUID = '5473C07A-3DCB-4dca-BD6F-1E9689E7349A' + LARGE_FILE_SIZE = 0x1000000 + + SectionHeader = struct.Struct("3B 1B") + + ## LoadBuildRule + # + @staticmethod + def __LoadBuildRule(): + if GenFdsGlobalVariable.__BuildRuleDatabase: + return GenFdsGlobalVariable.__BuildRuleDatabase + BuildConfigurationFile = os.path.normpath(os.path.join(GenFdsGlobalVariable.WorkSpaceDir, "Conf/target.txt")) + TargetTxt = TargetTxtClassObject() + if os.path.isfile(BuildConfigurationFile) == True: + TargetTxt.LoadTargetTxtFile(BuildConfigurationFile) + if DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary: + BuildRuleFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF] + if BuildRuleFile in [None, '']: + BuildRuleFile = 'Conf/build_rule.txt' + GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile) + ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] + if ToolDefinitionFile == '': + ToolDefinitionFile = "Conf/tools_def.txt" + if os.path.isfile(ToolDefinitionFile): + ToolDef = ToolDefClassObject() + ToolDef.LoadToolDefFile(ToolDefinitionFile) + ToolDefinition = ToolDef.ToolsDefTxtDatabase + if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \ + and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \ + and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]: + GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag] + + if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \ + and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \ + and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]: + GenFdsGlobalVariable.ToolChainFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag] + return GenFdsGlobalVariable.__BuildRuleDatabase + + ## GetBuildRules + # @param Inf: object of InfBuildData + # @param Arch: current arch + # + @staticmethod + def GetBuildRules(Inf, Arch): + if not Arch: + Arch = 'COMMON' + + if not Arch in GenFdsGlobalVariable.OutputDirDict: + return {} + + BuildRuleDatabase = GenFdsGlobalVariable.__LoadBuildRule() + if not BuildRuleDatabase: + return {} + + PathClassObj = PathClass(Inf.MetaFile.File, + GenFdsGlobalVariable.WorkSpaceDir) + Macro = {} + Macro["WORKSPACE" ] = GenFdsGlobalVariable.WorkSpaceDir + Macro["MODULE_NAME" ] = Inf.BaseName + Macro["MODULE_GUID" ] = Inf.Guid + Macro["MODULE_VERSION" ] = Inf.Version + Macro["MODULE_TYPE" ] = Inf.ModuleType + Macro["MODULE_FILE" ] = str(PathClassObj) + Macro["MODULE_FILE_BASE_NAME" ] = PathClassObj.BaseName + Macro["MODULE_RELATIVE_DIR" ] = PathClassObj.SubDir + Macro["MODULE_DIR" ] = PathClassObj.SubDir + + Macro["BASE_NAME" ] = Inf.BaseName + + Macro["ARCH" ] = Arch + Macro["TOOLCHAIN" ] = GenFdsGlobalVariable.ToolChainTag + Macro["TOOLCHAIN_TAG" ] = GenFdsGlobalVariable.ToolChainTag + Macro["TOOL_CHAIN_TAG" ] = GenFdsGlobalVariable.ToolChainTag + Macro["TARGET" ] = GenFdsGlobalVariable.TargetName + + Macro["BUILD_DIR" ] = GenFdsGlobalVariable.OutputDirDict[Arch] + Macro["BIN_DIR" ] = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch], Arch) + Macro["LIB_DIR" ] = os.path.join(GenFdsGlobalVariable.OutputDirDict[Arch], Arch) + BuildDir = os.path.join( + GenFdsGlobalVariable.OutputDirDict[Arch], + Arch, + PathClassObj.SubDir, + PathClassObj.BaseName + ) + Macro["MODULE_BUILD_DIR" ] = BuildDir + Macro["OUTPUT_DIR" ] = os.path.join(BuildDir, "OUTPUT") + Macro["DEBUG_DIR" ] = os.path.join(BuildDir, "DEBUG") + + BuildRules = {} + for Type in BuildRuleDatabase.FileTypeList: + #first try getting build rule by BuildRuleFamily + RuleObject = BuildRuleDatabase[Type, Inf.BuildType, Arch, GenFdsGlobalVariable.BuildRuleFamily] + if not RuleObject: + # build type is always module type, but ... + if Inf.ModuleType != Inf.BuildType: + RuleObject = BuildRuleDatabase[Type, Inf.ModuleType, Arch, GenFdsGlobalVariable.BuildRuleFamily] + #second try getting build rule by ToolChainFamily + if not RuleObject: + RuleObject = BuildRuleDatabase[Type, Inf.BuildType, Arch, GenFdsGlobalVariable.ToolChainFamily] + if not RuleObject: + # build type is always module type, but ... + if Inf.ModuleType != Inf.BuildType: + RuleObject = BuildRuleDatabase[Type, Inf.ModuleType, Arch, GenFdsGlobalVariable.ToolChainFamily] + if not RuleObject: + continue + RuleObject = RuleObject.Instantiate(Macro) + BuildRules[Type] = RuleObject + for Ext in RuleObject.SourceFileExtList: + BuildRules[Ext] = RuleObject + return BuildRules + + ## GetModuleCodaTargetList + # + # @param Inf: object of InfBuildData + # @param Arch: current arch + # + @staticmethod + def GetModuleCodaTargetList(Inf, Arch): + BuildRules = GenFdsGlobalVariable.GetBuildRules(Inf, Arch) + if not BuildRules: + return [] + + TargetList = set() + FileList = [] + for File in Inf.Sources: + if File.TagName in ("", "*", GenFdsGlobalVariable.ToolChainTag) and \ + File.ToolChainFamily in ("", "*", GenFdsGlobalVariable.ToolChainFamily): + FileList.append((File, DataType.TAB_UNKNOWN_FILE)) + + for File in Inf.Binaries: + if File.Target in ['COMMON', '*', GenFdsGlobalVariable.TargetName]: + FileList.append((File, File.Type)) + + for File, FileType in FileList: + LastTarget = None + RuleChain = [] + SourceList = [File] + Index = 0 + while Index < len(SourceList): + Source = SourceList[Index] + Index = Index + 1 + + if File.IsBinary and File == Source and Inf.Binaries != None and File in Inf.Binaries: + # Skip all files that are not binary libraries + if not Inf.LibraryClass: + continue + RuleObject = BuildRules[DataType.TAB_DEFAULT_BINARY_FILE] + elif FileType in BuildRules: + RuleObject = BuildRules[FileType] + elif Source.Ext in BuildRules: + RuleObject = BuildRules[Source.Ext] + else: + # stop at no more rules + if LastTarget: + TargetList.add(str(LastTarget)) + break + + FileType = RuleObject.SourceFileType + + # stop at STATIC_LIBRARY for library + if Inf.LibraryClass and FileType == DataType.TAB_STATIC_LIBRARY: + if LastTarget: + TargetList.add(str(LastTarget)) + break + + Target = RuleObject.Apply(Source) + if not Target: + if LastTarget: + TargetList.add(str(LastTarget)) + break + elif not Target.Outputs: + # Only do build for target with outputs + TargetList.add(str(Target)) + + # to avoid cyclic rule + if FileType in RuleChain: + break + + RuleChain.append(FileType) + SourceList.extend(Target.Outputs) + LastTarget = Target + FileType = DataType.TAB_UNKNOWN_FILE + + return list(TargetList) + + ## SetDir() + # + # @param OutputDir Output directory + # @param FdfParser FDF contents parser + # @param Workspace The directory of workspace + # @param ArchList The Arch list of platform + # + def SetDir (OutputDir, FdfParser, WorkSpace, ArchList): + GenFdsGlobalVariable.VerboseLogger( "GenFdsGlobalVariable.OutputDir :%s" %OutputDir) +# GenFdsGlobalVariable.OutputDirDict = OutputDir + GenFdsGlobalVariable.FdfParser = FdfParser + GenFdsGlobalVariable.WorkSpace = WorkSpace + GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], 'FV') + if not os.path.exists(GenFdsGlobalVariable.FvDir) : + os.makedirs(GenFdsGlobalVariable.FvDir) + GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs') + if not os.path.exists(GenFdsGlobalVariable.FfsDir) : + os.makedirs(GenFdsGlobalVariable.FfsDir) + if ArchList != None: + GenFdsGlobalVariable.ArchList = ArchList + + T_CHAR_LF = '\n' + # + # Create FV Address inf file + # + GenFdsGlobalVariable.FvAddressFileName = os.path.join(GenFdsGlobalVariable.FfsDir, 'FvAddress.inf') + FvAddressFile = open (GenFdsGlobalVariable.FvAddressFileName, 'w') + # + # Add [Options] + # + FvAddressFile.writelines("[options]" + T_CHAR_LF) + BsAddress = '0' + for Arch in ArchList: + if GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].BsBaseAddress: + BsAddress = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].BsBaseAddress + break + + FvAddressFile.writelines("EFI_BOOT_DRIVER_BASE_ADDRESS = " + \ + BsAddress + \ + T_CHAR_LF) + + RtAddress = '0' + for Arch in ArchList: + if GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].RtBaseAddress: + RtAddress = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].RtBaseAddress + + FvAddressFile.writelines("EFI_RUNTIME_DRIVER_BASE_ADDRESS = " + \ + RtAddress + \ + T_CHAR_LF) + + FvAddressFile.close() + + ## ReplaceWorkspaceMacro() + # + # @param String String that may contain macro + # + def ReplaceWorkspaceMacro(String): + Str = String.replace('$(WORKSPACE)', GenFdsGlobalVariable.WorkSpaceDir) + if os.path.exists(Str): + if not os.path.isabs(Str): + Str = os.path.abspath(Str) + else: + Str = os.path.join(GenFdsGlobalVariable.WorkSpaceDir, String) + return os.path.normpath(Str) + + ## Check if the input files are newer than output files + # + # @param Output Path of output file + # @param Input Path list of input files + # + # @retval True if Output doesn't exist, or any Input is newer + # @retval False if all Input is older than Output + # + @staticmethod + def NeedsUpdate(Output, Input): + if not os.path.exists(Output): + return True + # always update "Output" if no "Input" given + if Input == None or len(Input) == 0: + return True + + # if fdf file is changed after the 'Output" is generated, update the 'Output' + OutputTime = os.path.getmtime(Output) + if GenFdsGlobalVariable.FdfFileTimeStamp > OutputTime: + return True + + for F in Input: + # always update "Output" if any "Input" doesn't exist + if not os.path.exists(F): + return True + # always update "Output" if any "Input" is newer than "Output" + if os.path.getmtime(F) > OutputTime: + return True + return False + + @staticmethod + def GenerateSection(Output, Input, Type=None, CompressionType=None, Guid=None, + GuidHdrLen=None, GuidAttr=[], Ui=None, Ver=None, InputAlign=None, BuildNumber=None): + Cmd = ["GenSec"] + if Type not in [None, '']: + Cmd += ["-s", Type] + if CompressionType not in [None, '']: + Cmd += ["-c", CompressionType] + if Guid != None: + Cmd += ["-g", Guid] + if GuidHdrLen not in [None, '']: + Cmd += ["-l", GuidHdrLen] + if len(GuidAttr) != 0: + #Add each guided attribute + for Attr in GuidAttr: + Cmd += ["-r", Attr] + if InputAlign != None: + #Section Align is only for dummy section without section type + for SecAlign in InputAlign: + Cmd += ["--sectionalign", SecAlign] + + CommandFile = Output + '.txt' + if Ui not in [None, '']: + #Cmd += ["-n", '"' + Ui + '"'] + SectionData = array.array('B', [0,0,0,0]) + SectionData.fromstring(Ui.encode("utf_16_le")) + SectionData.append(0) + SectionData.append(0) + Len = len(SectionData) + GenFdsGlobalVariable.SectionHeader.pack_into(SectionData, 0, Len & 0xff, (Len >> 8) & 0xff, (Len >> 16) & 0xff, 0x15) + SaveFileOnChange(Output, SectionData.tostring()) + elif Ver not in [None, '']: + Cmd += ["-n", Ver] + if BuildNumber: + Cmd += ["-j", BuildNumber] + Cmd += ["-o", Output] + + SaveFileOnChange(CommandFile, ' '.join(Cmd), False) + if not GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): + return + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate section") + else: + Cmd += ["-o", Output] + Cmd += Input + + SaveFileOnChange(CommandFile, ' '.join(Cmd), False) + if GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate section") + + if (os.path.getsize(Output) >= GenFdsGlobalVariable.LARGE_FILE_SIZE and + GenFdsGlobalVariable.LargeFileInFvFlags): + GenFdsGlobalVariable.LargeFileInFvFlags[-1] = True + + @staticmethod + def GetAlignment (AlignString): + if AlignString == None: + return 0 if AlignString in ("1K", "2K", "4K", "8K", "16K", "32K", "64K"): return int (AlignString.rstrip('K')) * 1024 else: return int (AlignString) - - @staticmethod - def GenerateFfs(Output, Input, Type, Guid, Fixed=False, CheckSum=False, Align=None, - SectionAlign=None): - Cmd = ["GenFfs", "-t", Type, "-g", Guid] - if Fixed == True: - Cmd += ["-x"] - if CheckSum: - Cmd += ["-s"] - if Align not in [None, '']: - Cmd += ["-a", Align] - - Cmd += ["-o", Output] - for I in range(0, len(Input)): - Cmd += ("-i", Input[I]) - if SectionAlign not in [None, '', []] and SectionAlign[I] not in [None, '']: - Cmd += ("-n", SectionAlign[I]) - - CommandFile = Output + '.txt' - SaveFileOnChange(CommandFile, ' '.join(Cmd), False) - if not GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate FFS") - - @staticmethod - def GenerateFirmwareVolume(Output, Input, BaseAddress=None, ForceRebase=None, Capsule=False, Dump=False, - AddressFile=None, MapFile=None, FfsList=[], FileSystemGuid=None): - if not GenFdsGlobalVariable.NeedsUpdate(Output, Input+FfsList): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - - Cmd = ["GenFv"] - if BaseAddress not in [None, '']: - Cmd += ["-r", BaseAddress] - - if ForceRebase == False: - Cmd +=["-F", "FALSE"] - elif ForceRebase == True: - Cmd +=["-F", "TRUE"] - - if Capsule: - Cmd += ["-c"] - if Dump: - Cmd += ["-p"] - if AddressFile not in [None, '']: - Cmd += ["-a", AddressFile] - if MapFile not in [None, '']: - Cmd += ["-m", MapFile] - if FileSystemGuid: - Cmd += ["-g", FileSystemGuid] - Cmd += ["-o", Output] - for I in Input: - Cmd += ["-i", I] - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate FV") - - @staticmethod - def GenerateVtf(Output, Input, BaseAddress=None, FvSize=None): - if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - - Cmd = ["GenVtf"] - if BaseAddress not in [None, ''] and FvSize not in [None, ''] \ - and len(BaseAddress) == len(FvSize): - for I in range(0, len(BaseAddress)): - Cmd += ["-r", BaseAddress[I], "-s", FvSize[I]] - Cmd += ["-o", Output] - for F in Input: - Cmd += ["-f", F] - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate VTF") - - @staticmethod - def GenerateFirmwareImage(Output, Input, Type="efi", SubType=None, Zero=False, - Strip=False, Replace=False, TimeStamp=None, Join=False, - Align=None, Padding=None, Convert=False): - if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - - Cmd = ["GenFw"] - if Type.lower() == "te": - Cmd += ["-t"] - if SubType not in [None, '']: - Cmd += ["-e", SubType] - if TimeStamp not in [None, '']: - Cmd += ["-s", TimeStamp] - if Align not in [None, '']: - Cmd += ["-a", Align] - if Padding not in [None, '']: - Cmd += ["-p", Padding] - if Zero: - Cmd += ["-z"] - if Strip: - Cmd += ["-l"] - if Replace: - Cmd += ["-r"] - if Join: - Cmd += ["-j"] - if Convert: - Cmd += ["-m"] - Cmd += ["-o", Output] - Cmd += Input - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate firmware image") - - @staticmethod - def GenerateOptionRom(Output, EfiInput, BinaryInput, Compress=False, ClassCode=None, - Revision=None, DeviceId=None, VendorId=None): - InputList = [] - Cmd = ["EfiRom"] - if len(EfiInput) > 0: - - if Compress: - Cmd += ["-ec"] - else: - Cmd += ["-e"] - - for EfiFile in EfiInput: - Cmd += [EfiFile] - InputList.append (EfiFile) - - if len(BinaryInput) > 0: - Cmd += ["-b"] - for BinFile in BinaryInput: - Cmd += [BinFile] - InputList.append (BinFile) - - # Check List - if not GenFdsGlobalVariable.NeedsUpdate(Output, InputList): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, InputList)) - - if ClassCode != None: - Cmd += ["-l", ClassCode] - if Revision != None: - Cmd += ["-r", Revision] - if DeviceId != None: - Cmd += ["-i", DeviceId] - if VendorId != None: - Cmd += ["-f", VendorId] - - Cmd += ["-o", Output] - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate option rom") - - @staticmethod - def GuidTool(Output, Input, ToolPath, Options='', returnValue=[]): - if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): - return - GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) - - Cmd = [ToolPath, ] - Cmd += Options.split(' ') - Cmd += ["-o", Output] - Cmd += Input - - GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to call " + ToolPath, returnValue) - - def CallExternalTool (cmd, errorMess, returnValue=[]): - - if type(cmd) not in (tuple, list): - GenFdsGlobalVariable.ErrorLogger("ToolError! Invalid parameter type in call to CallExternalTool") - - if GenFdsGlobalVariable.DebugLevel != -1: - cmd += ('--debug', str(GenFdsGlobalVariable.DebugLevel)) - GenFdsGlobalVariable.InfLogger (cmd) - - if GenFdsGlobalVariable.VerboseMode: - cmd += ('-v',) - GenFdsGlobalVariable.InfLogger (cmd) - else: - sys.stdout.write ('#') - sys.stdout.flush() - GenFdsGlobalVariable.SharpCounter = GenFdsGlobalVariable.SharpCounter + 1 - if GenFdsGlobalVariable.SharpCounter % GenFdsGlobalVariable.SharpNumberPerLine == 0: - sys.stdout.write('\n') - - try: - PopenObject = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE, stderr= subprocess.PIPE, shell=True) - except Exception, X: - EdkLogger.error("GenFds", COMMAND_FAILURE, ExtraData="%s: %s" % (str(X), cmd[0])) - (out, error) = PopenObject.communicate() - - while PopenObject.returncode == None : - PopenObject.wait() - if returnValue != [] and returnValue[0] != 0: - #get command return value - returnValue[0] = PopenObject.returncode - return - if PopenObject.returncode != 0 or GenFdsGlobalVariable.VerboseMode or GenFdsGlobalVariable.DebugLevel != -1: - GenFdsGlobalVariable.InfLogger ("Return Value = %d" %PopenObject.returncode) - GenFdsGlobalVariable.InfLogger (out) - GenFdsGlobalVariable.InfLogger (error) - if PopenObject.returncode != 0: - print "###", cmd - EdkLogger.error("GenFds", COMMAND_FAILURE, errorMess) - - def VerboseLogger (msg): - EdkLogger.verbose(msg) - - def InfLogger (msg): - EdkLogger.info(msg) - - def ErrorLogger (msg, File = None, Line = None, ExtraData = None): - EdkLogger.error('GenFds', GENFDS_ERROR, msg, File, Line, ExtraData) - - def DebugLogger (Level, msg): - EdkLogger.debug(Level, msg) - - ## ReplaceWorkspaceMacro() - # - # @param Str String that may contain macro - # @param MacroDict Dictionary that contains macro value pair - # - def MacroExtend (Str, MacroDict = {}, Arch = 'COMMON'): - if Str == None : - return None - - Dict = {'$(WORKSPACE)' : GenFdsGlobalVariable.WorkSpaceDir, - '$(EDK_SOURCE)' : GenFdsGlobalVariable.EdkSourceDir, -# '$(OUTPUT_DIRECTORY)': GenFdsGlobalVariable.OutputDirFromDsc, - '$(TARGET)' : GenFdsGlobalVariable.TargetName, - '$(TOOL_CHAIN_TAG)' : GenFdsGlobalVariable.ToolChainTag - } - OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[GenFdsGlobalVariable.ArchList[0]] - if Arch != 'COMMON' and Arch in GenFdsGlobalVariable.ArchList: - OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[Arch] - - Dict['$(OUTPUT_DIRECTORY)'] = OutputDir - - if MacroDict != None and len (MacroDict) != 0: - Dict.update(MacroDict) - - for key in Dict.keys(): - if Str.find(key) >= 0 : - Str = Str.replace (key, Dict[key]) - - if Str.find('$(ARCH)') >= 0: - if len(GenFdsGlobalVariable.ArchList) == 1: - Str = Str.replace('$(ARCH)', GenFdsGlobalVariable.ArchList[0]) - else: - EdkLogger.error("GenFds", GENFDS_ERROR, "No way to determine $(ARCH) for %s" % Str) - - return Str - - ## GetPcdValue() - # - # @param PcdPattern pattern that labels a PCD. - # - def GetPcdValue (PcdPattern): - if PcdPattern == None : - return None - PcdPair = PcdPattern.lstrip('PCD(').rstrip(')').strip().split('.') - TokenSpace = PcdPair[0] - TokenCName = PcdPair[1] - - PcdValue = '' - for Arch in GenFdsGlobalVariable.ArchList: - Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] - PcdDict = Platform.Pcds - for Key in PcdDict: - PcdObj = PcdDict[Key] - if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace): - if PcdObj.Type != 'FixedAtBuild': - EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern) - if PcdObj.DatumType != 'VOID*': - EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern) - - PcdValue = PcdObj.DefaultValue - return PcdValue - - for Package in GenFdsGlobalVariable.WorkSpace.GetPackageList(GenFdsGlobalVariable.ActivePlatform, - Arch, - GenFdsGlobalVariable.TargetName, - GenFdsGlobalVariable.ToolChainTag): - PcdDict = Package.Pcds - for Key in PcdDict: - PcdObj = PcdDict[Key] - if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace): - if PcdObj.Type != 'FixedAtBuild': - EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern) - if PcdObj.DatumType != 'VOID*': - EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern) - - PcdValue = PcdObj.DefaultValue - return PcdValue - - return PcdValue - - SetDir = staticmethod(SetDir) - ReplaceWorkspaceMacro = staticmethod(ReplaceWorkspaceMacro) - CallExternalTool = staticmethod(CallExternalTool) - VerboseLogger = staticmethod(VerboseLogger) - InfLogger = staticmethod(InfLogger) - ErrorLogger = staticmethod(ErrorLogger) - DebugLogger = staticmethod(DebugLogger) - MacroExtend = staticmethod (MacroExtend) - GetPcdValue = staticmethod(GetPcdValue) + + @staticmethod + def GenerateFfs(Output, Input, Type, Guid, Fixed=False, CheckSum=False, Align=None, + SectionAlign=None): + Cmd = ["GenFfs", "-t", Type, "-g", Guid] + if Fixed == True: + Cmd += ["-x"] + if CheckSum: + Cmd += ["-s"] + if Align not in [None, '']: + Cmd += ["-a", Align] + + Cmd += ["-o", Output] + for I in range(0, len(Input)): + Cmd += ("-i", Input[I]) + if SectionAlign not in [None, '', []] and SectionAlign[I] not in [None, '']: + Cmd += ("-n", SectionAlign[I]) + + CommandFile = Output + '.txt' + SaveFileOnChange(CommandFile, ' '.join(Cmd), False) + if not GenFdsGlobalVariable.NeedsUpdate(Output, list(Input) + [CommandFile]): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate FFS") + + @staticmethod + def GenerateFirmwareVolume(Output, Input, BaseAddress=None, ForceRebase=None, Capsule=False, Dump=False, + AddressFile=None, MapFile=None, FfsList=[], FileSystemGuid=None): + if not GenFdsGlobalVariable.NeedsUpdate(Output, Input+FfsList): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + + Cmd = ["GenFv"] + if BaseAddress not in [None, '']: + Cmd += ["-r", BaseAddress] + + if ForceRebase == False: + Cmd +=["-F", "FALSE"] + elif ForceRebase == True: + Cmd +=["-F", "TRUE"] + + if Capsule: + Cmd += ["-c"] + if Dump: + Cmd += ["-p"] + if AddressFile not in [None, '']: + Cmd += ["-a", AddressFile] + if MapFile not in [None, '']: + Cmd += ["-m", MapFile] + if FileSystemGuid: + Cmd += ["-g", FileSystemGuid] + Cmd += ["-o", Output] + for I in Input: + Cmd += ["-i", I] + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate FV") + + @staticmethod + def GenerateVtf(Output, Input, BaseAddress=None, FvSize=None): + if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + + Cmd = ["GenVtf"] + if BaseAddress not in [None, ''] and FvSize not in [None, ''] \ + and len(BaseAddress) == len(FvSize): + for I in range(0, len(BaseAddress)): + Cmd += ["-r", BaseAddress[I], "-s", FvSize[I]] + Cmd += ["-o", Output] + for F in Input: + Cmd += ["-f", F] + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate VTF") + + @staticmethod + def GenerateFirmwareImage(Output, Input, Type="efi", SubType=None, Zero=False, + Strip=False, Replace=False, TimeStamp=None, Join=False, + Align=None, Padding=None, Convert=False): + if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + + Cmd = ["GenFw"] + if Type.lower() == "te": + Cmd += ["-t"] + if SubType not in [None, '']: + Cmd += ["-e", SubType] + if TimeStamp not in [None, '']: + Cmd += ["-s", TimeStamp] + if Align not in [None, '']: + Cmd += ["-a", Align] + if Padding not in [None, '']: + Cmd += ["-p", Padding] + if Zero: + Cmd += ["-z"] + if Strip: + Cmd += ["-l"] + if Replace: + Cmd += ["-r"] + if Join: + Cmd += ["-j"] + if Convert: + Cmd += ["-m"] + Cmd += ["-o", Output] + Cmd += Input + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate firmware image") + + @staticmethod + def GenerateOptionRom(Output, EfiInput, BinaryInput, Compress=False, ClassCode=None, + Revision=None, DeviceId=None, VendorId=None): + InputList = [] + Cmd = ["EfiRom"] + if len(EfiInput) > 0: + + if Compress: + Cmd += ["-ec"] + else: + Cmd += ["-e"] + + for EfiFile in EfiInput: + Cmd += [EfiFile] + InputList.append (EfiFile) + + if len(BinaryInput) > 0: + Cmd += ["-b"] + for BinFile in BinaryInput: + Cmd += [BinFile] + InputList.append (BinFile) + + # Check List + if not GenFdsGlobalVariable.NeedsUpdate(Output, InputList): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, InputList)) + + if ClassCode != None: + Cmd += ["-l", ClassCode] + if Revision != None: + Cmd += ["-r", Revision] + if DeviceId != None: + Cmd += ["-i", DeviceId] + if VendorId != None: + Cmd += ["-f", VendorId] + + Cmd += ["-o", Output] + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate option rom") + + @staticmethod + def GuidTool(Output, Input, ToolPath, Options='', returnValue=[]): + if not GenFdsGlobalVariable.NeedsUpdate(Output, Input): + return + GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input)) + + Cmd = [ToolPath, ] + Cmd += Options.split(' ') + Cmd += ["-o", Output] + Cmd += Input + + GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to call " + ToolPath, returnValue) + + def CallExternalTool (cmd, errorMess, returnValue=[]): + + if type(cmd) not in (tuple, list): + GenFdsGlobalVariable.ErrorLogger("ToolError! Invalid parameter type in call to CallExternalTool") + + if GenFdsGlobalVariable.DebugLevel != -1: + cmd += ('--debug', str(GenFdsGlobalVariable.DebugLevel)) + GenFdsGlobalVariable.InfLogger (cmd) + + if GenFdsGlobalVariable.VerboseMode: + cmd += ('-v',) + GenFdsGlobalVariable.InfLogger (cmd) + else: + sys.stdout.write ('#') + sys.stdout.flush() + GenFdsGlobalVariable.SharpCounter = GenFdsGlobalVariable.SharpCounter + 1 + if GenFdsGlobalVariable.SharpCounter % GenFdsGlobalVariable.SharpNumberPerLine == 0: + sys.stdout.write('\n') + + try: + PopenObject = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE, stderr= subprocess.PIPE, shell=True) + except Exception, X: + EdkLogger.error("GenFds", COMMAND_FAILURE, ExtraData="%s: %s" % (str(X), cmd[0])) + (out, error) = PopenObject.communicate() + + while PopenObject.returncode == None : + PopenObject.wait() + if returnValue != [] and returnValue[0] != 0: + #get command return value + returnValue[0] = PopenObject.returncode + return + if PopenObject.returncode != 0 or GenFdsGlobalVariable.VerboseMode or GenFdsGlobalVariable.DebugLevel != -1: + GenFdsGlobalVariable.InfLogger ("Return Value = %d" %PopenObject.returncode) + GenFdsGlobalVariable.InfLogger (out) + GenFdsGlobalVariable.InfLogger (error) + if PopenObject.returncode != 0: + print "###", cmd + EdkLogger.error("GenFds", COMMAND_FAILURE, errorMess) + + def VerboseLogger (msg): + EdkLogger.verbose(msg) + + def InfLogger (msg): + EdkLogger.info(msg) + + def ErrorLogger (msg, File = None, Line = None, ExtraData = None): + EdkLogger.error('GenFds', GENFDS_ERROR, msg, File, Line, ExtraData) + + def DebugLogger (Level, msg): + EdkLogger.debug(Level, msg) + + ## ReplaceWorkspaceMacro() + # + # @param Str String that may contain macro + # @param MacroDict Dictionary that contains macro value pair + # + def MacroExtend (Str, MacroDict = {}, Arch = 'COMMON'): + if Str == None : + return None + + Dict = {'$(WORKSPACE)' : GenFdsGlobalVariable.WorkSpaceDir, + '$(EDK_SOURCE)' : GenFdsGlobalVariable.EdkSourceDir, +# '$(OUTPUT_DIRECTORY)': GenFdsGlobalVariable.OutputDirFromDsc, + '$(TARGET)' : GenFdsGlobalVariable.TargetName, + '$(TOOL_CHAIN_TAG)' : GenFdsGlobalVariable.ToolChainTag + } + OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[GenFdsGlobalVariable.ArchList[0]] + if Arch != 'COMMON' and Arch in GenFdsGlobalVariable.ArchList: + OutputDir = GenFdsGlobalVariable.OutputDirFromDscDict[Arch] + + Dict['$(OUTPUT_DIRECTORY)'] = OutputDir + + if MacroDict != None and len (MacroDict) != 0: + Dict.update(MacroDict) + + for key in Dict.keys(): + if Str.find(key) >= 0 : + Str = Str.replace (key, Dict[key]) + + if Str.find('$(ARCH)') >= 0: + if len(GenFdsGlobalVariable.ArchList) == 1: + Str = Str.replace('$(ARCH)', GenFdsGlobalVariable.ArchList[0]) + else: + EdkLogger.error("GenFds", GENFDS_ERROR, "No way to determine $(ARCH) for %s" % Str) + + return Str + + ## GetPcdValue() + # + # @param PcdPattern pattern that labels a PCD. + # + def GetPcdValue (PcdPattern): + if PcdPattern == None : + return None + PcdPair = PcdPattern.lstrip('PCD(').rstrip(')').strip().split('.') + TokenSpace = PcdPair[0] + TokenCName = PcdPair[1] + + PcdValue = '' + for Arch in GenFdsGlobalVariable.ArchList: + Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] + PcdDict = Platform.Pcds + for Key in PcdDict: + PcdObj = PcdDict[Key] + if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace): + if PcdObj.Type != 'FixedAtBuild': + EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern) + if PcdObj.DatumType != 'VOID*': + EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern) + + PcdValue = PcdObj.DefaultValue + return PcdValue + + for Package in GenFdsGlobalVariable.WorkSpace.GetPackageList(GenFdsGlobalVariable.ActivePlatform, + Arch, + GenFdsGlobalVariable.TargetName, + GenFdsGlobalVariable.ToolChainTag): + PcdDict = Package.Pcds + for Key in PcdDict: + PcdObj = PcdDict[Key] + if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace): + if PcdObj.Type != 'FixedAtBuild': + EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern) + if PcdObj.DatumType != 'VOID*': + EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern) + + PcdValue = PcdObj.DefaultValue + return PcdValue + + return PcdValue + + SetDir = staticmethod(SetDir) + ReplaceWorkspaceMacro = staticmethod(ReplaceWorkspaceMacro) + CallExternalTool = staticmethod(CallExternalTool) + VerboseLogger = staticmethod(VerboseLogger) + InfLogger = staticmethod(InfLogger) + ErrorLogger = staticmethod(ErrorLogger) + DebugLogger = staticmethod(DebugLogger) + MacroExtend = staticmethod (MacroExtend) + GetPcdValue = staticmethod(GetPcdValue) diff --git a/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py b/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py index 6deb0f8471..b6227d24fb 100644 --- a/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py +++ b/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py @@ -1,8 +1,8 @@ ## @file # Generate PCD table for 'Patchable In Module' type PCD with given .map file. -# The Patch PCD table like: -# -# PCD Name Offset in binary +# The Patch PCD table like: +# +# PCD Name Offset in binary # ======== ================ # # Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.
    @@ -14,77 +14,77 @@ # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # -# - -#====================================== External Libraries ======================================== -import optparse -import os -import re -import array - -from Common.BuildToolError import * -import Common.EdkLogger as EdkLogger +# + +#====================================== External Libraries ======================================== +import optparse +import os +import re +import array + +from Common.BuildToolError import * +import Common.EdkLogger as EdkLogger from Common.Misc import PeImageClass from Common.BuildVersion import gBUILD_VERSION - -# Version and Copyright -__version_number__ = ("0.10" + " " + gBUILD_VERSION) -__version__ = "%prog Version " + __version_number__ -__copyright__ = "Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved." - -#====================================== Internal Libraries ======================================== - -#============================================== Code =============================================== -secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE) -symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE) - -def parsePcdInfoFromMapFile(mapfilepath, efifilepath): - """ Parse map file to get binary patch pcd information - @param path Map file absolution path - - @return a list which element hold (PcdName, Offset, SectionName) - """ - lines = [] - try: - f = open(mapfilepath, 'r') - lines = f.readlines() - f.close() - except: - return None - - if len(lines) == 0: return None - if lines[0].strip().find("Archive member included because of file (symbol)") != -1: - return _parseForGCC(lines, efifilepath) - return _parseGeneral(lines, efifilepath) - -def _parseForGCC(lines, efifilepath): - """ Parse map file generated by GCC linker """ - status = 0 - imageBase = -1 - sections = [] - bpcds = [] - for line in lines: - line = line.strip() - # status machine transection - if status == 0 and line == "Memory Configuration": - status = 1 - continue - elif status == 1 and line == 'Linker script and memory map': - status = 2 - continue - elif status ==2 and line == 'START GROUP': - status = 3 - continue - + +# Version and Copyright +__version_number__ = ("0.10" + " " + gBUILD_VERSION) +__version__ = "%prog Version " + __version_number__ +__copyright__ = "Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved." + +#====================================== Internal Libraries ======================================== + +#============================================== Code =============================================== +secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE) +symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE) + +def parsePcdInfoFromMapFile(mapfilepath, efifilepath): + """ Parse map file to get binary patch pcd information + @param path Map file absolution path + + @return a list which element hold (PcdName, Offset, SectionName) + """ + lines = [] + try: + f = open(mapfilepath, 'r') + lines = f.readlines() + f.close() + except: + return None + + if len(lines) == 0: return None + if lines[0].strip().find("Archive member included because of file (symbol)") != -1: + return _parseForGCC(lines, efifilepath) + return _parseGeneral(lines, efifilepath) + +def _parseForGCC(lines, efifilepath): + """ Parse map file generated by GCC linker """ + status = 0 + imageBase = -1 + sections = [] + bpcds = [] + for line in lines: + line = line.strip() + # status machine transection + if status == 0 and line == "Memory Configuration": + status = 1 + continue + elif status == 1 and line == 'Linker script and memory map': + status = 2 + continue + elif status ==2 and line == 'START GROUP': + status = 3 + continue + # status handler - if status == 2: - m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line) - if m != None: - sections.append(m.groups(0)) - if status == 2: - m = re.match("^([\da-fA-Fx]+) +[_]+gPcd_BinaryPatch_([\w_\d]+)$", line) - if m != None: - bpcds.append((m.groups(0)[1], int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0])) + if status == 2: + m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line) + if m != None: + sections.append(m.groups(0)) + if status == 2: + m = re.match("^([\da-fA-Fx]+) +[_]+gPcd_BinaryPatch_([\w_\d]+)$", line) + if m != None: + bpcds.append((m.groups(0)[1], int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0])) # get section information from efi file efisecs = PeImageClass(efifilepath).SectionHeaderList @@ -102,104 +102,104 @@ def _parseForGCC(lines, efifilepath): if pcd[1] >= efisec[1] and pcd[1] < efisec[1]+efisec[3]: #assert efisec[0].strip() == pcd[3].strip() and efisec[1] + redirection == pcd[2], "There are some differences between map file and efi file" pcds.append([pcd[0], efisec[2] + pcd[1] - efisec[1] - redirection, efisec[0]]) - return pcds - -def _parseGeneral(lines, efifilepath): - """ For MSFT, ICC, EBC - @param lines line array for map file - - @return a list which element hold (PcdName, Offset, SectionName) - """ - status = 0 #0 - beginning of file; 1 - PE section definition; 2 - symbol table - secs = [] # key = section name - bPcds = [] - - - for line in lines: - line = line.strip() - if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line): - status = 1 - continue - if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line): - status = 2 - continue - if re.match("^entry point at", line): - status = 3 - continue - if status == 1 and len(line) != 0: - m = secRe.match(line) - assert m != None, "Fail to parse the section in map file , line is %s" % line - sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0) - secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class]) - if status == 2 and len(line) != 0: - m = symRe.match(line) - assert m != None, "Fail to parse the symbol in map file, line is %s" % line - sec_no, sym_offset, sym_name, vir_addr = m.groups(0) - sec_no = int(sec_no, 16) - sym_offset = int(sym_offset, 16) - vir_addr = int(vir_addr, 16) - m2 = re.match('^[_]+gPcd_BinaryPatch_([\w]+)', sym_name) - if m2 != None: - # fond a binary pcd entry in map file - for sec in secs: - if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]): - bPcds.append([m2.groups(0)[0], sec[3], sym_offset, vir_addr, sec_no]) - - if len(bPcds) == 0: return None - - # get section information from efi file - efisecs = PeImageClass(efifilepath).SectionHeaderList - if efisecs == None or len(efisecs) == 0: - return None - - pcds = [] - for pcd in bPcds: - index = 0 - for efisec in efisecs: - index = index + 1 - if pcd[1].strip() == efisec[0].strip(): - pcds.append([pcd[0], efisec[2] + pcd[2], efisec[0]]) - elif pcd[4] == index: - pcds.append([pcd[0], efisec[2] + pcd[2], efisec[0]]) - return pcds - -def generatePcdTable(list, pcdpath): - try: - f = open(pcdpath, 'w') - except: - pass - - f.write('PCD Name Offset Section Name\r\n') - - for pcditem in list: - f.write('%-30s 0x%-08X %-6s\r\n' % (pcditem[0], pcditem[1], pcditem[2])) - f.close() - - #print 'Success to generate Binary Patch PCD table at %s!' % pcdpath - -if __name__ == '__main__': - UsageString = "%prog -m -e -o " - AdditionalNotes = "\nPCD table is generated in file name with .BinaryPcdTable.txt postfix" - parser = optparse.OptionParser(description=__copyright__, version=__version__, usage=UsageString) - parser.add_option('-m', '--mapfile', action='store', dest='mapfile', - help='Absolute path of module map file.') - parser.add_option('-e', '--efifile', action='store', dest='efifile', - help='Absolute path of EFI binary file.') - parser.add_option('-o', '--outputfile', action='store', dest='outfile', - help='Absolute path of output file to store the got patchable PCD table.') - - (options, args) = parser.parse_args() - - if options.mapfile == None or options.efifile == None: - print parser.get_usage() - elif os.path.exists(options.mapfile) and os.path.exists(options.efifile): - list = parsePcdInfoFromMapFile(options.mapfile, options.efifile) - if list != None: - if options.outfile != None: - generatePcdTable(list, options.outfile) - else: - generatePcdTable(list, options.mapfile.replace('.map', '.BinaryPcdTable.txt')) - else: - print 'Fail to generate Patch PCD Table based on map file and efi file' - else: - print 'Fail to generate Patch PCD Table for fail to find map file or efi file!' + return pcds + +def _parseGeneral(lines, efifilepath): + """ For MSFT, ICC, EBC + @param lines line array for map file + + @return a list which element hold (PcdName, Offset, SectionName) + """ + status = 0 #0 - beginning of file; 1 - PE section definition; 2 - symbol table + secs = [] # key = section name + bPcds = [] + + + for line in lines: + line = line.strip() + if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line): + status = 1 + continue + if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line): + status = 2 + continue + if re.match("^entry point at", line): + status = 3 + continue + if status == 1 and len(line) != 0: + m = secRe.match(line) + assert m != None, "Fail to parse the section in map file , line is %s" % line + sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0) + secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class]) + if status == 2 and len(line) != 0: + m = symRe.match(line) + assert m != None, "Fail to parse the symbol in map file, line is %s" % line + sec_no, sym_offset, sym_name, vir_addr = m.groups(0) + sec_no = int(sec_no, 16) + sym_offset = int(sym_offset, 16) + vir_addr = int(vir_addr, 16) + m2 = re.match('^[_]+gPcd_BinaryPatch_([\w]+)', sym_name) + if m2 != None: + # fond a binary pcd entry in map file + for sec in secs: + if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]): + bPcds.append([m2.groups(0)[0], sec[3], sym_offset, vir_addr, sec_no]) + + if len(bPcds) == 0: return None + + # get section information from efi file + efisecs = PeImageClass(efifilepath).SectionHeaderList + if efisecs == None or len(efisecs) == 0: + return None + + pcds = [] + for pcd in bPcds: + index = 0 + for efisec in efisecs: + index = index + 1 + if pcd[1].strip() == efisec[0].strip(): + pcds.append([pcd[0], efisec[2] + pcd[2], efisec[0]]) + elif pcd[4] == index: + pcds.append([pcd[0], efisec[2] + pcd[2], efisec[0]]) + return pcds + +def generatePcdTable(list, pcdpath): + try: + f = open(pcdpath, 'w') + except: + pass + + f.write('PCD Name Offset Section Name\r\n') + + for pcditem in list: + f.write('%-30s 0x%-08X %-6s\r\n' % (pcditem[0], pcditem[1], pcditem[2])) + f.close() + + #print 'Success to generate Binary Patch PCD table at %s!' % pcdpath + +if __name__ == '__main__': + UsageString = "%prog -m -e -o " + AdditionalNotes = "\nPCD table is generated in file name with .BinaryPcdTable.txt postfix" + parser = optparse.OptionParser(description=__copyright__, version=__version__, usage=UsageString) + parser.add_option('-m', '--mapfile', action='store', dest='mapfile', + help='Absolute path of module map file.') + parser.add_option('-e', '--efifile', action='store', dest='efifile', + help='Absolute path of EFI binary file.') + parser.add_option('-o', '--outputfile', action='store', dest='outfile', + help='Absolute path of output file to store the got patchable PCD table.') + + (options, args) = parser.parse_args() + + if options.mapfile == None or options.efifile == None: + print parser.get_usage() + elif os.path.exists(options.mapfile) and os.path.exists(options.efifile): + list = parsePcdInfoFromMapFile(options.mapfile, options.efifile) + if list != None: + if options.outfile != None: + generatePcdTable(list, options.outfile) + else: + generatePcdTable(list, options.mapfile.replace('.map', '.BinaryPcdTable.txt')) + else: + print 'Fail to generate Patch PCD Table based on map file and efi file' + else: + print 'Fail to generate Patch PCD Table for fail to find map file or efi file!' diff --git a/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py b/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py index 69c8244790..01b87012cd 100644 --- a/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py +++ b/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py @@ -1,290 +1,290 @@ -## @file -# Patch value into the binary file. -# -# Copyright (c) 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import re - -from optparse import OptionParser -from optparse import make_option -from Common.BuildToolError import * -import Common.EdkLogger as EdkLogger -from Common.BuildVersion import gBUILD_VERSION -import array - -# Version and Copyright -__version_number__ = ("0.10" + " " + gBUILD_VERSION) -__version__ = "%prog Version " + __version_number__ -__copyright__ = "Copyright (c) 2010, Intel Corporation. All rights reserved." - -## PatchBinaryFile method -# -# This method mainly patches the data into binary file. -# -# @param FileName File path of the binary file -# @param ValueOffset Offset value -# @param TypeName DataType Name -# @param Value Value String -# @param MaxSize MaxSize value -# -# @retval 0 File is updated successfully. -# @retval not 0 File is updated failed. -# -def PatchBinaryFile(FileName, ValueOffset, TypeName, ValueString, MaxSize=0): - # - # Length of Binary File - # - FileHandle = open (FileName, 'rb') - FileHandle.seek (0, 2) - FileLength = FileHandle.tell() - FileHandle.close() - # - # Unify string to upper string - # - TypeName = TypeName.upper() - # - # Get PCD value data length - # - ValueLength = 0 - if TypeName == 'BOOLEAN': - ValueLength = 1 - elif TypeName == 'UINT8': - ValueLength = 1 - elif TypeName == 'UINT16': - ValueLength = 2 - elif TypeName == 'UINT32': - ValueLength = 4 - elif TypeName == 'UINT64': - ValueLength = 8 - elif TypeName == 'VOID*': - if MaxSize == 0: - return OPTION_MISSING, "PcdMaxSize is not specified for VOID* type PCD." - ValueLength = int(MaxSize) - else: - return PARAMETER_INVALID, "PCD type %s is not valid." %(CommandOptions.PcdTypeName) - # - # Check PcdValue is in the input binary file. - # - if ValueOffset + ValueLength > FileLength: - return PARAMETER_INVALID, "PcdOffset + PcdMaxSize(DataType) is larger than the input file size." - # - # Read binary file into array - # - FileHandle = open (FileName, 'rb') - ByteArray = array.array('B') - ByteArray.fromfile(FileHandle, FileLength) - FileHandle.close() - OrigByteList = ByteArray.tolist() - ByteList = ByteArray.tolist() - # - # Clear the data in file - # - for Index in range(ValueLength): - ByteList[ValueOffset + Index] = 0 - # - # Patch value into offset - # - SavedStr = ValueString - ValueString = ValueString.upper() - ValueNumber = 0 - if TypeName == 'BOOLEAN': - # - # Get PCD value for BOOLEAN data type - # - try: - if ValueString == 'TRUE': - ValueNumber = 1 - elif ValueString == 'FALSE': - ValueNumber = 0 - elif ValueString.startswith('0X'): - ValueNumber = int (ValueString, 16) - else: - ValueNumber = int (ValueString) - if ValueNumber != 0: - ValueNumber = 1 - except: - return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string." %(ValueString) - # - # Set PCD value into binary data - # - ByteList[ValueOffset] = ValueNumber - elif TypeName in ['UINT8', 'UINT16', 'UINT32', 'UINT64']: - # - # Get PCD value for UINT* data type - # - try: - if ValueString.startswith('0X'): - ValueNumber = int (ValueString, 16) - else: - ValueNumber = int (ValueString) - except: - return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string." %(ValueString) - # - # Set PCD value into binary data - # - for Index in range(ValueLength): - ByteList[ValueOffset + Index] = ValueNumber % 0x100 - ValueNumber = ValueNumber / 0x100 - elif TypeName == 'VOID*': - ValueString = SavedStr - if ValueString.startswith('L"'): - # - # Patch Unicode String - # - Index = 0 - for ByteString in ValueString[2:-1]: - # - # Reserve zero as unicode tail - # - if Index + 2 >= ValueLength: - break - # - # Set string value one by one - # - ByteList[ValueOffset + Index] = ord(ByteString) - Index = Index + 2 - elif ValueString.startswith("{") and ValueString.endswith("}"): - # - # Patch {0x1, 0x2, ...} byte by byte - # - ValueList = ValueString[1 : len(ValueString) - 1].split(', ') - Index = 0 - try: - for ByteString in ValueList: - if ByteString.upper().startswith('0X'): - ByteValue = int(ByteString, 16) - else: - ByteValue = int(ByteString) - ByteList[ValueOffset + Index] = ByteValue % 0x100 - Index = Index + 1 - if Index >= ValueLength: - break - except: - return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string array." %(ValueString) - else: - # - # Patch ascii string - # - Index = 0 - for ByteString in ValueString[1:-1]: - # - # Reserve zero as string tail - # - if Index + 1 >= ValueLength: - break - # - # Set string value one by one - # - ByteList[ValueOffset + Index] = ord(ByteString) - Index = Index + 1 - # - # Update new data into input file. - # - if ByteList != OrigByteList: - ByteArray = array.array('B') - ByteArray.fromlist(ByteList) - FileHandle = open (FileName, 'wb') - ByteArray.tofile(FileHandle) - FileHandle.close() - return 0, "Patch Value into File %s successfully." %(FileName) - -## Parse command line options -# -# Using standard Python module optparse to parse command line option of this tool. -# -# @retval Options A optparse.Values object containing the parsed options -# @retval InputFile Path of file to be trimmed -# -def Options(): - OptionList = [ - make_option("-f", "--offset", dest="PcdOffset", action="store", type="int", - help="Start offset to the image is used to store PCD value."), - make_option("-u", "--value", dest="PcdValue", action="store", - help="PCD value will be updated into the image."), - make_option("-t", "--type", dest="PcdTypeName", action="store", - help="The name of PCD data type may be one of VOID*,BOOLEAN, UINT8, UINT16, UINT32, UINT64."), - make_option("-s", "--maxsize", dest="PcdMaxSize", action="store", type="int", - help="Max size of data buffer is taken by PCD value.It must be set when PCD type is VOID*."), - make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, - help="Run verbosely"), - make_option("-d", "--debug", dest="LogLevel", type="int", - help="Run with debug information"), - make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, - help="Run quietly"), - make_option("-?", action="help", help="show this help message and exit"), - ] - - # use clearer usage to override default usage message - UsageString = "%prog -f Offset -u Value -t Type [-s MaxSize] " - - Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) - Parser.set_defaults(LogLevel=EdkLogger.INFO) - - Options, Args = Parser.parse_args() - - # error check - if len(Args) == 0: - EdkLogger.error("PatchPcdValue", PARAMETER_INVALID, ExtraData=Parser.get_usage()) - - InputFile = Args[len(Args) - 1] - return Options, InputFile - -## Entrance method -# -# This method mainly dispatch specific methods per the command line options. -# If no error found, return zero value so the caller of this tool can know -# if it's executed successfully or not. -# -# @retval 0 Tool was successful -# @retval 1 Tool failed -# -def Main(): - try: - # - # Check input parameter - # - EdkLogger.Initialize() - CommandOptions, InputFile = Options() - if CommandOptions.LogLevel < EdkLogger.DEBUG_9: - EdkLogger.SetLevel(CommandOptions.LogLevel + 1) - else: - EdkLogger.SetLevel(CommandOptions.LogLevel) - if not os.path.exists (InputFile): - EdkLogger.error("PatchPcdValue", FILE_NOT_FOUND, ExtraData=InputFile) - return 1 - if CommandOptions.PcdOffset == None or CommandOptions.PcdValue == None or CommandOptions.PcdTypeName == None: - EdkLogger.error("PatchPcdValue", OPTION_MISSING, ExtraData="PcdOffset or PcdValue of PcdTypeName is not specified.") - return 1 - if CommandOptions.PcdTypeName.upper() not in ["BOOLEAN", "UINT8", "UINT16", "UINT32", "UINT64", "VOID*"]: - EdkLogger.error("PatchPcdValue", PARAMETER_INVALID, ExtraData="PCD type %s is not valid." %(CommandOptions.PcdTypeName)) - return 1 - if CommandOptions.PcdTypeName.upper() == "VOID*" and CommandOptions.PcdMaxSize == None: - EdkLogger.error("PatchPcdValue", OPTION_MISSING, ExtraData="PcdMaxSize is not specified for VOID* type PCD.") - return 1 - # - # Patch value into binary image. - # - ReturnValue, ErrorInfo = PatchBinaryFile (InputFile, CommandOptions.PcdOffset, CommandOptions.PcdTypeName, CommandOptions.PcdValue, CommandOptions.PcdMaxSize) - if ReturnValue != 0: - EdkLogger.error("PatchPcdValue", ReturnValue, ExtraData=ErrorInfo) - return 1 - return 0 - except: - return 1 - -if __name__ == '__main__': - r = Main() - sys.exit(r) +## @file +# Patch value into the binary file. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import re + +from optparse import OptionParser +from optparse import make_option +from Common.BuildToolError import * +import Common.EdkLogger as EdkLogger +from Common.BuildVersion import gBUILD_VERSION +import array + +# Version and Copyright +__version_number__ = ("0.10" + " " + gBUILD_VERSION) +__version__ = "%prog Version " + __version_number__ +__copyright__ = "Copyright (c) 2010, Intel Corporation. All rights reserved." + +## PatchBinaryFile method +# +# This method mainly patches the data into binary file. +# +# @param FileName File path of the binary file +# @param ValueOffset Offset value +# @param TypeName DataType Name +# @param Value Value String +# @param MaxSize MaxSize value +# +# @retval 0 File is updated successfully. +# @retval not 0 File is updated failed. +# +def PatchBinaryFile(FileName, ValueOffset, TypeName, ValueString, MaxSize=0): + # + # Length of Binary File + # + FileHandle = open (FileName, 'rb') + FileHandle.seek (0, 2) + FileLength = FileHandle.tell() + FileHandle.close() + # + # Unify string to upper string + # + TypeName = TypeName.upper() + # + # Get PCD value data length + # + ValueLength = 0 + if TypeName == 'BOOLEAN': + ValueLength = 1 + elif TypeName == 'UINT8': + ValueLength = 1 + elif TypeName == 'UINT16': + ValueLength = 2 + elif TypeName == 'UINT32': + ValueLength = 4 + elif TypeName == 'UINT64': + ValueLength = 8 + elif TypeName == 'VOID*': + if MaxSize == 0: + return OPTION_MISSING, "PcdMaxSize is not specified for VOID* type PCD." + ValueLength = int(MaxSize) + else: + return PARAMETER_INVALID, "PCD type %s is not valid." %(CommandOptions.PcdTypeName) + # + # Check PcdValue is in the input binary file. + # + if ValueOffset + ValueLength > FileLength: + return PARAMETER_INVALID, "PcdOffset + PcdMaxSize(DataType) is larger than the input file size." + # + # Read binary file into array + # + FileHandle = open (FileName, 'rb') + ByteArray = array.array('B') + ByteArray.fromfile(FileHandle, FileLength) + FileHandle.close() + OrigByteList = ByteArray.tolist() + ByteList = ByteArray.tolist() + # + # Clear the data in file + # + for Index in range(ValueLength): + ByteList[ValueOffset + Index] = 0 + # + # Patch value into offset + # + SavedStr = ValueString + ValueString = ValueString.upper() + ValueNumber = 0 + if TypeName == 'BOOLEAN': + # + # Get PCD value for BOOLEAN data type + # + try: + if ValueString == 'TRUE': + ValueNumber = 1 + elif ValueString == 'FALSE': + ValueNumber = 0 + elif ValueString.startswith('0X'): + ValueNumber = int (ValueString, 16) + else: + ValueNumber = int (ValueString) + if ValueNumber != 0: + ValueNumber = 1 + except: + return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string." %(ValueString) + # + # Set PCD value into binary data + # + ByteList[ValueOffset] = ValueNumber + elif TypeName in ['UINT8', 'UINT16', 'UINT32', 'UINT64']: + # + # Get PCD value for UINT* data type + # + try: + if ValueString.startswith('0X'): + ValueNumber = int (ValueString, 16) + else: + ValueNumber = int (ValueString) + except: + return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string." %(ValueString) + # + # Set PCD value into binary data + # + for Index in range(ValueLength): + ByteList[ValueOffset + Index] = ValueNumber % 0x100 + ValueNumber = ValueNumber / 0x100 + elif TypeName == 'VOID*': + ValueString = SavedStr + if ValueString.startswith('L"'): + # + # Patch Unicode String + # + Index = 0 + for ByteString in ValueString[2:-1]: + # + # Reserve zero as unicode tail + # + if Index + 2 >= ValueLength: + break + # + # Set string value one by one + # + ByteList[ValueOffset + Index] = ord(ByteString) + Index = Index + 2 + elif ValueString.startswith("{") and ValueString.endswith("}"): + # + # Patch {0x1, 0x2, ...} byte by byte + # + ValueList = ValueString[1 : len(ValueString) - 1].split(', ') + Index = 0 + try: + for ByteString in ValueList: + if ByteString.upper().startswith('0X'): + ByteValue = int(ByteString, 16) + else: + ByteValue = int(ByteString) + ByteList[ValueOffset + Index] = ByteValue % 0x100 + Index = Index + 1 + if Index >= ValueLength: + break + except: + return PARAMETER_INVALID, "PCD Value %s is not valid dec or hex string array." %(ValueString) + else: + # + # Patch ascii string + # + Index = 0 + for ByteString in ValueString[1:-1]: + # + # Reserve zero as string tail + # + if Index + 1 >= ValueLength: + break + # + # Set string value one by one + # + ByteList[ValueOffset + Index] = ord(ByteString) + Index = Index + 1 + # + # Update new data into input file. + # + if ByteList != OrigByteList: + ByteArray = array.array('B') + ByteArray.fromlist(ByteList) + FileHandle = open (FileName, 'wb') + ByteArray.tofile(FileHandle) + FileHandle.close() + return 0, "Patch Value into File %s successfully." %(FileName) + +## Parse command line options +# +# Using standard Python module optparse to parse command line option of this tool. +# +# @retval Options A optparse.Values object containing the parsed options +# @retval InputFile Path of file to be trimmed +# +def Options(): + OptionList = [ + make_option("-f", "--offset", dest="PcdOffset", action="store", type="int", + help="Start offset to the image is used to store PCD value."), + make_option("-u", "--value", dest="PcdValue", action="store", + help="PCD value will be updated into the image."), + make_option("-t", "--type", dest="PcdTypeName", action="store", + help="The name of PCD data type may be one of VOID*,BOOLEAN, UINT8, UINT16, UINT32, UINT64."), + make_option("-s", "--maxsize", dest="PcdMaxSize", action="store", type="int", + help="Max size of data buffer is taken by PCD value.It must be set when PCD type is VOID*."), + make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, + help="Run verbosely"), + make_option("-d", "--debug", dest="LogLevel", type="int", + help="Run with debug information"), + make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, + help="Run quietly"), + make_option("-?", action="help", help="show this help message and exit"), + ] + + # use clearer usage to override default usage message + UsageString = "%prog -f Offset -u Value -t Type [-s MaxSize] " + + Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) + Parser.set_defaults(LogLevel=EdkLogger.INFO) + + Options, Args = Parser.parse_args() + + # error check + if len(Args) == 0: + EdkLogger.error("PatchPcdValue", PARAMETER_INVALID, ExtraData=Parser.get_usage()) + + InputFile = Args[len(Args) - 1] + return Options, InputFile + +## Entrance method +# +# This method mainly dispatch specific methods per the command line options. +# If no error found, return zero value so the caller of this tool can know +# if it's executed successfully or not. +# +# @retval 0 Tool was successful +# @retval 1 Tool failed +# +def Main(): + try: + # + # Check input parameter + # + EdkLogger.Initialize() + CommandOptions, InputFile = Options() + if CommandOptions.LogLevel < EdkLogger.DEBUG_9: + EdkLogger.SetLevel(CommandOptions.LogLevel + 1) + else: + EdkLogger.SetLevel(CommandOptions.LogLevel) + if not os.path.exists (InputFile): + EdkLogger.error("PatchPcdValue", FILE_NOT_FOUND, ExtraData=InputFile) + return 1 + if CommandOptions.PcdOffset == None or CommandOptions.PcdValue == None or CommandOptions.PcdTypeName == None: + EdkLogger.error("PatchPcdValue", OPTION_MISSING, ExtraData="PcdOffset or PcdValue of PcdTypeName is not specified.") + return 1 + if CommandOptions.PcdTypeName.upper() not in ["BOOLEAN", "UINT8", "UINT16", "UINT32", "UINT64", "VOID*"]: + EdkLogger.error("PatchPcdValue", PARAMETER_INVALID, ExtraData="PCD type %s is not valid." %(CommandOptions.PcdTypeName)) + return 1 + if CommandOptions.PcdTypeName.upper() == "VOID*" and CommandOptions.PcdMaxSize == None: + EdkLogger.error("PatchPcdValue", OPTION_MISSING, ExtraData="PcdMaxSize is not specified for VOID* type PCD.") + return 1 + # + # Patch value into binary image. + # + ReturnValue, ErrorInfo = PatchBinaryFile (InputFile, CommandOptions.PcdOffset, CommandOptions.PcdTypeName, CommandOptions.PcdValue, CommandOptions.PcdMaxSize) + if ReturnValue != 0: + EdkLogger.error("PatchPcdValue", ReturnValue, ExtraData=ErrorInfo) + return 1 + return 0 + except: + return 1 + +if __name__ == '__main__': + r = Main() + sys.exit(r) diff --git a/BaseTools/Source/Python/Trim/Trim.py b/BaseTools/Source/Python/Trim/Trim.py index 0416ecdcac..c0ede03359 100644 --- a/BaseTools/Source/Python/Trim/Trim.py +++ b/BaseTools/Source/Python/Trim/Trim.py @@ -1,609 +1,609 @@ -## @file -# Trim files preprocessed by compiler -# -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import re - -from optparse import OptionParser -from optparse import make_option -from Common.BuildToolError import * -from Common.Misc import * -from Common.BuildVersion import gBUILD_VERSION -import Common.EdkLogger as EdkLogger - -# Version and Copyright -__version_number__ = ("0.10" + " " + gBUILD_VERSION) -__version__ = "%prog Version " + __version_number__ -__copyright__ = "Copyright (c) 2007-2010, Intel Corporation. All rights reserved." - -## Regular expression for matching Line Control directive like "#line xxx" -gLineControlDirective = re.compile('^\s*#(?:line)?\s+([0-9]+)\s+"*([^"]*)"') -## Regular expression for matching "typedef struct" -gTypedefPattern = re.compile("^\s*typedef\s+struct(\s+\w+)?\s*[{]*$", re.MULTILINE) -## Regular expression for matching "#pragma pack" -gPragmaPattern = re.compile("^\s*#pragma\s+pack", re.MULTILINE) - -# -# The following number pattern match will only match if following criteria is met: -# There is leading non-(alphanumeric or _) character, and no following alphanumeric or _ -# as the pattern is greedily match, so it is ok for the gDecNumberPattern or gHexNumberPattern to grab the maximum match -# -## Regular expression for matching HEX number -gHexNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])(0[xX])([0-9a-fA-F]+)(U(?=$|[^a-zA-Z0-9_]))?") -## Regular expression for matching decimal number with 'U' postfix -gDecNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])([0-9]+)U(?=$|[^a-zA-Z0-9_])") -## Regular expression for matching constant with 'ULL' 'LL' postfix -gLongNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])(0[xX][0-9a-fA-F]+|[0-9]+)U?LL(?=$|[^a-zA-Z0-9_])") - -## Regular expression for matching "Include ()" in asl file -gAslIncludePattern = re.compile("^(\s*)[iI]nclude\s*\(\"?([^\"\(\)]+)\"\)", re.MULTILINE) -## Regular expression for matching C style #include "XXX.asl" in asl file -gAslCIncludePattern = re.compile(r'^(\s*)#include\s*[<"]\s*([-\\/\w.]+)\s*([>"])', re.MULTILINE) -## Patterns used to convert EDK conventions to EDK2 ECP conventions -gImportCodePatterns = [ - [ - re.compile('^(\s*)\(\*\*PeiServices\)\.PciCfg\s*=\s*([^;\s]+);', re.MULTILINE), - '''\\1{ -\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { -\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), -\\1 &gEcpPeiPciCfgPpiGuid, -\\1 \\2 -\\1 }; -\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); -\\1}''' - ], - - [ - re.compile('^(\s*)\(\*PeiServices\)->PciCfg\s*=\s*([^;\s]+);', re.MULTILINE), - '''\\1{ -\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { -\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), -\\1 &gEcpPeiPciCfgPpiGuid, -\\1 \\2 -\\1 }; -\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); -\\1}''' - ], - - [ - re.compile("(\s*).+->Modify[\s\n]*\(", re.MULTILINE), - '\\1PeiLibPciCfgModify (' - ], - - [ - re.compile("(\W*)gRT->ReportStatusCode[\s\n]*\(", re.MULTILINE), - '\\1EfiLibReportStatusCode (' - ], - - [ - re.compile('#include\s+EFI_GUID_DEFINITION\s*\(FirmwareFileSystem\)', re.MULTILINE), - '#include EFI_GUID_DEFINITION (FirmwareFileSystem)\n#include EFI_GUID_DEFINITION (FirmwareFileSystem2)' - ], - - [ - re.compile('gEfiFirmwareFileSystemGuid', re.MULTILINE), - 'gEfiFirmwareFileSystem2Guid' - ], - - [ - re.compile('EFI_FVH_REVISION', re.MULTILINE), - 'EFI_FVH_PI_REVISION' - ], - - [ - re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_READY_TO_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE), - '\\1EfiCreateEventReadyToBoot (\\2\\3;' - ], - - [ - re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_LEGACY_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE), - '\\1EfiCreateEventLegacyBoot (\\2\\3;' - ], -# [ -# re.compile("(\W)(PEI_PCI_CFG_PPI)(\W)", re.MULTILINE), -# '\\1ECP_\\2\\3' -# ] -] - -## file cache to avoid circular include in ASL file -gIncludedAslFile = [] - -## Trim preprocessed source code -# -# Remove extra content made by preprocessor. The preprocessor must enable the -# line number generation option when preprocessing. -# -# @param Source File to be trimmed -# @param Target File to store the trimmed content -# @param Convert If True, convert standard HEX format to MASM format -# -def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong): - CreateDirectory(os.path.dirname(Target)) - try: - f = open (Source, 'r') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) - - # read whole file - Lines = f.readlines() - f.close() - - PreprocessedFile = "" - InjectedFile = "" - LineIndexOfOriginalFile = None - NewLines = [] - LineControlDirectiveFound = False - for Index in range(len(Lines)): - Line = Lines[Index] - # - # Find out the name of files injected by preprocessor from the lines - # with Line Control directive - # - MatchList = gLineControlDirective.findall(Line) - if MatchList != []: - MatchList = MatchList[0] - if len(MatchList) == 2: - LineNumber = int(MatchList[0], 0) - InjectedFile = MatchList[1] - # The first injetcted file must be the preprocessed file itself - if PreprocessedFile == "": - PreprocessedFile = InjectedFile - LineControlDirectiveFound = True - continue - elif PreprocessedFile == "" or InjectedFile != PreprocessedFile: - continue - - if LineIndexOfOriginalFile == None: - # - # Any non-empty lines must be from original preprocessed file. - # And this must be the first one. - # - LineIndexOfOriginalFile = Index - EdkLogger.verbose("Found original file content starting from line %d" - % (LineIndexOfOriginalFile + 1)) - - # convert HEX number format if indicated - if ConvertHex: - Line = gHexNumberPattern.sub(r"0\2h", Line) - else: - Line = gHexNumberPattern.sub(r"\1\2", Line) - if TrimLong: - Line = gLongNumberPattern.sub(r"\1", Line) - - # convert Decimal number format - Line = gDecNumberPattern.sub(r"\1", Line) - - if LineNumber != None: - EdkLogger.verbose("Got line directive: line=%d" % LineNumber) - # in case preprocessor removed some lines, like blank or comment lines - if LineNumber <= len(NewLines): - # possible? - NewLines[LineNumber - 1] = Line - else: - if LineNumber > (len(NewLines) + 1): - for LineIndex in range(len(NewLines), LineNumber-1): - NewLines.append(os.linesep) - NewLines.append(Line) - LineNumber = None - EdkLogger.verbose("Now we have lines: %d" % len(NewLines)) - else: - NewLines.append(Line) - - # in case there's no line directive or linemarker found - if (not LineControlDirectiveFound) and NewLines == []: - NewLines = Lines - - # save to file - try: - f = open (Target, 'wb') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) - f.writelines(NewLines) - f.close() - -## Trim preprocessed VFR file -# -# Remove extra content made by preprocessor. The preprocessor doesn't need to -# enable line number generation option when preprocessing. -# -# @param Source File to be trimmed -# @param Target File to store the trimmed content -# -def TrimPreprocessedVfr(Source, Target): - CreateDirectory(os.path.dirname(Target)) - - try: - f = open (Source,'r') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) - # read whole file - Lines = f.readlines() - f.close() - - FoundTypedef = False - Brace = 0 - TypedefStart = 0 - TypedefEnd = 0 - for Index in range(len(Lines)): - Line = Lines[Index] - # don't trim the lines from "formset" definition to the end of file - if Line.strip() == 'formset': - break - - if FoundTypedef == False and (Line.find('#line') == 0 or Line.find('# ') == 0): - # empty the line number directive if it's not aomong "typedef struct" - Lines[Index] = "\n" - continue - - if FoundTypedef == False and gTypedefPattern.search(Line) == None: - # keep "#pragram pack" directive - if gPragmaPattern.search(Line) == None: - Lines[Index] = "\n" - continue - elif FoundTypedef == False: - # found "typedef struct", keept its position and set a flag - FoundTypedef = True - TypedefStart = Index - - # match { and } to find the end of typedef definition - if Line.find("{") >= 0: - Brace += 1 - elif Line.find("}") >= 0: - Brace -= 1 - - # "typedef struct" must end with a ";" - if Brace == 0 and Line.find(";") >= 0: - FoundTypedef = False - TypedefEnd = Index - # keep all "typedef struct" except to GUID, EFI_PLABEL and PAL_CALL_RETURN - if Line.strip("} ;\r\n") in ["GUID", "EFI_PLABEL", "PAL_CALL_RETURN"]: - for i in range(TypedefStart, TypedefEnd+1): - Lines[i] = "\n" - - # save all lines trimmed - try: - f = open (Target,'w') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) - f.writelines(Lines) - f.close() - -## Read the content ASL file, including ASL included, recursively -# -# @param Source File to be read -# @param Indent Spaces before the Include() statement -# @param IncludePathList The list of external include file -# @param LocalSearchPath If LocalSearchPath is specified, this path will be searched -# first for the included file; otherwise, only the path specified -# in the IncludePathList will be searched. -# -def DoInclude(Source, Indent='', IncludePathList=[], LocalSearchPath=None): - NewFileContent = [] - - try: - # - # Search LocalSearchPath first if it is specified. - # - if LocalSearchPath: - SearchPathList = [LocalSearchPath] + IncludePathList - else: - SearchPathList = IncludePathList - - for IncludePath in SearchPathList: - IncludeFile = os.path.join(IncludePath, Source) - if os.path.isfile(IncludeFile): - F = open(IncludeFile, "r") - break - else: - EdkLogger.error("Trim", "Failed to find include file %s" % Source) - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) - - - # avoid A "include" B and B "include" A - IncludeFile = os.path.abspath(os.path.normpath(IncludeFile)) - if IncludeFile in gIncludedAslFile: - EdkLogger.warn("Trim", "Circular include", - ExtraData= "%s -> %s" % (" -> ".join(gIncludedAslFile), IncludeFile)) - return [] - gIncludedAslFile.append(IncludeFile) - - for Line in F: - LocalSearchPath = None - Result = gAslIncludePattern.findall(Line) - if len(Result) == 0: - Result = gAslCIncludePattern.findall(Line) - if len(Result) == 0 or os.path.splitext(Result[0][1])[1].lower() not in [".asl", ".asi"]: - NewFileContent.append("%s%s" % (Indent, Line)) - continue - # - # We should first search the local directory if current file are using pattern #include "XXX" - # - if Result[0][2] == '"': - LocalSearchPath = os.path.dirname(IncludeFile) - CurrentIndent = Indent + Result[0][0] - IncludedFile = Result[0][1] - NewFileContent.extend(DoInclude(IncludedFile, CurrentIndent, IncludePathList, LocalSearchPath)) - NewFileContent.append("\n") - - gIncludedAslFile.pop() - F.close() - - return NewFileContent - - -## Trim ASL file -# -# Replace ASL include statement with the content the included file -# -# @param Source File to be trimmed -# @param Target File to store the trimmed content -# @param IncludePathFile The file to log the external include path -# -def TrimAslFile(Source, Target, IncludePathFile): - CreateDirectory(os.path.dirname(Target)) - - SourceDir = os.path.dirname(Source) - if SourceDir == '': - SourceDir = '.' - - # - # Add source directory as the first search directory - # - IncludePathList = [SourceDir] - - # - # If additional include path file is specified, append them all - # to the search directory list. - # - if IncludePathFile: - try: - LineNum = 0 - for Line in open(IncludePathFile,'r'): - LineNum += 1 - if Line.startswith("/I") or Line.startswith ("-I"): - IncludePathList.append(Line[2:].strip()) - else: - EdkLogger.warn("Trim", "Invalid include line in include list file.", IncludePathFile, LineNum) - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=IncludePathFile) - - Lines = DoInclude(Source, '', IncludePathList) - - # - # Undef MIN and MAX to avoid collision in ASL source code - # - Lines.insert(0, "#undef MIN\n#undef MAX\n") - - # save all lines trimmed - try: - f = open (Target,'w') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) - - f.writelines(Lines) - f.close() - -## Trim EDK source code file(s) -# -# -# @param Source File or directory to be trimmed -# @param Target File or directory to store the trimmed content -# -def TrimEdkSources(Source, Target): - if os.path.isdir(Source): - for CurrentDir, Dirs, Files in os.walk(Source): - if '.svn' in Dirs: - Dirs.remove('.svn') - elif "CVS" in Dirs: - Dirs.remove("CVS") - - for FileName in Files: - Dummy, Ext = os.path.splitext(FileName) - if Ext.upper() not in ['.C', '.H']: continue - if Target == None or Target == '': - TrimEdkSourceCode( - os.path.join(CurrentDir, FileName), - os.path.join(CurrentDir, FileName) - ) - else: - TrimEdkSourceCode( - os.path.join(CurrentDir, FileName), - os.path.join(Target, CurrentDir[len(Source)+1:], FileName) - ) - else: - TrimEdkSourceCode(Source, Target) - -## Trim one EDK source code file -# -# Do following replacement: -# -# (**PeiServices\).PciCfg = <*>; -# => { -# STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { -# (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), -# &gEcpPeiPciCfgPpiGuid, -# <*> -# }; -# (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); -# -# <*>Modify(<*>) -# => PeiLibPciCfgModify (<*>) -# -# gRT->ReportStatusCode (<*>) -# => EfiLibReportStatusCode (<*>) -# -# #include -# => #include -# -# CreateEvent (EFI_EVENT_SIGNAL_READY_TO_BOOT, <*>) -# => EfiCreateEventReadyToBoot (<*>) -# -# CreateEvent (EFI_EVENT_SIGNAL_LEGACY_BOOT, <*>) -# => EfiCreateEventLegacyBoot (<*>) -# -# @param Source File to be trimmed -# @param Target File to store the trimmed content -# -def TrimEdkSourceCode(Source, Target): - EdkLogger.verbose("\t%s -> %s" % (Source, Target)) - CreateDirectory(os.path.dirname(Target)) - - try: - f = open (Source,'rb') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) - # read whole file - Lines = f.read() - f.close() - - NewLines = None - for Re,Repl in gImportCodePatterns: - if NewLines == None: - NewLines = Re.sub(Repl, Lines) - else: - NewLines = Re.sub(Repl, NewLines) - - # save all lines if trimmed - if Source == Target and NewLines == Lines: - return - - try: - f = open (Target,'wb') - except: - EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) - f.write(NewLines) - f.close() - - -## Parse command line options -# -# Using standard Python module optparse to parse command line option of this tool. -# -# @retval Options A optparse.Values object containing the parsed options -# @retval InputFile Path of file to be trimmed -# -def Options(): - OptionList = [ - make_option("-s", "--source-code", dest="FileType", const="SourceCode", action="store_const", - help="The input file is preprocessed source code, including C or assembly code"), - make_option("-r", "--vfr-file", dest="FileType", const="Vfr", action="store_const", - help="The input file is preprocessed VFR file"), - make_option("-a", "--asl-file", dest="FileType", const="Asl", action="store_const", - help="The input file is ASL file"), - make_option("-8", "--Edk-source-code", dest="FileType", const="EdkSourceCode", action="store_const", - help="The input file is source code for Edk to be trimmed for ECP"), - - make_option("-c", "--convert-hex", dest="ConvertHex", action="store_true", - help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), - - make_option("-l", "--trim-long", dest="TrimLong", action="store_true", - help="Remove postfix of long number"), - make_option("-i", "--include-path-file", dest="IncludePathFile", - help="The input file is include path list to search for ASL include file"), - make_option("-o", "--output", dest="OutputFile", - help="File to store the trimmed content"), - make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, - help="Run verbosely"), - make_option("-d", "--debug", dest="LogLevel", type="int", - help="Run with debug information"), - make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, - help="Run quietly"), - make_option("-?", action="help", help="show this help message and exit"), - ] - - # use clearer usage to override default usage message - UsageString = "%prog [-s|-r|-a] [-c] [-v|-d |-q] [-i ] [-o ] " - - Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) - Parser.set_defaults(FileType="Vfr") - Parser.set_defaults(ConvertHex=False) - Parser.set_defaults(LogLevel=EdkLogger.INFO) - - Options, Args = Parser.parse_args() - - # error check - if len(Args) == 0: - EdkLogger.error("Trim", OPTION_MISSING, ExtraData=Parser.get_usage()) - if len(Args) > 1: - EdkLogger.error("Trim", OPTION_NOT_SUPPORTED, ExtraData=Parser.get_usage()) - - InputFile = Args[0] - return Options, InputFile - -## Entrance method -# -# This method mainly dispatch specific methods per the command line options. -# If no error found, return zero value so the caller of this tool can know -# if it's executed successfully or not. -# -# @retval 0 Tool was successful -# @retval 1 Tool failed -# -def Main(): - try: - EdkLogger.Initialize() - CommandOptions, InputFile = Options() - if CommandOptions.LogLevel < EdkLogger.DEBUG_9: - EdkLogger.SetLevel(CommandOptions.LogLevel + 1) - else: - EdkLogger.SetLevel(CommandOptions.LogLevel) - except FatalError, X: - return 1 - - try: - if CommandOptions.FileType == "Vfr": - if CommandOptions.OutputFile == None: - CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' - TrimPreprocessedVfr(InputFile, CommandOptions.OutputFile) - elif CommandOptions.FileType == "Asl": - if CommandOptions.OutputFile == None: - CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' - TrimAslFile(InputFile, CommandOptions.OutputFile, CommandOptions.IncludePathFile) - elif CommandOptions.FileType == "EdkSourceCode": - TrimEdkSources(InputFile, CommandOptions.OutputFile) - else : - if CommandOptions.OutputFile == None: - CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' - TrimPreprocessedFile(InputFile, CommandOptions.OutputFile, CommandOptions.ConvertHex, CommandOptions.TrimLong) - except FatalError, X: - import platform - import traceback - if CommandOptions != None and CommandOptions.LogLevel <= EdkLogger.DEBUG_9: - EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc()) - return 1 - except: - import traceback - import platform - EdkLogger.error( - "\nTrim", - CODE_ERROR, - "Unknown fatal error when trimming [%s]" % InputFile, - ExtraData="\n(Please send email to edk2-buildtools-devel@lists.sourceforge.net for help, attaching following call stack trace!)\n", - RaiseError=False - ) - EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc()) - return 1 - - return 0 - -if __name__ == '__main__': - r = Main() - ## 0-127 is a safe return range, and 1 is a standard default error - if r < 0 or r > 127: r = 1 - sys.exit(r) - +## @file +# Trim files preprocessed by compiler +# +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import re + +from optparse import OptionParser +from optparse import make_option +from Common.BuildToolError import * +from Common.Misc import * +from Common.BuildVersion import gBUILD_VERSION +import Common.EdkLogger as EdkLogger + +# Version and Copyright +__version_number__ = ("0.10" + " " + gBUILD_VERSION) +__version__ = "%prog Version " + __version_number__ +__copyright__ = "Copyright (c) 2007-2010, Intel Corporation. All rights reserved." + +## Regular expression for matching Line Control directive like "#line xxx" +gLineControlDirective = re.compile('^\s*#(?:line)?\s+([0-9]+)\s+"*([^"]*)"') +## Regular expression for matching "typedef struct" +gTypedefPattern = re.compile("^\s*typedef\s+struct(\s+\w+)?\s*[{]*$", re.MULTILINE) +## Regular expression for matching "#pragma pack" +gPragmaPattern = re.compile("^\s*#pragma\s+pack", re.MULTILINE) + +# +# The following number pattern match will only match if following criteria is met: +# There is leading non-(alphanumeric or _) character, and no following alphanumeric or _ +# as the pattern is greedily match, so it is ok for the gDecNumberPattern or gHexNumberPattern to grab the maximum match +# +## Regular expression for matching HEX number +gHexNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])(0[xX])([0-9a-fA-F]+)(U(?=$|[^a-zA-Z0-9_]))?") +## Regular expression for matching decimal number with 'U' postfix +gDecNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])([0-9]+)U(?=$|[^a-zA-Z0-9_])") +## Regular expression for matching constant with 'ULL' 'LL' postfix +gLongNumberPattern = re.compile("(?<=[^a-zA-Z0-9_])(0[xX][0-9a-fA-F]+|[0-9]+)U?LL(?=$|[^a-zA-Z0-9_])") + +## Regular expression for matching "Include ()" in asl file +gAslIncludePattern = re.compile("^(\s*)[iI]nclude\s*\(\"?([^\"\(\)]+)\"\)", re.MULTILINE) +## Regular expression for matching C style #include "XXX.asl" in asl file +gAslCIncludePattern = re.compile(r'^(\s*)#include\s*[<"]\s*([-\\/\w.]+)\s*([>"])', re.MULTILINE) +## Patterns used to convert EDK conventions to EDK2 ECP conventions +gImportCodePatterns = [ + [ + re.compile('^(\s*)\(\*\*PeiServices\)\.PciCfg\s*=\s*([^;\s]+);', re.MULTILINE), + '''\\1{ +\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { +\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), +\\1 &gEcpPeiPciCfgPpiGuid, +\\1 \\2 +\\1 }; +\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); +\\1}''' + ], + + [ + re.compile('^(\s*)\(\*PeiServices\)->PciCfg\s*=\s*([^;\s]+);', re.MULTILINE), + '''\\1{ +\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { +\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), +\\1 &gEcpPeiPciCfgPpiGuid, +\\1 \\2 +\\1 }; +\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); +\\1}''' + ], + + [ + re.compile("(\s*).+->Modify[\s\n]*\(", re.MULTILINE), + '\\1PeiLibPciCfgModify (' + ], + + [ + re.compile("(\W*)gRT->ReportStatusCode[\s\n]*\(", re.MULTILINE), + '\\1EfiLibReportStatusCode (' + ], + + [ + re.compile('#include\s+EFI_GUID_DEFINITION\s*\(FirmwareFileSystem\)', re.MULTILINE), + '#include EFI_GUID_DEFINITION (FirmwareFileSystem)\n#include EFI_GUID_DEFINITION (FirmwareFileSystem2)' + ], + + [ + re.compile('gEfiFirmwareFileSystemGuid', re.MULTILINE), + 'gEfiFirmwareFileSystem2Guid' + ], + + [ + re.compile('EFI_FVH_REVISION', re.MULTILINE), + 'EFI_FVH_PI_REVISION' + ], + + [ + re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_READY_TO_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE), + '\\1EfiCreateEventReadyToBoot (\\2\\3;' + ], + + [ + re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_LEGACY_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE), + '\\1EfiCreateEventLegacyBoot (\\2\\3;' + ], +# [ +# re.compile("(\W)(PEI_PCI_CFG_PPI)(\W)", re.MULTILINE), +# '\\1ECP_\\2\\3' +# ] +] + +## file cache to avoid circular include in ASL file +gIncludedAslFile = [] + +## Trim preprocessed source code +# +# Remove extra content made by preprocessor. The preprocessor must enable the +# line number generation option when preprocessing. +# +# @param Source File to be trimmed +# @param Target File to store the trimmed content +# @param Convert If True, convert standard HEX format to MASM format +# +def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong): + CreateDirectory(os.path.dirname(Target)) + try: + f = open (Source, 'r') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) + + # read whole file + Lines = f.readlines() + f.close() + + PreprocessedFile = "" + InjectedFile = "" + LineIndexOfOriginalFile = None + NewLines = [] + LineControlDirectiveFound = False + for Index in range(len(Lines)): + Line = Lines[Index] + # + # Find out the name of files injected by preprocessor from the lines + # with Line Control directive + # + MatchList = gLineControlDirective.findall(Line) + if MatchList != []: + MatchList = MatchList[0] + if len(MatchList) == 2: + LineNumber = int(MatchList[0], 0) + InjectedFile = MatchList[1] + # The first injetcted file must be the preprocessed file itself + if PreprocessedFile == "": + PreprocessedFile = InjectedFile + LineControlDirectiveFound = True + continue + elif PreprocessedFile == "" or InjectedFile != PreprocessedFile: + continue + + if LineIndexOfOriginalFile == None: + # + # Any non-empty lines must be from original preprocessed file. + # And this must be the first one. + # + LineIndexOfOriginalFile = Index + EdkLogger.verbose("Found original file content starting from line %d" + % (LineIndexOfOriginalFile + 1)) + + # convert HEX number format if indicated + if ConvertHex: + Line = gHexNumberPattern.sub(r"0\2h", Line) + else: + Line = gHexNumberPattern.sub(r"\1\2", Line) + if TrimLong: + Line = gLongNumberPattern.sub(r"\1", Line) + + # convert Decimal number format + Line = gDecNumberPattern.sub(r"\1", Line) + + if LineNumber != None: + EdkLogger.verbose("Got line directive: line=%d" % LineNumber) + # in case preprocessor removed some lines, like blank or comment lines + if LineNumber <= len(NewLines): + # possible? + NewLines[LineNumber - 1] = Line + else: + if LineNumber > (len(NewLines) + 1): + for LineIndex in range(len(NewLines), LineNumber-1): + NewLines.append(os.linesep) + NewLines.append(Line) + LineNumber = None + EdkLogger.verbose("Now we have lines: %d" % len(NewLines)) + else: + NewLines.append(Line) + + # in case there's no line directive or linemarker found + if (not LineControlDirectiveFound) and NewLines == []: + NewLines = Lines + + # save to file + try: + f = open (Target, 'wb') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) + f.writelines(NewLines) + f.close() + +## Trim preprocessed VFR file +# +# Remove extra content made by preprocessor. The preprocessor doesn't need to +# enable line number generation option when preprocessing. +# +# @param Source File to be trimmed +# @param Target File to store the trimmed content +# +def TrimPreprocessedVfr(Source, Target): + CreateDirectory(os.path.dirname(Target)) + + try: + f = open (Source,'r') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) + # read whole file + Lines = f.readlines() + f.close() + + FoundTypedef = False + Brace = 0 + TypedefStart = 0 + TypedefEnd = 0 + for Index in range(len(Lines)): + Line = Lines[Index] + # don't trim the lines from "formset" definition to the end of file + if Line.strip() == 'formset': + break + + if FoundTypedef == False and (Line.find('#line') == 0 or Line.find('# ') == 0): + # empty the line number directive if it's not aomong "typedef struct" + Lines[Index] = "\n" + continue + + if FoundTypedef == False and gTypedefPattern.search(Line) == None: + # keep "#pragram pack" directive + if gPragmaPattern.search(Line) == None: + Lines[Index] = "\n" + continue + elif FoundTypedef == False: + # found "typedef struct", keept its position and set a flag + FoundTypedef = True + TypedefStart = Index + + # match { and } to find the end of typedef definition + if Line.find("{") >= 0: + Brace += 1 + elif Line.find("}") >= 0: + Brace -= 1 + + # "typedef struct" must end with a ";" + if Brace == 0 and Line.find(";") >= 0: + FoundTypedef = False + TypedefEnd = Index + # keep all "typedef struct" except to GUID, EFI_PLABEL and PAL_CALL_RETURN + if Line.strip("} ;\r\n") in ["GUID", "EFI_PLABEL", "PAL_CALL_RETURN"]: + for i in range(TypedefStart, TypedefEnd+1): + Lines[i] = "\n" + + # save all lines trimmed + try: + f = open (Target,'w') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) + f.writelines(Lines) + f.close() + +## Read the content ASL file, including ASL included, recursively +# +# @param Source File to be read +# @param Indent Spaces before the Include() statement +# @param IncludePathList The list of external include file +# @param LocalSearchPath If LocalSearchPath is specified, this path will be searched +# first for the included file; otherwise, only the path specified +# in the IncludePathList will be searched. +# +def DoInclude(Source, Indent='', IncludePathList=[], LocalSearchPath=None): + NewFileContent = [] + + try: + # + # Search LocalSearchPath first if it is specified. + # + if LocalSearchPath: + SearchPathList = [LocalSearchPath] + IncludePathList + else: + SearchPathList = IncludePathList + + for IncludePath in SearchPathList: + IncludeFile = os.path.join(IncludePath, Source) + if os.path.isfile(IncludeFile): + F = open(IncludeFile, "r") + break + else: + EdkLogger.error("Trim", "Failed to find include file %s" % Source) + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) + + + # avoid A "include" B and B "include" A + IncludeFile = os.path.abspath(os.path.normpath(IncludeFile)) + if IncludeFile in gIncludedAslFile: + EdkLogger.warn("Trim", "Circular include", + ExtraData= "%s -> %s" % (" -> ".join(gIncludedAslFile), IncludeFile)) + return [] + gIncludedAslFile.append(IncludeFile) + + for Line in F: + LocalSearchPath = None + Result = gAslIncludePattern.findall(Line) + if len(Result) == 0: + Result = gAslCIncludePattern.findall(Line) + if len(Result) == 0 or os.path.splitext(Result[0][1])[1].lower() not in [".asl", ".asi"]: + NewFileContent.append("%s%s" % (Indent, Line)) + continue + # + # We should first search the local directory if current file are using pattern #include "XXX" + # + if Result[0][2] == '"': + LocalSearchPath = os.path.dirname(IncludeFile) + CurrentIndent = Indent + Result[0][0] + IncludedFile = Result[0][1] + NewFileContent.extend(DoInclude(IncludedFile, CurrentIndent, IncludePathList, LocalSearchPath)) + NewFileContent.append("\n") + + gIncludedAslFile.pop() + F.close() + + return NewFileContent + + +## Trim ASL file +# +# Replace ASL include statement with the content the included file +# +# @param Source File to be trimmed +# @param Target File to store the trimmed content +# @param IncludePathFile The file to log the external include path +# +def TrimAslFile(Source, Target, IncludePathFile): + CreateDirectory(os.path.dirname(Target)) + + SourceDir = os.path.dirname(Source) + if SourceDir == '': + SourceDir = '.' + + # + # Add source directory as the first search directory + # + IncludePathList = [SourceDir] + + # + # If additional include path file is specified, append them all + # to the search directory list. + # + if IncludePathFile: + try: + LineNum = 0 + for Line in open(IncludePathFile,'r'): + LineNum += 1 + if Line.startswith("/I") or Line.startswith ("-I"): + IncludePathList.append(Line[2:].strip()) + else: + EdkLogger.warn("Trim", "Invalid include line in include list file.", IncludePathFile, LineNum) + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=IncludePathFile) + + Lines = DoInclude(Source, '', IncludePathList) + + # + # Undef MIN and MAX to avoid collision in ASL source code + # + Lines.insert(0, "#undef MIN\n#undef MAX\n") + + # save all lines trimmed + try: + f = open (Target,'w') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) + + f.writelines(Lines) + f.close() + +## Trim EDK source code file(s) +# +# +# @param Source File or directory to be trimmed +# @param Target File or directory to store the trimmed content +# +def TrimEdkSources(Source, Target): + if os.path.isdir(Source): + for CurrentDir, Dirs, Files in os.walk(Source): + if '.svn' in Dirs: + Dirs.remove('.svn') + elif "CVS" in Dirs: + Dirs.remove("CVS") + + for FileName in Files: + Dummy, Ext = os.path.splitext(FileName) + if Ext.upper() not in ['.C', '.H']: continue + if Target == None or Target == '': + TrimEdkSourceCode( + os.path.join(CurrentDir, FileName), + os.path.join(CurrentDir, FileName) + ) + else: + TrimEdkSourceCode( + os.path.join(CurrentDir, FileName), + os.path.join(Target, CurrentDir[len(Source)+1:], FileName) + ) + else: + TrimEdkSourceCode(Source, Target) + +## Trim one EDK source code file +# +# Do following replacement: +# +# (**PeiServices\).PciCfg = <*>; +# => { +# STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = { +# (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), +# &gEcpPeiPciCfgPpiGuid, +# <*> +# }; +# (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList); +# +# <*>Modify(<*>) +# => PeiLibPciCfgModify (<*>) +# +# gRT->ReportStatusCode (<*>) +# => EfiLibReportStatusCode (<*>) +# +# #include +# => #include +# +# CreateEvent (EFI_EVENT_SIGNAL_READY_TO_BOOT, <*>) +# => EfiCreateEventReadyToBoot (<*>) +# +# CreateEvent (EFI_EVENT_SIGNAL_LEGACY_BOOT, <*>) +# => EfiCreateEventLegacyBoot (<*>) +# +# @param Source File to be trimmed +# @param Target File to store the trimmed content +# +def TrimEdkSourceCode(Source, Target): + EdkLogger.verbose("\t%s -> %s" % (Source, Target)) + CreateDirectory(os.path.dirname(Target)) + + try: + f = open (Source,'rb') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source) + # read whole file + Lines = f.read() + f.close() + + NewLines = None + for Re,Repl in gImportCodePatterns: + if NewLines == None: + NewLines = Re.sub(Repl, Lines) + else: + NewLines = Re.sub(Repl, NewLines) + + # save all lines if trimmed + if Source == Target and NewLines == Lines: + return + + try: + f = open (Target,'wb') + except: + EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target) + f.write(NewLines) + f.close() + + +## Parse command line options +# +# Using standard Python module optparse to parse command line option of this tool. +# +# @retval Options A optparse.Values object containing the parsed options +# @retval InputFile Path of file to be trimmed +# +def Options(): + OptionList = [ + make_option("-s", "--source-code", dest="FileType", const="SourceCode", action="store_const", + help="The input file is preprocessed source code, including C or assembly code"), + make_option("-r", "--vfr-file", dest="FileType", const="Vfr", action="store_const", + help="The input file is preprocessed VFR file"), + make_option("-a", "--asl-file", dest="FileType", const="Asl", action="store_const", + help="The input file is ASL file"), + make_option("-8", "--Edk-source-code", dest="FileType", const="EdkSourceCode", action="store_const", + help="The input file is source code for Edk to be trimmed for ECP"), + + make_option("-c", "--convert-hex", dest="ConvertHex", action="store_true", + help="Convert standard hex format (0xabcd) to MASM format (abcdh)"), + + make_option("-l", "--trim-long", dest="TrimLong", action="store_true", + help="Remove postfix of long number"), + make_option("-i", "--include-path-file", dest="IncludePathFile", + help="The input file is include path list to search for ASL include file"), + make_option("-o", "--output", dest="OutputFile", + help="File to store the trimmed content"), + make_option("-v", "--verbose", dest="LogLevel", action="store_const", const=EdkLogger.VERBOSE, + help="Run verbosely"), + make_option("-d", "--debug", dest="LogLevel", type="int", + help="Run with debug information"), + make_option("-q", "--quiet", dest="LogLevel", action="store_const", const=EdkLogger.QUIET, + help="Run quietly"), + make_option("-?", action="help", help="show this help message and exit"), + ] + + # use clearer usage to override default usage message + UsageString = "%prog [-s|-r|-a] [-c] [-v|-d |-q] [-i ] [-o ] " + + Parser = OptionParser(description=__copyright__, version=__version__, option_list=OptionList, usage=UsageString) + Parser.set_defaults(FileType="Vfr") + Parser.set_defaults(ConvertHex=False) + Parser.set_defaults(LogLevel=EdkLogger.INFO) + + Options, Args = Parser.parse_args() + + # error check + if len(Args) == 0: + EdkLogger.error("Trim", OPTION_MISSING, ExtraData=Parser.get_usage()) + if len(Args) > 1: + EdkLogger.error("Trim", OPTION_NOT_SUPPORTED, ExtraData=Parser.get_usage()) + + InputFile = Args[0] + return Options, InputFile + +## Entrance method +# +# This method mainly dispatch specific methods per the command line options. +# If no error found, return zero value so the caller of this tool can know +# if it's executed successfully or not. +# +# @retval 0 Tool was successful +# @retval 1 Tool failed +# +def Main(): + try: + EdkLogger.Initialize() + CommandOptions, InputFile = Options() + if CommandOptions.LogLevel < EdkLogger.DEBUG_9: + EdkLogger.SetLevel(CommandOptions.LogLevel + 1) + else: + EdkLogger.SetLevel(CommandOptions.LogLevel) + except FatalError, X: + return 1 + + try: + if CommandOptions.FileType == "Vfr": + if CommandOptions.OutputFile == None: + CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' + TrimPreprocessedVfr(InputFile, CommandOptions.OutputFile) + elif CommandOptions.FileType == "Asl": + if CommandOptions.OutputFile == None: + CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' + TrimAslFile(InputFile, CommandOptions.OutputFile, CommandOptions.IncludePathFile) + elif CommandOptions.FileType == "EdkSourceCode": + TrimEdkSources(InputFile, CommandOptions.OutputFile) + else : + if CommandOptions.OutputFile == None: + CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii' + TrimPreprocessedFile(InputFile, CommandOptions.OutputFile, CommandOptions.ConvertHex, CommandOptions.TrimLong) + except FatalError, X: + import platform + import traceback + if CommandOptions != None and CommandOptions.LogLevel <= EdkLogger.DEBUG_9: + EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc()) + return 1 + except: + import traceback + import platform + EdkLogger.error( + "\nTrim", + CODE_ERROR, + "Unknown fatal error when trimming [%s]" % InputFile, + ExtraData="\n(Please send email to edk2-buildtools-devel@lists.sourceforge.net for help, attaching following call stack trace!)\n", + RaiseError=False + ) + EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc()) + return 1 + + return 0 + +if __name__ == '__main__': + r = Main() + ## 0-127 is a safe return range, and 1 is a standard default error + if r < 0 or r > 127: r = 1 + sys.exit(r) + diff --git a/BaseTools/Source/Python/UPT/BuildVersion.py b/BaseTools/Source/Python/UPT/BuildVersion.py index 1ce93dbe8b..8b86b37e30 100644 --- a/BaseTools/Source/Python/UPT/BuildVersion.py +++ b/BaseTools/Source/Python/UPT/BuildVersion.py @@ -17,4 +17,4 @@ Build version information ''' -gBUILD_VERSION = "Build 2640" +gBUILD_VERSION = "Build 2649" diff --git a/BaseTools/Source/Python/UPT/Core/__init__.py b/BaseTools/Source/Python/UPT/Core/__init__.py index 39c78e8ecf..efe9cd09b7 100644 --- a/BaseTools/Source/Python/UPT/Core/__init__.py +++ b/BaseTools/Source/Python/UPT/Core/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Core init file +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Core init file ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py b/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py index 0f6ce81579..269ba0bc48 100644 --- a/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py +++ b/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -GenMetaFile +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +GenMetaFile ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py b/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py index 91041c7a64..3b476b4c48 100644 --- a/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py +++ b/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py @@ -93,7 +93,7 @@ class _ExprBase: ## IsCurrentOp # - # @param OpList: option list + # @param OpList: option list # def IsCurrentOp(self, OpList): self.SkipWhitespace() diff --git a/BaseTools/Source/Python/UPT/Library/GlobalData.py b/BaseTools/Source/Python/UPT/Library/GlobalData.py index 3f72f22738..e47e24a714 100644 --- a/BaseTools/Source/Python/UPT/Library/GlobalData.py +++ b/BaseTools/Source/Python/UPT/Library/GlobalData.py @@ -1,99 +1,99 @@ -## @file -# This file is used to define common static strings and global data used by UPT -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -''' -GlobalData -''' - -# -# The workspace directory -# -gWORKSPACE = '.' - -# -# INF module directory -# -gINF_MODULE_DIR = "." -gINF_MODULE_NAME = '' - -# -# the directory to holds upt related files -# -gUPT_DIR = r"Conf/upt/" - -# -# Log file for invalid meta-data files during force removing -# -gINVALID_MODULE_FILE = gUPT_DIR + r"Invalid_Modules.log" - -# -# File name for content zip file in the distribution -# -gCONTENT_FILE = "dist.content" - -# -# File name for XML file in the distibution -# -gDESC_FILE = 'dist.pkg' - -# -# Case Insensitive flag -# -gCASE_INSENSITIVE = '' - -# -# All Files dictionary -# -gALL_FILES = {} - -# -# Database instance -# -gDB = None - -# -# list for files that are found in module level but not in INF files, -# items are (File, ModulePath), all these should be relative to $(WORKSPACE) -# -gMISS_FILE_IN_MODLIST = [] - -# -# Global Current Line -# -gINF_CURRENT_LINE = None - -# -# Global pkg list -# -gWSPKG_LIST = [] - -# -# Flag used to take WARN as ERROR. -# By default, only ERROR message will break the tools execution. -# -gWARNING_AS_ERROR = False - -# -# Used to specify the temp directory to hold the unpacked distribution files -# -gUNPACK_DIR = None - -# -# Flag used to mark whether the INF file is Binary INF or not. -# -gIS_BINARY_INF = False -# -# Used by Library instance parser -# {FilePath: FileObj} -# +## @file +# This file is used to define common static strings and global data used by UPT +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +''' +GlobalData +''' + +# +# The workspace directory +# +gWORKSPACE = '.' + +# +# INF module directory +# +gINF_MODULE_DIR = "." +gINF_MODULE_NAME = '' + +# +# the directory to holds upt related files +# +gUPT_DIR = r"Conf/upt/" + +# +# Log file for invalid meta-data files during force removing +# +gINVALID_MODULE_FILE = gUPT_DIR + r"Invalid_Modules.log" + +# +# File name for content zip file in the distribution +# +gCONTENT_FILE = "dist.content" + +# +# File name for XML file in the distibution +# +gDESC_FILE = 'dist.pkg' + +# +# Case Insensitive flag +# +gCASE_INSENSITIVE = '' + +# +# All Files dictionary +# +gALL_FILES = {} + +# +# Database instance +# +gDB = None + +# +# list for files that are found in module level but not in INF files, +# items are (File, ModulePath), all these should be relative to $(WORKSPACE) +# +gMISS_FILE_IN_MODLIST = [] + +# +# Global Current Line +# +gINF_CURRENT_LINE = None + +# +# Global pkg list +# +gWSPKG_LIST = [] + +# +# Flag used to take WARN as ERROR. +# By default, only ERROR message will break the tools execution. +# +gWARNING_AS_ERROR = False + +# +# Used to specify the temp directory to hold the unpacked distribution files +# +gUNPACK_DIR = None + +# +# Flag used to mark whether the INF file is Binary INF or not. +# +gIS_BINARY_INF = False +# +# Used by Library instance parser +# {FilePath: FileObj} +# gLIBINSTANCEDICT = {} \ No newline at end of file diff --git a/BaseTools/Source/Python/UPT/Library/Misc.py b/BaseTools/Source/Python/UPT/Library/Misc.py index 889b777d19..750805e328 100644 --- a/BaseTools/Source/Python/UPT/Library/Misc.py +++ b/BaseTools/Source/Python/UPT/Library/Misc.py @@ -1,974 +1,974 @@ -## @file -# Common routines used by all tools -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Misc -''' - -## -# Import Modules -# -import os.path -from os import access -from os import F_OK -from os import makedirs -from os import getcwd -from os import chdir -from os import listdir -from os import remove -from os import rmdir -from os import linesep -from os import walk -from os import environ -import re -from UserDict import IterableUserDict - -import Logger.Log as Logger -from Logger import StringTable as ST -from Logger import ToolError -from Library import GlobalData -from Library.DataType import SUP_MODULE_LIST -from Library.DataType import END_OF_LINE -from Library.DataType import TAB_SPLIT -from Library.DataType import LANGUAGE_EN_US -from Library.String import GetSplitValueList -from Library.ParserValidate import IsValidHexVersion -from Library.ParserValidate import IsValidPath -from Object.POM.CommonObject import TextObject - -## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C -# structure style -# -# @param Guid: The GUID string -# -def GuidStringToGuidStructureString(Guid): - GuidList = Guid.split('-') - Result = '{' - for Index in range(0, 3, 1): - Result = Result + '0x' + GuidList[Index] + ', ' - Result = Result + '{0x' + GuidList[3][0:2] + ', 0x' + GuidList[3][2:4] - for Index in range(0, 12, 2): - Result = Result + ', 0x' + GuidList[4][Index:Index + 2] - Result += '}}' - return Result - -## Check whether GUID string is of format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -# -# @param GuidValue: The GUID value -# -def CheckGuidRegFormat(GuidValue): - ## Regular expression used to find out register format of GUID - # - RegFormatGuidPattern = re.compile("^\s*([0-9a-fA-F]){8}-" - "([0-9a-fA-F]){4}-" - "([0-9a-fA-F]){4}-" - "([0-9a-fA-F]){4}-" - "([0-9a-fA-F]){12}\s*$") - - if RegFormatGuidPattern.match(GuidValue): - return True - else: - return False - - -## Convert GUID string in C structure style to -# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -# -# @param GuidValue: The GUID value in C structure format -# -def GuidStructureStringToGuidString(GuidValue): - GuidValueString = GuidValue.lower().replace("{", "").replace("}", "").\ - replace(" ", "").replace(";", "") - GuidValueList = GuidValueString.split(",") - if len(GuidValueList) != 11: - return '' - try: - return "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( - int(GuidValueList[0], 16), - int(GuidValueList[1], 16), - int(GuidValueList[2], 16), - int(GuidValueList[3], 16), - int(GuidValueList[4], 16), - int(GuidValueList[5], 16), - int(GuidValueList[6], 16), - int(GuidValueList[7], 16), - int(GuidValueList[8], 16), - int(GuidValueList[9], 16), - int(GuidValueList[10], 16) - ) - except BaseException: - return '' - -## Create directories -# -# @param Directory: The directory name -# -def CreateDirectory(Directory): - if Directory == None or Directory.strip() == "": - return True - try: - if not access(Directory, F_OK): - makedirs(Directory) - except BaseException: - return False - return True - -## Remove directories, including files and sub-directories in it -# -# @param Directory: The directory name -# -def RemoveDirectory(Directory, Recursively=False): - if Directory == None or Directory.strip() == "" or not \ - os.path.exists(Directory): - return - if Recursively: - CurrentDirectory = getcwd() - chdir(Directory) - for File in listdir("."): - if os.path.isdir(File): - RemoveDirectory(File, Recursively) - else: - remove(File) - chdir(CurrentDirectory) - rmdir(Directory) - -## Store content in file -# -# This method is used to save file only when its content is changed. This is -# quite useful for "make" system to decide what will be re-built and what -# won't. -# -# @param File: The path of file -# @param Content: The new content of the file -# @param IsBinaryFile: The flag indicating if the file is binary file -# or not -# -def SaveFileOnChange(File, Content, IsBinaryFile=True): - if not IsBinaryFile: - Content = Content.replace("\n", linesep) - - if os.path.exists(File): - try: - if Content == open(File, "rb").read(): - return False - except BaseException: - Logger.Error(None, ToolError.FILE_OPEN_FAILURE, ExtraData=File) - - CreateDirectory(os.path.dirname(File)) - try: - FileFd = open(File, "wb") - FileFd.write(Content) - FileFd.close() - except BaseException: - Logger.Error(None, ToolError.FILE_CREATE_FAILURE, ExtraData=File) - - return True - -## Get all files of a directory -# -# @param Root: Root dir -# @param SkipList : The files need be skipped -# -def GetFiles(Root, SkipList=None, FullPath=True): - OriPath = os.path.normpath(Root) - FileList = [] - for Root, Dirs, Files in walk(Root): - if SkipList: - for Item in SkipList: - if Item in Dirs: - Dirs.remove(Item) - for Dir in Dirs: - if Dir.startswith('.'): - Dirs.remove(Dir) - - for File in Files: - if File.startswith('.'): - continue - File = os.path.normpath(os.path.join(Root, File)) - if not FullPath: - File = File[len(OriPath) + 1:] - FileList.append(File) - - return FileList - -## Get all non-metadata files of a directory -# -# @param Root: Root Dir -# @param SkipList : List of path need be skipped -# @param FullPath: True if the returned file should be full path -# @param PrefixPath: the path that need to be added to the files found -# @return: the list of files found -# -def GetNonMetaDataFiles(Root, SkipList, FullPath, PrefixPath): - FileList = GetFiles(Root, SkipList, FullPath) - NewFileList = [] - for File in FileList: - ExtName = os.path.splitext(File)[1] - # - # skip '.dec', '.inf', '.dsc', '.fdf' files - # - if ExtName.lower() not in ['.dec', '.inf', '.dsc', '.fdf']: - NewFileList.append(os.path.normpath(os.path.join(PrefixPath, File))) - - return NewFileList - -## Check if given file exists or not -# -# @param File: File name or path to be checked -# @param Dir: The directory the file is relative to -# -def ValidFile(File, Ext=None): - File = File.replace('\\', '/') - if Ext != None: - FileExt = os.path.splitext(File)[1] - if FileExt.lower() != Ext.lower(): - return False - if not os.path.exists(File): - return False - return True - -## RealPath -# -# @param File: File name or path to be checked -# @param Dir: The directory the file is relative to -# @param OverrideDir: The override directory -# -def RealPath(File, Dir='', OverrideDir=''): - NewFile = os.path.normpath(os.path.join(Dir, File)) - NewFile = GlobalData.gALL_FILES[NewFile] - if not NewFile and OverrideDir: - NewFile = os.path.normpath(os.path.join(OverrideDir, File)) - NewFile = GlobalData.gALL_FILES[NewFile] - return NewFile - -## RealPath2 -# -# @param File: File name or path to be checked -# @param Dir: The directory the file is relative to -# @param OverrideDir: The override directory -# -def RealPath2(File, Dir='', OverrideDir=''): - if OverrideDir: - NewFile = GlobalData.gALL_FILES[os.path.normpath(os.path.join\ - (OverrideDir, File))] - if NewFile: - if OverrideDir[-1] == os.path.sep: - return NewFile[len(OverrideDir):], NewFile[0:len(OverrideDir)] - else: - return NewFile[len(OverrideDir) + 1:], \ - NewFile[0:len(OverrideDir)] - - NewFile = GlobalData.gALL_FILES[os.path.normpath(os.path.join(Dir, File))] - if NewFile: - if Dir: - if Dir[-1] == os.path.sep: - return NewFile[len(Dir):], NewFile[0:len(Dir)] - else: - return NewFile[len(Dir) + 1:], NewFile[0:len(Dir)] - else: - return NewFile, '' - - return None, None - -## A dict which can access its keys and/or values orderly -# -# The class implements a new kind of dict which its keys or values can be -# accessed in the order they are added into the dict. It guarantees the order -# by making use of an internal list to keep a copy of keys. -# -class Sdict(IterableUserDict): - ## Constructor - # - def __init__(self): - IterableUserDict.__init__(self) - self._key_list = [] - - ## [] operator - # - def __setitem__(self, Key, Value): - if Key not in self._key_list: - self._key_list.append(Key) - IterableUserDict.__setitem__(self, Key, Value) - - ## del operator - # - def __delitem__(self, Key): - self._key_list.remove(Key) - IterableUserDict.__delitem__(self, Key) - - ## used in "for k in dict" loop to ensure the correct order - # - def __iter__(self): - return self.iterkeys() - - ## len() support - # - def __len__(self): - return len(self._key_list) - - ## "in" test support - # - def __contains__(self, Key): - return Key in self._key_list - - ## indexof support - # - def index(self, Key): - return self._key_list.index(Key) - - ## insert support - # - def insert(self, Key, Newkey, Newvalue, Order): - Index = self._key_list.index(Key) - if Order == 'BEFORE': - self._key_list.insert(Index, Newkey) - IterableUserDict.__setitem__(self, Newkey, Newvalue) - elif Order == 'AFTER': - self._key_list.insert(Index + 1, Newkey) - IterableUserDict.__setitem__(self, Newkey, Newvalue) - - ## append support - # - def append(self, Sdict2): - for Key in Sdict2: - if Key not in self._key_list: - self._key_list.append(Key) - IterableUserDict.__setitem__(self, Key, Sdict2[Key]) - ## hash key - # - def has_key(self, Key): - return Key in self._key_list - - ## Empty the dict - # - def clear(self): - self._key_list = [] - IterableUserDict.clear(self) - - ## Return a copy of keys - # - def keys(self): - Keys = [] - for Key in self._key_list: - Keys.append(Key) - return Keys - - ## Return a copy of values - # - def values(self): - Values = [] - for Key in self._key_list: - Values.append(self[Key]) - return Values - - ## Return a copy of (key, value) list - # - def items(self): - Items = [] - for Key in self._key_list: - Items.append((Key, self[Key])) - return Items - - ## Iteration support - # - def iteritems(self): - return iter(self.items()) - - ## Keys interation support - # - def iterkeys(self): - return iter(self.keys()) - - ## Values interation support - # - def itervalues(self): - return iter(self.values()) - - ## Return value related to a key, and remove the (key, value) from the dict - # - def pop(self, Key, *Dv): - Value = None - if Key in self._key_list: - Value = self[Key] - self.__delitem__(Key) - elif len(Dv) != 0 : - Value = Dv[0] - return Value - - ## Return (key, value) pair, and remove the (key, value) from the dict - # - def popitem(self): - Key = self._key_list[-1] - Value = self[Key] - self.__delitem__(Key) - return Key, Value - ## update method - # - def update(self, Dict=None, **Kwargs): - if Dict != None: - for Key1, Val1 in Dict.items(): - self[Key1] = Val1 - if len(Kwargs): - for Key1, Val1 in Kwargs.items(): - self[Key1] = Val1 - -## CommonPath -# -# @param PathList: PathList -# -def CommonPath(PathList): - Path1 = min(PathList).split(os.path.sep) - Path2 = max(PathList).split(os.path.sep) - for Index in xrange(min(len(Path1), len(Path2))): - if Path1[Index] != Path2[Index]: - return os.path.sep.join(Path1[:Index]) - return os.path.sep.join(Path1) - -## PathClass -# -class PathClass(object): - def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False, - Arch='COMMON', ToolChainFamily='', Target='', TagName='', \ - ToolCode=''): - self.Arch = Arch - self.File = str(File) - if os.path.isabs(self.File): - self.Root = '' - self.AlterRoot = '' - else: - self.Root = str(Root) - self.AlterRoot = str(AlterRoot) - - # - # Remove any '.' and '..' in path - # - if self.Root: - self.Path = os.path.normpath(os.path.join(self.Root, self.File)) - self.Root = os.path.normpath(CommonPath([self.Root, self.Path])) - # - # eliminate the side-effect of 'C:' - # - if self.Root[-1] == ':': - self.Root += os.path.sep - # - # file path should not start with path separator - # - if self.Root[-1] == os.path.sep: - self.File = self.Path[len(self.Root):] - else: - self.File = self.Path[len(self.Root) + 1:] - else: - self.Path = os.path.normpath(self.File) - - self.SubDir, self.Name = os.path.split(self.File) - self.BaseName, self.Ext = os.path.splitext(self.Name) - - if self.Root: - if self.SubDir: - self.Dir = os.path.join(self.Root, self.SubDir) - else: - self.Dir = self.Root - else: - self.Dir = self.SubDir - - if IsBinary: - self.Type = Type - else: - self.Type = self.Ext.lower() - - self.IsBinary = IsBinary - self.Target = Target - self.TagName = TagName - self.ToolCode = ToolCode - self.ToolChainFamily = ToolChainFamily - - self._Key = None - - ## Convert the object of this class to a string - # - # Convert member Path of the class to a string - # - def __str__(self): - return self.Path - - ## Override __eq__ function - # - # Check whether PathClass are the same - # - def __eq__(self, Other): - if type(Other) == type(self): - return self.Path == Other.Path - else: - return self.Path == str(Other) - - ## Override __hash__ function - # - # Use Path as key in hash table - # - def __hash__(self): - return hash(self.Path) - - ## _GetFileKey - # - def _GetFileKey(self): - if self._Key == None: - self._Key = self.Path.upper() - return self._Key - ## Validate - # - def Validate(self, Type='', CaseSensitive=True): - if GlobalData.gCASE_INSENSITIVE: - CaseSensitive = False - if Type and Type.lower() != self.Type: - return ToolError.FILE_TYPE_MISMATCH, '%s (expect %s but got %s)' % \ - (self.File, Type, self.Type) - - RealFile, RealRoot = RealPath2(self.File, self.Root, self.AlterRoot) - if not RealRoot and not RealFile: - RealFile = self.File - if self.AlterRoot: - RealFile = os.path.join(self.AlterRoot, self.File) - elif self.Root: - RealFile = os.path.join(self.Root, self.File) - return ToolError.FILE_NOT_FOUND, os.path.join(self.AlterRoot, RealFile) - - ErrorCode = 0 - ErrorInfo = '' - if RealRoot != self.Root or RealFile != self.File: - if CaseSensitive and (RealFile != self.File or \ - (RealRoot != self.Root and RealRoot != \ - self.AlterRoot)): - ErrorCode = ToolError.FILE_CASE_MISMATCH - ErrorInfo = self.File + '\n\t' + RealFile + \ - " [in file system]" - - self.SubDir, self.Name = os.path.split(RealFile) - self.BaseName, self.Ext = os.path.splitext(self.Name) - if self.SubDir: - self.Dir = os.path.join(RealRoot, self.SubDir) - else: - self.Dir = RealRoot - self.File = RealFile - self.Root = RealRoot - self.Path = os.path.join(RealRoot, RealFile) - return ErrorCode, ErrorInfo - - Key = property(_GetFileKey) - -## Check environment variables -# -# Check environment variables that must be set for build. Currently they are -# -# WORKSPACE The directory all packages/platforms start from -# EDK_TOOLS_PATH The directory contains all tools needed by the build -# PATH $(EDK_TOOLS_PATH)/Bin/ must be set in PATH -# -# If any of above environment variable is not set or has error, the build -# will be broken. -# -def CheckEnvVariable(): - # - # check WORKSPACE - # - if "WORKSPACE" not in environ: - Logger.Error("UPT", - ToolError.UPT_ENVIRON_MISSING_ERROR, - ST.ERR_NOT_FOUND_ENVIRONMENT, - ExtraData="WORKSPACE") - - WorkspaceDir = os.path.normpath(environ["WORKSPACE"]) - if not os.path.exists(WorkspaceDir): - Logger.Error("UPT", - ToolError.UPT_ENVIRON_MISSING_ERROR, - ST.ERR_WORKSPACE_NOTEXIST, - ExtraData="%s" % WorkspaceDir) - elif ' ' in WorkspaceDir: - Logger.Error("UPT", - ToolError.FORMAT_NOT_SUPPORTED, - ST.ERR_SPACE_NOTALLOWED, - ExtraData=WorkspaceDir) - -## Check whether all module types are in list -# -# check whether all module types (SUP_MODULE_LIST) are in list -# -# @param ModuleList: a list of ModuleType -# -def IsAllModuleList(ModuleList): - NewModuleList = [Module.upper() for Module in ModuleList] - for Module in SUP_MODULE_LIST: - if Module not in NewModuleList: - return False - else: - return True - -## Dictionary that use comment(GenericComment, TailComment) as value, -# if a new comment which key already in the dic is inserted, then the -# comment will be merged. -# Key is (Statement, SupArch), when TailComment is added, it will ident -# according to Statement -# -class MergeCommentDict(dict): - ## []= operator - # - def __setitem__(self, Key, CommentVal): - GenericComment, TailComment = CommentVal - if Key in self: - OrigVal1, OrigVal2 = dict.__getitem__(self, Key) - Statement = Key[0] - dict.__setitem__(self, Key, (OrigVal1 + GenericComment, OrigVal2 \ - + len(Statement) * ' ' + TailComment)) - else: - dict.__setitem__(self, Key, (GenericComment, TailComment)) - - ## =[] operator - # - def __getitem__(self, Key): - return dict.__getitem__(self, Key) - - -## GenDummyHelpTextObj -# -# @retval HelpTxt: Generated dummy help text object -# -def GenDummyHelpTextObj(): - HelpTxt = TextObject() - HelpTxt.SetLang(LANGUAGE_EN_US) - HelpTxt.SetString(' ') - return HelpTxt - -## ConvertVersionToDecimal, the minor version should be within 0 - 99 -# ::= "0x" -# ::= (a-fA-F0-9){4} -# ::= (a-fA-F0-9){4} -# ::= (0-65535) ["." (0-99)] -# -# @param StringIn: The string contains version defined in INF file. -# It can be Decimal or Hex -# -def ConvertVersionToDecimal(StringIn): - if IsValidHexVersion(StringIn): - Value = int(StringIn, 16) - Major = Value >> 16 - Minor = Value & 0xFFFF - MinorStr = str(Minor) - if len(MinorStr) == 1: - MinorStr = '0' + MinorStr - return str(Major) + '.' + MinorStr - else: - if StringIn.find(TAB_SPLIT) != -1: - return StringIn - elif StringIn: - return StringIn + '.0' - else: - # - # when StringIn is '', return it directly - # - return StringIn - -## GetHelpStringByRemoveHashKey -# -# Remove hash key at the header of string and return the remain. -# -# @param String: The string need to be processed. -# -def GetHelpStringByRemoveHashKey(String): - ReturnString = '' - PattenRemoveHashKey = re.compile(r"^[#+\s]+", re.DOTALL) - String = String.strip() - if String == '': - return String - - LineList = GetSplitValueList(String, END_OF_LINE) - for Line in LineList: - ValueList = PattenRemoveHashKey.split(Line) - if len(ValueList) == 1: - ReturnString += ValueList[0] + END_OF_LINE - else: - ReturnString += ValueList[1] + END_OF_LINE - - if ReturnString.endswith('\n') and not ReturnString.endswith('\n\n') and ReturnString != '\n': - ReturnString = ReturnString[:-1] - - return ReturnString - -## ConvPathFromAbsToRel -# -# Get relative file path from absolute path. -# -# @param Path: The string contain file absolute path. -# @param Root: The string contain the parent path of Path in. -# -# -def ConvPathFromAbsToRel(Path, Root): - Path = os.path.normpath(Path) - Root = os.path.normpath(Root) - FullPath = os.path.normpath(os.path.join(Root, Path)) - - # - # If Path is absolute path. - # It should be in Root. - # - if os.path.isabs(Path): - return FullPath[FullPath.find(Root) + len(Root) + 1:] - - else: - return Path - -## ConvertPath -# -# Convert special characters to '_', '\' to '/' -# return converted path: Test!1.inf -> Test_1.inf -# -# @param Path: Path to be converted -# -def ConvertPath(Path): - RetPath = '' - for Char in Path.strip(): - if Char.isalnum() or Char in '.-_/': - RetPath = RetPath + Char - elif Char == '\\': - RetPath = RetPath + '/' - else: - RetPath = RetPath + '_' - return RetPath - -## ConvertSpec -# -# during install, convert the Spec string extract from UPD into INF allowable definition, -# the difference is period is allowed in the former (not the first letter) but not in the latter. -# return converted Spec string -# -# @param SpecStr: SpecStr to be converted -# -def ConvertSpec(SpecStr): - RetStr = '' - for Char in SpecStr: - if Char.isalnum() or Char == '_': - RetStr = RetStr + Char - else: - RetStr = RetStr + '_' - - return RetStr - - -## IsEqualList -# -# Judge two lists are identical(contain same item). -# The rule is elements in List A are in List B and elements in List B are in List A. -# -# @param ListA, ListB Lists need to be judged. -# -# @return True ListA and ListB are identical -# @return False ListA and ListB are different with each other -# -def IsEqualList(ListA, ListB): - if ListA == ListB: - return True - - for ItemA in ListA: - if not ItemA in ListB: - return False - - for ItemB in ListB: - if not ItemB in ListA: - return False - - return True - -## ConvertArchList -# -# Convert item in ArchList if the start character is lower case. -# In UDP spec, Arch is only allowed as: [A-Z]([a-zA-Z0-9])* -# -# @param ArchList The ArchList need to be converted. -# -# @return NewList The ArchList been converted. -# -def ConvertArchList(ArchList): - NewArchList = [] - if not ArchList: - return NewArchList - - if type(ArchList) == list: - for Arch in ArchList: - Arch = Arch.upper() - NewArchList.append(Arch) - elif type(ArchList) == str: - ArchList = ArchList.upper() - NewArchList.append(ArchList) - - return NewArchList - -## ProcessLineExtender -# -# Process the LineExtender of Line in LineList. -# If one line ends with a line extender, then it will be combined together with next line. -# -# @param LineList The LineList need to be processed. -# -# @return NewList The ArchList been processed. -# -def ProcessLineExtender(LineList): - NewList = [] - Count = 0 - while Count < len(LineList): - if LineList[Count].strip().endswith("\\") and Count + 1 < len(LineList): - NewList.append(LineList[Count].strip()[:-2] + LineList[Count + 1]) - Count = Count + 1 - else: - NewList.append(LineList[Count]) - - Count = Count + 1 - - return NewList - -## ProcessEdkComment -# -# Process EDK style comment in LineList: c style /* */ comment or cpp style // comment -# -# -# @param LineList The LineList need to be processed. -# -# @return LineList The LineList been processed. -# @return FirstPos Where Edk comment is first found, -1 if not found -# -def ProcessEdkComment(LineList): - FindEdkBlockComment = False - Count = 0 - StartPos = -1 - EndPos = -1 - FirstPos = -1 - - while(Count < len(LineList)): - Line = LineList[Count].strip() - if Line.startswith("/*"): - # - # handling c style comment - # - StartPos = Count - while Count < len(LineList): - Line = LineList[Count].strip() - if Line.endswith("*/"): - if (Count == StartPos) and Line.strip() == '/*/': - Count = Count + 1 - continue - EndPos = Count - FindEdkBlockComment = True - break - Count = Count + 1 - - if FindEdkBlockComment: - if FirstPos == -1: - FirstPos = StartPos - for Index in xrange(StartPos, EndPos+1): - LineList[Index] = '' - FindEdkBlockComment = False - elif Line.find("//") != -1 and not Line.startswith("#"): - # - # handling cpp style comment - # - LineList[Count] = Line.replace("//", '#') - if FirstPos == -1: - FirstPos = Count - - Count = Count + 1 - - return LineList, FirstPos - -## GetLibInstanceInfo -# -# Get the information from Library Instance INF file. -# -# @param string. A string start with # and followed by INF file path -# @param WorkSpace. The WorkSpace directory used to combined with INF file path. -# -# @return GUID, Version -def GetLibInstanceInfo(String, WorkSpace, LineNo): - - FileGuidString = "" - VerString = "" - - OrignalString = String - String = String.strip() - if not String: - return None, None - # - # Remove "#" characters at the beginning - # - String = GetHelpStringByRemoveHashKey(String) - String = String.strip() - - # - # Validate file name exist. - # - FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, String))) - if not (ValidFile(FullFileName)): - Logger.Error("InfParser", - ToolError.FORMAT_INVALID, - ST.ERR_FILELIST_EXIST % (String), - File=GlobalData.gINF_MODULE_NAME, - Line=LineNo, - ExtraData=OrignalString) - - # - # Validate file exist/format. - # - if IsValidPath(String, WorkSpace): - IsValidFileFlag = True - else: - Logger.Error("InfParser", - ToolError.FORMAT_INVALID, - ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (String), - File=GlobalData.gINF_MODULE_NAME, - Line=LineNo, - ExtraData=OrignalString) - return False - if IsValidFileFlag: - FileLinesList = [] - - try: - FInputfile = open(FullFileName, "rb", 0) - try: - FileLinesList = FInputfile.readlines() - except BaseException: - Logger.Error("InfParser", - ToolError.FILE_READ_FAILURE, - ST.ERR_FILE_OPEN_FAILURE, - File=FullFileName) - finally: - FInputfile.close() - except BaseException: - Logger.Error("InfParser", - ToolError.FILE_READ_FAILURE, - ST.ERR_FILE_OPEN_FAILURE, - File=FullFileName) - - ReFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$") - ReVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$") - - FileLinesList = ProcessLineExtender(FileLinesList) - - for Line in FileLinesList: - if ReFileGuidPattern.match(Line): - FileGuidString = Line - if ReVerStringPattern.match(Line): - VerString = Line - - if FileGuidString: - FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1] - if VerString: - VerString = GetSplitValueList(VerString, '=', 1)[1] - - return FileGuidString, VerString +## @file +# Common routines used by all tools +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Misc +''' + +## +# Import Modules +# +import os.path +from os import access +from os import F_OK +from os import makedirs +from os import getcwd +from os import chdir +from os import listdir +from os import remove +from os import rmdir +from os import linesep +from os import walk +from os import environ +import re +from UserDict import IterableUserDict + +import Logger.Log as Logger +from Logger import StringTable as ST +from Logger import ToolError +from Library import GlobalData +from Library.DataType import SUP_MODULE_LIST +from Library.DataType import END_OF_LINE +from Library.DataType import TAB_SPLIT +from Library.DataType import LANGUAGE_EN_US +from Library.String import GetSplitValueList +from Library.ParserValidate import IsValidHexVersion +from Library.ParserValidate import IsValidPath +from Object.POM.CommonObject import TextObject + +## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C +# structure style +# +# @param Guid: The GUID string +# +def GuidStringToGuidStructureString(Guid): + GuidList = Guid.split('-') + Result = '{' + for Index in range(0, 3, 1): + Result = Result + '0x' + GuidList[Index] + ', ' + Result = Result + '{0x' + GuidList[3][0:2] + ', 0x' + GuidList[3][2:4] + for Index in range(0, 12, 2): + Result = Result + ', 0x' + GuidList[4][Index:Index + 2] + Result += '}}' + return Result + +## Check whether GUID string is of format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +# +# @param GuidValue: The GUID value +# +def CheckGuidRegFormat(GuidValue): + ## Regular expression used to find out register format of GUID + # + RegFormatGuidPattern = re.compile("^\s*([0-9a-fA-F]){8}-" + "([0-9a-fA-F]){4}-" + "([0-9a-fA-F]){4}-" + "([0-9a-fA-F]){4}-" + "([0-9a-fA-F]){12}\s*$") + + if RegFormatGuidPattern.match(GuidValue): + return True + else: + return False + + +## Convert GUID string in C structure style to +# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +# +# @param GuidValue: The GUID value in C structure format +# +def GuidStructureStringToGuidString(GuidValue): + GuidValueString = GuidValue.lower().replace("{", "").replace("}", "").\ + replace(" ", "").replace(";", "") + GuidValueList = GuidValueString.split(",") + if len(GuidValueList) != 11: + return '' + try: + return "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x" % ( + int(GuidValueList[0], 16), + int(GuidValueList[1], 16), + int(GuidValueList[2], 16), + int(GuidValueList[3], 16), + int(GuidValueList[4], 16), + int(GuidValueList[5], 16), + int(GuidValueList[6], 16), + int(GuidValueList[7], 16), + int(GuidValueList[8], 16), + int(GuidValueList[9], 16), + int(GuidValueList[10], 16) + ) + except BaseException: + return '' + +## Create directories +# +# @param Directory: The directory name +# +def CreateDirectory(Directory): + if Directory == None or Directory.strip() == "": + return True + try: + if not access(Directory, F_OK): + makedirs(Directory) + except BaseException: + return False + return True + +## Remove directories, including files and sub-directories in it +# +# @param Directory: The directory name +# +def RemoveDirectory(Directory, Recursively=False): + if Directory == None or Directory.strip() == "" or not \ + os.path.exists(Directory): + return + if Recursively: + CurrentDirectory = getcwd() + chdir(Directory) + for File in listdir("."): + if os.path.isdir(File): + RemoveDirectory(File, Recursively) + else: + remove(File) + chdir(CurrentDirectory) + rmdir(Directory) + +## Store content in file +# +# This method is used to save file only when its content is changed. This is +# quite useful for "make" system to decide what will be re-built and what +# won't. +# +# @param File: The path of file +# @param Content: The new content of the file +# @param IsBinaryFile: The flag indicating if the file is binary file +# or not +# +def SaveFileOnChange(File, Content, IsBinaryFile=True): + if not IsBinaryFile: + Content = Content.replace("\n", linesep) + + if os.path.exists(File): + try: + if Content == open(File, "rb").read(): + return False + except BaseException: + Logger.Error(None, ToolError.FILE_OPEN_FAILURE, ExtraData=File) + + CreateDirectory(os.path.dirname(File)) + try: + FileFd = open(File, "wb") + FileFd.write(Content) + FileFd.close() + except BaseException: + Logger.Error(None, ToolError.FILE_CREATE_FAILURE, ExtraData=File) + + return True + +## Get all files of a directory +# +# @param Root: Root dir +# @param SkipList : The files need be skipped +# +def GetFiles(Root, SkipList=None, FullPath=True): + OriPath = os.path.normpath(Root) + FileList = [] + for Root, Dirs, Files in walk(Root): + if SkipList: + for Item in SkipList: + if Item in Dirs: + Dirs.remove(Item) + for Dir in Dirs: + if Dir.startswith('.'): + Dirs.remove(Dir) + + for File in Files: + if File.startswith('.'): + continue + File = os.path.normpath(os.path.join(Root, File)) + if not FullPath: + File = File[len(OriPath) + 1:] + FileList.append(File) + + return FileList + +## Get all non-metadata files of a directory +# +# @param Root: Root Dir +# @param SkipList : List of path need be skipped +# @param FullPath: True if the returned file should be full path +# @param PrefixPath: the path that need to be added to the files found +# @return: the list of files found +# +def GetNonMetaDataFiles(Root, SkipList, FullPath, PrefixPath): + FileList = GetFiles(Root, SkipList, FullPath) + NewFileList = [] + for File in FileList: + ExtName = os.path.splitext(File)[1] + # + # skip '.dec', '.inf', '.dsc', '.fdf' files + # + if ExtName.lower() not in ['.dec', '.inf', '.dsc', '.fdf']: + NewFileList.append(os.path.normpath(os.path.join(PrefixPath, File))) + + return NewFileList + +## Check if given file exists or not +# +# @param File: File name or path to be checked +# @param Dir: The directory the file is relative to +# +def ValidFile(File, Ext=None): + File = File.replace('\\', '/') + if Ext != None: + FileExt = os.path.splitext(File)[1] + if FileExt.lower() != Ext.lower(): + return False + if not os.path.exists(File): + return False + return True + +## RealPath +# +# @param File: File name or path to be checked +# @param Dir: The directory the file is relative to +# @param OverrideDir: The override directory +# +def RealPath(File, Dir='', OverrideDir=''): + NewFile = os.path.normpath(os.path.join(Dir, File)) + NewFile = GlobalData.gALL_FILES[NewFile] + if not NewFile and OverrideDir: + NewFile = os.path.normpath(os.path.join(OverrideDir, File)) + NewFile = GlobalData.gALL_FILES[NewFile] + return NewFile + +## RealPath2 +# +# @param File: File name or path to be checked +# @param Dir: The directory the file is relative to +# @param OverrideDir: The override directory +# +def RealPath2(File, Dir='', OverrideDir=''): + if OverrideDir: + NewFile = GlobalData.gALL_FILES[os.path.normpath(os.path.join\ + (OverrideDir, File))] + if NewFile: + if OverrideDir[-1] == os.path.sep: + return NewFile[len(OverrideDir):], NewFile[0:len(OverrideDir)] + else: + return NewFile[len(OverrideDir) + 1:], \ + NewFile[0:len(OverrideDir)] + + NewFile = GlobalData.gALL_FILES[os.path.normpath(os.path.join(Dir, File))] + if NewFile: + if Dir: + if Dir[-1] == os.path.sep: + return NewFile[len(Dir):], NewFile[0:len(Dir)] + else: + return NewFile[len(Dir) + 1:], NewFile[0:len(Dir)] + else: + return NewFile, '' + + return None, None + +## A dict which can access its keys and/or values orderly +# +# The class implements a new kind of dict which its keys or values can be +# accessed in the order they are added into the dict. It guarantees the order +# by making use of an internal list to keep a copy of keys. +# +class Sdict(IterableUserDict): + ## Constructor + # + def __init__(self): + IterableUserDict.__init__(self) + self._key_list = [] + + ## [] operator + # + def __setitem__(self, Key, Value): + if Key not in self._key_list: + self._key_list.append(Key) + IterableUserDict.__setitem__(self, Key, Value) + + ## del operator + # + def __delitem__(self, Key): + self._key_list.remove(Key) + IterableUserDict.__delitem__(self, Key) + + ## used in "for k in dict" loop to ensure the correct order + # + def __iter__(self): + return self.iterkeys() + + ## len() support + # + def __len__(self): + return len(self._key_list) + + ## "in" test support + # + def __contains__(self, Key): + return Key in self._key_list + + ## indexof support + # + def index(self, Key): + return self._key_list.index(Key) + + ## insert support + # + def insert(self, Key, Newkey, Newvalue, Order): + Index = self._key_list.index(Key) + if Order == 'BEFORE': + self._key_list.insert(Index, Newkey) + IterableUserDict.__setitem__(self, Newkey, Newvalue) + elif Order == 'AFTER': + self._key_list.insert(Index + 1, Newkey) + IterableUserDict.__setitem__(self, Newkey, Newvalue) + + ## append support + # + def append(self, Sdict2): + for Key in Sdict2: + if Key not in self._key_list: + self._key_list.append(Key) + IterableUserDict.__setitem__(self, Key, Sdict2[Key]) + ## hash key + # + def has_key(self, Key): + return Key in self._key_list + + ## Empty the dict + # + def clear(self): + self._key_list = [] + IterableUserDict.clear(self) + + ## Return a copy of keys + # + def keys(self): + Keys = [] + for Key in self._key_list: + Keys.append(Key) + return Keys + + ## Return a copy of values + # + def values(self): + Values = [] + for Key in self._key_list: + Values.append(self[Key]) + return Values + + ## Return a copy of (key, value) list + # + def items(self): + Items = [] + for Key in self._key_list: + Items.append((Key, self[Key])) + return Items + + ## Iteration support + # + def iteritems(self): + return iter(self.items()) + + ## Keys interation support + # + def iterkeys(self): + return iter(self.keys()) + + ## Values interation support + # + def itervalues(self): + return iter(self.values()) + + ## Return value related to a key, and remove the (key, value) from the dict + # + def pop(self, Key, *Dv): + Value = None + if Key in self._key_list: + Value = self[Key] + self.__delitem__(Key) + elif len(Dv) != 0 : + Value = Dv[0] + return Value + + ## Return (key, value) pair, and remove the (key, value) from the dict + # + def popitem(self): + Key = self._key_list[-1] + Value = self[Key] + self.__delitem__(Key) + return Key, Value + ## update method + # + def update(self, Dict=None, **Kwargs): + if Dict != None: + for Key1, Val1 in Dict.items(): + self[Key1] = Val1 + if len(Kwargs): + for Key1, Val1 in Kwargs.items(): + self[Key1] = Val1 + +## CommonPath +# +# @param PathList: PathList +# +def CommonPath(PathList): + Path1 = min(PathList).split(os.path.sep) + Path2 = max(PathList).split(os.path.sep) + for Index in xrange(min(len(Path1), len(Path2))): + if Path1[Index] != Path2[Index]: + return os.path.sep.join(Path1[:Index]) + return os.path.sep.join(Path1) + +## PathClass +# +class PathClass(object): + def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False, + Arch='COMMON', ToolChainFamily='', Target='', TagName='', \ + ToolCode=''): + self.Arch = Arch + self.File = str(File) + if os.path.isabs(self.File): + self.Root = '' + self.AlterRoot = '' + else: + self.Root = str(Root) + self.AlterRoot = str(AlterRoot) + + # + # Remove any '.' and '..' in path + # + if self.Root: + self.Path = os.path.normpath(os.path.join(self.Root, self.File)) + self.Root = os.path.normpath(CommonPath([self.Root, self.Path])) + # + # eliminate the side-effect of 'C:' + # + if self.Root[-1] == ':': + self.Root += os.path.sep + # + # file path should not start with path separator + # + if self.Root[-1] == os.path.sep: + self.File = self.Path[len(self.Root):] + else: + self.File = self.Path[len(self.Root) + 1:] + else: + self.Path = os.path.normpath(self.File) + + self.SubDir, self.Name = os.path.split(self.File) + self.BaseName, self.Ext = os.path.splitext(self.Name) + + if self.Root: + if self.SubDir: + self.Dir = os.path.join(self.Root, self.SubDir) + else: + self.Dir = self.Root + else: + self.Dir = self.SubDir + + if IsBinary: + self.Type = Type + else: + self.Type = self.Ext.lower() + + self.IsBinary = IsBinary + self.Target = Target + self.TagName = TagName + self.ToolCode = ToolCode + self.ToolChainFamily = ToolChainFamily + + self._Key = None + + ## Convert the object of this class to a string + # + # Convert member Path of the class to a string + # + def __str__(self): + return self.Path + + ## Override __eq__ function + # + # Check whether PathClass are the same + # + def __eq__(self, Other): + if type(Other) == type(self): + return self.Path == Other.Path + else: + return self.Path == str(Other) + + ## Override __hash__ function + # + # Use Path as key in hash table + # + def __hash__(self): + return hash(self.Path) + + ## _GetFileKey + # + def _GetFileKey(self): + if self._Key == None: + self._Key = self.Path.upper() + return self._Key + ## Validate + # + def Validate(self, Type='', CaseSensitive=True): + if GlobalData.gCASE_INSENSITIVE: + CaseSensitive = False + if Type and Type.lower() != self.Type: + return ToolError.FILE_TYPE_MISMATCH, '%s (expect %s but got %s)' % \ + (self.File, Type, self.Type) + + RealFile, RealRoot = RealPath2(self.File, self.Root, self.AlterRoot) + if not RealRoot and not RealFile: + RealFile = self.File + if self.AlterRoot: + RealFile = os.path.join(self.AlterRoot, self.File) + elif self.Root: + RealFile = os.path.join(self.Root, self.File) + return ToolError.FILE_NOT_FOUND, os.path.join(self.AlterRoot, RealFile) + + ErrorCode = 0 + ErrorInfo = '' + if RealRoot != self.Root or RealFile != self.File: + if CaseSensitive and (RealFile != self.File or \ + (RealRoot != self.Root and RealRoot != \ + self.AlterRoot)): + ErrorCode = ToolError.FILE_CASE_MISMATCH + ErrorInfo = self.File + '\n\t' + RealFile + \ + " [in file system]" + + self.SubDir, self.Name = os.path.split(RealFile) + self.BaseName, self.Ext = os.path.splitext(self.Name) + if self.SubDir: + self.Dir = os.path.join(RealRoot, self.SubDir) + else: + self.Dir = RealRoot + self.File = RealFile + self.Root = RealRoot + self.Path = os.path.join(RealRoot, RealFile) + return ErrorCode, ErrorInfo + + Key = property(_GetFileKey) + +## Check environment variables +# +# Check environment variables that must be set for build. Currently they are +# +# WORKSPACE The directory all packages/platforms start from +# EDK_TOOLS_PATH The directory contains all tools needed by the build +# PATH $(EDK_TOOLS_PATH)/Bin/ must be set in PATH +# +# If any of above environment variable is not set or has error, the build +# will be broken. +# +def CheckEnvVariable(): + # + # check WORKSPACE + # + if "WORKSPACE" not in environ: + Logger.Error("UPT", + ToolError.UPT_ENVIRON_MISSING_ERROR, + ST.ERR_NOT_FOUND_ENVIRONMENT, + ExtraData="WORKSPACE") + + WorkspaceDir = os.path.normpath(environ["WORKSPACE"]) + if not os.path.exists(WorkspaceDir): + Logger.Error("UPT", + ToolError.UPT_ENVIRON_MISSING_ERROR, + ST.ERR_WORKSPACE_NOTEXIST, + ExtraData="%s" % WorkspaceDir) + elif ' ' in WorkspaceDir: + Logger.Error("UPT", + ToolError.FORMAT_NOT_SUPPORTED, + ST.ERR_SPACE_NOTALLOWED, + ExtraData=WorkspaceDir) + +## Check whether all module types are in list +# +# check whether all module types (SUP_MODULE_LIST) are in list +# +# @param ModuleList: a list of ModuleType +# +def IsAllModuleList(ModuleList): + NewModuleList = [Module.upper() for Module in ModuleList] + for Module in SUP_MODULE_LIST: + if Module not in NewModuleList: + return False + else: + return True + +## Dictionary that use comment(GenericComment, TailComment) as value, +# if a new comment which key already in the dic is inserted, then the +# comment will be merged. +# Key is (Statement, SupArch), when TailComment is added, it will ident +# according to Statement +# +class MergeCommentDict(dict): + ## []= operator + # + def __setitem__(self, Key, CommentVal): + GenericComment, TailComment = CommentVal + if Key in self: + OrigVal1, OrigVal2 = dict.__getitem__(self, Key) + Statement = Key[0] + dict.__setitem__(self, Key, (OrigVal1 + GenericComment, OrigVal2 \ + + len(Statement) * ' ' + TailComment)) + else: + dict.__setitem__(self, Key, (GenericComment, TailComment)) + + ## =[] operator + # + def __getitem__(self, Key): + return dict.__getitem__(self, Key) + + +## GenDummyHelpTextObj +# +# @retval HelpTxt: Generated dummy help text object +# +def GenDummyHelpTextObj(): + HelpTxt = TextObject() + HelpTxt.SetLang(LANGUAGE_EN_US) + HelpTxt.SetString(' ') + return HelpTxt + +## ConvertVersionToDecimal, the minor version should be within 0 - 99 +# ::= "0x" +# ::= (a-fA-F0-9){4} +# ::= (a-fA-F0-9){4} +# ::= (0-65535) ["." (0-99)] +# +# @param StringIn: The string contains version defined in INF file. +# It can be Decimal or Hex +# +def ConvertVersionToDecimal(StringIn): + if IsValidHexVersion(StringIn): + Value = int(StringIn, 16) + Major = Value >> 16 + Minor = Value & 0xFFFF + MinorStr = str(Minor) + if len(MinorStr) == 1: + MinorStr = '0' + MinorStr + return str(Major) + '.' + MinorStr + else: + if StringIn.find(TAB_SPLIT) != -1: + return StringIn + elif StringIn: + return StringIn + '.0' + else: + # + # when StringIn is '', return it directly + # + return StringIn + +## GetHelpStringByRemoveHashKey +# +# Remove hash key at the header of string and return the remain. +# +# @param String: The string need to be processed. +# +def GetHelpStringByRemoveHashKey(String): + ReturnString = '' + PattenRemoveHashKey = re.compile(r"^[#+\s]+", re.DOTALL) + String = String.strip() + if String == '': + return String + + LineList = GetSplitValueList(String, END_OF_LINE) + for Line in LineList: + ValueList = PattenRemoveHashKey.split(Line) + if len(ValueList) == 1: + ReturnString += ValueList[0] + END_OF_LINE + else: + ReturnString += ValueList[1] + END_OF_LINE + + if ReturnString.endswith('\n') and not ReturnString.endswith('\n\n') and ReturnString != '\n': + ReturnString = ReturnString[:-1] + + return ReturnString + +## ConvPathFromAbsToRel +# +# Get relative file path from absolute path. +# +# @param Path: The string contain file absolute path. +# @param Root: The string contain the parent path of Path in. +# +# +def ConvPathFromAbsToRel(Path, Root): + Path = os.path.normpath(Path) + Root = os.path.normpath(Root) + FullPath = os.path.normpath(os.path.join(Root, Path)) + + # + # If Path is absolute path. + # It should be in Root. + # + if os.path.isabs(Path): + return FullPath[FullPath.find(Root) + len(Root) + 1:] + + else: + return Path + +## ConvertPath +# +# Convert special characters to '_', '\' to '/' +# return converted path: Test!1.inf -> Test_1.inf +# +# @param Path: Path to be converted +# +def ConvertPath(Path): + RetPath = '' + for Char in Path.strip(): + if Char.isalnum() or Char in '.-_/': + RetPath = RetPath + Char + elif Char == '\\': + RetPath = RetPath + '/' + else: + RetPath = RetPath + '_' + return RetPath + +## ConvertSpec +# +# during install, convert the Spec string extract from UPD into INF allowable definition, +# the difference is period is allowed in the former (not the first letter) but not in the latter. +# return converted Spec string +# +# @param SpecStr: SpecStr to be converted +# +def ConvertSpec(SpecStr): + RetStr = '' + for Char in SpecStr: + if Char.isalnum() or Char == '_': + RetStr = RetStr + Char + else: + RetStr = RetStr + '_' + + return RetStr + + +## IsEqualList +# +# Judge two lists are identical(contain same item). +# The rule is elements in List A are in List B and elements in List B are in List A. +# +# @param ListA, ListB Lists need to be judged. +# +# @return True ListA and ListB are identical +# @return False ListA and ListB are different with each other +# +def IsEqualList(ListA, ListB): + if ListA == ListB: + return True + + for ItemA in ListA: + if not ItemA in ListB: + return False + + for ItemB in ListB: + if not ItemB in ListA: + return False + + return True + +## ConvertArchList +# +# Convert item in ArchList if the start character is lower case. +# In UDP spec, Arch is only allowed as: [A-Z]([a-zA-Z0-9])* +# +# @param ArchList The ArchList need to be converted. +# +# @return NewList The ArchList been converted. +# +def ConvertArchList(ArchList): + NewArchList = [] + if not ArchList: + return NewArchList + + if type(ArchList) == list: + for Arch in ArchList: + Arch = Arch.upper() + NewArchList.append(Arch) + elif type(ArchList) == str: + ArchList = ArchList.upper() + NewArchList.append(ArchList) + + return NewArchList + +## ProcessLineExtender +# +# Process the LineExtender of Line in LineList. +# If one line ends with a line extender, then it will be combined together with next line. +# +# @param LineList The LineList need to be processed. +# +# @return NewList The ArchList been processed. +# +def ProcessLineExtender(LineList): + NewList = [] + Count = 0 + while Count < len(LineList): + if LineList[Count].strip().endswith("\\") and Count + 1 < len(LineList): + NewList.append(LineList[Count].strip()[:-2] + LineList[Count + 1]) + Count = Count + 1 + else: + NewList.append(LineList[Count]) + + Count = Count + 1 + + return NewList + +## ProcessEdkComment +# +# Process EDK style comment in LineList: c style /* */ comment or cpp style // comment +# +# +# @param LineList The LineList need to be processed. +# +# @return LineList The LineList been processed. +# @return FirstPos Where Edk comment is first found, -1 if not found +# +def ProcessEdkComment(LineList): + FindEdkBlockComment = False + Count = 0 + StartPos = -1 + EndPos = -1 + FirstPos = -1 + + while(Count < len(LineList)): + Line = LineList[Count].strip() + if Line.startswith("/*"): + # + # handling c style comment + # + StartPos = Count + while Count < len(LineList): + Line = LineList[Count].strip() + if Line.endswith("*/"): + if (Count == StartPos) and Line.strip() == '/*/': + Count = Count + 1 + continue + EndPos = Count + FindEdkBlockComment = True + break + Count = Count + 1 + + if FindEdkBlockComment: + if FirstPos == -1: + FirstPos = StartPos + for Index in xrange(StartPos, EndPos+1): + LineList[Index] = '' + FindEdkBlockComment = False + elif Line.find("//") != -1 and not Line.startswith("#"): + # + # handling cpp style comment + # + LineList[Count] = Line.replace("//", '#') + if FirstPos == -1: + FirstPos = Count + + Count = Count + 1 + + return LineList, FirstPos + +## GetLibInstanceInfo +# +# Get the information from Library Instance INF file. +# +# @param string. A string start with # and followed by INF file path +# @param WorkSpace. The WorkSpace directory used to combined with INF file path. +# +# @return GUID, Version +def GetLibInstanceInfo(String, WorkSpace, LineNo): + + FileGuidString = "" + VerString = "" + + OrignalString = String + String = String.strip() + if not String: + return None, None + # + # Remove "#" characters at the beginning + # + String = GetHelpStringByRemoveHashKey(String) + String = String.strip() + + # + # Validate file name exist. + # + FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, String))) + if not (ValidFile(FullFileName)): + Logger.Error("InfParser", + ToolError.FORMAT_INVALID, + ST.ERR_FILELIST_EXIST % (String), + File=GlobalData.gINF_MODULE_NAME, + Line=LineNo, + ExtraData=OrignalString) + + # + # Validate file exist/format. + # + if IsValidPath(String, WorkSpace): + IsValidFileFlag = True + else: + Logger.Error("InfParser", + ToolError.FORMAT_INVALID, + ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (String), + File=GlobalData.gINF_MODULE_NAME, + Line=LineNo, + ExtraData=OrignalString) + return False + if IsValidFileFlag: + FileLinesList = [] + + try: + FInputfile = open(FullFileName, "rb", 0) + try: + FileLinesList = FInputfile.readlines() + except BaseException: + Logger.Error("InfParser", + ToolError.FILE_READ_FAILURE, + ST.ERR_FILE_OPEN_FAILURE, + File=FullFileName) + finally: + FInputfile.close() + except BaseException: + Logger.Error("InfParser", + ToolError.FILE_READ_FAILURE, + ST.ERR_FILE_OPEN_FAILURE, + File=FullFileName) + + ReFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$") + ReVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$") + + FileLinesList = ProcessLineExtender(FileLinesList) + + for Line in FileLinesList: + if ReFileGuidPattern.match(Line): + FileGuidString = Line + if ReVerStringPattern.match(Line): + VerString = Line + + if FileGuidString: + FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1] + if VerString: + VerString = GetSplitValueList(VerString, '=', 1)[1] + + return FileGuidString, VerString diff --git a/BaseTools/Source/Python/UPT/Library/Xml/__init__.py b/BaseTools/Source/Python/UPT/Library/Xml/__init__.py index 5d268d990b..f09eece5fb 100644 --- a/BaseTools/Source/Python/UPT/Library/Xml/__init__.py +++ b/BaseTools/Source/Python/UPT/Library/Xml/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Xml +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Xml ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/UPT/Library/__init__.py b/BaseTools/Source/Python/UPT/Library/__init__.py index b265bc873c..6a98cd80a3 100644 --- a/BaseTools/Source/Python/UPT/Library/__init__.py +++ b/BaseTools/Source/Python/UPT/Library/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Library +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Library ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/UPT/Logger/Log.py b/BaseTools/Source/Python/UPT/Logger/Log.py index 0915bb7263..407a1b32b6 100644 --- a/BaseTools/Source/Python/UPT/Logger/Log.py +++ b/BaseTools/Source/Python/UPT/Logger/Log.py @@ -1,325 +1,325 @@ -## @file -# This file implements the log mechanism for Python tools. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Logger -''' - -## Import modules -from sys import argv -from sys import stdout -from sys import stderr -import os.path -from os import remove -from logging import getLogger -from logging import Formatter -from logging import StreamHandler -from logging import FileHandler -from traceback import extract_stack - -from Logger.ToolError import FatalError -from Logger.ToolError import WARNING_AS_ERROR -from Logger.ToolError import gERROR_MESSAGE -from Logger.ToolError import UNKNOWN_ERROR -from Library import GlobalData - -# -# Log level constants -# -DEBUG_0 = 1 -DEBUG_1 = 2 -DEBUG_2 = 3 -DEBUG_3 = 4 -DEBUG_4 = 5 -DEBUG_5 = 6 -DEBUG_6 = 7 -DEBUG_7 = 8 -DEBUG_8 = 9 -DEBUG_9 = 10 -VERBOSE = 15 -INFO = 20 -WARN = 30 -QUIET = 40 -QUIET_1 = 41 -ERROR = 50 -SILENT = 60 - -IS_RAISE_ERROR = True -SUPRESS_ERROR = False - -# -# Tool name -# -_TOOL_NAME = os.path.basename(argv[0]) -# -# For validation purpose -# -_LOG_LEVELS = [DEBUG_0, DEBUG_1, DEBUG_2, DEBUG_3, DEBUG_4, DEBUG_5, DEBUG_6, \ - DEBUG_7, DEBUG_8, DEBUG_9, VERBOSE, WARN, INFO, ERROR, QUIET, \ - QUIET_1, SILENT] -# -# For DEBUG level (All DEBUG_0~9 are applicable) -# -_DEBUG_LOGGER = getLogger("tool_debug") -_DEBUG_FORMATTER = Formatter("[%(asctime)s.%(msecs)d]: %(message)s", \ - datefmt="%H:%M:%S") -# -# For VERBOSE, INFO, WARN level -# -_INFO_LOGGER = getLogger("tool_info") -_INFO_FORMATTER = Formatter("%(message)s") -# -# For ERROR level -# -_ERROR_LOGGER = getLogger("tool_error") -_ERROR_FORMATTER = Formatter("%(message)s") - -# -# String templates for ERROR/WARN/DEBUG log message -# -_ERROR_MESSAGE_TEMPLATE = \ -('\n\n%(tool)s...\n%(file)s(%(line)s): error %(errorcode)04X: %(msg)s\n\t%(extra)s') - -__ERROR_MESSAGE_TEMPLATE_WITHOUT_FILE = \ -'\n\n%(tool)s...\n : error %(errorcode)04X: %(msg)s\n\t%(extra)s' - -_WARNING_MESSAGE_TEMPLATE = '%(tool)s...\n%(file)s(%(line)s): warning: %(msg)s' -_WARNING_MESSAGE_TEMPLATE_WITHOUT_FILE = '%(tool)s: : warning: %(msg)s' -_DEBUG_MESSAGE_TEMPLATE = '%(file)s(%(line)s): debug: \n %(msg)s' - - -# -# Log INFO message -# -#Info = _INFO_LOGGER.info - -def Info(msg, *args, **kwargs): - _INFO_LOGGER.info(msg, *args, **kwargs) - -# -# Log information which should be always put out -# -def Quiet(msg, *args, **kwargs): - _ERROR_LOGGER.error(msg, *args, **kwargs) - -## Log debug message -# -# @param Level DEBUG level (DEBUG0~9) -# @param Message Debug information -# @param ExtraData More information associated with "Message" -# -def Debug(Level, Message, ExtraData=None): - if _DEBUG_LOGGER.level > Level: - return - if Level > DEBUG_9: - return - # - # Find out the caller method information - # - CallerStack = extract_stack()[-2] - TemplateDict = { - "file" : CallerStack[0], - "line" : CallerStack[1], - "msg" : Message, - } - - if ExtraData != None: - LogText = _DEBUG_MESSAGE_TEMPLATE % TemplateDict + "\n %s" % ExtraData - else: - LogText = _DEBUG_MESSAGE_TEMPLATE % TemplateDict - - _DEBUG_LOGGER.log(Level, LogText) - -## Log verbose message -# -# @param Message Verbose information -# -def Verbose(Message): - return _INFO_LOGGER.log(VERBOSE, Message) - -## Log warning message -# -# Warning messages are those which might be wrong but won't fail the tool. -# -# @param ToolName The name of the tool. If not given, the name of caller -# method will be used. -# @param Message Warning information -# @param File The name of file which caused the warning. -# @param Line The line number in the "File" which caused the warning. -# @param ExtraData More information associated with "Message" -# -def Warn(ToolName, Message, File=None, Line=None, ExtraData=None): - if _INFO_LOGGER.level > WARN: - return - # - # if no tool name given, use caller's source file name as tool name - # - if ToolName == None or ToolName == "": - ToolName = os.path.basename(extract_stack()[-2][0]) - - if Line == None: - Line = "..." - else: - Line = "%d" % Line - - TemplateDict = { - "tool" : ToolName, - "file" : File, - "line" : Line, - "msg" : Message, - } - - if File != None: - LogText = _WARNING_MESSAGE_TEMPLATE % TemplateDict - else: - LogText = _WARNING_MESSAGE_TEMPLATE_WITHOUT_FILE % TemplateDict - - if ExtraData != None: - LogText += "\n %s" % ExtraData - - _INFO_LOGGER.log(WARN, LogText) - # - # Raise an execption if indicated - # - if GlobalData.gWARNING_AS_ERROR == True: - raise FatalError(WARNING_AS_ERROR) - -## Log ERROR message -# -# Once an error messages is logged, the tool's execution will be broken by -# raising an execption. If you don't want to break the execution later, you -# can give "RaiseError" with "False" value. -# -# @param ToolName The name of the tool. If not given, the name of caller -# method will be used. -# @param ErrorCode The error code -# @param Message Warning information -# @param File The name of file which caused the error. -# @param Line The line number in the "File" which caused the warning. -# @param ExtraData More information associated with "Message" -# @param RaiseError Raise an exception to break the tool's executuion if -# it's True. This is the default behavior. -# -def Error(ToolName, ErrorCode, Message=None, File=None, Line=None, \ - ExtraData=None, RaiseError=IS_RAISE_ERROR): - if ToolName: - pass - if Line == None: - Line = "..." - else: - Line = "%d" % Line - - if Message == None: - if ErrorCode in gERROR_MESSAGE: - Message = gERROR_MESSAGE[ErrorCode] - else: - Message = gERROR_MESSAGE[UNKNOWN_ERROR] - - if ExtraData == None: - ExtraData = "" - - TemplateDict = { - "tool" : _TOOL_NAME, - "file" : File, - "line" : Line, - "errorcode" : ErrorCode, - "msg" : Message, - "extra" : ExtraData - } - - if File != None: - LogText = _ERROR_MESSAGE_TEMPLATE % TemplateDict - else: - LogText = __ERROR_MESSAGE_TEMPLATE_WITHOUT_FILE % TemplateDict - - if not SUPRESS_ERROR: - _ERROR_LOGGER.log(ERROR, LogText) - if RaiseError: - raise FatalError(ErrorCode) - - -## Initialize log system -# -def Initialize(): - # - # Since we use different format to log different levels of message into - # different place (stdout or stderr), we have to use different "Logger" - # objects to do this. - # - # For DEBUG level (All DEBUG_0~9 are applicable) - _DEBUG_LOGGER.setLevel(INFO) - _DebugChannel = StreamHandler(stdout) - _DebugChannel.setFormatter(_DEBUG_FORMATTER) - _DEBUG_LOGGER.addHandler(_DebugChannel) - # - # For VERBOSE, INFO, WARN level - # - _INFO_LOGGER.setLevel(INFO) - _InfoChannel = StreamHandler(stdout) - _InfoChannel.setFormatter(_INFO_FORMATTER) - _INFO_LOGGER.addHandler(_InfoChannel) - # - # For ERROR level - # - _ERROR_LOGGER.setLevel(INFO) - _ErrorCh = StreamHandler(stderr) - _ErrorCh.setFormatter(_ERROR_FORMATTER) - _ERROR_LOGGER.addHandler(_ErrorCh) - - -## Set log level -# -# @param Level One of log level in _LogLevel -# -def SetLevel(Level): - if Level not in _LOG_LEVELS: - Info("Not supported log level (%d). Use default level instead." % \ - Level) - Level = INFO - _DEBUG_LOGGER.setLevel(Level) - _INFO_LOGGER.setLevel(Level) - _ERROR_LOGGER.setLevel(Level) - -## Get current log level -# -def GetLevel(): - return _INFO_LOGGER.getEffectiveLevel() - -## Raise up warning as error -# -def SetWarningAsError(): - GlobalData.gWARNING_AS_ERROR = True - -## Specify a file to store the log message as well as put on console -# -# @param LogFile The file path used to store the log message -# -def SetLogFile(LogFile): - if os.path.exists(LogFile): - remove(LogFile) - - _Ch = FileHandler(LogFile) - _Ch.setFormatter(_DEBUG_FORMATTER) - _DEBUG_LOGGER.addHandler(_Ch) - - _Ch = FileHandler(LogFile) - _Ch.setFormatter(_INFO_FORMATTER) - _INFO_LOGGER.addHandler(_Ch) - - _Ch = FileHandler(LogFile) - _Ch.setFormatter(_ERROR_FORMATTER) - _ERROR_LOGGER.addHandler(_Ch) - - - +## @file +# This file implements the log mechanism for Python tools. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Logger +''' + +## Import modules +from sys import argv +from sys import stdout +from sys import stderr +import os.path +from os import remove +from logging import getLogger +from logging import Formatter +from logging import StreamHandler +from logging import FileHandler +from traceback import extract_stack + +from Logger.ToolError import FatalError +from Logger.ToolError import WARNING_AS_ERROR +from Logger.ToolError import gERROR_MESSAGE +from Logger.ToolError import UNKNOWN_ERROR +from Library import GlobalData + +# +# Log level constants +# +DEBUG_0 = 1 +DEBUG_1 = 2 +DEBUG_2 = 3 +DEBUG_3 = 4 +DEBUG_4 = 5 +DEBUG_5 = 6 +DEBUG_6 = 7 +DEBUG_7 = 8 +DEBUG_8 = 9 +DEBUG_9 = 10 +VERBOSE = 15 +INFO = 20 +WARN = 30 +QUIET = 40 +QUIET_1 = 41 +ERROR = 50 +SILENT = 60 + +IS_RAISE_ERROR = True +SUPRESS_ERROR = False + +# +# Tool name +# +_TOOL_NAME = os.path.basename(argv[0]) +# +# For validation purpose +# +_LOG_LEVELS = [DEBUG_0, DEBUG_1, DEBUG_2, DEBUG_3, DEBUG_4, DEBUG_5, DEBUG_6, \ + DEBUG_7, DEBUG_8, DEBUG_9, VERBOSE, WARN, INFO, ERROR, QUIET, \ + QUIET_1, SILENT] +# +# For DEBUG level (All DEBUG_0~9 are applicable) +# +_DEBUG_LOGGER = getLogger("tool_debug") +_DEBUG_FORMATTER = Formatter("[%(asctime)s.%(msecs)d]: %(message)s", \ + datefmt="%H:%M:%S") +# +# For VERBOSE, INFO, WARN level +# +_INFO_LOGGER = getLogger("tool_info") +_INFO_FORMATTER = Formatter("%(message)s") +# +# For ERROR level +# +_ERROR_LOGGER = getLogger("tool_error") +_ERROR_FORMATTER = Formatter("%(message)s") + +# +# String templates for ERROR/WARN/DEBUG log message +# +_ERROR_MESSAGE_TEMPLATE = \ +('\n\n%(tool)s...\n%(file)s(%(line)s): error %(errorcode)04X: %(msg)s\n\t%(extra)s') + +__ERROR_MESSAGE_TEMPLATE_WITHOUT_FILE = \ +'\n\n%(tool)s...\n : error %(errorcode)04X: %(msg)s\n\t%(extra)s' + +_WARNING_MESSAGE_TEMPLATE = '%(tool)s...\n%(file)s(%(line)s): warning: %(msg)s' +_WARNING_MESSAGE_TEMPLATE_WITHOUT_FILE = '%(tool)s: : warning: %(msg)s' +_DEBUG_MESSAGE_TEMPLATE = '%(file)s(%(line)s): debug: \n %(msg)s' + + +# +# Log INFO message +# +#Info = _INFO_LOGGER.info + +def Info(msg, *args, **kwargs): + _INFO_LOGGER.info(msg, *args, **kwargs) + +# +# Log information which should be always put out +# +def Quiet(msg, *args, **kwargs): + _ERROR_LOGGER.error(msg, *args, **kwargs) + +## Log debug message +# +# @param Level DEBUG level (DEBUG0~9) +# @param Message Debug information +# @param ExtraData More information associated with "Message" +# +def Debug(Level, Message, ExtraData=None): + if _DEBUG_LOGGER.level > Level: + return + if Level > DEBUG_9: + return + # + # Find out the caller method information + # + CallerStack = extract_stack()[-2] + TemplateDict = { + "file" : CallerStack[0], + "line" : CallerStack[1], + "msg" : Message, + } + + if ExtraData != None: + LogText = _DEBUG_MESSAGE_TEMPLATE % TemplateDict + "\n %s" % ExtraData + else: + LogText = _DEBUG_MESSAGE_TEMPLATE % TemplateDict + + _DEBUG_LOGGER.log(Level, LogText) + +## Log verbose message +# +# @param Message Verbose information +# +def Verbose(Message): + return _INFO_LOGGER.log(VERBOSE, Message) + +## Log warning message +# +# Warning messages are those which might be wrong but won't fail the tool. +# +# @param ToolName The name of the tool. If not given, the name of caller +# method will be used. +# @param Message Warning information +# @param File The name of file which caused the warning. +# @param Line The line number in the "File" which caused the warning. +# @param ExtraData More information associated with "Message" +# +def Warn(ToolName, Message, File=None, Line=None, ExtraData=None): + if _INFO_LOGGER.level > WARN: + return + # + # if no tool name given, use caller's source file name as tool name + # + if ToolName == None or ToolName == "": + ToolName = os.path.basename(extract_stack()[-2][0]) + + if Line == None: + Line = "..." + else: + Line = "%d" % Line + + TemplateDict = { + "tool" : ToolName, + "file" : File, + "line" : Line, + "msg" : Message, + } + + if File != None: + LogText = _WARNING_MESSAGE_TEMPLATE % TemplateDict + else: + LogText = _WARNING_MESSAGE_TEMPLATE_WITHOUT_FILE % TemplateDict + + if ExtraData != None: + LogText += "\n %s" % ExtraData + + _INFO_LOGGER.log(WARN, LogText) + # + # Raise an execption if indicated + # + if GlobalData.gWARNING_AS_ERROR == True: + raise FatalError(WARNING_AS_ERROR) + +## Log ERROR message +# +# Once an error messages is logged, the tool's execution will be broken by +# raising an execption. If you don't want to break the execution later, you +# can give "RaiseError" with "False" value. +# +# @param ToolName The name of the tool. If not given, the name of caller +# method will be used. +# @param ErrorCode The error code +# @param Message Warning information +# @param File The name of file which caused the error. +# @param Line The line number in the "File" which caused the warning. +# @param ExtraData More information associated with "Message" +# @param RaiseError Raise an exception to break the tool's executuion if +# it's True. This is the default behavior. +# +def Error(ToolName, ErrorCode, Message=None, File=None, Line=None, \ + ExtraData=None, RaiseError=IS_RAISE_ERROR): + if ToolName: + pass + if Line == None: + Line = "..." + else: + Line = "%d" % Line + + if Message == None: + if ErrorCode in gERROR_MESSAGE: + Message = gERROR_MESSAGE[ErrorCode] + else: + Message = gERROR_MESSAGE[UNKNOWN_ERROR] + + if ExtraData == None: + ExtraData = "" + + TemplateDict = { + "tool" : _TOOL_NAME, + "file" : File, + "line" : Line, + "errorcode" : ErrorCode, + "msg" : Message, + "extra" : ExtraData + } + + if File != None: + LogText = _ERROR_MESSAGE_TEMPLATE % TemplateDict + else: + LogText = __ERROR_MESSAGE_TEMPLATE_WITHOUT_FILE % TemplateDict + + if not SUPRESS_ERROR: + _ERROR_LOGGER.log(ERROR, LogText) + if RaiseError: + raise FatalError(ErrorCode) + + +## Initialize log system +# +def Initialize(): + # + # Since we use different format to log different levels of message into + # different place (stdout or stderr), we have to use different "Logger" + # objects to do this. + # + # For DEBUG level (All DEBUG_0~9 are applicable) + _DEBUG_LOGGER.setLevel(INFO) + _DebugChannel = StreamHandler(stdout) + _DebugChannel.setFormatter(_DEBUG_FORMATTER) + _DEBUG_LOGGER.addHandler(_DebugChannel) + # + # For VERBOSE, INFO, WARN level + # + _INFO_LOGGER.setLevel(INFO) + _InfoChannel = StreamHandler(stdout) + _InfoChannel.setFormatter(_INFO_FORMATTER) + _INFO_LOGGER.addHandler(_InfoChannel) + # + # For ERROR level + # + _ERROR_LOGGER.setLevel(INFO) + _ErrorCh = StreamHandler(stderr) + _ErrorCh.setFormatter(_ERROR_FORMATTER) + _ERROR_LOGGER.addHandler(_ErrorCh) + + +## Set log level +# +# @param Level One of log level in _LogLevel +# +def SetLevel(Level): + if Level not in _LOG_LEVELS: + Info("Not supported log level (%d). Use default level instead." % \ + Level) + Level = INFO + _DEBUG_LOGGER.setLevel(Level) + _INFO_LOGGER.setLevel(Level) + _ERROR_LOGGER.setLevel(Level) + +## Get current log level +# +def GetLevel(): + return _INFO_LOGGER.getEffectiveLevel() + +## Raise up warning as error +# +def SetWarningAsError(): + GlobalData.gWARNING_AS_ERROR = True + +## Specify a file to store the log message as well as put on console +# +# @param LogFile The file path used to store the log message +# +def SetLogFile(LogFile): + if os.path.exists(LogFile): + remove(LogFile) + + _Ch = FileHandler(LogFile) + _Ch.setFormatter(_DEBUG_FORMATTER) + _DEBUG_LOGGER.addHandler(_Ch) + + _Ch = FileHandler(LogFile) + _Ch.setFormatter(_INFO_FORMATTER) + _INFO_LOGGER.addHandler(_Ch) + + _Ch = FileHandler(LogFile) + _Ch.setFormatter(_ERROR_FORMATTER) + _ERROR_LOGGER.addHandler(_Ch) + + + diff --git a/BaseTools/Source/Python/UPT/Logger/ToolError.py b/BaseTools/Source/Python/UPT/Logger/ToolError.py index 906d03337c..5065b370a3 100644 --- a/BaseTools/Source/Python/UPT/Logger/ToolError.py +++ b/BaseTools/Source/Python/UPT/Logger/ToolError.py @@ -1,177 +1,177 @@ -## @file -# Standardized Error Hanlding infrastructures. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -ToolError -''' - -import Logger.StringTable as ST - -FILE_OPEN_FAILURE = 1 -FILE_WRITE_FAILURE = 2 -FILE_PARSE_FAILURE = 3 -FILE_READ_FAILURE = 4 -FILE_CREATE_FAILURE = 5 -FILE_CHECKSUM_FAILURE = 6 -FILE_COMPRESS_FAILURE = 7 -FILE_DECOMPRESS_FAILURE = 8 -FILE_MOVE_FAILURE = 9 -FILE_DELETE_FAILURE = 10 -FILE_COPY_FAILURE = 11 -FILE_POSITIONING_FAILURE = 12 -FILE_ALREADY_EXIST = 13 -FILE_NOT_FOUND = 14 -FILE_TYPE_MISMATCH = 15 -FILE_CASE_MISMATCH = 16 -FILE_DUPLICATED = 17 -FILE_UNKNOWN_ERROR = 0x0FFF - -OPTION_UNKNOWN = 0x1000 -OPTION_MISSING = 0x1001 -OPTION_CONFLICT = 0x1002 -OPTION_VALUE_INVALID = 0x1003 -OPTION_DEPRECATED = 0x1004 -OPTION_NOT_SUPPORTED = 0x1005 -OPTION_UNKNOWN_ERROR = 0x1FFF - -PARAMETER_INVALID = 0x2000 -PARAMETER_MISSING = 0x2001 -PARAMETER_UNKNOWN_ERROR = 0x2FFF - -FORMAT_INVALID = 0x3000 -FORMAT_NOT_SUPPORTED = 0x3001 -FORMAT_UNKNOWN = 0x3002 -FORMAT_UNKNOWN_ERROR = 0x3FFF - -RESOURCE_NOT_AVAILABLE = 0x4000 -RESOURCE_ALLOCATE_FAILURE = 0x4001 -RESOURCE_FULL = 0x4002 -RESOURCE_OVERFLOW = 0x4003 -RESOURCE_UNDERRUN = 0x4004 -RESOURCE_UNKNOWN_ERROR = 0x4FFF - -ATTRIBUTE_NOT_AVAILABLE = 0x5000 -ATTRIBUTE_GET_FAILURE = 0x5001 -ATTRIBUTE_SET_FAILURE = 0x5002 -ATTRIBUTE_UPDATE_FAILURE = 0x5003 -ATTRIBUTE_ACCESS_DENIED = 0x5004 -ATTRIBUTE_RETRIEVE_FAILURE = 0x5005 -ATTRIBUTE_UNKNOWN_ERROR = 0x5FFF -ATTRIBUTE_RETRIEVE_FAILURE = 0x5F00 - -IO_NOT_READY = 0x6000 -IO_BUSY = 0x6001 -IO_TIMEOUT = 0x6002 -IO_UNKNOWN_ERROR = 0x6FFF - -COMMAND_FAILURE = 0x7000 - -CODE_ERROR = 0xC0DE - -AUTOGEN_ERROR = 0xF000 -PARSER_ERROR = 0xF001 -BUILD_ERROR = 0xF002 -GENFDS_ERROR = 0xF003 -ECC_ERROR = 0xF004 -EOT_ERROR = 0xF005 -DDC_ERROR = 0xF009 -WARNING_AS_ERROR = 0xF006 -MIGRATION_ERROR = 0xF010 -EDK1_INF_ERROR = 0xF011 -ABORT_ERROR = 0xFFFE -UNKNOWN_ERROR = 0xFFFF - -UPT_ALREADY_INSTALLED_ERROR = 0xD000 -UPT_ENVIRON_MISSING_ERROR = 0xD001 -UPT_REPKG_ERROR = 0xD002 -UPT_ALREADY_RUNNING_ERROR = 0xD003 -UPT_MUL_DEC_ERROR = 0xD004 -UPT_DB_UPDATE_ERROR = 0xD005 -UPT_INI_PARSE_ERROR = 0xE000 - -## Error message of each error code -# -gERROR_MESSAGE = { - FILE_NOT_FOUND : ST.ERR_FILE_NOT_FOUND, - FILE_OPEN_FAILURE : ST.ERR_FILE_OPEN_FAILURE, - FILE_WRITE_FAILURE : ST.ERR_FILE_WRITE_FAILURE, - FILE_PARSE_FAILURE : ST.ERR_FILE_PARSE_FAILURE, - FILE_READ_FAILURE : ST.ERR_FILE_READ_FAILURE, - FILE_CREATE_FAILURE : ST.ERR_FILE_CREATE_FAILURE, - FILE_CHECKSUM_FAILURE : ST.ERR_FILE_CHECKSUM_FAILURE, - FILE_COMPRESS_FAILURE : ST.ERR_FILE_COMPRESS_FAILURE, - FILE_DECOMPRESS_FAILURE : ST.ERR_FILE_DECOMPRESS_FAILURE, - FILE_MOVE_FAILURE : ST.ERR_FILE_MOVE_FAILURE, - FILE_DELETE_FAILURE : ST.ERR_FILE_DELETE_FAILURE, - FILE_COPY_FAILURE : ST.ERR_FILE_COPY_FAILURE, - FILE_POSITIONING_FAILURE: ST.ERR_FILE_POSITIONING_FAILURE, - FILE_ALREADY_EXIST : ST.ERR_FILE_ALREADY_EXIST, - FILE_TYPE_MISMATCH : ST.ERR_FILE_TYPE_MISMATCH , - FILE_CASE_MISMATCH : ST.ERR_FILE_CASE_MISMATCH, - FILE_DUPLICATED : ST.ERR_FILE_DUPLICATED, - FILE_UNKNOWN_ERROR : ST.ERR_FILE_UNKNOWN_ERROR, - - OPTION_UNKNOWN : ST.ERR_OPTION_UNKNOWN, - OPTION_MISSING : ST.ERR_OPTION_MISSING, - OPTION_CONFLICT : ST.ERR_OPTION_CONFLICT, - OPTION_VALUE_INVALID : ST.ERR_OPTION_VALUE_INVALID, - OPTION_DEPRECATED : ST.ERR_OPTION_DEPRECATED, - OPTION_NOT_SUPPORTED : ST.ERR_OPTION_NOT_SUPPORTED, - OPTION_UNKNOWN_ERROR : ST.ERR_OPTION_UNKNOWN_ERROR, - - PARAMETER_INVALID : ST.ERR_PARAMETER_INVALID, - PARAMETER_MISSING : ST.ERR_PARAMETER_MISSING, - PARAMETER_UNKNOWN_ERROR : ST.ERR_PARAMETER_UNKNOWN_ERROR, - - FORMAT_INVALID : ST.ERR_FORMAT_INVALID, - FORMAT_NOT_SUPPORTED : ST.ERR_FORMAT_NOT_SUPPORTED, - FORMAT_UNKNOWN : ST.ERR_FORMAT_UNKNOWN, - FORMAT_UNKNOWN_ERROR : ST.ERR_FORMAT_UNKNOWN_ERROR, - - RESOURCE_NOT_AVAILABLE : ST.ERR_RESOURCE_NOT_AVAILABLE, - RESOURCE_ALLOCATE_FAILURE : ST.ERR_RESOURCE_ALLOCATE_FAILURE, - RESOURCE_FULL : ST.ERR_RESOURCE_FULL, - RESOURCE_OVERFLOW : ST.ERR_RESOURCE_OVERFLOW, - RESOURCE_UNDERRUN : ST.ERR_RESOURCE_UNDERRUN, - RESOURCE_UNKNOWN_ERROR : ST.ERR_RESOURCE_UNKNOWN_ERROR, - - ATTRIBUTE_NOT_AVAILABLE : ST.ERR_ATTRIBUTE_NOT_AVAILABLE, - ATTRIBUTE_RETRIEVE_FAILURE : ST.ERR_ATTRIBUTE_RETRIEVE_FAILURE, - ATTRIBUTE_SET_FAILURE : ST.ERR_ATTRIBUTE_SET_FAILURE, - ATTRIBUTE_UPDATE_FAILURE: ST.ERR_ATTRIBUTE_UPDATE_FAILURE, - ATTRIBUTE_ACCESS_DENIED : ST.ERR_ATTRIBUTE_ACCESS_DENIED, - ATTRIBUTE_UNKNOWN_ERROR : ST.ERR_ATTRIBUTE_UNKNOWN_ERROR, - - COMMAND_FAILURE : ST.ERR_COMMAND_FAILURE, - - IO_NOT_READY : ST.ERR_IO_NOT_READY, - IO_BUSY : ST.ERR_IO_BUSY, - IO_TIMEOUT : ST.ERR_IO_TIMEOUT, - IO_UNKNOWN_ERROR : ST.ERR_IO_UNKNOWN_ERROR, - - UNKNOWN_ERROR : ST.ERR_UNKNOWN_ERROR, - - UPT_ALREADY_INSTALLED_ERROR : ST.ERR_UPT_ALREADY_INSTALLED_ERROR, - UPT_ENVIRON_MISSING_ERROR : ST.ERR_UPT_ENVIRON_MISSING_ERROR, - UPT_REPKG_ERROR : ST.ERR_UPT_REPKG_ERROR, - UPT_ALREADY_RUNNING_ERROR : ST.ERR_UPT_ALREADY_RUNNING_ERROR, - UPT_MUL_DEC_ERROR : ST.ERR_MUL_DEC_ERROR, - UPT_INI_PARSE_ERROR : ST.ERR_UPT_INI_PARSE_ERROR, -} - -## Exception indicating a fatal error -# -class FatalError(Exception): - pass - +## @file +# Standardized Error Hanlding infrastructures. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +ToolError +''' + +import Logger.StringTable as ST + +FILE_OPEN_FAILURE = 1 +FILE_WRITE_FAILURE = 2 +FILE_PARSE_FAILURE = 3 +FILE_READ_FAILURE = 4 +FILE_CREATE_FAILURE = 5 +FILE_CHECKSUM_FAILURE = 6 +FILE_COMPRESS_FAILURE = 7 +FILE_DECOMPRESS_FAILURE = 8 +FILE_MOVE_FAILURE = 9 +FILE_DELETE_FAILURE = 10 +FILE_COPY_FAILURE = 11 +FILE_POSITIONING_FAILURE = 12 +FILE_ALREADY_EXIST = 13 +FILE_NOT_FOUND = 14 +FILE_TYPE_MISMATCH = 15 +FILE_CASE_MISMATCH = 16 +FILE_DUPLICATED = 17 +FILE_UNKNOWN_ERROR = 0x0FFF + +OPTION_UNKNOWN = 0x1000 +OPTION_MISSING = 0x1001 +OPTION_CONFLICT = 0x1002 +OPTION_VALUE_INVALID = 0x1003 +OPTION_DEPRECATED = 0x1004 +OPTION_NOT_SUPPORTED = 0x1005 +OPTION_UNKNOWN_ERROR = 0x1FFF + +PARAMETER_INVALID = 0x2000 +PARAMETER_MISSING = 0x2001 +PARAMETER_UNKNOWN_ERROR = 0x2FFF + +FORMAT_INVALID = 0x3000 +FORMAT_NOT_SUPPORTED = 0x3001 +FORMAT_UNKNOWN = 0x3002 +FORMAT_UNKNOWN_ERROR = 0x3FFF + +RESOURCE_NOT_AVAILABLE = 0x4000 +RESOURCE_ALLOCATE_FAILURE = 0x4001 +RESOURCE_FULL = 0x4002 +RESOURCE_OVERFLOW = 0x4003 +RESOURCE_UNDERRUN = 0x4004 +RESOURCE_UNKNOWN_ERROR = 0x4FFF + +ATTRIBUTE_NOT_AVAILABLE = 0x5000 +ATTRIBUTE_GET_FAILURE = 0x5001 +ATTRIBUTE_SET_FAILURE = 0x5002 +ATTRIBUTE_UPDATE_FAILURE = 0x5003 +ATTRIBUTE_ACCESS_DENIED = 0x5004 +ATTRIBUTE_RETRIEVE_FAILURE = 0x5005 +ATTRIBUTE_UNKNOWN_ERROR = 0x5FFF +ATTRIBUTE_RETRIEVE_FAILURE = 0x5F00 + +IO_NOT_READY = 0x6000 +IO_BUSY = 0x6001 +IO_TIMEOUT = 0x6002 +IO_UNKNOWN_ERROR = 0x6FFF + +COMMAND_FAILURE = 0x7000 + +CODE_ERROR = 0xC0DE + +AUTOGEN_ERROR = 0xF000 +PARSER_ERROR = 0xF001 +BUILD_ERROR = 0xF002 +GENFDS_ERROR = 0xF003 +ECC_ERROR = 0xF004 +EOT_ERROR = 0xF005 +DDC_ERROR = 0xF009 +WARNING_AS_ERROR = 0xF006 +MIGRATION_ERROR = 0xF010 +EDK1_INF_ERROR = 0xF011 +ABORT_ERROR = 0xFFFE +UNKNOWN_ERROR = 0xFFFF + +UPT_ALREADY_INSTALLED_ERROR = 0xD000 +UPT_ENVIRON_MISSING_ERROR = 0xD001 +UPT_REPKG_ERROR = 0xD002 +UPT_ALREADY_RUNNING_ERROR = 0xD003 +UPT_MUL_DEC_ERROR = 0xD004 +UPT_DB_UPDATE_ERROR = 0xD005 +UPT_INI_PARSE_ERROR = 0xE000 + +## Error message of each error code +# +gERROR_MESSAGE = { + FILE_NOT_FOUND : ST.ERR_FILE_NOT_FOUND, + FILE_OPEN_FAILURE : ST.ERR_FILE_OPEN_FAILURE, + FILE_WRITE_FAILURE : ST.ERR_FILE_WRITE_FAILURE, + FILE_PARSE_FAILURE : ST.ERR_FILE_PARSE_FAILURE, + FILE_READ_FAILURE : ST.ERR_FILE_READ_FAILURE, + FILE_CREATE_FAILURE : ST.ERR_FILE_CREATE_FAILURE, + FILE_CHECKSUM_FAILURE : ST.ERR_FILE_CHECKSUM_FAILURE, + FILE_COMPRESS_FAILURE : ST.ERR_FILE_COMPRESS_FAILURE, + FILE_DECOMPRESS_FAILURE : ST.ERR_FILE_DECOMPRESS_FAILURE, + FILE_MOVE_FAILURE : ST.ERR_FILE_MOVE_FAILURE, + FILE_DELETE_FAILURE : ST.ERR_FILE_DELETE_FAILURE, + FILE_COPY_FAILURE : ST.ERR_FILE_COPY_FAILURE, + FILE_POSITIONING_FAILURE: ST.ERR_FILE_POSITIONING_FAILURE, + FILE_ALREADY_EXIST : ST.ERR_FILE_ALREADY_EXIST, + FILE_TYPE_MISMATCH : ST.ERR_FILE_TYPE_MISMATCH , + FILE_CASE_MISMATCH : ST.ERR_FILE_CASE_MISMATCH, + FILE_DUPLICATED : ST.ERR_FILE_DUPLICATED, + FILE_UNKNOWN_ERROR : ST.ERR_FILE_UNKNOWN_ERROR, + + OPTION_UNKNOWN : ST.ERR_OPTION_UNKNOWN, + OPTION_MISSING : ST.ERR_OPTION_MISSING, + OPTION_CONFLICT : ST.ERR_OPTION_CONFLICT, + OPTION_VALUE_INVALID : ST.ERR_OPTION_VALUE_INVALID, + OPTION_DEPRECATED : ST.ERR_OPTION_DEPRECATED, + OPTION_NOT_SUPPORTED : ST.ERR_OPTION_NOT_SUPPORTED, + OPTION_UNKNOWN_ERROR : ST.ERR_OPTION_UNKNOWN_ERROR, + + PARAMETER_INVALID : ST.ERR_PARAMETER_INVALID, + PARAMETER_MISSING : ST.ERR_PARAMETER_MISSING, + PARAMETER_UNKNOWN_ERROR : ST.ERR_PARAMETER_UNKNOWN_ERROR, + + FORMAT_INVALID : ST.ERR_FORMAT_INVALID, + FORMAT_NOT_SUPPORTED : ST.ERR_FORMAT_NOT_SUPPORTED, + FORMAT_UNKNOWN : ST.ERR_FORMAT_UNKNOWN, + FORMAT_UNKNOWN_ERROR : ST.ERR_FORMAT_UNKNOWN_ERROR, + + RESOURCE_NOT_AVAILABLE : ST.ERR_RESOURCE_NOT_AVAILABLE, + RESOURCE_ALLOCATE_FAILURE : ST.ERR_RESOURCE_ALLOCATE_FAILURE, + RESOURCE_FULL : ST.ERR_RESOURCE_FULL, + RESOURCE_OVERFLOW : ST.ERR_RESOURCE_OVERFLOW, + RESOURCE_UNDERRUN : ST.ERR_RESOURCE_UNDERRUN, + RESOURCE_UNKNOWN_ERROR : ST.ERR_RESOURCE_UNKNOWN_ERROR, + + ATTRIBUTE_NOT_AVAILABLE : ST.ERR_ATTRIBUTE_NOT_AVAILABLE, + ATTRIBUTE_RETRIEVE_FAILURE : ST.ERR_ATTRIBUTE_RETRIEVE_FAILURE, + ATTRIBUTE_SET_FAILURE : ST.ERR_ATTRIBUTE_SET_FAILURE, + ATTRIBUTE_UPDATE_FAILURE: ST.ERR_ATTRIBUTE_UPDATE_FAILURE, + ATTRIBUTE_ACCESS_DENIED : ST.ERR_ATTRIBUTE_ACCESS_DENIED, + ATTRIBUTE_UNKNOWN_ERROR : ST.ERR_ATTRIBUTE_UNKNOWN_ERROR, + + COMMAND_FAILURE : ST.ERR_COMMAND_FAILURE, + + IO_NOT_READY : ST.ERR_IO_NOT_READY, + IO_BUSY : ST.ERR_IO_BUSY, + IO_TIMEOUT : ST.ERR_IO_TIMEOUT, + IO_UNKNOWN_ERROR : ST.ERR_IO_UNKNOWN_ERROR, + + UNKNOWN_ERROR : ST.ERR_UNKNOWN_ERROR, + + UPT_ALREADY_INSTALLED_ERROR : ST.ERR_UPT_ALREADY_INSTALLED_ERROR, + UPT_ENVIRON_MISSING_ERROR : ST.ERR_UPT_ENVIRON_MISSING_ERROR, + UPT_REPKG_ERROR : ST.ERR_UPT_REPKG_ERROR, + UPT_ALREADY_RUNNING_ERROR : ST.ERR_UPT_ALREADY_RUNNING_ERROR, + UPT_MUL_DEC_ERROR : ST.ERR_MUL_DEC_ERROR, + UPT_INI_PARSE_ERROR : ST.ERR_UPT_INI_PARSE_ERROR, +} + +## Exception indicating a fatal error +# +class FatalError(Exception): + pass + diff --git a/BaseTools/Source/Python/UPT/Xml/__init__.py b/BaseTools/Source/Python/UPT/Xml/__init__.py index 5d268d990b..f09eece5fb 100644 --- a/BaseTools/Source/Python/UPT/Xml/__init__.py +++ b/BaseTools/Source/Python/UPT/Xml/__init__.py @@ -1,20 +1,20 @@ -## @file -# Python 'Library' package initialization file. -# -# This file is required to make Python interpreter treat the directory -# as containing package. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials are licensed and made available -# under the terms and conditions of the BSD License which accompanies this -# distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -''' -Xml +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Xml ''' \ No newline at end of file diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index 7a6b1be46e..bc45a66e49 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -1,1872 +1,1872 @@ -## @file -# This file is used to parse meta files -# -# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
    -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import re -import time -import copy - -import Common.EdkLogger as EdkLogger -import Common.GlobalData as GlobalData - -from CommonDataClass.DataClass import * -from Common.DataType import * -from Common.String import * -from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd -from Common.Expression import * -from CommonDataClass.Exceptions import * - -from MetaFileTable import MetaFileStorage - -## A decorator used to parse macro definition -def ParseMacro(Parser): - def MacroParser(self): - Match = gMacroDefPattern.match(self._CurrentLine) - if not Match: - # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method - Parser(self) - return - - TokenList = GetSplitValueList(self._CurrentLine[Match.end(1):], TAB_EQUAL_SPLIT, 1) - # Syntax check - if not TokenList[0]: - EdkLogger.error('Parser', FORMAT_INVALID, "No macro name given", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - if len(TokenList) < 2: - TokenList.append('') - - Type = Match.group(1) - Name, Value = TokenList - # Global macros can be only defined via environment variable - if Name in GlobalData.gGlobalDefines: - EdkLogger.error('Parser', FORMAT_INVALID, "%s can only be defined via environment variable" % Name, - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - # Only upper case letters, digit and '_' are allowed - if not gMacroNamePattern.match(Name): - EdkLogger.error('Parser', FORMAT_INVALID, "The macro name must be in the pattern [A-Z][A-Z0-9_]*", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - - Value = ReplaceMacro(Value, self._Macros) - if Type in self.DataType: - self._ItemType = self.DataType[Type] - else: - self._ItemType = MODEL_META_DATA_DEFINE - # DEFINE defined macros - if Type == TAB_DSC_DEFINES_DEFINE: - # - # First judge whether this DEFINE is in conditional directive statements or not. - # - if type(self) == DscParser and self._InDirective > -1: - pass - else: - if type(self) == DecParser: - if MODEL_META_DATA_HEADER in self._SectionType: - self._FileLocalMacros[Name] = Value - else: - self._ConstructSectionMacroDict(Name, Value) - elif self._SectionType == MODEL_META_DATA_HEADER: - self._FileLocalMacros[Name] = Value - else: - self._ConstructSectionMacroDict(Name, Value) - - # EDK_GLOBAL defined macros - elif type(self) != DscParser: - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used in .dsc file", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - elif self._SectionType != MODEL_META_DATA_HEADER: - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used under [Defines] section", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - elif (Name in self._FileLocalMacros) and (self._FileLocalMacros[Name] != Value): - EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL defined a macro with the same name and different value as one defined by 'DEFINE'", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - - self._ValueList = [Type, Name, Value] - - return MacroParser - -## Base class of parser -# -# This class is used for derivation purpose. The specific parser for one kind -# type file must derive this class and implement some public interfaces. -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# @param Owner Owner ID (for sub-section parsing) -# @param From ID from which the data comes (for !INCLUDE directive) -# -class MetaFileParser(object): - # data type (file content) for specific file type - DataType = {} - - # Parser objects used to implement singleton - MetaFiles = {} - - ## Factory method - # - # One file, one parser object. This factory method makes sure that there's - # only one object constructed for one meta file. - # - # @param Class class object of real AutoGen class - # (InfParser, DecParser or DscParser) - # @param FilePath The path of meta file - # @param *args The specific class related parameters - # @param **kwargs The specific class related dict parameters - # - def __new__(Class, FilePath, *args, **kwargs): - if FilePath in Class.MetaFiles: - return Class.MetaFiles[FilePath] - else: - ParserObject = super(MetaFileParser, Class).__new__(Class) - Class.MetaFiles[FilePath] = ParserObject - return ParserObject - - ## Constructor of MetaFileParser - # - # Initialize object of MetaFileParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # @param Owner Owner ID (for sub-section parsing) - # @param From ID from which the data comes (for !INCLUDE directive) - # - def __init__(self, FilePath, FileType, Table, Owner= -1, From= -1): - self._Table = Table - self._RawTable = Table - self._FileType = FileType - self.MetaFile = FilePath - self._FileDir = self.MetaFile.Dir - self._Defines = {} - self._FileLocalMacros = {} - self._SectionsMacroDict = {} - - # for recursive parsing - self._Owner = [Owner] - self._From = From - - # parsr status for parsing - self._ValueList = ['', '', '', '', ''] - self._Scope = [] - self._LineIndex = 0 - self._CurrentLine = '' - self._SectionType = MODEL_UNKNOWN - self._SectionName = '' - self._InSubsection = False - self._SubsectionType = MODEL_UNKNOWN - self._SubsectionName = '' - self._ItemType = MODEL_UNKNOWN - self._LastItem = -1 - self._Enabled = 0 - self._Finished = False - self._PostProcessed = False - # Different version of meta-file has different way to parse. - self._Version = 0 - - ## Store the parsed data in table - def _Store(self, *Args): - return self._Table.Insert(*Args) - - ## Virtual method for starting parse - def Start(self): - raise NotImplementedError - - ## Notify a post-process is needed - def DoPostProcess(self): - self._PostProcessed = False - - ## Set parsing complete flag in both class and table - def _Done(self): - self._Finished = True - ## Do not set end flag when processing included files - if self._From == -1: - self._Table.SetEndFlag() - - def _PostProcess(self): - self._PostProcessed = True - - ## Get the parse complete flag - def _GetFinished(self): - return self._Finished - - ## Set the complete flag - def _SetFinished(self, Value): - self._Finished = Value - - ## Use [] style to query data in table, just for readability - # - # DataInfo = [data_type, scope1(arch), scope2(platform/moduletype)] - # - def __getitem__(self, DataInfo): - if type(DataInfo) != type(()): - DataInfo = (DataInfo,) - - # Parse the file first, if necessary - if not self._Finished: - if self._RawTable.IsIntegrity(): - self._Finished = True - else: - self._Table = self._RawTable - self._PostProcessed = False - self.Start() - - # No specific ARCH or Platform given, use raw data - if self._RawTable and (len(DataInfo) == 1 or DataInfo[1] == None): - return self._RawTable.Query(*DataInfo) - - # Do post-process if necessary - if not self._PostProcessed: - self._PostProcess() - - return self._Table.Query(*DataInfo) - - ## Data parser for the common format in different type of file - # - # The common format in the meatfile is like - # - # xxx1 | xxx2 | xxx3 - # - @ParseMacro - def _CommonParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - - ## Data parser for the format in which there's path - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _PathParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - # Don't do macro replacement for dsc file at this point - if type(self) != DscParser: - Macros = self._Macros - self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] - - ## Skip unsupported data - def _Skip(self): - EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile, - Line=self._LineIndex + 1, ExtraData=self._CurrentLine); - self._ValueList[0:1] = [self._CurrentLine] - - ## Section header parser - # - # The section header is always in following format: - # - # [section_name.arch<.platform|module_type>] - # - def _SectionHeaderParser(self): - self._Scope = [] - self._SectionName = '' - ArchList = set() - for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): - if Item == '': - continue - ItemList = GetSplitValueList(Item, TAB_SPLIT,2) - # different section should not mix in one section - if self._SectionName != '' and self._SectionName != ItemList[0].upper(): - EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section", - File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) - self._SectionName = ItemList[0].upper() - if self._SectionName in self.DataType: - self._SectionType = self.DataType[self._SectionName] - # Check if the section name is valid - if self._SectionName not in SECTIONS_HAVE_ITEM_AFTER_ARCH and len(ItemList) > 3: - EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, - self.MetaFile, self._LineIndex + 1, self._CurrentLine) - elif self._Version >= 0x00010005: - EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, - self.MetaFile, self._LineIndex + 1, self._CurrentLine) - else: - self._SectionType = MODEL_UNKNOWN - - # S1 is always Arch - if len(ItemList) > 1: - S1 = ItemList[1].upper() - else: - S1 = 'COMMON' - ArchList.add(S1) - - # S2 may be Platform or ModuleType - if len(ItemList) > 2: - if self._SectionName.upper() in SECTIONS_HAVE_ITEM_PCD: - S2 = ItemList[2] - else: - S2 = ItemList[2].upper() - else: - S2 = 'COMMON' - self._Scope.append([S1, S2]) - - # 'COMMON' must not be used with specific ARCHs at the same section - if 'COMMON' in ArchList and len(ArchList) > 1: - EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", - File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) - # If the section information is needed later, it should be stored in database - self._ValueList[0] = self._SectionName - - ## [defines] section parser - @ParseMacro - def _DefineParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[1:len(TokenList)] = TokenList - if not self._ValueList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - if not self._ValueList[2]: - EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - - self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] - Name, Value = self._ValueList[1], self._ValueList[2] - # Sometimes, we need to make differences between EDK and EDK2 modules - if Name == 'INF_VERSION': - try: - self._Version = int(Value, 0) - except: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - - if type(self) == InfParser and self._Version < 0x00010005: - # EDK module allows using defines as macros - self._FileLocalMacros[Name] = Value - self._Defines[Name] = Value - - ## [BuildOptions] section parser - @ParseMacro - def _BuildOptionParser(self): - self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True) - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - TokenList2 = GetSplitValueList(TokenList[0], ':', 1) - if len(TokenList2) == 2: - self._ValueList[0] = TokenList2[0] # toolchain family - self._ValueList[1] = TokenList2[1] # keys - else: - self._ValueList[1] = TokenList[0] - if len(TokenList) == 2 and type(self) != DscParser: # value - self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros) - - if self._ValueList[1].count('_') != 4: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "'%s' must be in format of ____FLAGS" % self._ValueList[1], - ExtraData=self._CurrentLine, - File=self.MetaFile, - Line=self._LineIndex + 1 - ) - - def _GetMacros(self): - Macros = {} - Macros.update(self._FileLocalMacros) - Macros.update(self._GetApplicableSectionMacro()) - return Macros - - ## Construct section Macro dict - def _ConstructSectionMacroDict(self, Name, Value): - ScopeKey = [(Scope[0], Scope[1]) for Scope in self._Scope] - ScopeKey = tuple(ScopeKey) - SectionDictKey = self._SectionType, ScopeKey - # - # DecParser SectionType is a list, will contain more than one item only in Pcd Section - # As Pcd section macro usage is not alllowed, so here it is safe - # - if type(self) == DecParser: - SectionDictKey = self._SectionType[0], ScopeKey - if SectionDictKey not in self._SectionsMacroDict: - self._SectionsMacroDict[SectionDictKey] = {} - SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] - SectionLocalMacros[Name] = Value - - ## Get section Macros that are applicable to current line, which may come from other sections - ## that share the same name while scope is wider - def _GetApplicableSectionMacro(self): - Macros = {} - - ComComMacroDict = {} - ComSpeMacroDict = {} - SpeSpeMacroDict = {} - - ActiveSectionType = self._SectionType - if type(self) == DecParser: - ActiveSectionType = self._SectionType[0] - - for (SectionType, Scope) in self._SectionsMacroDict: - if SectionType != ActiveSectionType: - continue - - for ActiveScope in self._Scope: - Scope0, Scope1 = ActiveScope[0], ActiveScope[1] - if(Scope0, Scope1) not in Scope: - break - else: - SpeSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) - - for ActiveScope in self._Scope: - Scope0, Scope1 = ActiveScope[0], ActiveScope[1] - if(Scope0, Scope1) not in Scope and (Scope0, "COMMON") not in Scope and ("COMMON", Scope1) not in Scope: - break - else: - ComSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) - - if ("COMMON", "COMMON") in Scope: - ComComMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) - - Macros.update(ComComMacroDict) - Macros.update(ComSpeMacroDict) - Macros.update(SpeSpeMacroDict) - - return Macros - - _SectionParser = {} - Finished = property(_GetFinished, _SetFinished) - _Macros = property(_GetMacros) - - -## INF file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# -class InfParser(MetaFileParser): - # INF file supported data types (one type per section) - DataType = { - TAB_UNKNOWN.upper() : MODEL_UNKNOWN, - TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE, - TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE, - TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX, - TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC, - TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_DEPEX.upper() : MODEL_EFI_DEPEX, - TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE, - TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION - } - - ## Constructor of InfParser - # - # Initialize object of InfParser - # - # @param FilePath The path of module description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # - def __init__(self, FilePath, FileType, Table): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table) - self.PcdsDict = {} - - ## Parser starter - def Start(self): - NmakeLine = '' - Content = '' - try: - Content = open(str(self.MetaFile), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - - # parse the file line by line - IsFindBlockComment = False - GetHeaderComment = False - TailComments = [] - SectionComments = [] - Comments = [] - - for Index in range(0, len(Content)): - # skip empty, commented, block commented lines - Line, Comment = CleanString2(Content[Index], AllowCppStyleComment=True) - NextLine = '' - if Index + 1 < len(Content): - NextLine, NextComment = CleanString2(Content[Index + 1]) - if Line == '': - if Comment: - Comments.append((Comment, Index + 1)) - elif GetHeaderComment: - SectionComments.extend(Comments) - Comments = [] - continue - if Line.find(DataType.TAB_COMMENT_EDK_START) > -1: - IsFindBlockComment = True - continue - if Line.find(DataType.TAB_COMMENT_EDK_END) > -1: - IsFindBlockComment = False - continue - if IsFindBlockComment: - continue - - self._LineIndex = Index - self._CurrentLine = Line - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - if not GetHeaderComment: - for Cmt, LNo in Comments: - self._Store(MODEL_META_DATA_HEADER_COMMENT, Cmt, '', '', 'COMMON', - 'COMMON', self._Owner[-1], LNo, -1, LNo, -1, 0) - GetHeaderComment = True - else: - TailComments.extend(SectionComments + Comments) - Comments = [] - self._SectionHeaderParser() - # Check invalid sections - if self._Version < 0x00010005: - if self._SectionType in [MODEL_META_DATA_BUILD_OPTION, - MODEL_EFI_LIBRARY_CLASS, - MODEL_META_DATA_PACKAGE, - MODEL_PCD_FIXED_AT_BUILD, - MODEL_PCD_PATCHABLE_IN_MODULE, - MODEL_PCD_FEATURE_FLAG, - MODEL_PCD_DYNAMIC_EX, - MODEL_PCD_DYNAMIC, - MODEL_EFI_GUID, - MODEL_EFI_PROTOCOL, - MODEL_EFI_PPI, - MODEL_META_DATA_USER_EXTENSION]: - EdkLogger.error('Parser', FORMAT_INVALID, - "Section [%s] is not allowed in inf file without version" % (self._SectionName), - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - elif self._SectionType in [MODEL_EFI_INCLUDE, - MODEL_EFI_LIBRARY_INSTANCE, - MODEL_META_DATA_NMAKE]: - EdkLogger.error('Parser', FORMAT_INVALID, - "Section [%s] is not allowed in inf file with version 0x%08x" % (self._SectionName, self._Version), - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - continue - # merge two lines specified by '\' in section NMAKE - elif self._SectionType == MODEL_META_DATA_NMAKE: - if Line[-1] == '\\': - if NextLine == '': - self._CurrentLine = NmakeLine + Line[0:-1] - NmakeLine = '' - else: - if NextLine[0] == TAB_SECTION_START and NextLine[-1] == TAB_SECTION_END: - self._CurrentLine = NmakeLine + Line[0:-1] - NmakeLine = '' - else: - NmakeLine = NmakeLine + ' ' + Line[0:-1] - continue - else: - self._CurrentLine = NmakeLine + Line - NmakeLine = '' - - # section content - self._ValueList = ['', '', ''] - # parse current line, result will be put in self._ValueList - self._SectionParser[self._SectionType](self) - if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: - self._ItemType = -1 - Comments = [] - continue - if Comment: - Comments.append((Comment, Index + 1)) - # - # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - for Arch, Platform in self._Scope: - LastItem = self._Store(self._SectionType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - Platform, - self._Owner[-1], - self._LineIndex + 1, - - 1, - self._LineIndex + 1, - - 1, - 0 - ) - for Comment, LineNo in Comments: - self._Store(MODEL_META_DATA_COMMENT, Comment, '', '', Arch, Platform, - LastItem, LineNo, -1, LineNo, -1, 0) - Comments = [] - SectionComments = [] - TailComments.extend(SectionComments + Comments) - if IsFindBlockComment: - EdkLogger.error("Parser", FORMAT_INVALID, "Open block comments (starting with /*) are expected to end with */", - File=self.MetaFile) - - # If there are tail comments in INF file, save to database whatever the comments are - for Comment in TailComments: - self._Store(MODEL_META_DATA_TAIL_COMMENT, Comment[0], '', '', 'COMMON', - 'COMMON', self._Owner[-1], -1, -1, -1, -1, 0) - self._Done() - - ## Data parser for the format in which there's path - # - # Only path can have macro used. So we need to replace them before use. - # - def _IncludeParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - Macros = self._Macros - if Macros: - for Index in range(0, len(self._ValueList)): - Value = self._ValueList[Index] - if not Value: - continue - - if Value.upper().find('$(EFI_SOURCE)\Edk'.upper()) > -1 or Value.upper().find('$(EFI_SOURCE)/Edk'.upper()) > -1: - Value = '$(EDK_SOURCE)' + Value[17:] - if Value.find('$(EFI_SOURCE)') > -1 or Value.find('$(EDK_SOURCE)') > -1: - pass - elif Value.startswith('.'): - pass - elif Value.startswith('$('): - pass - else: - Value = '$(EFI_SOURCE)/' + Value - - self._ValueList[Index] = ReplaceMacro(Value, Macros) - - ## Parse [Sources] section - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _SourceFileParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - self._ValueList[0:len(TokenList)] = TokenList - Macros = self._Macros - # For Acpi tables, remove macro like ' TABLE_NAME=Sata1' - if 'COMPONENT_TYPE' in Macros: - if self._Defines['COMPONENT_TYPE'].upper() == 'ACPITABLE': - self._ValueList[0] = GetSplitValueList(self._ValueList[0], ' ', 1)[0] - if self._Defines['BASE_NAME'] == 'Microcode': - pass - self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] - - ## Parse [Binaries] section - # - # Only path can have macro used. So we need to replace them before use. - # - @ParseMacro - def _BinaryFileParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 2) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No file type or path specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex + 1) - if not TokenList[0]: - EdkLogger.error('Parser', FORMAT_INVALID, "No file type specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex + 1) - if not TokenList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No file path specified", - ExtraData=self._CurrentLine + " ( | [| ])", - File=self.MetaFile, Line=self._LineIndex + 1) - self._ValueList[0:len(TokenList)] = TokenList - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) - - ## [nmake] section parser (Edk.x style only) - def _NmakeParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[0:len(TokenList)] = TokenList - # remove macros - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) - # remove self-reference in macro setting - #self._ValueList[1] = ReplaceMacro(self._ValueList[1], {self._ValueList[0]:''}) - - ## [FixedPcd], [FeaturePcd], [PatchPcd], [Pcd] and [PcdEx] sections parser - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - ValueList = GetSplitValueList(TokenList[0], TAB_SPLIT) - if len(ValueList) != 2: - EdkLogger.error('Parser', FORMAT_INVALID, "Illegal token space GUID and PCD name format", - ExtraData=self._CurrentLine + " (.)", - File=self.MetaFile, Line=self._LineIndex + 1) - self._ValueList[0:1] = ValueList - if len(TokenList) > 1: - self._ValueList[2] = TokenList[1] - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + " (.)", - File=self.MetaFile, Line=self._LineIndex + 1) - - # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. - if self._ValueList[2] != '': - InfPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) - if InfPcdValueList[0] in ['True', 'true', 'TRUE']: - self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1); - elif InfPcdValueList[0] in ['False', 'false', 'FALSE']: - self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1); - if (self._ValueList[0], self._ValueList[1]) not in self.PcdsDict: - self.PcdsDict[self._ValueList[0], self._ValueList[1]] = self._SectionType - elif self.PcdsDict[self._ValueList[0], self._ValueList[1]] != self._SectionType: - EdkLogger.error('Parser', FORMAT_INVALID, "It is not permissible to list a specified PCD in different PCD type sections.", - ExtraData=self._CurrentLine + " (.)", - File=self.MetaFile, Line=self._LineIndex + 1) - - ## [depex] section parser - @ParseMacro - def _DepexParser(self): - self._ValueList[0:1] = [self._CurrentLine] - - _SectionParser = { - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, - MODEL_META_DATA_BUILD_OPTION : MetaFileParser._BuildOptionParser, - MODEL_EFI_INCLUDE : _IncludeParser, # for Edk.x modules - MODEL_EFI_LIBRARY_INSTANCE : MetaFileParser._CommonParser, # for Edk.x modules - MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, - MODEL_META_DATA_PACKAGE : MetaFileParser._PathParser, - MODEL_META_DATA_NMAKE : _NmakeParser, # for Edk.x modules - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC_EX : _PcdParser, - MODEL_PCD_DYNAMIC : _PcdParser, - MODEL_EFI_SOURCE_FILE : _SourceFileParser, - MODEL_EFI_GUID : MetaFileParser._CommonParser, - MODEL_EFI_PROTOCOL : MetaFileParser._CommonParser, - MODEL_EFI_PPI : MetaFileParser._CommonParser, - MODEL_EFI_DEPEX : _DepexParser, - MODEL_EFI_BINARY_FILE : _BinaryFileParser, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - } - -## DSC file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# @param Owner Owner ID (for sub-section parsing) -# @param From ID from which the data comes (for !INCLUDE directive) -# -class DscParser(MetaFileParser): - # DSC file supported data types (one type per section) - DataType = { - TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID, - TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, - TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_PCDS_DYNAMIC_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_DEFAULT, - TAB_PCDS_DYNAMIC_HII_NULL.upper() : MODEL_PCD_DYNAMIC_HII, - TAB_PCDS_DYNAMIC_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_VPD, - TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_EX_DEFAULT, - TAB_PCDS_DYNAMIC_EX_HII_NULL.upper() : MODEL_PCD_DYNAMIC_EX_HII, - TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_EX_VPD, - TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT, - TAB_COMPONENTS_SOURCE_OVERRIDE_PATH.upper() : MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, - TAB_DSC_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_DSC_DEFINES_EDKGLOBAL : MODEL_META_DATA_GLOBAL_DEFINE, - TAB_INCLUDE.upper() : MODEL_META_DATA_INCLUDE, - TAB_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - TAB_IF_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - TAB_IF_N_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF, - TAB_ELSE_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF, - TAB_ELSE.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, - TAB_END_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF, - } - - # Valid names in define section - DefineKeywords = [ - "DSC_SPECIFICATION", - "PLATFORM_NAME", - "PLATFORM_GUID", - "PLATFORM_VERSION", - "SKUID_IDENTIFIER", - "PCD_INFO_GENERATION", - "SUPPORTED_ARCHITECTURES", - "BUILD_TARGETS", - "OUTPUT_DIRECTORY", - "FLASH_DEFINITION", - "BUILD_NUMBER", - "RFC_LANGUAGES", - "ISO_LANGUAGES", - "TIME_STAMP_FILE", - "VPD_TOOL_GUID", - "FIX_LOAD_TOP_MEMORY_ADDRESS" - ] - - SymbolPattern = ValueExpression.SymbolPattern - - ## Constructor of DscParser - # - # Initialize object of DscParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # @param Owner Owner ID (for sub-section parsing) - # @param From ID from which the data comes (for !INCLUDE directive) - # - def __init__(self, FilePath, FileType, Table, Owner= -1, From= -1): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table, Owner, From) - self._Version = 0x00010005 # Only EDK2 dsc file is supported - # to store conditional directive evaluation result - self._DirectiveStack = [] - self._DirectiveEvalStack = [] - self._Enabled = 1 - - # - # Specify whether current line is in uncertain condition - # - self._InDirective = -1 - - # Final valid replacable symbols - self._Symbols = {} - # - # Map the ID between the original table and new table to track - # the owner item - # - self._IdMapping = {-1:-1} - - ## Parser starter - def Start(self): - Content = '' - try: - Content = open(str(self.MetaFile), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - - OwnerId = {} - for Index in range(0, len(Content)): - Line = CleanString(Content[Index]) - # skip empty line - if Line == '': - continue - - self._CurrentLine = Line - self._LineIndex = Index - if self._InSubsection and self._Owner[-1] == -1: - self._Owner.append(self._LastItem) - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - self._SectionType = MODEL_META_DATA_SECTION_HEADER - # subsection ending - elif Line[0] == '}' and self._InSubsection: - self._InSubsection = False - self._SubsectionType = MODEL_UNKNOWN - self._SubsectionName = '' - self._Owner[-1] = -1 - OwnerId = {} - continue - # subsection header - elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END: - self._SubsectionType = MODEL_META_DATA_SUBSECTION_HEADER - # directive line - elif Line[0] == '!': - self._DirectiveParser() - continue - - if self._InSubsection: - SectionType = self._SubsectionType - else: - SectionType = self._SectionType - self._ItemType = SectionType - - self._ValueList = ['', '', ''] - self._SectionParser[SectionType](self) - if self._ValueList == None: - continue - # - # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - for Arch, ModuleType in self._Scope: - Owner = self._Owner[-1] - if self._SubsectionType != MODEL_UNKNOWN: - Owner = OwnerId[Arch] - self._LastItem = self._Store( - self._ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - ModuleType, - Owner, - self._From, - self._LineIndex + 1, - - 1, - self._LineIndex + 1, - - 1, - self._Enabled - ) - if self._SubsectionType == MODEL_UNKNOWN and self._InSubsection: - OwnerId[Arch] = self._LastItem - - if self._DirectiveStack: - Type, Line, Text = self._DirectiveStack[-1] - EdkLogger.error('Parser', FORMAT_INVALID, "No matching '!endif' found", - ExtraData=Text, File=self.MetaFile, Line=Line) - self._Done() - - ## parser - def _SubsectionHeaderParser(self): - self._SubsectionName = self._CurrentLine[1:-1].upper() - if self._SubsectionName in self.DataType: - self._SubsectionType = self.DataType[self._SubsectionName] - else: - self._SubsectionType = MODEL_UNKNOWN - EdkLogger.warn("Parser", "Unrecognized sub-section", File=self.MetaFile, - Line=self._LineIndex + 1, ExtraData=self._CurrentLine) - self._ValueList[0] = self._SubsectionName - - ## Directive statement parser - def _DirectiveParser(self): - self._ValueList = ['', '', ''] - TokenList = GetSplitValueList(self._CurrentLine, ' ', 1) - self._ValueList[0:len(TokenList)] = TokenList - - # Syntax check - DirectiveName = self._ValueList[0].upper() - if DirectiveName not in self.DataType: - EdkLogger.error("Parser", FORMAT_INVALID, "Unknown directive [%s]" % DirectiveName, - File=self.MetaFile, Line=self._LineIndex + 1) - - if DirectiveName in ['!IF', '!IFDEF', '!IFNDEF']: - self._InDirective += 1 - - if DirectiveName in ['!ENDIF']: - self._InDirective -= 1 - - if DirectiveName in ['!IF', '!IFDEF', '!INCLUDE', '!IFNDEF', '!ELSEIF'] and self._ValueList[1] == '': - EdkLogger.error("Parser", FORMAT_INVALID, "Missing expression", - File=self.MetaFile, Line=self._LineIndex + 1, - ExtraData=self._CurrentLine) - - ItemType = self.DataType[DirectiveName] - Scope = [['COMMON', 'COMMON']] - if ItemType == MODEL_META_DATA_INCLUDE: - Scope = self._Scope - if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: - # Remove all directives between !if and !endif, including themselves - while self._DirectiveStack: - # Remove any !else or !elseif - DirectiveInfo = self._DirectiveStack.pop() - if DirectiveInfo[0] in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - break - else: - EdkLogger.error("Parser", FORMAT_INVALID, "Redundant '!endif'", - File=self.MetaFile, Line=self._LineIndex + 1, - ExtraData=self._CurrentLine) - elif ItemType != MODEL_META_DATA_INCLUDE: - # Break if there's a !else is followed by a !elseif - if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF and \ - self._DirectiveStack and \ - self._DirectiveStack[-1][0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: - EdkLogger.error("Parser", FORMAT_INVALID, "'!elseif' after '!else'", - File=self.MetaFile, Line=self._LineIndex + 1, - ExtraData=self._CurrentLine) - self._DirectiveStack.append((ItemType, self._LineIndex + 1, self._CurrentLine)) - elif self._From > 0: - EdkLogger.error('Parser', FORMAT_INVALID, - "No '!include' allowed in included file", - ExtraData=self._CurrentLine, File=self.MetaFile, - Line=self._LineIndex + 1) - - # - # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, - # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 - # - for Arch, ModuleType in Scope: - self._LastItem = self._Store( - ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - ModuleType, - self._Owner[-1], - self._From, - self._LineIndex + 1, - - 1, - self._LineIndex + 1, - - 1, - 0 - ) - - ## [defines] section parser - @ParseMacro - def _DefineParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - self._ValueList[1:len(TokenList)] = TokenList - - # Syntax check - if not self._ValueList[1]: - EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - if not self._ValueList[2]: - EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - if not self._ValueList[1] in self.DefineKeywords: - EdkLogger.error('Parser', FORMAT_INVALID, - "Unknown keyword found: %s. " - "If this is a macro you must " - "add it as a DEFINE in the DSC" % self._ValueList[1], - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - self._Defines[self._ValueList[1]] = self._ValueList[2] - self._ItemType = self.DataType[TAB_DSC_DEFINES.upper()] - - @ParseMacro - def _SkuIdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - if len(TokenList) != 2: - EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '|'", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - self._ValueList[0:len(TokenList)] = TokenList - - ## Parse Edk style of library modules - @ParseMacro - def _LibraryInstanceParser(self): - self._ValueList[0] = self._CurrentLine - - ## PCD sections parser - # - # [PcdsFixedAtBuild] - # [PcdsPatchableInModule] - # [PcdsFeatureFlag] - # [PcdsDynamicEx - # [PcdsDynamicExDefault] - # [PcdsDynamicExVpd] - # [PcdsDynamicExHii] - # [PcdsDynamic] - # [PcdsDynamicDefault] - # [PcdsDynamicVpd] - # [PcdsDynamicHii] - # - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) - if len(TokenList) == 2: - self._ValueList[2] = TokenList[1] - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + " (.|)", - File=self.MetaFile, Line=self._LineIndex + 1) - if self._ValueList[2] == '': - # - # The PCD values are optional for FIXEDATBUILD and PATCHABLEINMODULE - # - if self._SectionType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE): - return - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given", - ExtraData=self._CurrentLine + " (.|)", - File=self.MetaFile, Line=self._LineIndex + 1) - - # Validate the datum type of Dynamic Defaul PCD and DynamicEx Default PCD - ValueList = GetSplitValueList(self._ValueList[2]) - if len(ValueList) > 1 and ValueList[1] != TAB_VOID \ - and self._ItemType in [MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT]: - EdkLogger.error('Parser', FORMAT_INVALID, "The datum type '%s' of PCD is wrong" % ValueList[1], - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - - # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. - DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) - if DscPcdValueList[0] in ['True', 'true', 'TRUE']: - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '1', 1); - elif DscPcdValueList[0] in ['False', 'false', 'FALSE']: - self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '0', 1); - - - ## [components] section parser - @ParseMacro - def _ComponentParser(self): - if self._CurrentLine[-1] == '{': - self._ValueList[0] = self._CurrentLine[0:-1].strip() - self._InSubsection = True - else: - self._ValueList[0] = self._CurrentLine - - ## [LibraryClasses] section - @ParseMacro - def _LibraryClassParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No library class or instance specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex + 1) - if TokenList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No library class specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex + 1) - if TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No library instance specified", - ExtraData=self._CurrentLine + " (|)", - File=self.MetaFile, Line=self._LineIndex + 1) - - self._ValueList[0:len(TokenList)] = TokenList - - def _CompponentSourceOverridePathParser(self): - self._ValueList[0] = self._CurrentLine - - ## [BuildOptions] section parser - @ParseMacro - def _BuildOptionParser(self): - self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True) - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - TokenList2 = GetSplitValueList(TokenList[0], ':', 1) - if len(TokenList2) == 2: - self._ValueList[0] = TokenList2[0] # toolchain family - self._ValueList[1] = TokenList2[1] # keys - else: - self._ValueList[1] = TokenList[0] - if len(TokenList) == 2: # value - self._ValueList[2] = TokenList[1] - - if self._ValueList[1].count('_') != 4: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "'%s' must be in format of ____FLAGS" % self._ValueList[1], - ExtraData=self._CurrentLine, - File=self.MetaFile, - Line=self._LineIndex + 1 - ) - - ## Override parent's method since we'll do all macro replacements in parser - def _GetMacros(self): - Macros = {} - Macros.update(self._FileLocalMacros) - Macros.update(self._GetApplicableSectionMacro()) - Macros.update(GlobalData.gEdkGlobal) - Macros.update(GlobalData.gPlatformDefines) - Macros.update(GlobalData.gCommandLineDefines) - # PCD cannot be referenced in macro definition - if self._ItemType not in [MODEL_META_DATA_DEFINE, MODEL_META_DATA_GLOBAL_DEFINE]: - Macros.update(self._Symbols) - return Macros - - def _PostProcess(self): - Processer = { - MODEL_META_DATA_SECTION_HEADER : self.__ProcessSectionHeader, - MODEL_META_DATA_SUBSECTION_HEADER : self.__ProcessSubsectionHeader, - MODEL_META_DATA_HEADER : self.__ProcessDefine, - MODEL_META_DATA_DEFINE : self.__ProcessDefine, - MODEL_META_DATA_GLOBAL_DEFINE : self.__ProcessDefine, - MODEL_META_DATA_INCLUDE : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective, - MODEL_EFI_SKU_ID : self.__ProcessSkuId, - MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance, - MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass, - MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd, - MODEL_PCD_PATCHABLE_IN_MODULE : self.__ProcessPcd, - MODEL_PCD_FEATURE_FLAG : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_DEFAULT : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_HII : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_VPD : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_DEFAULT : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_HII : self.__ProcessPcd, - MODEL_PCD_DYNAMIC_EX_VPD : self.__ProcessPcd, - MODEL_META_DATA_COMPONENT : self.__ProcessComponent, - MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : self.__ProcessSourceOverridePath, - MODEL_META_DATA_BUILD_OPTION : self.__ProcessBuildOption, - MODEL_UNKNOWN : self._Skip, - MODEL_META_DATA_USER_EXTENSION : self._Skip, - } - - self._Table = MetaFileStorage(self._RawTable.Cur, self.MetaFile, MODEL_FILE_DSC, True) - self._Table.Create() - self._DirectiveStack = [] - self._DirectiveEvalStack = [] - self._FileWithError = self.MetaFile - self._FileLocalMacros = {} - self._SectionsMacroDict = {} - GlobalData.gPlatformDefines = {} - - # Get all macro and PCD which has straitforward value - self.__RetrievePcdValue() - self._Content = self._RawTable.GetAll() - self._ContentIndex = 0 - while self._ContentIndex < len(self._Content) : - Id, self._ItemType, V1, V2, V3, S1, S2, Owner, self._From, \ - LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex] - - if self._From < 0: - self._FileWithError = self.MetaFile - - self._ContentIndex += 1 - - self._Scope = [[S1, S2]] - # - # For !include directive, handle it specially, - # merge arch and module type in case of duplicate items - # - while self._ItemType == MODEL_META_DATA_INCLUDE: - if self._ContentIndex >= len(self._Content): - break - Record = self._Content[self._ContentIndex] - if LineStart == Record[9] and LineEnd == Record[11]: - if [Record[5], Record[6]] not in self._Scope: - self._Scope.append([Record[5], Record[6]]) - self._ContentIndex += 1 - else: - break - - self._LineIndex = LineStart - 1 - self._ValueList = [V1, V2, V3] - - try: - Processer[self._ItemType]() - except EvaluationException, Excpt: - # - # Only catch expression evaluation error here. We need to report - # the precise number of line on which the error occurred - # - if hasattr(Excpt, 'Pcd'): - if Excpt.Pcd in GlobalData.gPlatformOtherPcds: - Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd] - EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as" - " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section" - " of the DSC file, and it is currently defined in this section:" - " %s, line #: %d." % (Excpt.Pcd, Info[0], Info[1]), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex + 1) - else: - EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd, - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex + 1) - else: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex + 1) - except MacroException, Excpt: - EdkLogger.error('Parser', FORMAT_INVALID, str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex + 1) - - if self._ValueList == None: - continue - - NewOwner = self._IdMapping.get(Owner, -1) - self._Enabled = int((not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack)) - self._LastItem = self._Store( - self._ItemType, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - S1, - S2, - NewOwner, - self._From, - self._LineIndex + 1, - - 1, - self._LineIndex + 1, - - 1, - self._Enabled - ) - self._IdMapping[Id] = self._LastItem - - GlobalData.gPlatformDefines.update(self._FileLocalMacros) - self._PostProcessed = True - self._Content = None - - def __ProcessSectionHeader(self): - self._SectionName = self._ValueList[0] - if self._SectionName in self.DataType: - self._SectionType = self.DataType[self._SectionName] - else: - self._SectionType = MODEL_UNKNOWN - - def __ProcessSubsectionHeader(self): - self._SubsectionName = self._ValueList[0] - if self._SubsectionName in self.DataType: - self._SubsectionType = self.DataType[self._SubsectionName] - else: - self._SubsectionType = MODEL_UNKNOWN - - def __RetrievePcdValue(self): - Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem= -1.0) - for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: - Name = TokenSpaceGuid + '.' + PcdName - ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FEATURE_FLAG) - self._Symbols[Name] = ValList[Index] - - Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem= -1.0) - for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: - Name = TokenSpaceGuid + '.' + PcdName - ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FIXED_AT_BUILD) - self._Symbols[Name] = ValList[Index] - - Content = open(str(self.MetaFile), 'r').readlines() - GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile) - for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII, - MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII, - MODEL_PCD_DYNAMIC_EX_VPD): - Records = self._RawTable.Query(PcdType, BelongsToItem= -1.0) - for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: - Name = TokenSpaceGuid + '.' + PcdName - if Name not in GlobalData.gPlatformOtherPcds: - PcdLine = Line - while not Content[Line - 1].lstrip().startswith(TAB_SECTION_START): - Line -= 1 - GlobalData.gPlatformOtherPcds[Name] = (CleanString(Content[Line - 1]), PcdLine, PcdType) - - def __ProcessDefine(self): - if not self._Enabled: - return - - Type, Name, Value = self._ValueList - Value = ReplaceMacro(Value, self._Macros, False) - if self._ItemType == MODEL_META_DATA_DEFINE: - if self._SectionType == MODEL_META_DATA_HEADER: - self._FileLocalMacros[Name] = Value - else: - self._ConstructSectionMacroDict(Name, Value) - elif self._ItemType == MODEL_META_DATA_GLOBAL_DEFINE: - GlobalData.gEdkGlobal[Name] = Value - - # - # Keyword in [Defines] section can be used as Macros - # - if (self._ItemType == MODEL_META_DATA_HEADER) and (self._SectionType == MODEL_META_DATA_HEADER): - self._FileLocalMacros[Name] = Value - - self._ValueList = [Type, Name, Value] - - def __ProcessDirective(self): - Result = None - if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF]: - Macros = self._Macros - Macros.update(GlobalData.gGlobalDefines) - try: - Result = ValueExpression(self._ValueList[1], Macros)() - except SymbolNotFound, Exc: - EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc), self._ValueList[1]) - Result = False - except WrnExpression, Excpt: - # - # Catch expression evaluation warning here. We need to report - # the precise number of line and return the evaluation result - # - EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt), - File=self._FileWithError, ExtraData=' '.join(self._ValueList), - Line=self._LineIndex + 1) - Result = Excpt.result - - if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - self._DirectiveStack.append(self._ItemType) - if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IF: - Result = bool(Result) - else: - Macro = self._ValueList[1] - Macro = Macro[2:-1] if (Macro.startswith("$(") and Macro.endswith(")")) else Macro - Result = Macro in self._Macros - if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF: - Result = not Result - self._DirectiveEvalStack.append(Result) - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF: - self._DirectiveStack.append(self._ItemType) - self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] - self._DirectiveEvalStack.append(bool(Result)) - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: - self._DirectiveStack.append(self._ItemType) - self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] - self._DirectiveEvalStack.append(True) - elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: - # Back to the nearest !if/!ifdef/!ifndef - while self._DirectiveStack: - self._DirectiveEvalStack.pop() - Directive = self._DirectiveStack.pop() - if Directive in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, - MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: - break - elif self._ItemType == MODEL_META_DATA_INCLUDE: - # The included file must be relative to workspace or same directory as DSC file - __IncludeMacros = {} - # - # Allow using system environment variables in path after !include - # - __IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE'] - if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys(): - __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE'] - # - # During GenFds phase call DSC parser, will go into this branch. - # - elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys(): - __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE'] - - __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE'] - __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE'] - # - # Allow using MACROs comes from [Defines] section to keep compatible. - # - __IncludeMacros.update(self._Macros) - - IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True)) - # - # First search the include file under the same directory as DSC file - # - IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir) - ErrorCode, ErrorInfo1 = IncludedFile1.Validate() - if ErrorCode != 0: - # - # Also search file under the WORKSPACE directory - # - IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) - ErrorCode, ErrorInfo2 = IncludedFile1.Validate() - if ErrorCode != 0: - EdkLogger.error('parser', ErrorCode, File=self._FileWithError, - Line=self._LineIndex + 1, ExtraData=ErrorInfo1 + "\n" + ErrorInfo2) - - self._FileWithError = IncludedFile1 - - IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False) - Owner = self._Content[self._ContentIndex - 1][0] - Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable, - Owner=Owner, From=Owner) - - # set the parser status with current status - Parser._SectionName = self._SectionName - Parser._SectionType = self._SectionType - Parser._Scope = self._Scope - Parser._Enabled = self._Enabled - # Parse the included file - Parser.Start() - - # update current status with sub-parser's status - self._SectionName = Parser._SectionName - self._SectionType = Parser._SectionType - self._Scope = Parser._Scope - self._Enabled = Parser._Enabled - - # Insert all records in the table for the included file into dsc file table - Records = IncludedFileTable.GetAll() - if Records: - self._Content[self._ContentIndex:self._ContentIndex] = Records - self._Content.pop(self._ContentIndex - 1) - self._ValueList = None - self._ContentIndex -= 1 - - def __ProcessSkuId(self): - self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) - for Value in self._ValueList] - - def __ProcessLibraryInstance(self): - self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] - - def __ProcessLibraryClass(self): - self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True) - - def __ProcessPcd(self): - if self._ItemType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: - self._ValueList[2] = ReplaceMacro(self._ValueList[2], self._Macros, RaiseError=True) - return - - ValList, Valid, Index = AnalyzeDscPcd(self._ValueList[2], self._ItemType) - if not Valid: - EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self._FileWithError, Line=self._LineIndex+1, - ExtraData="%s.%s|%s" % (self._ValueList[0], self._ValueList[1], self._ValueList[2])) - PcdValue = ValList[Index] - if PcdValue: - try: - ValList[Index] = ValueExpression(PcdValue, self._Macros)(True) - except WrnExpression, Value: - ValList[Index] = Value.result - - if ValList[Index] == 'True': - ValList[Index] = '1' - if ValList[Index] == 'False': - ValList[Index] = '0' - - GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue - self._ValueList[2] = '|'.join(ValList) - - def __ProcessComponent(self): - self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) - - def __ProcessSourceOverridePath(self): - self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) - - def __ProcessBuildOption(self): - self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False) - for Value in self._ValueList] - - _SectionParser = { - MODEL_META_DATA_HEADER : _DefineParser, - MODEL_EFI_SKU_ID : _SkuIdParser, - MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser, - MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser, - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC_DEFAULT : _PcdParser, - MODEL_PCD_DYNAMIC_HII : _PcdParser, - MODEL_PCD_DYNAMIC_VPD : _PcdParser, - MODEL_PCD_DYNAMIC_EX_DEFAULT : _PcdParser, - MODEL_PCD_DYNAMIC_EX_HII : _PcdParser, - MODEL_PCD_DYNAMIC_EX_VPD : _PcdParser, - MODEL_META_DATA_COMPONENT : _ComponentParser, - MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : _CompponentSourceOverridePathParser, - MODEL_META_DATA_BUILD_OPTION : _BuildOptionParser, - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - MODEL_META_DATA_SECTION_HEADER : MetaFileParser._SectionHeaderParser, - MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHeaderParser, - } - - _Macros = property(_GetMacros) - -## DEC file parser class -# -# @param FilePath The path of platform description file -# @param FileType The raw data of DSC file -# @param Table Database used to retrieve module/package information -# @param Macros Macros used for replacement in file -# -class DecParser(MetaFileParser): - # DEC file supported data types (one type per section) - DataType = { - TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC, - TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX, - } - - ## Constructor of DecParser - # - # Initialize object of DecParser - # - # @param FilePath The path of platform description file - # @param FileType The raw data of DSC file - # @param Table Database used to retrieve module/package information - # @param Macros Macros used for replacement in file - # - def __init__(self, FilePath, FileType, Table): - # prevent re-initialization - if hasattr(self, "_Table"): - return - MetaFileParser.__init__(self, FilePath, FileType, Table, -1) - self._Comments = [] - self._Version = 0x00010005 # Only EDK2 dec file is supported - self._AllPCDs = [] # Only for check duplicate PCD - - ## Parser starter - def Start(self): - Content = '' - try: - Content = open(str(self.MetaFile), 'r').readlines() - except: - EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) - - for Index in range(0, len(Content)): - Line, Comment = CleanString2(Content[Index]) - self._CurrentLine = Line - self._LineIndex = Index - - # save comment for later use - if Comment: - self._Comments.append((Comment, self._LineIndex + 1)) - # skip empty line - if Line == '': - continue - - # section header - if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: - self._SectionHeaderParser() - self._Comments = [] - continue - elif len(self._SectionType) == 0: - self._Comments = [] - continue - - # section content - self._ValueList = ['', '', ''] - self._SectionParser[self._SectionType[0]](self) - if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: - self._ItemType = -1 - self._Comments = [] - continue - - # - # Model, Value1, Value2, Value3, Arch, BelongsToItem=-1, LineBegin=-1, - # ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, FeatureFlag='', Enabled=-1 - # - for Arch, ModuleType, Type in self._Scope: - self._LastItem = self._Store( - Type, - self._ValueList[0], - self._ValueList[1], - self._ValueList[2], - Arch, - ModuleType, - self._Owner[-1], - self._LineIndex + 1, - - 1, - self._LineIndex + 1, - - 1, - 0 - ) - for Comment, LineNo in self._Comments: - self._Store( - MODEL_META_DATA_COMMENT, - Comment, - self._ValueList[0], - self._ValueList[1], - Arch, - ModuleType, - self._LastItem, - LineNo, - - 1, - LineNo, - - 1, - 0 - ) - self._Comments = [] - self._Done() - - - ## Section header parser - # - # The section header is always in following format: - # - # [section_name.arch<.platform|module_type>] - # - def _SectionHeaderParser(self): - self._Scope = [] - self._SectionName = '' - self._SectionType = [] - ArchList = set() - Line = self._CurrentLine.replace("%s%s" % (TAB_COMMA_SPLIT, TAB_SPACE_SPLIT), TAB_COMMA_SPLIT) - for Item in Line[1:-1].split(TAB_COMMA_SPLIT): - if Item == '': - EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, - "section name can NOT be empty or incorrectly use separator comma", - self.MetaFile, self._LineIndex + 1, self._CurrentLine) - ItemList = Item.split(TAB_SPLIT) - - # different types of PCD are permissible in one section - self._SectionName = ItemList[0].upper() - if self._SectionName in self.DataType: - if self.DataType[self._SectionName] not in self._SectionType: - self._SectionType.append(self.DataType[self._SectionName]) - else: - EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, - self.MetaFile, self._LineIndex + 1, self._CurrentLine) - - if MODEL_PCD_FEATURE_FLAG in self._SectionType and len(self._SectionType) > 1: - EdkLogger.error( - 'Parser', - FORMAT_INVALID, - "%s must not be in the same section of other types of PCD" % TAB_PCDS_FEATURE_FLAG_NULL, - File=self.MetaFile, - Line=self._LineIndex + 1, - ExtraData=self._CurrentLine - ) - # S1 is always Arch - if len(ItemList) > 1: - S1 = ItemList[1].upper() - else: - S1 = 'COMMON' - ArchList.add(S1) - # S2 may be Platform or ModuleType - if len(ItemList) > 2: - S2 = ItemList[2].upper() - else: - S2 = 'COMMON' - if [S1, S2, self.DataType[self._SectionName]] not in self._Scope: - self._Scope.append([S1, S2, self.DataType[self._SectionName]]) - - # 'COMMON' must not be used with specific ARCHs at the same section - if 'COMMON' in ArchList and len(ArchList) > 1: - EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", - File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) - - ## [guids], [ppis] and [protocols] section parser - @ParseMacro - def _GuidParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) - if len(TokenList) < 2: - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name or value specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex + 1) - if TokenList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex + 1) - if TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No GUID value specified", - ExtraData=self._CurrentLine + " ( = )", - File=self.MetaFile, Line=self._LineIndex + 1) - if TokenList[1][0] != '{' or TokenList[1][-1] != '}' or GuidStructureStringToGuidString(TokenList[1]) == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", - ExtraData=self._CurrentLine + \ - " ( = )", - File=self.MetaFile, Line=self._LineIndex + 1) - self._ValueList[0] = TokenList[0] - self._ValueList[1] = TokenList[1] - - ## PCD sections parser - # - # [PcdsFixedAtBuild] - # [PcdsPatchableInModule] - # [PcdsFeatureFlag] - # [PcdsDynamicEx - # [PcdsDynamic] - # - @ParseMacro - def _PcdParser(self): - TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) - self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) - ValueRe = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*') - # check PCD information - if self._ValueList[0] == '' or self._ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check format of token space GUID CName - if not ValueRe.match(self._ValueList[0]): - EdkLogger.error('Parser', FORMAT_INVALID, "The format of the token space GUID CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check format of PCD CName - if not ValueRe.match(self._ValueList[1]): - EdkLogger.error('Parser', FORMAT_INVALID, "The format of the PCD CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check PCD datum information - if len(TokenList) < 2 or TokenList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - - - ValueRe = re.compile(r'^\s*L?\".*\|.*\"') - PtrValue = ValueRe.findall(TokenList[1]) - - # Has VOID* type string, may contain "|" character in the string. - if len(PtrValue) != 0: - ptrValueList = re.sub(ValueRe, '', TokenList[1]) - ValueList = GetSplitValueList(ptrValueList) - ValueList[0] = PtrValue[0] - else: - ValueList = GetSplitValueList(TokenList[1]) - - - # check if there's enough datum information given - if len(ValueList) != 3: - EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check default value - if ValueList[0] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check datum type - if ValueList[1] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check token of the PCD - if ValueList[2] == '': - EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information", - ExtraData=self._CurrentLine + \ - " (.|||)", - File=self.MetaFile, Line=self._LineIndex + 1) - # check format of default value against the datum type - IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) - if not IsValid: - EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine, - File=self.MetaFile, Line=self._LineIndex + 1) - - if ValueList[0] in ['True', 'true', 'TRUE']: - ValueList[0] = '1' - elif ValueList[0] in ['False', 'false', 'FALSE']: - ValueList[0] = '0' - - # check for duplicate PCD definition - if (self._Scope[0], self._ValueList[0], self._ValueList[1]) in self._AllPCDs: - EdkLogger.error('Parser', FORMAT_INVALID, - "The same PCD name and GUID have been already defined", - ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) - else: - self._AllPCDs.append((self._Scope[0], self._ValueList[0], self._ValueList[1])) - - self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip() - - _SectionParser = { - MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, - MODEL_EFI_INCLUDE : MetaFileParser._PathParser, - MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, - MODEL_EFI_GUID : _GuidParser, - MODEL_EFI_PPI : _GuidParser, - MODEL_EFI_PROTOCOL : _GuidParser, - MODEL_PCD_FIXED_AT_BUILD : _PcdParser, - MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, - MODEL_PCD_FEATURE_FLAG : _PcdParser, - MODEL_PCD_DYNAMIC : _PcdParser, - MODEL_PCD_DYNAMIC_EX : _PcdParser, - MODEL_UNKNOWN : MetaFileParser._Skip, - MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, - } - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - pass - +## @file +# This file is used to parse meta files +# +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
    +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import re +import time +import copy + +import Common.EdkLogger as EdkLogger +import Common.GlobalData as GlobalData + +from CommonDataClass.DataClass import * +from Common.DataType import * +from Common.String import * +from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd +from Common.Expression import * +from CommonDataClass.Exceptions import * + +from MetaFileTable import MetaFileStorage + +## A decorator used to parse macro definition +def ParseMacro(Parser): + def MacroParser(self): + Match = gMacroDefPattern.match(self._CurrentLine) + if not Match: + # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method + Parser(self) + return + + TokenList = GetSplitValueList(self._CurrentLine[Match.end(1):], TAB_EQUAL_SPLIT, 1) + # Syntax check + if not TokenList[0]: + EdkLogger.error('Parser', FORMAT_INVALID, "No macro name given", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + if len(TokenList) < 2: + TokenList.append('') + + Type = Match.group(1) + Name, Value = TokenList + # Global macros can be only defined via environment variable + if Name in GlobalData.gGlobalDefines: + EdkLogger.error('Parser', FORMAT_INVALID, "%s can only be defined via environment variable" % Name, + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + # Only upper case letters, digit and '_' are allowed + if not gMacroNamePattern.match(Name): + EdkLogger.error('Parser', FORMAT_INVALID, "The macro name must be in the pattern [A-Z][A-Z0-9_]*", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + + Value = ReplaceMacro(Value, self._Macros) + if Type in self.DataType: + self._ItemType = self.DataType[Type] + else: + self._ItemType = MODEL_META_DATA_DEFINE + # DEFINE defined macros + if Type == TAB_DSC_DEFINES_DEFINE: + # + # First judge whether this DEFINE is in conditional directive statements or not. + # + if type(self) == DscParser and self._InDirective > -1: + pass + else: + if type(self) == DecParser: + if MODEL_META_DATA_HEADER in self._SectionType: + self._FileLocalMacros[Name] = Value + else: + self._ConstructSectionMacroDict(Name, Value) + elif self._SectionType == MODEL_META_DATA_HEADER: + self._FileLocalMacros[Name] = Value + else: + self._ConstructSectionMacroDict(Name, Value) + + # EDK_GLOBAL defined macros + elif type(self) != DscParser: + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used in .dsc file", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + elif self._SectionType != MODEL_META_DATA_HEADER: + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL can only be used under [Defines] section", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + elif (Name in self._FileLocalMacros) and (self._FileLocalMacros[Name] != Value): + EdkLogger.error('Parser', FORMAT_INVALID, "EDK_GLOBAL defined a macro with the same name and different value as one defined by 'DEFINE'", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + + self._ValueList = [Type, Name, Value] + + return MacroParser + +## Base class of parser +# +# This class is used for derivation purpose. The specific parser for one kind +# type file must derive this class and implement some public interfaces. +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# @param Owner Owner ID (for sub-section parsing) +# @param From ID from which the data comes (for !INCLUDE directive) +# +class MetaFileParser(object): + # data type (file content) for specific file type + DataType = {} + + # Parser objects used to implement singleton + MetaFiles = {} + + ## Factory method + # + # One file, one parser object. This factory method makes sure that there's + # only one object constructed for one meta file. + # + # @param Class class object of real AutoGen class + # (InfParser, DecParser or DscParser) + # @param FilePath The path of meta file + # @param *args The specific class related parameters + # @param **kwargs The specific class related dict parameters + # + def __new__(Class, FilePath, *args, **kwargs): + if FilePath in Class.MetaFiles: + return Class.MetaFiles[FilePath] + else: + ParserObject = super(MetaFileParser, Class).__new__(Class) + Class.MetaFiles[FilePath] = ParserObject + return ParserObject + + ## Constructor of MetaFileParser + # + # Initialize object of MetaFileParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # @param Owner Owner ID (for sub-section parsing) + # @param From ID from which the data comes (for !INCLUDE directive) + # + def __init__(self, FilePath, FileType, Table, Owner= -1, From= -1): + self._Table = Table + self._RawTable = Table + self._FileType = FileType + self.MetaFile = FilePath + self._FileDir = self.MetaFile.Dir + self._Defines = {} + self._FileLocalMacros = {} + self._SectionsMacroDict = {} + + # for recursive parsing + self._Owner = [Owner] + self._From = From + + # parsr status for parsing + self._ValueList = ['', '', '', '', ''] + self._Scope = [] + self._LineIndex = 0 + self._CurrentLine = '' + self._SectionType = MODEL_UNKNOWN + self._SectionName = '' + self._InSubsection = False + self._SubsectionType = MODEL_UNKNOWN + self._SubsectionName = '' + self._ItemType = MODEL_UNKNOWN + self._LastItem = -1 + self._Enabled = 0 + self._Finished = False + self._PostProcessed = False + # Different version of meta-file has different way to parse. + self._Version = 0 + + ## Store the parsed data in table + def _Store(self, *Args): + return self._Table.Insert(*Args) + + ## Virtual method for starting parse + def Start(self): + raise NotImplementedError + + ## Notify a post-process is needed + def DoPostProcess(self): + self._PostProcessed = False + + ## Set parsing complete flag in both class and table + def _Done(self): + self._Finished = True + ## Do not set end flag when processing included files + if self._From == -1: + self._Table.SetEndFlag() + + def _PostProcess(self): + self._PostProcessed = True + + ## Get the parse complete flag + def _GetFinished(self): + return self._Finished + + ## Set the complete flag + def _SetFinished(self, Value): + self._Finished = Value + + ## Use [] style to query data in table, just for readability + # + # DataInfo = [data_type, scope1(arch), scope2(platform/moduletype)] + # + def __getitem__(self, DataInfo): + if type(DataInfo) != type(()): + DataInfo = (DataInfo,) + + # Parse the file first, if necessary + if not self._Finished: + if self._RawTable.IsIntegrity(): + self._Finished = True + else: + self._Table = self._RawTable + self._PostProcessed = False + self.Start() + + # No specific ARCH or Platform given, use raw data + if self._RawTable and (len(DataInfo) == 1 or DataInfo[1] == None): + return self._RawTable.Query(*DataInfo) + + # Do post-process if necessary + if not self._PostProcessed: + self._PostProcess() + + return self._Table.Query(*DataInfo) + + ## Data parser for the common format in different type of file + # + # The common format in the meatfile is like + # + # xxx1 | xxx2 | xxx3 + # + @ParseMacro + def _CommonParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + + ## Data parser for the format in which there's path + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _PathParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + # Don't do macro replacement for dsc file at this point + if type(self) != DscParser: + Macros = self._Macros + self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] + + ## Skip unsupported data + def _Skip(self): + EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile, + Line=self._LineIndex + 1, ExtraData=self._CurrentLine); + self._ValueList[0:1] = [self._CurrentLine] + + ## Section header parser + # + # The section header is always in following format: + # + # [section_name.arch<.platform|module_type>] + # + def _SectionHeaderParser(self): + self._Scope = [] + self._SectionName = '' + ArchList = set() + for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT): + if Item == '': + continue + ItemList = GetSplitValueList(Item, TAB_SPLIT,2) + # different section should not mix in one section + if self._SectionName != '' and self._SectionName != ItemList[0].upper(): + EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section", + File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) + self._SectionName = ItemList[0].upper() + if self._SectionName in self.DataType: + self._SectionType = self.DataType[self._SectionName] + # Check if the section name is valid + if self._SectionName not in SECTIONS_HAVE_ITEM_AFTER_ARCH and len(ItemList) > 3: + EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, + self.MetaFile, self._LineIndex + 1, self._CurrentLine) + elif self._Version >= 0x00010005: + EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, + self.MetaFile, self._LineIndex + 1, self._CurrentLine) + else: + self._SectionType = MODEL_UNKNOWN + + # S1 is always Arch + if len(ItemList) > 1: + S1 = ItemList[1].upper() + else: + S1 = 'COMMON' + ArchList.add(S1) + + # S2 may be Platform or ModuleType + if len(ItemList) > 2: + if self._SectionName.upper() in SECTIONS_HAVE_ITEM_PCD: + S2 = ItemList[2] + else: + S2 = ItemList[2].upper() + else: + S2 = 'COMMON' + self._Scope.append([S1, S2]) + + # 'COMMON' must not be used with specific ARCHs at the same section + if 'COMMON' in ArchList and len(ArchList) > 1: + EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", + File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) + # If the section information is needed later, it should be stored in database + self._ValueList[0] = self._SectionName + + ## [defines] section parser + @ParseMacro + def _DefineParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[1:len(TokenList)] = TokenList + if not self._ValueList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + if not self._ValueList[2]: + EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + + self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] + Name, Value = self._ValueList[1], self._ValueList[2] + # Sometimes, we need to make differences between EDK and EDK2 modules + if Name == 'INF_VERSION': + try: + self._Version = int(Value, 0) + except: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + + if type(self) == InfParser and self._Version < 0x00010005: + # EDK module allows using defines as macros + self._FileLocalMacros[Name] = Value + self._Defines[Name] = Value + + ## [BuildOptions] section parser + @ParseMacro + def _BuildOptionParser(self): + self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True) + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + TokenList2 = GetSplitValueList(TokenList[0], ':', 1) + if len(TokenList2) == 2: + self._ValueList[0] = TokenList2[0] # toolchain family + self._ValueList[1] = TokenList2[1] # keys + else: + self._ValueList[1] = TokenList[0] + if len(TokenList) == 2 and type(self) != DscParser: # value + self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros) + + if self._ValueList[1].count('_') != 4: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "'%s' must be in format of ____FLAGS" % self._ValueList[1], + ExtraData=self._CurrentLine, + File=self.MetaFile, + Line=self._LineIndex + 1 + ) + + def _GetMacros(self): + Macros = {} + Macros.update(self._FileLocalMacros) + Macros.update(self._GetApplicableSectionMacro()) + return Macros + + ## Construct section Macro dict + def _ConstructSectionMacroDict(self, Name, Value): + ScopeKey = [(Scope[0], Scope[1]) for Scope in self._Scope] + ScopeKey = tuple(ScopeKey) + SectionDictKey = self._SectionType, ScopeKey + # + # DecParser SectionType is a list, will contain more than one item only in Pcd Section + # As Pcd section macro usage is not alllowed, so here it is safe + # + if type(self) == DecParser: + SectionDictKey = self._SectionType[0], ScopeKey + if SectionDictKey not in self._SectionsMacroDict: + self._SectionsMacroDict[SectionDictKey] = {} + SectionLocalMacros = self._SectionsMacroDict[SectionDictKey] + SectionLocalMacros[Name] = Value + + ## Get section Macros that are applicable to current line, which may come from other sections + ## that share the same name while scope is wider + def _GetApplicableSectionMacro(self): + Macros = {} + + ComComMacroDict = {} + ComSpeMacroDict = {} + SpeSpeMacroDict = {} + + ActiveSectionType = self._SectionType + if type(self) == DecParser: + ActiveSectionType = self._SectionType[0] + + for (SectionType, Scope) in self._SectionsMacroDict: + if SectionType != ActiveSectionType: + continue + + for ActiveScope in self._Scope: + Scope0, Scope1 = ActiveScope[0], ActiveScope[1] + if(Scope0, Scope1) not in Scope: + break + else: + SpeSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) + + for ActiveScope in self._Scope: + Scope0, Scope1 = ActiveScope[0], ActiveScope[1] + if(Scope0, Scope1) not in Scope and (Scope0, "COMMON") not in Scope and ("COMMON", Scope1) not in Scope: + break + else: + ComSpeMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) + + if ("COMMON", "COMMON") in Scope: + ComComMacroDict.update(self._SectionsMacroDict[(SectionType, Scope)]) + + Macros.update(ComComMacroDict) + Macros.update(ComSpeMacroDict) + Macros.update(SpeSpeMacroDict) + + return Macros + + _SectionParser = {} + Finished = property(_GetFinished, _SetFinished) + _Macros = property(_GetMacros) + + +## INF file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# +class InfParser(MetaFileParser): + # INF file supported data types (one type per section) + DataType = { + TAB_UNKNOWN.upper() : MODEL_UNKNOWN, + TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, + TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, + TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE, + TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE, + TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX, + TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC, + TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE, + TAB_GUIDS.upper() : MODEL_EFI_GUID, + TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, + TAB_PPIS.upper() : MODEL_EFI_PPI, + TAB_DEPEX.upper() : MODEL_EFI_DEPEX, + TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE, + TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION + } + + ## Constructor of InfParser + # + # Initialize object of InfParser + # + # @param FilePath The path of module description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # + def __init__(self, FilePath, FileType, Table): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table) + self.PcdsDict = {} + + ## Parser starter + def Start(self): + NmakeLine = '' + Content = '' + try: + Content = open(str(self.MetaFile), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + + # parse the file line by line + IsFindBlockComment = False + GetHeaderComment = False + TailComments = [] + SectionComments = [] + Comments = [] + + for Index in range(0, len(Content)): + # skip empty, commented, block commented lines + Line, Comment = CleanString2(Content[Index], AllowCppStyleComment=True) + NextLine = '' + if Index + 1 < len(Content): + NextLine, NextComment = CleanString2(Content[Index + 1]) + if Line == '': + if Comment: + Comments.append((Comment, Index + 1)) + elif GetHeaderComment: + SectionComments.extend(Comments) + Comments = [] + continue + if Line.find(DataType.TAB_COMMENT_EDK_START) > -1: + IsFindBlockComment = True + continue + if Line.find(DataType.TAB_COMMENT_EDK_END) > -1: + IsFindBlockComment = False + continue + if IsFindBlockComment: + continue + + self._LineIndex = Index + self._CurrentLine = Line + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + if not GetHeaderComment: + for Cmt, LNo in Comments: + self._Store(MODEL_META_DATA_HEADER_COMMENT, Cmt, '', '', 'COMMON', + 'COMMON', self._Owner[-1], LNo, -1, LNo, -1, 0) + GetHeaderComment = True + else: + TailComments.extend(SectionComments + Comments) + Comments = [] + self._SectionHeaderParser() + # Check invalid sections + if self._Version < 0x00010005: + if self._SectionType in [MODEL_META_DATA_BUILD_OPTION, + MODEL_EFI_LIBRARY_CLASS, + MODEL_META_DATA_PACKAGE, + MODEL_PCD_FIXED_AT_BUILD, + MODEL_PCD_PATCHABLE_IN_MODULE, + MODEL_PCD_FEATURE_FLAG, + MODEL_PCD_DYNAMIC_EX, + MODEL_PCD_DYNAMIC, + MODEL_EFI_GUID, + MODEL_EFI_PROTOCOL, + MODEL_EFI_PPI, + MODEL_META_DATA_USER_EXTENSION]: + EdkLogger.error('Parser', FORMAT_INVALID, + "Section [%s] is not allowed in inf file without version" % (self._SectionName), + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + elif self._SectionType in [MODEL_EFI_INCLUDE, + MODEL_EFI_LIBRARY_INSTANCE, + MODEL_META_DATA_NMAKE]: + EdkLogger.error('Parser', FORMAT_INVALID, + "Section [%s] is not allowed in inf file with version 0x%08x" % (self._SectionName, self._Version), + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + continue + # merge two lines specified by '\' in section NMAKE + elif self._SectionType == MODEL_META_DATA_NMAKE: + if Line[-1] == '\\': + if NextLine == '': + self._CurrentLine = NmakeLine + Line[0:-1] + NmakeLine = '' + else: + if NextLine[0] == TAB_SECTION_START and NextLine[-1] == TAB_SECTION_END: + self._CurrentLine = NmakeLine + Line[0:-1] + NmakeLine = '' + else: + NmakeLine = NmakeLine + ' ' + Line[0:-1] + continue + else: + self._CurrentLine = NmakeLine + Line + NmakeLine = '' + + # section content + self._ValueList = ['', '', ''] + # parse current line, result will be put in self._ValueList + self._SectionParser[self._SectionType](self) + if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: + self._ItemType = -1 + Comments = [] + continue + if Comment: + Comments.append((Comment, Index + 1)) + # + # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + for Arch, Platform in self._Scope: + LastItem = self._Store(self._SectionType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + Platform, + self._Owner[-1], + self._LineIndex + 1, + - 1, + self._LineIndex + 1, + - 1, + 0 + ) + for Comment, LineNo in Comments: + self._Store(MODEL_META_DATA_COMMENT, Comment, '', '', Arch, Platform, + LastItem, LineNo, -1, LineNo, -1, 0) + Comments = [] + SectionComments = [] + TailComments.extend(SectionComments + Comments) + if IsFindBlockComment: + EdkLogger.error("Parser", FORMAT_INVALID, "Open block comments (starting with /*) are expected to end with */", + File=self.MetaFile) + + # If there are tail comments in INF file, save to database whatever the comments are + for Comment in TailComments: + self._Store(MODEL_META_DATA_TAIL_COMMENT, Comment[0], '', '', 'COMMON', + 'COMMON', self._Owner[-1], -1, -1, -1, -1, 0) + self._Done() + + ## Data parser for the format in which there's path + # + # Only path can have macro used. So we need to replace them before use. + # + def _IncludeParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + Macros = self._Macros + if Macros: + for Index in range(0, len(self._ValueList)): + Value = self._ValueList[Index] + if not Value: + continue + + if Value.upper().find('$(EFI_SOURCE)\Edk'.upper()) > -1 or Value.upper().find('$(EFI_SOURCE)/Edk'.upper()) > -1: + Value = '$(EDK_SOURCE)' + Value[17:] + if Value.find('$(EFI_SOURCE)') > -1 or Value.find('$(EDK_SOURCE)') > -1: + pass + elif Value.startswith('.'): + pass + elif Value.startswith('$('): + pass + else: + Value = '$(EFI_SOURCE)/' + Value + + self._ValueList[Index] = ReplaceMacro(Value, Macros) + + ## Parse [Sources] section + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _SourceFileParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + self._ValueList[0:len(TokenList)] = TokenList + Macros = self._Macros + # For Acpi tables, remove macro like ' TABLE_NAME=Sata1' + if 'COMPONENT_TYPE' in Macros: + if self._Defines['COMPONENT_TYPE'].upper() == 'ACPITABLE': + self._ValueList[0] = GetSplitValueList(self._ValueList[0], ' ', 1)[0] + if self._Defines['BASE_NAME'] == 'Microcode': + pass + self._ValueList = [ReplaceMacro(Value, Macros) for Value in self._ValueList] + + ## Parse [Binaries] section + # + # Only path can have macro used. So we need to replace them before use. + # + @ParseMacro + def _BinaryFileParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 2) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No file type or path specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex + 1) + if not TokenList[0]: + EdkLogger.error('Parser', FORMAT_INVALID, "No file type specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex + 1) + if not TokenList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No file path specified", + ExtraData=self._CurrentLine + " ( | [| ])", + File=self.MetaFile, Line=self._LineIndex + 1) + self._ValueList[0:len(TokenList)] = TokenList + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) + + ## [nmake] section parser (Edk.x style only) + def _NmakeParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[0:len(TokenList)] = TokenList + # remove macros + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros) + # remove self-reference in macro setting + #self._ValueList[1] = ReplaceMacro(self._ValueList[1], {self._ValueList[0]:''}) + + ## [FixedPcd], [FeaturePcd], [PatchPcd], [Pcd] and [PcdEx] sections parser + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + ValueList = GetSplitValueList(TokenList[0], TAB_SPLIT) + if len(ValueList) != 2: + EdkLogger.error('Parser', FORMAT_INVALID, "Illegal token space GUID and PCD name format", + ExtraData=self._CurrentLine + " (.)", + File=self.MetaFile, Line=self._LineIndex + 1) + self._ValueList[0:1] = ValueList + if len(TokenList) > 1: + self._ValueList[2] = TokenList[1] + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + " (.)", + File=self.MetaFile, Line=self._LineIndex + 1) + + # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. + if self._ValueList[2] != '': + InfPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) + if InfPcdValueList[0] in ['True', 'true', 'TRUE']: + self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '1', 1); + elif InfPcdValueList[0] in ['False', 'false', 'FALSE']: + self._ValueList[2] = TokenList[1].replace(InfPcdValueList[0], '0', 1); + if (self._ValueList[0], self._ValueList[1]) not in self.PcdsDict: + self.PcdsDict[self._ValueList[0], self._ValueList[1]] = self._SectionType + elif self.PcdsDict[self._ValueList[0], self._ValueList[1]] != self._SectionType: + EdkLogger.error('Parser', FORMAT_INVALID, "It is not permissible to list a specified PCD in different PCD type sections.", + ExtraData=self._CurrentLine + " (.)", + File=self.MetaFile, Line=self._LineIndex + 1) + + ## [depex] section parser + @ParseMacro + def _DepexParser(self): + self._ValueList[0:1] = [self._CurrentLine] + + _SectionParser = { + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, + MODEL_META_DATA_BUILD_OPTION : MetaFileParser._BuildOptionParser, + MODEL_EFI_INCLUDE : _IncludeParser, # for Edk.x modules + MODEL_EFI_LIBRARY_INSTANCE : MetaFileParser._CommonParser, # for Edk.x modules + MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, + MODEL_META_DATA_PACKAGE : MetaFileParser._PathParser, + MODEL_META_DATA_NMAKE : _NmakeParser, # for Edk.x modules + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC_EX : _PcdParser, + MODEL_PCD_DYNAMIC : _PcdParser, + MODEL_EFI_SOURCE_FILE : _SourceFileParser, + MODEL_EFI_GUID : MetaFileParser._CommonParser, + MODEL_EFI_PROTOCOL : MetaFileParser._CommonParser, + MODEL_EFI_PPI : MetaFileParser._CommonParser, + MODEL_EFI_DEPEX : _DepexParser, + MODEL_EFI_BINARY_FILE : _BinaryFileParser, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + } + +## DSC file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# @param Owner Owner ID (for sub-section parsing) +# @param From ID from which the data comes (for !INCLUDE directive) +# +class DscParser(MetaFileParser): + # DSC file supported data types (one type per section) + DataType = { + TAB_SKUIDS.upper() : MODEL_EFI_SKU_ID, + TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, + TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_PCDS_DYNAMIC_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_DEFAULT, + TAB_PCDS_DYNAMIC_HII_NULL.upper() : MODEL_PCD_DYNAMIC_HII, + TAB_PCDS_DYNAMIC_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_VPD, + TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL.upper() : MODEL_PCD_DYNAMIC_EX_DEFAULT, + TAB_PCDS_DYNAMIC_EX_HII_NULL.upper() : MODEL_PCD_DYNAMIC_EX_HII, + TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper() : MODEL_PCD_DYNAMIC_EX_VPD, + TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT, + TAB_COMPONENTS_SOURCE_OVERRIDE_PATH.upper() : MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, + TAB_DSC_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_DSC_DEFINES_EDKGLOBAL : MODEL_META_DATA_GLOBAL_DEFINE, + TAB_INCLUDE.upper() : MODEL_META_DATA_INCLUDE, + TAB_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + TAB_IF_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + TAB_IF_N_DEF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF, + TAB_ELSE_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF, + TAB_ELSE.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE, + TAB_END_IF.upper() : MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF, + } + + # Valid names in define section + DefineKeywords = [ + "DSC_SPECIFICATION", + "PLATFORM_NAME", + "PLATFORM_GUID", + "PLATFORM_VERSION", + "SKUID_IDENTIFIER", + "PCD_INFO_GENERATION", + "SUPPORTED_ARCHITECTURES", + "BUILD_TARGETS", + "OUTPUT_DIRECTORY", + "FLASH_DEFINITION", + "BUILD_NUMBER", + "RFC_LANGUAGES", + "ISO_LANGUAGES", + "TIME_STAMP_FILE", + "VPD_TOOL_GUID", + "FIX_LOAD_TOP_MEMORY_ADDRESS" + ] + + SymbolPattern = ValueExpression.SymbolPattern + + ## Constructor of DscParser + # + # Initialize object of DscParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # @param Owner Owner ID (for sub-section parsing) + # @param From ID from which the data comes (for !INCLUDE directive) + # + def __init__(self, FilePath, FileType, Table, Owner= -1, From= -1): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table, Owner, From) + self._Version = 0x00010005 # Only EDK2 dsc file is supported + # to store conditional directive evaluation result + self._DirectiveStack = [] + self._DirectiveEvalStack = [] + self._Enabled = 1 + + # + # Specify whether current line is in uncertain condition + # + self._InDirective = -1 + + # Final valid replacable symbols + self._Symbols = {} + # + # Map the ID between the original table and new table to track + # the owner item + # + self._IdMapping = {-1:-1} + + ## Parser starter + def Start(self): + Content = '' + try: + Content = open(str(self.MetaFile), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + + OwnerId = {} + for Index in range(0, len(Content)): + Line = CleanString(Content[Index]) + # skip empty line + if Line == '': + continue + + self._CurrentLine = Line + self._LineIndex = Index + if self._InSubsection and self._Owner[-1] == -1: + self._Owner.append(self._LastItem) + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + self._SectionType = MODEL_META_DATA_SECTION_HEADER + # subsection ending + elif Line[0] == '}' and self._InSubsection: + self._InSubsection = False + self._SubsectionType = MODEL_UNKNOWN + self._SubsectionName = '' + self._Owner[-1] = -1 + OwnerId = {} + continue + # subsection header + elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END: + self._SubsectionType = MODEL_META_DATA_SUBSECTION_HEADER + # directive line + elif Line[0] == '!': + self._DirectiveParser() + continue + + if self._InSubsection: + SectionType = self._SubsectionType + else: + SectionType = self._SectionType + self._ItemType = SectionType + + self._ValueList = ['', '', ''] + self._SectionParser[SectionType](self) + if self._ValueList == None: + continue + # + # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + for Arch, ModuleType in self._Scope: + Owner = self._Owner[-1] + if self._SubsectionType != MODEL_UNKNOWN: + Owner = OwnerId[Arch] + self._LastItem = self._Store( + self._ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + ModuleType, + Owner, + self._From, + self._LineIndex + 1, + - 1, + self._LineIndex + 1, + - 1, + self._Enabled + ) + if self._SubsectionType == MODEL_UNKNOWN and self._InSubsection: + OwnerId[Arch] = self._LastItem + + if self._DirectiveStack: + Type, Line, Text = self._DirectiveStack[-1] + EdkLogger.error('Parser', FORMAT_INVALID, "No matching '!endif' found", + ExtraData=Text, File=self.MetaFile, Line=Line) + self._Done() + + ## parser + def _SubsectionHeaderParser(self): + self._SubsectionName = self._CurrentLine[1:-1].upper() + if self._SubsectionName in self.DataType: + self._SubsectionType = self.DataType[self._SubsectionName] + else: + self._SubsectionType = MODEL_UNKNOWN + EdkLogger.warn("Parser", "Unrecognized sub-section", File=self.MetaFile, + Line=self._LineIndex + 1, ExtraData=self._CurrentLine) + self._ValueList[0] = self._SubsectionName + + ## Directive statement parser + def _DirectiveParser(self): + self._ValueList = ['', '', ''] + TokenList = GetSplitValueList(self._CurrentLine, ' ', 1) + self._ValueList[0:len(TokenList)] = TokenList + + # Syntax check + DirectiveName = self._ValueList[0].upper() + if DirectiveName not in self.DataType: + EdkLogger.error("Parser", FORMAT_INVALID, "Unknown directive [%s]" % DirectiveName, + File=self.MetaFile, Line=self._LineIndex + 1) + + if DirectiveName in ['!IF', '!IFDEF', '!IFNDEF']: + self._InDirective += 1 + + if DirectiveName in ['!ENDIF']: + self._InDirective -= 1 + + if DirectiveName in ['!IF', '!IFDEF', '!INCLUDE', '!IFNDEF', '!ELSEIF'] and self._ValueList[1] == '': + EdkLogger.error("Parser", FORMAT_INVALID, "Missing expression", + File=self.MetaFile, Line=self._LineIndex + 1, + ExtraData=self._CurrentLine) + + ItemType = self.DataType[DirectiveName] + Scope = [['COMMON', 'COMMON']] + if ItemType == MODEL_META_DATA_INCLUDE: + Scope = self._Scope + if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: + # Remove all directives between !if and !endif, including themselves + while self._DirectiveStack: + # Remove any !else or !elseif + DirectiveInfo = self._DirectiveStack.pop() + if DirectiveInfo[0] in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + break + else: + EdkLogger.error("Parser", FORMAT_INVALID, "Redundant '!endif'", + File=self.MetaFile, Line=self._LineIndex + 1, + ExtraData=self._CurrentLine) + elif ItemType != MODEL_META_DATA_INCLUDE: + # Break if there's a !else is followed by a !elseif + if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF and \ + self._DirectiveStack and \ + self._DirectiveStack[-1][0] == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: + EdkLogger.error("Parser", FORMAT_INVALID, "'!elseif' after '!else'", + File=self.MetaFile, Line=self._LineIndex + 1, + ExtraData=self._CurrentLine) + self._DirectiveStack.append((ItemType, self._LineIndex + 1, self._CurrentLine)) + elif self._From > 0: + EdkLogger.error('Parser', FORMAT_INVALID, + "No '!include' allowed in included file", + ExtraData=self._CurrentLine, File=self.MetaFile, + Line=self._LineIndex + 1) + + # + # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, + # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1 + # + for Arch, ModuleType in Scope: + self._LastItem = self._Store( + ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + ModuleType, + self._Owner[-1], + self._From, + self._LineIndex + 1, + - 1, + self._LineIndex + 1, + - 1, + 0 + ) + + ## [defines] section parser + @ParseMacro + def _DefineParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + self._ValueList[1:len(TokenList)] = TokenList + + # Syntax check + if not self._ValueList[1]: + EdkLogger.error('Parser', FORMAT_INVALID, "No name specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + if not self._ValueList[2]: + EdkLogger.error('Parser', FORMAT_INVALID, "No value specified", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + if not self._ValueList[1] in self.DefineKeywords: + EdkLogger.error('Parser', FORMAT_INVALID, + "Unknown keyword found: %s. " + "If this is a macro you must " + "add it as a DEFINE in the DSC" % self._ValueList[1], + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + self._Defines[self._ValueList[1]] = self._ValueList[2] + self._ItemType = self.DataType[TAB_DSC_DEFINES.upper()] + + @ParseMacro + def _SkuIdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + if len(TokenList) != 2: + EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '|'", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + self._ValueList[0:len(TokenList)] = TokenList + + ## Parse Edk style of library modules + @ParseMacro + def _LibraryInstanceParser(self): + self._ValueList[0] = self._CurrentLine + + ## PCD sections parser + # + # [PcdsFixedAtBuild] + # [PcdsPatchableInModule] + # [PcdsFeatureFlag] + # [PcdsDynamicEx + # [PcdsDynamicExDefault] + # [PcdsDynamicExVpd] + # [PcdsDynamicExHii] + # [PcdsDynamic] + # [PcdsDynamicDefault] + # [PcdsDynamicVpd] + # [PcdsDynamicHii] + # + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) + if len(TokenList) == 2: + self._ValueList[2] = TokenList[1] + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + " (.|)", + File=self.MetaFile, Line=self._LineIndex + 1) + if self._ValueList[2] == '': + # + # The PCD values are optional for FIXEDATBUILD and PATCHABLEINMODULE + # + if self._SectionType in (MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE): + return + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given", + ExtraData=self._CurrentLine + " (.|)", + File=self.MetaFile, Line=self._LineIndex + 1) + + # Validate the datum type of Dynamic Defaul PCD and DynamicEx Default PCD + ValueList = GetSplitValueList(self._ValueList[2]) + if len(ValueList) > 1 and ValueList[1] != TAB_VOID \ + and self._ItemType in [MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT]: + EdkLogger.error('Parser', FORMAT_INVALID, "The datum type '%s' of PCD is wrong" % ValueList[1], + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + + # if value are 'True', 'true', 'TRUE' or 'False', 'false', 'FALSE', replace with integer 1 or 0. + DscPcdValueList = GetSplitValueList(TokenList[1], TAB_VALUE_SPLIT, 1) + if DscPcdValueList[0] in ['True', 'true', 'TRUE']: + self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '1', 1); + elif DscPcdValueList[0] in ['False', 'false', 'FALSE']: + self._ValueList[2] = TokenList[1].replace(DscPcdValueList[0], '0', 1); + + + ## [components] section parser + @ParseMacro + def _ComponentParser(self): + if self._CurrentLine[-1] == '{': + self._ValueList[0] = self._CurrentLine[0:-1].strip() + self._InSubsection = True + else: + self._ValueList[0] = self._CurrentLine + + ## [LibraryClasses] section + @ParseMacro + def _LibraryClassParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No library class or instance specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex + 1) + if TokenList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No library class specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex + 1) + if TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No library instance specified", + ExtraData=self._CurrentLine + " (|)", + File=self.MetaFile, Line=self._LineIndex + 1) + + self._ValueList[0:len(TokenList)] = TokenList + + def _CompponentSourceOverridePathParser(self): + self._ValueList[0] = self._CurrentLine + + ## [BuildOptions] section parser + @ParseMacro + def _BuildOptionParser(self): + self._CurrentLine = CleanString(self._CurrentLine, BuildOption=True) + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + TokenList2 = GetSplitValueList(TokenList[0], ':', 1) + if len(TokenList2) == 2: + self._ValueList[0] = TokenList2[0] # toolchain family + self._ValueList[1] = TokenList2[1] # keys + else: + self._ValueList[1] = TokenList[0] + if len(TokenList) == 2: # value + self._ValueList[2] = TokenList[1] + + if self._ValueList[1].count('_') != 4: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "'%s' must be in format of ____FLAGS" % self._ValueList[1], + ExtraData=self._CurrentLine, + File=self.MetaFile, + Line=self._LineIndex + 1 + ) + + ## Override parent's method since we'll do all macro replacements in parser + def _GetMacros(self): + Macros = {} + Macros.update(self._FileLocalMacros) + Macros.update(self._GetApplicableSectionMacro()) + Macros.update(GlobalData.gEdkGlobal) + Macros.update(GlobalData.gPlatformDefines) + Macros.update(GlobalData.gCommandLineDefines) + # PCD cannot be referenced in macro definition + if self._ItemType not in [MODEL_META_DATA_DEFINE, MODEL_META_DATA_GLOBAL_DEFINE]: + Macros.update(self._Symbols) + return Macros + + def _PostProcess(self): + Processer = { + MODEL_META_DATA_SECTION_HEADER : self.__ProcessSectionHeader, + MODEL_META_DATA_SUBSECTION_HEADER : self.__ProcessSubsectionHeader, + MODEL_META_DATA_HEADER : self.__ProcessDefine, + MODEL_META_DATA_DEFINE : self.__ProcessDefine, + MODEL_META_DATA_GLOBAL_DEFINE : self.__ProcessDefine, + MODEL_META_DATA_INCLUDE : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF : self.__ProcessDirective, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF : self.__ProcessDirective, + MODEL_EFI_SKU_ID : self.__ProcessSkuId, + MODEL_EFI_LIBRARY_INSTANCE : self.__ProcessLibraryInstance, + MODEL_EFI_LIBRARY_CLASS : self.__ProcessLibraryClass, + MODEL_PCD_FIXED_AT_BUILD : self.__ProcessPcd, + MODEL_PCD_PATCHABLE_IN_MODULE : self.__ProcessPcd, + MODEL_PCD_FEATURE_FLAG : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_DEFAULT : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_HII : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_VPD : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_DEFAULT : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_HII : self.__ProcessPcd, + MODEL_PCD_DYNAMIC_EX_VPD : self.__ProcessPcd, + MODEL_META_DATA_COMPONENT : self.__ProcessComponent, + MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : self.__ProcessSourceOverridePath, + MODEL_META_DATA_BUILD_OPTION : self.__ProcessBuildOption, + MODEL_UNKNOWN : self._Skip, + MODEL_META_DATA_USER_EXTENSION : self._Skip, + } + + self._Table = MetaFileStorage(self._RawTable.Cur, self.MetaFile, MODEL_FILE_DSC, True) + self._Table.Create() + self._DirectiveStack = [] + self._DirectiveEvalStack = [] + self._FileWithError = self.MetaFile + self._FileLocalMacros = {} + self._SectionsMacroDict = {} + GlobalData.gPlatformDefines = {} + + # Get all macro and PCD which has straitforward value + self.__RetrievePcdValue() + self._Content = self._RawTable.GetAll() + self._ContentIndex = 0 + while self._ContentIndex < len(self._Content) : + Id, self._ItemType, V1, V2, V3, S1, S2, Owner, self._From, \ + LineStart, ColStart, LineEnd, ColEnd, Enabled = self._Content[self._ContentIndex] + + if self._From < 0: + self._FileWithError = self.MetaFile + + self._ContentIndex += 1 + + self._Scope = [[S1, S2]] + # + # For !include directive, handle it specially, + # merge arch and module type in case of duplicate items + # + while self._ItemType == MODEL_META_DATA_INCLUDE: + if self._ContentIndex >= len(self._Content): + break + Record = self._Content[self._ContentIndex] + if LineStart == Record[9] and LineEnd == Record[11]: + if [Record[5], Record[6]] not in self._Scope: + self._Scope.append([Record[5], Record[6]]) + self._ContentIndex += 1 + else: + break + + self._LineIndex = LineStart - 1 + self._ValueList = [V1, V2, V3] + + try: + Processer[self._ItemType]() + except EvaluationException, Excpt: + # + # Only catch expression evaluation error here. We need to report + # the precise number of line on which the error occurred + # + if hasattr(Excpt, 'Pcd'): + if Excpt.Pcd in GlobalData.gPlatformOtherPcds: + Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd] + EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as" + " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section" + " of the DSC file, and it is currently defined in this section:" + " %s, line #: %d." % (Excpt.Pcd, Info[0], Info[1]), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex + 1) + else: + EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd, + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex + 1) + else: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex + 1) + except MacroException, Excpt: + EdkLogger.error('Parser', FORMAT_INVALID, str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex + 1) + + if self._ValueList == None: + continue + + NewOwner = self._IdMapping.get(Owner, -1) + self._Enabled = int((not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack)) + self._LastItem = self._Store( + self._ItemType, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + S1, + S2, + NewOwner, + self._From, + self._LineIndex + 1, + - 1, + self._LineIndex + 1, + - 1, + self._Enabled + ) + self._IdMapping[Id] = self._LastItem + + GlobalData.gPlatformDefines.update(self._FileLocalMacros) + self._PostProcessed = True + self._Content = None + + def __ProcessSectionHeader(self): + self._SectionName = self._ValueList[0] + if self._SectionName in self.DataType: + self._SectionType = self.DataType[self._SectionName] + else: + self._SectionType = MODEL_UNKNOWN + + def __ProcessSubsectionHeader(self): + self._SubsectionName = self._ValueList[0] + if self._SubsectionName in self.DataType: + self._SubsectionType = self.DataType[self._SubsectionName] + else: + self._SubsectionType = MODEL_UNKNOWN + + def __RetrievePcdValue(self): + Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem= -1.0) + for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: + Name = TokenSpaceGuid + '.' + PcdName + ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FEATURE_FLAG) + self._Symbols[Name] = ValList[Index] + + Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem= -1.0) + for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: + Name = TokenSpaceGuid + '.' + PcdName + ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FIXED_AT_BUILD) + self._Symbols[Name] = ValList[Index] + + Content = open(str(self.MetaFile), 'r').readlines() + GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile) + for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII, + MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_DYNAMIC_EX_HII, + MODEL_PCD_DYNAMIC_EX_VPD): + Records = self._RawTable.Query(PcdType, BelongsToItem= -1.0) + for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records: + Name = TokenSpaceGuid + '.' + PcdName + if Name not in GlobalData.gPlatformOtherPcds: + PcdLine = Line + while not Content[Line - 1].lstrip().startswith(TAB_SECTION_START): + Line -= 1 + GlobalData.gPlatformOtherPcds[Name] = (CleanString(Content[Line - 1]), PcdLine, PcdType) + + def __ProcessDefine(self): + if not self._Enabled: + return + + Type, Name, Value = self._ValueList + Value = ReplaceMacro(Value, self._Macros, False) + if self._ItemType == MODEL_META_DATA_DEFINE: + if self._SectionType == MODEL_META_DATA_HEADER: + self._FileLocalMacros[Name] = Value + else: + self._ConstructSectionMacroDict(Name, Value) + elif self._ItemType == MODEL_META_DATA_GLOBAL_DEFINE: + GlobalData.gEdkGlobal[Name] = Value + + # + # Keyword in [Defines] section can be used as Macros + # + if (self._ItemType == MODEL_META_DATA_HEADER) and (self._SectionType == MODEL_META_DATA_HEADER): + self._FileLocalMacros[Name] = Value + + self._ValueList = [Type, Name, Value] + + def __ProcessDirective(self): + Result = None + if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF]: + Macros = self._Macros + Macros.update(GlobalData.gGlobalDefines) + try: + Result = ValueExpression(self._ValueList[1], Macros)() + except SymbolNotFound, Exc: + EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc), self._ValueList[1]) + Result = False + except WrnExpression, Excpt: + # + # Catch expression evaluation warning here. We need to report + # the precise number of line and return the evaluation result + # + EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt), + File=self._FileWithError, ExtraData=' '.join(self._ValueList), + Line=self._LineIndex + 1) + Result = Excpt.result + + if self._ItemType in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + self._DirectiveStack.append(self._ItemType) + if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IF: + Result = bool(Result) + else: + Macro = self._ValueList[1] + Macro = Macro[2:-1] if (Macro.startswith("$(") and Macro.endswith(")")) else Macro + Result = Macro in self._Macros + if self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF: + Result = not Result + self._DirectiveEvalStack.append(Result) + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF: + self._DirectiveStack.append(self._ItemType) + self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] + self._DirectiveEvalStack.append(bool(Result)) + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE: + self._DirectiveStack.append(self._ItemType) + self._DirectiveEvalStack[-1] = not self._DirectiveEvalStack[-1] + self._DirectiveEvalStack.append(True) + elif self._ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF: + # Back to the nearest !if/!ifdef/!ifndef + while self._DirectiveStack: + self._DirectiveEvalStack.pop() + Directive = self._DirectiveStack.pop() + if Directive in [MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF, + MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: + break + elif self._ItemType == MODEL_META_DATA_INCLUDE: + # The included file must be relative to workspace or same directory as DSC file + __IncludeMacros = {} + # + # Allow using system environment variables in path after !include + # + __IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE'] + if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE'] + # + # During GenFds phase call DSC parser, will go into this branch. + # + elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE'] + + __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE'] + __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE'] + # + # Allow using MACROs comes from [Defines] section to keep compatible. + # + __IncludeMacros.update(self._Macros) + + IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True)) + # + # First search the include file under the same directory as DSC file + # + IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir) + ErrorCode, ErrorInfo1 = IncludedFile1.Validate() + if ErrorCode != 0: + # + # Also search file under the WORKSPACE directory + # + IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) + ErrorCode, ErrorInfo2 = IncludedFile1.Validate() + if ErrorCode != 0: + EdkLogger.error('parser', ErrorCode, File=self._FileWithError, + Line=self._LineIndex + 1, ExtraData=ErrorInfo1 + "\n" + ErrorInfo2) + + self._FileWithError = IncludedFile1 + + IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False) + Owner = self._Content[self._ContentIndex - 1][0] + Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable, + Owner=Owner, From=Owner) + + # set the parser status with current status + Parser._SectionName = self._SectionName + Parser._SectionType = self._SectionType + Parser._Scope = self._Scope + Parser._Enabled = self._Enabled + # Parse the included file + Parser.Start() + + # update current status with sub-parser's status + self._SectionName = Parser._SectionName + self._SectionType = Parser._SectionType + self._Scope = Parser._Scope + self._Enabled = Parser._Enabled + + # Insert all records in the table for the included file into dsc file table + Records = IncludedFileTable.GetAll() + if Records: + self._Content[self._ContentIndex:self._ContentIndex] = Records + self._Content.pop(self._ContentIndex - 1) + self._ValueList = None + self._ContentIndex -= 1 + + def __ProcessSkuId(self): + self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) + for Value in self._ValueList] + + def __ProcessLibraryInstance(self): + self._ValueList = [ReplaceMacro(Value, self._Macros) for Value in self._ValueList] + + def __ProcessLibraryClass(self): + self._ValueList[1] = ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True) + + def __ProcessPcd(self): + if self._ItemType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]: + self._ValueList[2] = ReplaceMacro(self._ValueList[2], self._Macros, RaiseError=True) + return + + ValList, Valid, Index = AnalyzeDscPcd(self._ValueList[2], self._ItemType) + if not Valid: + EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self._FileWithError, Line=self._LineIndex+1, + ExtraData="%s.%s|%s" % (self._ValueList[0], self._ValueList[1], self._ValueList[2])) + PcdValue = ValList[Index] + if PcdValue: + try: + ValList[Index] = ValueExpression(PcdValue, self._Macros)(True) + except WrnExpression, Value: + ValList[Index] = Value.result + + if ValList[Index] == 'True': + ValList[Index] = '1' + if ValList[Index] == 'False': + ValList[Index] = '0' + + GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue + self._ValueList[2] = '|'.join(ValList) + + def __ProcessComponent(self): + self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) + + def __ProcessSourceOverridePath(self): + self._ValueList[0] = ReplaceMacro(self._ValueList[0], self._Macros) + + def __ProcessBuildOption(self): + self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=False) + for Value in self._ValueList] + + _SectionParser = { + MODEL_META_DATA_HEADER : _DefineParser, + MODEL_EFI_SKU_ID : _SkuIdParser, + MODEL_EFI_LIBRARY_INSTANCE : _LibraryInstanceParser, + MODEL_EFI_LIBRARY_CLASS : _LibraryClassParser, + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC_DEFAULT : _PcdParser, + MODEL_PCD_DYNAMIC_HII : _PcdParser, + MODEL_PCD_DYNAMIC_VPD : _PcdParser, + MODEL_PCD_DYNAMIC_EX_DEFAULT : _PcdParser, + MODEL_PCD_DYNAMIC_EX_HII : _PcdParser, + MODEL_PCD_DYNAMIC_EX_VPD : _PcdParser, + MODEL_META_DATA_COMPONENT : _ComponentParser, + MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH : _CompponentSourceOverridePathParser, + MODEL_META_DATA_BUILD_OPTION : _BuildOptionParser, + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + MODEL_META_DATA_SECTION_HEADER : MetaFileParser._SectionHeaderParser, + MODEL_META_DATA_SUBSECTION_HEADER : _SubsectionHeaderParser, + } + + _Macros = property(_GetMacros) + +## DEC file parser class +# +# @param FilePath The path of platform description file +# @param FileType The raw data of DSC file +# @param Table Database used to retrieve module/package information +# @param Macros Macros used for replacement in file +# +class DecParser(MetaFileParser): + # DEC file supported data types (one type per section) + DataType = { + TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER, + TAB_DSC_DEFINES_DEFINE : MODEL_META_DATA_DEFINE, + TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, + TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, + TAB_GUIDS.upper() : MODEL_EFI_GUID, + TAB_PPIS.upper() : MODEL_EFI_PPI, + TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, + TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, + TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, + TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, + TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC, + TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX, + } + + ## Constructor of DecParser + # + # Initialize object of DecParser + # + # @param FilePath The path of platform description file + # @param FileType The raw data of DSC file + # @param Table Database used to retrieve module/package information + # @param Macros Macros used for replacement in file + # + def __init__(self, FilePath, FileType, Table): + # prevent re-initialization + if hasattr(self, "_Table"): + return + MetaFileParser.__init__(self, FilePath, FileType, Table, -1) + self._Comments = [] + self._Version = 0x00010005 # Only EDK2 dec file is supported + self._AllPCDs = [] # Only for check duplicate PCD + + ## Parser starter + def Start(self): + Content = '' + try: + Content = open(str(self.MetaFile), 'r').readlines() + except: + EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) + + for Index in range(0, len(Content)): + Line, Comment = CleanString2(Content[Index]) + self._CurrentLine = Line + self._LineIndex = Index + + # save comment for later use + if Comment: + self._Comments.append((Comment, self._LineIndex + 1)) + # skip empty line + if Line == '': + continue + + # section header + if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END: + self._SectionHeaderParser() + self._Comments = [] + continue + elif len(self._SectionType) == 0: + self._Comments = [] + continue + + # section content + self._ValueList = ['', '', ''] + self._SectionParser[self._SectionType[0]](self) + if self._ValueList == None or self._ItemType == MODEL_META_DATA_DEFINE: + self._ItemType = -1 + self._Comments = [] + continue + + # + # Model, Value1, Value2, Value3, Arch, BelongsToItem=-1, LineBegin=-1, + # ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, FeatureFlag='', Enabled=-1 + # + for Arch, ModuleType, Type in self._Scope: + self._LastItem = self._Store( + Type, + self._ValueList[0], + self._ValueList[1], + self._ValueList[2], + Arch, + ModuleType, + self._Owner[-1], + self._LineIndex + 1, + - 1, + self._LineIndex + 1, + - 1, + 0 + ) + for Comment, LineNo in self._Comments: + self._Store( + MODEL_META_DATA_COMMENT, + Comment, + self._ValueList[0], + self._ValueList[1], + Arch, + ModuleType, + self._LastItem, + LineNo, + - 1, + LineNo, + - 1, + 0 + ) + self._Comments = [] + self._Done() + + + ## Section header parser + # + # The section header is always in following format: + # + # [section_name.arch<.platform|module_type>] + # + def _SectionHeaderParser(self): + self._Scope = [] + self._SectionName = '' + self._SectionType = [] + ArchList = set() + Line = self._CurrentLine.replace("%s%s" % (TAB_COMMA_SPLIT, TAB_SPACE_SPLIT), TAB_COMMA_SPLIT) + for Item in Line[1:-1].split(TAB_COMMA_SPLIT): + if Item == '': + EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, + "section name can NOT be empty or incorrectly use separator comma", + self.MetaFile, self._LineIndex + 1, self._CurrentLine) + ItemList = Item.split(TAB_SPLIT) + + # different types of PCD are permissible in one section + self._SectionName = ItemList[0].upper() + if self._SectionName in self.DataType: + if self.DataType[self._SectionName] not in self._SectionType: + self._SectionType.append(self.DataType[self._SectionName]) + else: + EdkLogger.error("Parser", FORMAT_UNKNOWN_ERROR, "%s is not a valid section name" % Item, + self.MetaFile, self._LineIndex + 1, self._CurrentLine) + + if MODEL_PCD_FEATURE_FLAG in self._SectionType and len(self._SectionType) > 1: + EdkLogger.error( + 'Parser', + FORMAT_INVALID, + "%s must not be in the same section of other types of PCD" % TAB_PCDS_FEATURE_FLAG_NULL, + File=self.MetaFile, + Line=self._LineIndex + 1, + ExtraData=self._CurrentLine + ) + # S1 is always Arch + if len(ItemList) > 1: + S1 = ItemList[1].upper() + else: + S1 = 'COMMON' + ArchList.add(S1) + # S2 may be Platform or ModuleType + if len(ItemList) > 2: + S2 = ItemList[2].upper() + else: + S2 = 'COMMON' + if [S1, S2, self.DataType[self._SectionName]] not in self._Scope: + self._Scope.append([S1, S2, self.DataType[self._SectionName]]) + + # 'COMMON' must not be used with specific ARCHs at the same section + if 'COMMON' in ArchList and len(ArchList) > 1: + EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs", + File=self.MetaFile, Line=self._LineIndex + 1, ExtraData=self._CurrentLine) + + ## [guids], [ppis] and [protocols] section parser + @ParseMacro + def _GuidParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1) + if len(TokenList) < 2: + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name or value specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex + 1) + if TokenList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID name specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex + 1) + if TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No GUID value specified", + ExtraData=self._CurrentLine + " ( = )", + File=self.MetaFile, Line=self._LineIndex + 1) + if TokenList[1][0] != '{' or TokenList[1][-1] != '}' or GuidStructureStringToGuidString(TokenList[1]) == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid GUID value format", + ExtraData=self._CurrentLine + \ + " ( = )", + File=self.MetaFile, Line=self._LineIndex + 1) + self._ValueList[0] = TokenList[0] + self._ValueList[1] = TokenList[1] + + ## PCD sections parser + # + # [PcdsFixedAtBuild] + # [PcdsPatchableInModule] + # [PcdsFeatureFlag] + # [PcdsDynamicEx + # [PcdsDynamic] + # + @ParseMacro + def _PcdParser(self): + TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) + self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) + ValueRe = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*') + # check PCD information + if self._ValueList[0] == '' or self._ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check format of token space GUID CName + if not ValueRe.match(self._ValueList[0]): + EdkLogger.error('Parser', FORMAT_INVALID, "The format of the token space GUID CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check format of PCD CName + if not ValueRe.match(self._ValueList[1]): + EdkLogger.error('Parser', FORMAT_INVALID, "The format of the PCD CName is invalid. The correct format is '(a-zA-Z_)[a-zA-Z0-9_]*'", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check PCD datum information + if len(TokenList) < 2 or TokenList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "No PCD Datum information given", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + + + ValueRe = re.compile(r'^\s*L?\".*\|.*\"') + PtrValue = ValueRe.findall(TokenList[1]) + + # Has VOID* type string, may contain "|" character in the string. + if len(PtrValue) != 0: + ptrValueList = re.sub(ValueRe, '', TokenList[1]) + ValueList = GetSplitValueList(ptrValueList) + ValueList[0] = PtrValue[0] + else: + ValueList = GetSplitValueList(TokenList[1]) + + + # check if there's enough datum information given + if len(ValueList) != 3: + EdkLogger.error('Parser', FORMAT_INVALID, "Invalid PCD Datum information given", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check default value + if ValueList[0] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DefaultValue in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check datum type + if ValueList[1] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing DatumType in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check token of the PCD + if ValueList[2] == '': + EdkLogger.error('Parser', FORMAT_INVALID, "Missing Token in PCD Datum information", + ExtraData=self._CurrentLine + \ + " (.|||)", + File=self.MetaFile, Line=self._LineIndex + 1) + # check format of default value against the datum type + IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0]) + if not IsValid: + EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine, + File=self.MetaFile, Line=self._LineIndex + 1) + + if ValueList[0] in ['True', 'true', 'TRUE']: + ValueList[0] = '1' + elif ValueList[0] in ['False', 'false', 'FALSE']: + ValueList[0] = '0' + + # check for duplicate PCD definition + if (self._Scope[0], self._ValueList[0], self._ValueList[1]) in self._AllPCDs: + EdkLogger.error('Parser', FORMAT_INVALID, + "The same PCD name and GUID have been already defined", + ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1) + else: + self._AllPCDs.append((self._Scope[0], self._ValueList[0], self._ValueList[1])) + + self._ValueList[2] = ValueList[0].strip() + '|' + ValueList[1].strip() + '|' + ValueList[2].strip() + + _SectionParser = { + MODEL_META_DATA_HEADER : MetaFileParser._DefineParser, + MODEL_EFI_INCLUDE : MetaFileParser._PathParser, + MODEL_EFI_LIBRARY_CLASS : MetaFileParser._PathParser, + MODEL_EFI_GUID : _GuidParser, + MODEL_EFI_PPI : _GuidParser, + MODEL_EFI_PROTOCOL : _GuidParser, + MODEL_PCD_FIXED_AT_BUILD : _PcdParser, + MODEL_PCD_PATCHABLE_IN_MODULE : _PcdParser, + MODEL_PCD_FEATURE_FLAG : _PcdParser, + MODEL_PCD_DYNAMIC : _PcdParser, + MODEL_PCD_DYNAMIC_EX : _PcdParser, + MODEL_UNKNOWN : MetaFileParser._Skip, + MODEL_META_DATA_USER_EXTENSION : MetaFileParser._Skip, + } + +## +# +# This acts like the main() function for the script, unless it is 'import'ed into another +# script. +# +if __name__ == '__main__': + pass + diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index 262ec65e64..3444e4f053 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -1811,7 +1811,7 @@ class InfBuildData(ModuleBuildClassObject): else: Tool = ToolList[0] ToolChain = "*_*_*_%s_FLAGS" % Tool - ToolChainFamily = '' + ToolChainFamily = 'MSFT' # Edk.x only support MSFT tool chain #ignore not replaced macros in value ValueList = GetSplitList(' ' + Value, '/D') Dummy = ValueList[0] diff --git a/BaseTools/Source/Python/sitecustomize.py b/BaseTools/Source/Python/sitecustomize.py index 22501f8bae..ec463ea5fa 100644 --- a/BaseTools/Source/Python/sitecustomize.py +++ b/BaseTools/Source/Python/sitecustomize.py @@ -1,19 +1,19 @@ -# -# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -import sys -import locale - -if sys.platform == "darwin": - DefaultLocal = locale.getdefaultlocale()[1] - if DefaultLocal is None: - DefaultLocal = 'UTF8' - sys.setdefaultencoding(DefaultLocal) - +# +# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +import sys +import locale + +if sys.platform == "darwin": + DefaultLocal = locale.getdefaultlocale()[1] + if DefaultLocal is None: + DefaultLocal = 'UTF8' + sys.setdefaultencoding(DefaultLocal) + diff --git a/BaseTools/Tests/CToolsTests.py b/BaseTools/Tests/CToolsTests.py index 67681ea77f..ab75d9a7dc 100644 --- a/BaseTools/Tests/CToolsTests.py +++ b/BaseTools/Tests/CToolsTests.py @@ -1,35 +1,35 @@ -## @file -# Unit tests for C based BaseTools -# -# Copyright (c) 2008, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import unittest - -import TianoCompress -modules = ( - TianoCompress, - ) - - -def TheTestSuite(): - suites = map(lambda module: module.TheTestSuite(), modules) - return unittest.TestSuite(suites) - -if __name__ == '__main__': - allTests = TheTestSuite() - unittest.TextTestRunner().run(allTests) - +## @file +# Unit tests for C based BaseTools +# +# Copyright (c) 2008, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import unittest + +import TianoCompress +modules = ( + TianoCompress, + ) + + +def TheTestSuite(): + suites = map(lambda module: module.TheTestSuite(), modules) + return unittest.TestSuite(suites) + +if __name__ == '__main__': + allTests = TheTestSuite() + unittest.TextTestRunner().run(allTests) + diff --git a/BaseTools/Tests/CheckPythonSyntax.py b/BaseTools/Tests/CheckPythonSyntax.py index e27c341c0c..61a048ad5d 100644 --- a/BaseTools/Tests/CheckPythonSyntax.py +++ b/BaseTools/Tests/CheckPythonSyntax.py @@ -1,74 +1,74 @@ -## @file -# Unit tests for checking syntax of Python source code -# -# Copyright (c) 2009, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import unittest -import py_compile - -import TestTools - -class Tests(TestTools.BaseToolsTest): - - def setUp(self): - TestTools.BaseToolsTest.setUp(self) - - def SingleFileTest(self, filename): - try: - py_compile.compile(filename, doraise=True) - except Exception, e: - self.fail('syntax error: %s, Error is %s' % (filename, str(e))) - -def MakePythonSyntaxCheckTests(): - def GetAllPythonSourceFiles(): - pythonSourceFiles = [] - for (root, dirs, files) in os.walk(TestTools.PythonSourceDir): - for filename in files: - if filename.lower().endswith('.py'): - pythonSourceFiles.append( - os.path.join(root, filename) - ) - return pythonSourceFiles - - def MakeTestName(filename): - assert filename.lower().endswith('.py') - name = filename[:-3] - name = name.replace(TestTools.PythonSourceDir, '') - name = name.replace(os.path.sep, '_') - return 'test' + name - - def MakeNewTest(filename): - test = MakeTestName(filename) - newmethod = lambda self: self.SingleFileTest(filename) - setattr( - Tests, - test, - newmethod - ) - - for filename in GetAllPythonSourceFiles(): - MakeNewTest(filename) - -MakePythonSyntaxCheckTests() -del MakePythonSyntaxCheckTests - -TheTestSuite = TestTools.MakeTheTestSuite(locals()) - -if __name__ == '__main__': - allTests = TheTestSuite() - unittest.TextTestRunner().run(allTests) - - +## @file +# Unit tests for checking syntax of Python source code +# +# Copyright (c) 2009, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import unittest +import py_compile + +import TestTools + +class Tests(TestTools.BaseToolsTest): + + def setUp(self): + TestTools.BaseToolsTest.setUp(self) + + def SingleFileTest(self, filename): + try: + py_compile.compile(filename, doraise=True) + except Exception, e: + self.fail('syntax error: %s, Error is %s' % (filename, str(e))) + +def MakePythonSyntaxCheckTests(): + def GetAllPythonSourceFiles(): + pythonSourceFiles = [] + for (root, dirs, files) in os.walk(TestTools.PythonSourceDir): + for filename in files: + if filename.lower().endswith('.py'): + pythonSourceFiles.append( + os.path.join(root, filename) + ) + return pythonSourceFiles + + def MakeTestName(filename): + assert filename.lower().endswith('.py') + name = filename[:-3] + name = name.replace(TestTools.PythonSourceDir, '') + name = name.replace(os.path.sep, '_') + return 'test' + name + + def MakeNewTest(filename): + test = MakeTestName(filename) + newmethod = lambda self: self.SingleFileTest(filename) + setattr( + Tests, + test, + newmethod + ) + + for filename in GetAllPythonSourceFiles(): + MakeNewTest(filename) + +MakePythonSyntaxCheckTests() +del MakePythonSyntaxCheckTests + +TheTestSuite = TestTools.MakeTheTestSuite(locals()) + +if __name__ == '__main__': + allTests = TheTestSuite() + unittest.TextTestRunner().run(allTests) + + diff --git a/BaseTools/Tests/PythonToolsTests.py b/BaseTools/Tests/PythonToolsTests.py index 7db5855e0b..6096e212a9 100644 --- a/BaseTools/Tests/PythonToolsTests.py +++ b/BaseTools/Tests/PythonToolsTests.py @@ -1,32 +1,32 @@ -## @file -# Unit tests for Python based BaseTools -# -# Copyright (c) 2008, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import unittest - - -def TheTestSuite(): - suites = [] - import CheckPythonSyntax - suites.append(CheckPythonSyntax.TheTestSuite()) - return unittest.TestSuite(suites) - -if __name__ == '__main__': - allTests = TheTestSuite() - unittest.TextTestRunner().run(allTests) - +## @file +# Unit tests for Python based BaseTools +# +# Copyright (c) 2008, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import unittest + + +def TheTestSuite(): + suites = [] + import CheckPythonSyntax + suites.append(CheckPythonSyntax.TheTestSuite()) + return unittest.TestSuite(suites) + +if __name__ == '__main__': + allTests = TheTestSuite() + unittest.TextTestRunner().run(allTests) + diff --git a/BaseTools/Tests/RunTests.py b/BaseTools/Tests/RunTests.py index 193bc60625..e8ca2d055e 100644 --- a/BaseTools/Tests/RunTests.py +++ b/BaseTools/Tests/RunTests.py @@ -1,40 +1,40 @@ -## @file -# Unit tests for BaseTools utilities -# -# Copyright (c) 2008, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import sys -import unittest - -import TestTools - -sys.path.append(TestTools.PythonSourceDir) - -def GetCTestSuite(): - import CToolsTests - return CToolsTests.TheTestSuite() - -def GetPythonTestSuite(): - import PythonToolsTests - return PythonToolsTests.TheTestSuite() - -def GetAllTestsSuite(): - return unittest.TestSuite([GetCTestSuite(), GetPythonTestSuite()]) - -if __name__ == '__main__': - allTests = GetAllTestsSuite() - unittest.TextTestRunner(verbosity=2).run(allTests) - +## @file +# Unit tests for BaseTools utilities +# +# Copyright (c) 2008, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import sys +import unittest + +import TestTools + +sys.path.append(TestTools.PythonSourceDir) + +def GetCTestSuite(): + import CToolsTests + return CToolsTests.TheTestSuite() + +def GetPythonTestSuite(): + import PythonToolsTests + return PythonToolsTests.TheTestSuite() + +def GetAllTestsSuite(): + return unittest.TestSuite([GetCTestSuite(), GetPythonTestSuite()]) + +if __name__ == '__main__': + allTests = GetAllTestsSuite() + unittest.TextTestRunner(verbosity=2).run(allTests) + diff --git a/BaseTools/Tests/TestTools.py b/BaseTools/Tests/TestTools.py index e838ae4294..ac009db1fa 100644 --- a/BaseTools/Tests/TestTools.py +++ b/BaseTools/Tests/TestTools.py @@ -1,179 +1,179 @@ -## @file -# Utility functions and classes for BaseTools unit tests -# -# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import base64 -import os -import os.path -import random -import shutil -import subprocess -import sys -import types -import unittest - -TestsDir = os.path.realpath(os.path.split(sys.argv[0])[0]) -BaseToolsDir = os.path.realpath(os.path.join(TestsDir, '..')) -CSourceDir = os.path.join(BaseToolsDir, 'Source', 'C') -PythonSourceDir = os.path.join(BaseToolsDir, 'Source', 'Python') -TestTempDir = os.path.join(TestsDir, 'TestTempDir') - -def MakeTheTestSuite(localItems): - tests = [] - for name, item in localItems.iteritems(): - if isinstance(item, types.TypeType): - if issubclass(item, unittest.TestCase): - tests.append(unittest.TestLoader().loadTestsFromTestCase(item)) - elif issubclass(item, unittest.TestSuite): - tests.append(item()) - return lambda: unittest.TestSuite(tests) - -def GetBaseToolsPaths(): - if sys.platform in ('win32', 'win64'): - return [ os.path.join(BaseToolsDir, 'Bin', sys.platform.title()) ] - else: - uname = os.popen('uname -sm').read().strip() - for char in (' ', '/'): - uname = uname.replace(char, '-') - return [ - os.path.join(BaseToolsDir, 'Bin', uname), - os.path.join(BaseToolsDir, 'BinWrappers', uname), - os.path.join(BaseToolsDir, 'BinWrappers', 'PosixLike') - ] - -BaseToolsBinPaths = GetBaseToolsPaths() - -class BaseToolsTest(unittest.TestCase): - - def cleanOutDir(self, dir): - for dirItem in os.listdir(dir): - if dirItem in ('.', '..'): continue - dirItem = os.path.join(dir, dirItem) - self.RemoveFileOrDir(dirItem) - - def CleanUpTmpDir(self): - if os.path.exists(self.testDir): - self.cleanOutDir(self.testDir) - - def HandleTreeDeleteError(self, function, path, excinfo): - os.chmod(path, stat.S_IWRITE) - function(path) - - def RemoveDir(self, dir): - shutil.rmtree(dir, False, self.HandleTreeDeleteError) - - def RemoveFileOrDir(self, path): - if not os.path.exists(path): - return - elif os.path.isdir(path): - self.RemoveDir(path) - else: - os.remove(path) - - def DisplayBinaryData(self, description, data): - print description, '(base64 encoded):' - b64data = base64.b64encode(data) - print b64data - - def DisplayFile(self, fileName): - sys.stdout.write(self.ReadTmpFile(fileName)) - sys.stdout.flush() - - def FindToolBin(self, toolName): - for binPath in BaseToolsBinPaths: - bin = os.path.join(binPath, toolName) - if os.path.exists(bin): - break - assert os.path.exists(bin) - return bin - - def RunTool(self, *args, **kwd): - if 'toolName' in kwd: toolName = kwd['toolName'] - else: toolName = None - if 'logFile' in kwd: logFile = kwd['logFile'] - else: logFile = None - - if toolName is None: toolName = self.toolName - bin = self.FindToolBin(toolName) - if logFile is not None: - logFile = open(os.path.join(self.testDir, logFile), 'w') - popenOut = logFile - else: - popenOut = subprocess.PIPE - - args = [toolName] + list(args) - - Proc = subprocess.Popen( - args, executable=bin, - stdout=popenOut, stderr=subprocess.STDOUT - ) - - if logFile is None: - Proc.stdout.read() - - return Proc.wait() - - def GetTmpFilePath(self, fileName): - return os.path.join(self.testDir, fileName) - - def OpenTmpFile(self, fileName, mode = 'r'): - return open(os.path.join(self.testDir, fileName), mode) - - def ReadTmpFile(self, fileName): - f = open(self.GetTmpFilePath(fileName), 'r') - data = f.read() - f.close() - return data - - def WriteTmpFile(self, fileName, data): - f = open(self.GetTmpFilePath(fileName), 'w') - f.write(data) - f.close() - - def GenRandomFileData(self, fileName, minlen = None, maxlen = None): - if maxlen is None: maxlen = minlen - f = self.OpenTmpFile(fileName, 'w') - f.write(self.GetRandomString(minlen, maxlen)) - f.close() - - def GetRandomString(self, minlen = None, maxlen = None): - if minlen is None: minlen = 1024 - if maxlen is None: maxlen = minlen - return ''.join( - [chr(random.randint(0,255)) - for x in xrange(random.randint(minlen, maxlen)) - ]) - - def setUp(self): - self.savedEnvPath = os.environ['PATH'] - self.savedSysPath = sys.path[:] - - for binPath in BaseToolsBinPaths: - os.environ['PATH'] = \ - os.path.pathsep.join((os.environ['PATH'], binPath)) - - self.testDir = TestTempDir - if not os.path.exists(self.testDir): - os.mkdir(self.testDir) - else: - self.cleanOutDir(self.testDir) - - def tearDown(self): - self.RemoveFileOrDir(self.testDir) - - os.environ['PATH'] = self.savedEnvPath - sys.path = self.savedSysPath - +## @file +# Utility functions and classes for BaseTools unit tests +# +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import base64 +import os +import os.path +import random +import shutil +import subprocess +import sys +import types +import unittest + +TestsDir = os.path.realpath(os.path.split(sys.argv[0])[0]) +BaseToolsDir = os.path.realpath(os.path.join(TestsDir, '..')) +CSourceDir = os.path.join(BaseToolsDir, 'Source', 'C') +PythonSourceDir = os.path.join(BaseToolsDir, 'Source', 'Python') +TestTempDir = os.path.join(TestsDir, 'TestTempDir') + +def MakeTheTestSuite(localItems): + tests = [] + for name, item in localItems.iteritems(): + if isinstance(item, types.TypeType): + if issubclass(item, unittest.TestCase): + tests.append(unittest.TestLoader().loadTestsFromTestCase(item)) + elif issubclass(item, unittest.TestSuite): + tests.append(item()) + return lambda: unittest.TestSuite(tests) + +def GetBaseToolsPaths(): + if sys.platform in ('win32', 'win64'): + return [ os.path.join(BaseToolsDir, 'Bin', sys.platform.title()) ] + else: + uname = os.popen('uname -sm').read().strip() + for char in (' ', '/'): + uname = uname.replace(char, '-') + return [ + os.path.join(BaseToolsDir, 'Bin', uname), + os.path.join(BaseToolsDir, 'BinWrappers', uname), + os.path.join(BaseToolsDir, 'BinWrappers', 'PosixLike') + ] + +BaseToolsBinPaths = GetBaseToolsPaths() + +class BaseToolsTest(unittest.TestCase): + + def cleanOutDir(self, dir): + for dirItem in os.listdir(dir): + if dirItem in ('.', '..'): continue + dirItem = os.path.join(dir, dirItem) + self.RemoveFileOrDir(dirItem) + + def CleanUpTmpDir(self): + if os.path.exists(self.testDir): + self.cleanOutDir(self.testDir) + + def HandleTreeDeleteError(self, function, path, excinfo): + os.chmod(path, stat.S_IWRITE) + function(path) + + def RemoveDir(self, dir): + shutil.rmtree(dir, False, self.HandleTreeDeleteError) + + def RemoveFileOrDir(self, path): + if not os.path.exists(path): + return + elif os.path.isdir(path): + self.RemoveDir(path) + else: + os.remove(path) + + def DisplayBinaryData(self, description, data): + print description, '(base64 encoded):' + b64data = base64.b64encode(data) + print b64data + + def DisplayFile(self, fileName): + sys.stdout.write(self.ReadTmpFile(fileName)) + sys.stdout.flush() + + def FindToolBin(self, toolName): + for binPath in BaseToolsBinPaths: + bin = os.path.join(binPath, toolName) + if os.path.exists(bin): + break + assert os.path.exists(bin) + return bin + + def RunTool(self, *args, **kwd): + if 'toolName' in kwd: toolName = kwd['toolName'] + else: toolName = None + if 'logFile' in kwd: logFile = kwd['logFile'] + else: logFile = None + + if toolName is None: toolName = self.toolName + bin = self.FindToolBin(toolName) + if logFile is not None: + logFile = open(os.path.join(self.testDir, logFile), 'w') + popenOut = logFile + else: + popenOut = subprocess.PIPE + + args = [toolName] + list(args) + + Proc = subprocess.Popen( + args, executable=bin, + stdout=popenOut, stderr=subprocess.STDOUT + ) + + if logFile is None: + Proc.stdout.read() + + return Proc.wait() + + def GetTmpFilePath(self, fileName): + return os.path.join(self.testDir, fileName) + + def OpenTmpFile(self, fileName, mode = 'r'): + return open(os.path.join(self.testDir, fileName), mode) + + def ReadTmpFile(self, fileName): + f = open(self.GetTmpFilePath(fileName), 'r') + data = f.read() + f.close() + return data + + def WriteTmpFile(self, fileName, data): + f = open(self.GetTmpFilePath(fileName), 'w') + f.write(data) + f.close() + + def GenRandomFileData(self, fileName, minlen = None, maxlen = None): + if maxlen is None: maxlen = minlen + f = self.OpenTmpFile(fileName, 'w') + f.write(self.GetRandomString(minlen, maxlen)) + f.close() + + def GetRandomString(self, minlen = None, maxlen = None): + if minlen is None: minlen = 1024 + if maxlen is None: maxlen = minlen + return ''.join( + [chr(random.randint(0,255)) + for x in xrange(random.randint(minlen, maxlen)) + ]) + + def setUp(self): + self.savedEnvPath = os.environ['PATH'] + self.savedSysPath = sys.path[:] + + for binPath in BaseToolsBinPaths: + os.environ['PATH'] = \ + os.path.pathsep.join((os.environ['PATH'], binPath)) + + self.testDir = TestTempDir + if not os.path.exists(self.testDir): + os.mkdir(self.testDir) + else: + self.cleanOutDir(self.testDir) + + def tearDown(self): + self.RemoveFileOrDir(self.testDir) + + os.environ['PATH'] = self.savedEnvPath + sys.path = self.savedSysPath + diff --git a/BaseTools/Tests/TianoCompress.py b/BaseTools/Tests/TianoCompress.py index 01cd975048..e141364162 100644 --- a/BaseTools/Tests/TianoCompress.py +++ b/BaseTools/Tests/TianoCompress.py @@ -1,74 +1,74 @@ -## @file -# Unit tests for TianoCompress utility -# -# Copyright (c) 2008, Intel Corporation. All rights reserved.
    -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import random -import sys -import unittest - -import TestTools - -class Tests(TestTools.BaseToolsTest): - - def setUp(self): - TestTools.BaseToolsTest.setUp(self) - self.toolName = 'TianoCompress' - - def testHelp(self): - result = self.RunTool('--help', logFile='help') - #self.DisplayFile('help') - self.assertTrue(result == 0) - - def compressionTestCycle(self, data): - path = self.GetTmpFilePath('input') - self.WriteTmpFile('input', data) - result = self.RunTool( - '-e', - '-o', self.GetTmpFilePath('output1'), - self.GetTmpFilePath('input') - ) - self.assertTrue(result == 0) - result = self.RunTool( - '-d', - '-o', self.GetTmpFilePath('output2'), - self.GetTmpFilePath('output1') - ) - self.assertTrue(result == 0) - start = self.ReadTmpFile('input') - finish = self.ReadTmpFile('output2') - startEqualsFinish = start == finish - if not startEqualsFinish: - print - print 'Original data did not match decompress(compress(data))' - self.DisplayBinaryData('original data', start) - self.DisplayBinaryData('after compression', self.ReadTmpFile('output1')) - self.DisplayBinaryData('after decomression', finish) - self.assertTrue(startEqualsFinish) - - def testRandomDataCycles(self): - for i in range(8): - data = self.GetRandomString(1024, 2048) - self.compressionTestCycle(data) - self.CleanUpTmpDir() - -TheTestSuite = TestTools.MakeTheTestSuite(locals()) - -if __name__ == '__main__': - allTests = TheTestSuite() - unittest.TextTestRunner().run(allTests) - - +## @file +# Unit tests for TianoCompress utility +# +# Copyright (c) 2008, Intel Corporation. All rights reserved.
    +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import os +import random +import sys +import unittest + +import TestTools + +class Tests(TestTools.BaseToolsTest): + + def setUp(self): + TestTools.BaseToolsTest.setUp(self) + self.toolName = 'TianoCompress' + + def testHelp(self): + result = self.RunTool('--help', logFile='help') + #self.DisplayFile('help') + self.assertTrue(result == 0) + + def compressionTestCycle(self, data): + path = self.GetTmpFilePath('input') + self.WriteTmpFile('input', data) + result = self.RunTool( + '-e', + '-o', self.GetTmpFilePath('output1'), + self.GetTmpFilePath('input') + ) + self.assertTrue(result == 0) + result = self.RunTool( + '-d', + '-o', self.GetTmpFilePath('output2'), + self.GetTmpFilePath('output1') + ) + self.assertTrue(result == 0) + start = self.ReadTmpFile('input') + finish = self.ReadTmpFile('output2') + startEqualsFinish = start == finish + if not startEqualsFinish: + print + print 'Original data did not match decompress(compress(data))' + self.DisplayBinaryData('original data', start) + self.DisplayBinaryData('after compression', self.ReadTmpFile('output1')) + self.DisplayBinaryData('after decomression', finish) + self.assertTrue(startEqualsFinish) + + def testRandomDataCycles(self): + for i in range(8): + data = self.GetRandomString(1024, 2048) + self.compressionTestCycle(data) + self.CleanUpTmpDir() + +TheTestSuite = TestTools.MakeTheTestSuite(locals()) + +if __name__ == '__main__': + allTests = TheTestSuite() + unittest.TextTestRunner().run(allTests) + + diff --git a/BaseTools/building-gcc.txt b/BaseTools/building-gcc.txt index ed9cecee28..2b2cff6058 100644 --- a/BaseTools/building-gcc.txt +++ b/BaseTools/building-gcc.txt @@ -1,15 +1,15 @@ -To use GCC with the BaseTools project for edk2 based development purposes, -you will need to build a GCC based cross-compiler (in addition to binutils). - -Instructions for building GCC for this purpose can be found under the -BaseTools source tree. (In addition to the instructions, you will also -find scripts to help automate the build process.) - -If you do not have a tianocore.org account, you can make use of the 'guest' -account with an empty password. - -In a web browser, you can 'browse' the relavent source at this location: - http://sourceforge.net/p/edk2-buildtools/code/HEAD/tree/trunk/BaseTools/gcc - -Or, with subversion, you can download the relavent source with this command: - svn co https://svn.code.sf.net/p/edk2-buildtools/code/trunk/BaseTools/gcc +To use GCC with the BaseTools project for edk2 based development purposes, +you will need to build a GCC based cross-compiler (in addition to binutils). + +Instructions for building GCC for this purpose can be found under the +BaseTools source tree. (In addition to the instructions, you will also +find scripts to help automate the build process.) + +If you do not have a tianocore.org account, you can make use of the 'guest' +account with an empty password. + +In a web browser, you can 'browse' the relavent source at this location: + http://sourceforge.net/p/edk2-buildtools/code/HEAD/tree/trunk/BaseTools/gcc + +Or, with subversion, you can download the relavent source with this command: + svn co https://svn.code.sf.net/p/edk2-buildtools/code/trunk/BaseTools/gcc -- 2.39.2