From 370d694d6411b13e05b056de653bbb125a81f5cb Mon Sep 17 00:00:00 2001 From: Tony Zhang <tony.zhang.domore@outlook.com> Date: Sun, 23 Feb 2020 12:58:28 -0500 Subject: [PATCH] Remove unused files --- .gitignore | 6 +- Makefile | 18 ---- SQLPGrammar.y | 211 --------------------------------------------- SQLPParser | Bin 42128 -> 0 bytes SQLPParser.c | 37 -------- SQLPScanner.l | 165 ------------------------------------ SQLPSchema | Bin 65248 -> 65120 bytes old | 205 -------------------------------------------- parser.c | 86 ------------------- parser.h | 8 -- util.c | 231 -------------------------------------------------- util.h | 92 -------------------- 12 files changed, 5 insertions(+), 1054 deletions(-) delete mode 100644 SQLPGrammar.y delete mode 100755 SQLPParser delete mode 100644 SQLPParser.c delete mode 100644 SQLPScanner.l delete mode 100644 old delete mode 100644 parser.c delete mode 100644 parser.h delete mode 100644 util.c delete mode 100644 util.h diff --git a/.gitignore b/.gitignore index 1530978..eba2f25 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -*.o \ No newline at end of file +*.o +.DS_Store +SQLPParser.dSYM/ +SQLPRefExp.dSYM/ +SQLPSchema.dSYM/ diff --git a/Makefile b/Makefile index a383350..72f4cdf 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,6 @@ #CFLAGS = `pkg-config --cflags glib-2.0` #LDLIBS = `pkg-config --libs glib-2.0` all: SQLPSchema SQLPParser_new SQLPRefExp - -SQLPParser: SQLPParser.c SQLPGrammar.y SQLPScanner.l util.o - bison --verbose -d SQLPGrammar.y - flex SQLPScanner.l - gcc -g -w SQLPParser.c util.o -o SQLPParser - rm -f lex.yy.c SQLPGrammar.tab.c SQLPGrammar.tab.h SQLPParser_new: SQLPParser_new.c SQLPGrammar_new.y SQLPScanner_new.l util_new.o bison --verbose -d SQLPGrammar_new.y @@ -27,17 +21,5 @@ SQLPRefExp: SQLPRefExp_main.c SQLPRefExp.y SQLPScanner_new.l util_new.o gcc -g -w SQLPRefExp_main.c util_new.o -o SQLPRefExp rm -f lex.yy.c SQLPRefExp.tab.c SQLPRefExp.tab.h -util.o: util.c util.h - gcc -g -c util.c - util_new.o: util_new.c util_new.h gcc -g -c util_new.c - - - -Parser: parser.c util.o - gcc -g -w parser.c util.o -o Parser - -clean: - rm -f lex.yy.c *.tab.c *.tab.h *.fasl Parser util.o util_new.o - diff --git a/SQLPGrammar.y b/SQLPGrammar.y deleted file mode 100644 index 2fb3f37..0000000 --- a/SQLPGrammar.y +++ /dev/null @@ -1,211 +0,0 @@ -%{ - #include "util.h" -%} - -%define api.value.type {cons_cell *} -%token IMPLIES OR AND NOT LE GE LT GT NE HAS MAX MIN AS ASC DESC MOD ASSIGN EQ STAR COMMA DOT - -%token SIZE SELECTIVITY OVERLAP -%token FREQUENCY UNIT TIME SPACE - -%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF - -%token STORE STORING DYNAMIC STATIC OF TYPE ORDERED BY -%token INDEX LIST ARRAY BINARY TREE DISTRIBUTED POINTER - -%token SCHEMA CLASS ISA PROPERTIES CONSTRAINTS PROPERTY -%token ON DETERMINED COVER QUERY GIVEN FROM SELECT WHERE ORDER -%token PRECOMPUTED ONE EXIST FOR ALL TRANSACTION INTCLASS STRCLASS OID -%token INTEGER REAL DOUBLEREAL STRING MAXLEN RANGE TO SELF -%token INSERT END CHANGE DELETE DECLARE RETURN UNION - -%start SQLPProgram -%% -SQLPProgram - : Query - { printf("Input Query\n"); - cons_cell *n = $1; - printf("Printing Tree\n"); - print_cons_tree(n); - } - ; - -Query - : Union_Query - { printf("Union Query\n"); - $$ = $1; - } - ; - -Select_Query - : SELECT Select_List Body - { printf("SQLP Query\n"); - $$ = create_proj_operator($2, $3); - } - ; - -Body - : FROM TablePath - { printf("Body 1\n"); - $$ = $2; - } - | FROM TablePath WHERE Bool - { printf("Body 2\n"); - $$ = create_eval_operator($4, $2); - } - | FROM TablePath WHERE Pred - { printf("Body 3\n"); - $$ = create_eval_operator($4, $2); - } - ; - -TablePath - : TableIdentifier VarIdentifier - { printf("last table path\n"); - $$ = create_rename_operator($1, $2); - } - | TableIdentifier VarIdentifier ',' TablePath - { printf("table path2\n"); - $$ = create_cross_operator(create_rename_operator($1, $2), $4); - } - ; - -Union_Query - : Select_Query - { printf("union query 1\n"); - $$ = $1; - } - | Union_Query UNION Select_Query - { printf("union query 2\n"); - $$ = create_union_all_operator($1, $3); - } - ; - -Select_List - : STAR - { printf("star\n"); - //$$ = new_node(1, Select_List); - //$$->children[0] = new_node(0, STAR); - } - | Col - { printf("select list attr path\n"); - $$ = create_rename_operator($1, NULL); - } - | Col ',' Select_List - { printf("Select list\n"); - $$ = create_rename_operator($1, $2); - } - ; - -Col - : VarIdentifier '.' AttrPath - { - printf("col\n"); - $$ = create_spcol($1, $3); - } - -AttrPath - : AttrIdentifier - { printf("path id\n"); - $$ = create_pf($1, NULL); - } - | AttrIdentifier '.' AttrPath - { printf("Path Function\n"); - $$ = create_pf($1, $3); - } - ; - -VarIdentifier - : IDENTIFIER - { - printf("|%s| ", yytext); - $$ = create_var(yytext); - } - -TableIdentifier - : IDENTIFIER - { - printf("|%s| ", yytext); - $$ = create_table(yytext); - } - -AttrIdentifier - : IDENTIFIER - { - printf("|%s| ", yytext); - $$ = create_attr(yytext); - } - -Operator - : EQ - { - $$ = create_op(yytext); - } - | NE - { - $$ = create_op(yytext); - } - | LE - { - $$ = create_op(yytext); - } - | GE - { - $$ = create_op(yytext); - } - | LT - { - $$ = create_op(yytext); - } - | GT - { - $$ = create_op(yytext); - } - ; - -Bool - : Col Operator Col - { printf("Col op Col\n"); - cons_cell* first_term = create_term($1); - cons_cell* second_term = create_term($3); - $$ = create_comp_operator($2, first_term, second_term, NULL); - } - | Col Operator Constant - { printf("Col op Constant\n"); - cons_cell* first_term = create_term($1); - $$ = create_comp_operator($2, first_term, $3, NULL); - } - ; - -Pred - : Bool AND Pred - { printf("pred and pred\n"); - $$ = $1; - $$->cdr->cdr->cdr->cdr->car = $3; - } - | NOT Pred - { printf("Not Pred\n"); - $$ = create_not_operator($1, NULL); - } - | EXIST '(' Query ')' - { printf("Exist query\n"); - $$ = create_atom("INPROG"); - //$$->children[0] = new_node(0, EXIST); - //$$->children[1] = $3; - } - ; - -Constant - : INTEGER - { printf("|%s|", yytext); - $$ = create_constant(yytext); - } - | REAL - { printf("|%s|", yytext); - $$ = create_constant(yytext); - } - | STRING - { printf("|%s|", yytext); - $$ = create_constant(yytext); - } - diff --git a/SQLPParser b/SQLPParser deleted file mode 100755 index a4d2f770e38db4efe0f1f921965421492ccf52e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42128 zcmd^o3s_Xu+W*?%R#FkXpeUx}t-J){ja1S=9UTf370DtSxeS7G69zAtg`wp%Qq*T= zS$&?acCoCJ)=5(|6T8#REV@uxX9(?Z(u}g4|L<LwJ$pv*9G~z1ec$tc{+nmbyVm=A z-*?^Lwf5SZnOm&M(}OgPsVkUGW|XSvEI0`gNPS2~KoZz^b`d@=W_?+Eq}y?xz!L-k zDy|l3TG0^64+bT@@j-$SNc&1TMO6uj>Jn>>SZ)$rMH#bj2I)~*Lss)7sD(!q4W|O( z+De7umxX^)@klRH>P1RDMVn>86jk*jGZfNf{Q~JUV00-;vUH_>@64h2&=Q_Jhh8u3 zDXR2lLyyY&?_S|jaE{Ect#)aV`6()^%SIODXT^;jS&$Q5kY7~3B6`L6xahdCF=fRu zqj|l_KFQ9QIgjT=%_~iDya&?6BmAeb#gFN0=RWVv|9NcRi{ftGz9McFVHYE)eq)-2 zRcPTs#OsGZ*RYE>^v#`@89w1>w;Cn_Fnu;5-p!O&(YQAFnQid9q97KfY@(gokSE#J z@;%lDKe-M5vu*I_w!t6L2LG>Z@O!nvzpf4bhi&j*Y=a-&M!S`^A%ANd{D<4%yV~Ht z*#>`d8~o}v_|%6K0<XuxXpMhG8})q^@&f~nAiWBqD~n{73JXV-|ClcMu>t)1BtId5 z&oCdeY5K*nGG}Ra$x7x}k?&;oq*?Zoa%VQfM;Wu*%bc0nOYGTsOYFIs`31zy&dV%i zrH;&kg5qqb=HwT#{IX1^b0yg+a1^mZM`4)*mh6tw(xPHJ#4?@v#YHT;z>!%B9w`-< zJ4ueREmW3DAx9XA<mSUtG0R<En(uV5Tx6HSa!X3{i=4SIoV_B`o||8kS&)CDgO_-b z10}ZGsY+DhQm4Hz6XnW<sbUx_bvW3J<fJK6?W1ExjWwda*yxyXu#=WzN9K-2`DIQ= zX<EwEg5n}aT4q)O@~|%|EH09!?LxFwLGoGjr>IB;ORhrNnbL|UB*}jTb04Ps?Z&$| z!A-Yg&9F(l9{Ks9<O$Enba|irizqi8<A^S`KB;k00cpCz)%qopEJ5-^0>*_(AHBuG zC25UNYX&hIO#Cn|AwE1NepeH}*~E`B@moxMvoluXn$~Rc-Re@~n)v+`6I6|B;`cZ4 zEz*7m@MP0)bf}51))xX|O?<hubNTTmKINgV1QXx9j@nFo%3EEjCcf$$!seU!=t$#Q zXySJ?xQykQ__UU&tHi{YTQLr;F!5!VbAE-1-$fY#U2o#6F-UN=iEs8}n@#-gCOcbA zd|JEJwavtjP)yJrCVo#7{}mIT)*f}$nD~*333}MX?``7OnfQH7d|T!55Sv>MEw?b+ zx*BJYx6W31FywVZ!aJ^y)55$%`r<RJe*$8Z&Lh0B!Ha81H%ikGYpmnxj+CaM)mX#R zL6oK;)wqMFe=kFtrc~orp8lEAG_)G4dHP36(~xSc;OTEEO+%@%gr`5JG!3D~g*^Qs zrD^Cirt<V#l%^rmn84EqC{079F_x!ar8EtZMhj2BNNE}xjp01~G^J@sG%}ukgwizC z8=KF9G2{VC)6i&a;OToPO;f(Hj;HUSbT>-Z@bs;erlHZegQst#G!2Qytvp>y=?F?! z^Ymg$(-3H^F!Xb)k>=N^6G^TQZm_w&wN)N#PEAX$(%(vA%vKdTmy=0fO=Qd)5eFNm z!un4mWKt#)^K4c6wV<{MEjHKp&fe(qj+8`~hc56o<i>>cU(4+;c%6FLmxlfT60926 zhnpF87W%gRXM=67X4`(xl{W2=?Sr$<NErN}R2b|`2HUb%F-e0RRzA{JIq69#pkydd zXPbM{(@1$j(ZU`ZJ`U-hA+1qyDyU#5Ux!K5hr|~&=0bvEb1{6!yY*iox~?W{-HQ;c z)xRf2#N7IKoL}CtR{uouP|Q0JMZL?rAbtbIUHWn&ZheIb87mNnKyDU@^I}Mqa#lnJ zk^SEW+q62Hn;RVM=`@IuouNV^iIdRLT=1J<TUFnVdszY`T(zE6{fGv8Jn-?*h#?u5 zwIOU*L=@MuHmnb~xvdRgdfYnkT-LfKt(tgYyI9z+8e4W9`gHqM42gC@>#gs*t#!7| zwyGZJEB*8guwQN$l#BjN2H?^gmLdmkQ2z|krZ}_sjG01wGcsATy3U5yyE!6km-T&- ziS6oEGg(S(WD>Toj%3jeD*I38N_!Kmb>*APIZbL)Cp*<w23w`IK{Knhmuk6_^0csZ zr!g<8&2R@<U6lXh%GDpU^2^YsKbMF$b?e6vL(R+@pG-G$`xwpQvAOggN!~rLfhUI@ zu({A`-*O&r^7Z-}nK;B$OD+co`DKUQ{yH3n+xjt@e;r01b-^|1;Is=8EqE0Y7${!q z;EB=<b+Dd733R+$zY;MNvT-nmwp)Ly7?x`^m%bH|#-(IkzgO`#AaY2b4F%Si4hVLl zxt&9pt?`I?Hl6W$Uzvt(Y>XFpsDVcjzKrm8ghvVd1Wejoq<;o6Pdee35q<`q5%%9T z@Or}I2=798y}-8{_-?{`5*|kQZh==B_!h!X{|=mPbsDz_ywJc`5q^a5VT7*|c#45% z5Wb7>*@R~ZJleqH3ExEcXu{(K9%|rGgfAm}9N|#{KT%}VA2Cll;S&fygO!5nZ{YQW z#}Pi4@Opu7H}Ktr_auA{;kyN1W#C%~Km8l<aKg6;ywJc`5q^a5d4#VLc#45%5Wb7> z@q}jxJleqH3ExEcNW$X<9%|rGgfAm}FyT=GKT&AZA2Cll;Zq1d(@E6d!0QQ*BYZ01 z^#b2+;JXR$Nq8T^cMH7Az_$>7x&=7h`ZaD5c%gx>BK!#9@r17uc#45%5Wb7>PK0L& zJleqH3ExC`5aICx4>j;8!j};~obV`tpC~ZukC-Q&@L7bP!A^qu-@xk$k0X3K;q?OF zZs5BK?@9O=!gmY2%D}e}e)?D7BM9Fj@InJ$MfefII}^T2;3)>4LHI7hlL^ldc(j4X z6TXS?P{QK{9%|rGgfAnUj%XUA1b$+PQGdid>4eiQRpS}#tf>A5UQc)&;g=9zFYxUK zzMJr#gkMhhZh==B_!h!Xp9Y>t_!fZ|8u%*0j}RVA_$q;?7<dNZy9mFM@C<=R8+bh7 zn+P9Dc)Y+v4LpkQWrX)8JWAjv78~_P%#%)dEa7Lc)1>+vcs=29geMSQFYxUKzMJr# zgvSxSTi{g&zJ>79zW^Ug_!fZ|8u%*0j}ShQ@Kpj&G4Kq+cM+aKc!t2E4LqLkO@yZr z9xw1v1CJtn8R4S{j}rKae53w|dD01=MEDu(ys7>MUQc)&;gN*b3w*nQ?<Tw_;k^jo zE$}J>-$MB5Q@}4Ke2c&f4SW^hM+hH6_$q;?7<dNZy9gghc!t2E4LqLkO@t33JYL|T z1|CKDGQwvN9wqP-c}D#a^Q05rm+&*V6QTMWcs=29gwG_rUf|med^h1e3AYlyTi{g& zzJ>79CxOQhzD3}L2EK~$BZOZ{_$q;?7<dNZy9kdWJVW5o1|CoNCc-BZ9xw1v1CJtn z8R7j1j}rKaMMnJ*^Q03_+rY*%xHF^r8+bk8afBxkUN7+N2ELo{o(8^K;8g~`h49lq zEB!43FEsE~gdZXNYO=pd;3)>4LHI7hyAhrt@Mr^%Cwvp(?Fo+;c&LF#5x$J@4unSu z{6wx%f5bfLgm)zT4DM8^{svx8cpTyJ*yuIZ3w*nQ?<Tw_;j0MWE$}J>-$MB5e*#}k z_!fZ|8u%*0j}U$t;j09mV&EBs?;^ZAufM>f4LqLkO@t36{dj?g8h8}p%LpGvc$C0T zIE?xu=1C_!gYYxBbEo<ncs=29gfAexUf|med^h1e36CLsx4^3md<)^Hn}J6YzD3}L z2EK~$BZQA2e3igc3_OGIU4-}G^%r=wfyWcRiSUu6A20Aw1CJtn8R1tD9wqP-IY#{v z^Q03#nea0>$)Nfhcs=29z#HoY^r8XP5EMmFjezbmpvMVffUv{<C5f?DV4Hcaz)4Kw zMlKt1CfkBN{!-G&Zbpt7T=#=lQAzB~Ydzon19s_Lg{wAZb1mE;x+6xB<gmI*kLI!- z#SO-1utc|d{08G7Peg1dV%)8|6UO5PI19NvF5o)@;Jz;XK91;Xg+QU705Y9M3>V$P zWC@9@{UmA=Xm?62H&wuw`N1}KYKU7OOT5iC?Eu6$KH)&A6SfzE@3tN#s17$~U6J(E zbzpRRgnKx&#mNv#d;zs_WCHidm8-vC&Y@r&%K`&;PSE>|qHg^|B6N#o{eteVUZqZO z>w6@(@g)pZ54rlv7R}kMvLz^N?IS2TZk!#BzadhqKLk;_JRjje4g3*Me~qi_%Rt=v zP57kNKd}GD{#xA!EtNIdxDjpq7M9(5Hb6R?co-I-*qJNVdQv*0>+j&ah!V2mtM33L zJq_)7eWB5fYfw+?Gep$W_zMOD(tppS8b;I+F*;YY?NQ>%1|-~bmtk-}L1+*dI4z={ z#^=x~)lHo-I+x5qO$%`z)tEz>R303kvEX%e)?$NBDe1T)GKiQmO$dR_qre~WnV%s< zW6u$FM~o+4_J_901DY5BBZx8KKpB<cc^k^mh%+*n3nsoh;`l-kBRhA(SPbA%fKL(M zMI&f93G(}P8@jT*<16S>)_Av$852aY+Yy7<>xRN_6ypkf>Kv}Mz63eeG=QH1R87Gc zqDDfcs%(g-U~Y9=A6{vF2}ctz#aj>G^eN2ckP&x83K3KB#$zCr$JXk^rwfu3h2$WA z$%v6iyHfi$4hrT{J%rSsc7J=3BdmvcDfcw?)VN?1Nw_0E_7g;jJ;>^7Vp5|}3LV2M z>9W2<40nPBV;IwnqLEq+=0xS{I(Exo&Pl~V9tWyy9WZKb`}em5)BLo0T&a;wT@{E! zCc%=7${K#q0UpoKb%Z=tKMW#O3Rh|fMi=3=37EW811XDsq%J=-9bJC9n*!h-P+U2F z!+BNp-)=yy+!5arF*UWXX)0ImVPSXDsq7lWEI7pKP;2E8w8?Iv{aAqZVAOK$S13@e zwPrXc2l2_8E{Do`p|aFZg(~Qtci5KwmV4eo8o}CIa8vGiH8eC1VrU$Ux9(Zp59$L* z5AD#{==Hj+HI=Jtyw3Lc>{$LN{~QmQAtH+|0a@5kePq!LYgMV53mKs)nr+%)kq<1D z_lNer1tN!+Jzg(5mD=&B747(3R|bc2(4~I}fyQm9k0%ErwNx|KG}?0w5^gxWc3kCg zQdtER&y|J{jAu#XKZ1#7pNpj1x(5YuhZYm$9yg!J{vU7z`cIqtBAa_@h&u(Pe$!TU zMHidv1N8k~j8*0t4+}1RIvLOt@QE((g$y)ONBjKtcPf3@ItNa^!0twDcf^_N$+$XS zbw_jn8}r1ip9KI5(<@gWX62E!RzA<6_aZ64+(|gPrjg*&tOx%9@!b*6_}RnyL~s)Z z2wzX#5l;d~qgQnfg3g^nXStsarptu=VRt?cJ$J+kA+8;8>xGDZ(4y7B=hG1&&Si0~ z#|?zWaRWH})eh4kG0jDH=qQej>%%eGdcAF8&isgOu(_r}Oz+6WB2H$Y_(nT$6LQLQ zorbo3J&afKOOkR&9P$%(&-=LY#~@5xcf^|jP&*V--^)eyXN1N^KMk>VJV-p6dxyB~ zH9~T6fF!0tL@Du<7nkC5gn0Zp;x?Cl8<=kED_B)*a#eBblfiRYPoc(nq~fx+H2%qZ z&f0>L?zJ_}KJXP3H4eRB8H2-H9C|nDyzkdrPr9M64xfLI6-T@B?E92UKXx7L!UhWP zC8Bip?GwNHa^ocU)SA_&jI-~P;^a1YtjH@MlX7AkXWu7HXW#W#NP82kr|9h4ms4V! zI*TUw%7C-)77dLNMTMS#ir@M(92)G1RoJ!qIKZ>lik3QLJqeF<+^G9m?0HS+{>NRq zha^Sazd@Ah?h~ICXXJZ)4Gd$p@^gP#_f*-=yzV}&mBenf?qA1CdlRh3sqQ`<YnwVt z#-CG$u#Gk7YmAA?)u&jw4m;>+3<)Nh0MC44U8}#axyos#ot)2`!h?-(14Xf}@Qv@= zJQ48{5&!8!i`4|HC#;eV_}uz)kO0eNJqBy{3ay(1v{Gq8uH;x~7RS__hEqW6lS$gE zT50D#TiBR*jtw`m5KEf1rKy*#vJf3zS=fx;rtyuvw6&QRJzN<0?V59nj`6U(7TXhK zgW)`k9#W7+T1wC1QR5sU6YhxT{Vbu#F8vjb=#LA5JN*SB9zYt-78ceDfkHn4?uBGC z@(tUrE6L4wV%T~YdN3ltaPd6@)do+cTspUpp1~|$uTS76QD&DOhiLVie0zyrg|t2x z9CT#_2ycrXJPkJxw(c|T74)Ced7bKsm^zkjD83^e+5?&E9G`GtSs3E)gAZTUc%QIP zLt<1y{WQgRGs5j4{RE}O-NP0{J?(IgMfU}Lu$^<Z#}b>^ln${O+(4~oJ?wd23*~nO z9ry@sT84W#pm5QYaX%?&C&8Xr-$*^80$l1pF&6YuNLE957^rY_F6$pi_eNTH;4s8w zvD#78t^YZX%dXdtBjUFHA=;20heq05t1%q(w*k=OU3z4>kK*o#ZA5%chBA)!%*Sd8 ziE<&aiIdP<xM08|%fpy0cw`CT5`tkGj#<wUiYZ(}t=4k7Vo;)!`Cf24R$I>*v_ds} zf28#NyvtpyTRb0$t$C!$Zf9Zlmo#&cmECyEm$gre&isxfP?)7C%%>E0N7VQ!5ts(> zEpRcic7yPd^|TQF4}W2I#3RITrP5%$U5J$UiMS(fLR!p@Tp=*a5TId?btcGzWf`}Q zSpaAY)TF6V?$$>OohU=64qF3v0&cknb42ed1b&}ut~#b%I3|oPM9vcC(k~aO21;R# z4^SY9hd89a2g2vxYlu`EZq!0!#Z`W6UjoYLNxO(a1;wvi-NN{$+zWs1$;6#E)yh5Z z7`75TmJmske>3g2`g0{&ZE}+|kFd>=dz9D6LVszYHo-!T!G{HJCO$Oo;Vf&5$qisk z@IpA3p%a3r3Uaiao`bkM;%g$tKsJqva&lQ82%%R^LSpAD%1*aG=v-M&RACElNO&6Y zyAbzvR^@TtLRe`UJcGWZJu{z~<hp7-4~ue>>us>nNr=@`n?Ps!Fs7$a=CaU<qCCS* z<#97#p*_x?LYJPmQbAw_TNp$uS2r*x?j&#*iu`Ux0YK`%pxyG#9r(delm04~gpw<D zu;&(FaBT1gt{^qw==~nmo?&Y%MHVf!34Ns^?=J3UWQ)N48A;ipd^T92G*lK5Q7qfM zrrEQ7HNA%7?uY~;t#(g{=hr{r1dZ81KHpckA7Rl`i!9K9ouyft)=ZdfOf{QT)A}U1 znAXQY__Y3rq}&mE{Ds{SZxcgI>m5Smem@a+#N$YdX?+(V=)IB1yiy1k_z4r(4PZKP z#d>iym($aP_#{Kz@Cbk6nRu<93V<5X*9LCgLc(+(dRR1RxUlitEU=Ac<N{9$fqxJp zN7r{0cSpSAC#*&n#><mvaFle95PRGtrY416O-xy%wG_umgUzL{<SP2D5~api##s?| zBIc4gyLtNY>MaE#t7mu_@}!f5k@8YoEw;D378q{(8}J$thIBiIuF-pQ<9atKN_Vr* zU5*jafVBgYpam~iya7!b9Y4*qu)RDE^<ke=4S~D#_rSN+>bpVcYJ3JC5PzB2RjJet zk5P2Ofw0@F397X=W5QGWZ6rQ6U}77GN#U2@&4h}T%q9w3z~yxZ5$WqRD(o0h*k)5< z6S-*UXd?UhzR@Up(Pu`{y8|{{poK5ua69A!v}Jgm1wNoE^(?3dC4?(qTT@PMgSb?A zgX`?b_aTkjQ7z%tSJT0gpIfhvLqYH0^UT^%=?QZ2F)E$AShSTV4|D()n5A}Vv8mC6 zg+Z(eeCm*s7_4Oc{KZ%wSGo@BG2E`>Q85`b>MlG2@6TFK=utR5Q9Qm_&`rA`8H-jr z>MEzZZn++z9jGl}_IBzA+K*SRZWfE#TjNmcjnJ>P9;31}4Wj)x-L2z<k4|uqcnh`1 z5O|B$%AiW?F>Gaz#alnV=@YuK#|>sG?bT_Fz(eBhIzT}#Y|V0{#Nxiqzu`-$2wjmk zRoGY!&#k+D<Z26K=3&T>yAC?25bssb%ul`Eebfe?gNV_otXsbkvU0Au_3h@wHY4HI zBa=;1UITEg{)1KveH=JyUqB9-H@|Lgl{?$Vb?eFJn40K=F%=V#q6^U>zUV+-bfk>d z>d{8*QXhQuDntJh8RbnOYTQH{yKlf(-jHN4oA(ki9F)l$-p@yy{+tlI&m<<svnL;K z?!aahA#jPbdtM`i7n_7}mV-%O2{4Da7;ovKj<b=Z%kw8X-&9bw)fEj}>v`i7uh$sI zV#K@3oB8PDP0t5=&ACEyS}gk*$Mr%#F^zWp7Mcnu&O=EkPE|x4m8xpoz%k4>cDliu z=N>$mTyJe^LcJoELN;u#wF$!&75E4yJ!Jx}Sl!go*&d&)oX)syWYl$NUq`CgGmxvb z9_LOz65t34S_r%oU?o7h_0K*E2fiJs#|Cba>mY=0<HEI`IN}UDnCxn>O?Z9T-^}*v zZ6dQ9$lhdsdv4t-4gB&Ex(TZ9!RS*`gBPzeG~A(!iRISs;$$8QGOq7vQ&V(+5Z#Da zG7_&B1Bo9b$ytQ)?<zlKbK&NN?}R(yZ9W^Hh1M21N9Nkr9A6Q_SdPuzZpcuS)P{ri zQ8l&esxiKhWVP!y%9yQcT{zwbvbol6=3`F~*Sf8gs#>=dZ%P5%CNNH1>vmA8cHJu= zhq<u|#Dv+kDyGMva-64+MGV8u+Z1A}<aUGH>qvtfCr{_n_LQ5mX*FUU5yiln#RM)9 zcIzj6J-C+_%Pr7h{Cwd9?8WJM+PcFqX<PFel`8B~#=>sr@78_rI58wY9Q<XSWYH;s zY<aa^>*`3#eJ>Zrsm1;Veqw^+RMvE$3G~+wfxFfnC9%rah_JA=U*IVjOz@nmIwN{7 z$Cc4fZLYU4Fg@3hu3P9D?aXsh_SZG=>;<W8Xt8NR+OREm7RtWp2xb4*56t#CCYzIX zFuVfmJR$>5Oc}`DpTO(y#F>C-2vqpRI&SnZ>7COna(u|*Q7%=f@XBJG&`FaRBmbgP zD_x!NT=O*=3!TE&79&wDMg}c=ReE(SdJ*TSVS8&_>()c4@-_P08Mc=0)7*N46(?gY zXUjWzs?oqMy$)&IN8@u{%`K6>!S3e6-lgvV(lpAgZv&k~Z!a$I?bf#-A+p;aBeUC8 z1CLCrn2Re4b<I=)7PkH`fJJd8h22G~wwvR^(x<+HPv9oX%gyi#1>+FWZ1t9qUmv0h zHkDPr#^;f<L*;ggXtjFtG%<&S9T%TJm`yYjaZ?-dC15l^pO~)j#*NriS2t;Xt$FK6 zqk4Y1hOHe2PXSTNI-vYiKynn^{fyvI+GePIuE-DFjrGR0t_FglNd|`9z6a+v(xmU5 z;}LLj#yiLT$m7vF$8f{<phY}u-s1y~*MS=hA-_~LX$^rn0^}?V&cTt`JztAFfEN=! zEl`<C(|Ea%xRxXankC5J@Qf-wXg-u)ENDGoP*kMx51ktyMyh{*H=tzP_~$~R3rW0T zlBo2+x{-ll+}qP<{6B^2=jam89sgSOph-1Hs6IievrMYK9Q~?9|Jk9cG)$<jBGn#d zRjiY$HOxh?^Z-z8)1Mpqid^B^Za$lzwByY*hHTcn(^@nARY>$FiHFS+MicP{Q~B7# ze8yJ@)t@mjJ=sugTqGDj5Mz$nmhWzBxv6mDh4{N9KFB1_Td4Ky$D7oDqdSwTNe__v zvA0ciYh88OMZS{n6{^{!`jlDKSI`3{@w<fh6(oM6S-ka}Za1l>k*ZsNC&7Xiq!;9M z7!kYiYHmq?fkU;PZ{T0mQ0OPLHW^y)M=P!Cgw`slb)P9O58br5^@WDk{f5?Hp=Fg? z7n$;UQD_a9&>j<XpMb(7^cNF!lYmZLN%gAr+-8C@1@xJOmYAUF0@^E~R1-8pK#xjj zoCyjisA|#&c%#j8=1pHmtASbTISUtwwre35Dd!5!j9Sn40$}8-j7h{@iu+!{+(}A* zqn!}RUuMeoevN1AplsK+n(ghvdb2rO(~uDP>?GL8;B9O(RWFYh8T6nG2AMK&C*U5C z`)ib$d>KCy<xhX<2{46wg&XdMlf%Y;QrW8})sKLgFAfJ*bg!yf*Kl9X#DvNVr1BK0 z$oO64f~1FifMoDIeX<2C8o8SwEk^DUo{RqLB!X%^$2%BWO^cxNHRqE`wxRN<P&p`7 z{$^4c3zcULl~_ZiM5x>?Rc<q>(9%f@A67fs-293=aPA=uE_OtmxfMdD&9t#13xDdq zm$$Af+`PI@7#6S)3$W6YAy(hsL)EsY4&6f;guTo*<Iy-@^u>0Gt(YSslWs{eZ<!WI z-Q2LfCgt1-2g(PU#ZF`E%Xe0^z*iuL#;jAgFA<v&RgM>w5N*G>&?E>|<2m>heBb4a zcIyieHMUZzNQf#d8)DdR>dd!N*iq3ffY?#V?M=A_=cr_h{*fq{l&dD)hsF_OU>{yj z6N16zlkprio^R{I+<GIAl@D*6h2bqWXSk)T2bYhcELiY-gd0Vivw=ssR@bhhZ4`VS z<f$g2l(CnnhW6Ws?Q~vK$y-7byBW4(hTQ4hGTGdZ|CH)iXyuof`S&Zcf!n)W*`2m{ ze$x@Qwkn`NU;8xW4CFO>1fA;9P$OIAcAA#BjoMDbBFHp6WDi|TwKeSv-<XJ2m3~Q$ zLMd7TgJ_ryFoa^@l@!`AiZt4lHT9=7dSnc87d;Y<m+*uD{3UkU3t=4lZ~O<JJ`Yi2 z9M~vRzJo6s<QoU)ZmH30Lm<lQ_!S15=VE#z@!y|!O^K!k5E(w?8+hgxe3-27qc<yC zZ$a53<<G0T;R(El`2Emk8ZU4{kGxKWqvo=?7kF}PWBT$tYp3psJP6*JgLK1fdUAM3 zpEbe4XiV2o?vFy<vk*nVBbv(9e=uivAlrb5wmk;8$pS~UYCIaxwf|LYMHzoR31V(C za4Y3fHEAQo)2S@#sj56)!Led_!@fwUc{-3Ne`1U?O#YA)iw2K2;1L77yS3#|LO2G7 z>1fZwk97IzBstcRM#-*1Ui(lr=GlRmG|SI0!zs=0y=y%iImS;y#lt3Kj0}titQ!wN z_T2pF2w9$pIx%!%y;)RYnlCS^0@kb6s=!}OFwUuB`5_ZtyD%Snw2Z2OKAa&=QN=F* zFkAvMYQQ_pm~SrY&tWg?^AO8*Sx-Z>!B%DcS&F8LGI@9z-6<{T_0Fo-2ckw7nstiI z8ae)ek%}CD3EQQAiRgOkuQKmnWZoYO*;ey@Vt-)X=TzBx)L5ABke2Wm9XW{#7mMtv z!X8tF?Iapd(Fqrn+2TKW>w4UJ7|-k^DtM7mLCWi-tl&wK49M%<nhUAe3r1c~4OSI< z6fxP8=8E0cN@fc$D6?rsW>a})cq5EA9Zur-&Ew!!ayYy1LaOsEJqmMK(R4q+Z@R41 zbPb4!v0-kySNKCS|M7Uw1?9EO$g6_q6<C|}R&t2Fpd5P095B`gA`3azd;8T#jdc$m z&IJyI1A9$vw-8hN6*#yZIQHCzcb&JMJKnb%<Nfb+M()B3s`MVL+X{K!L3M%+SHRr? zOmX(#1p6r12zdEVupbd@c!|7$sxz_>^G#GWjz>`8(QU0ci9cU6RU!eEIE+fvoLl%B zqwvH1ivxLH%I-#Sz8;{8^BH327Uw}B*=li$F1R>b`1vnhk`j%kinCU*(O~*KlmgZN z3H>|=Q91W;rfvO6mc64aI~oYy-hb47vFAb?=prL)-e0OjKl4Lu^6Kwn)fG<eO~hn* z%wGLQVWHI)O1|LotP~lm@uSL<Wt3++FAq&HDui+uzX-h5Le%cQ&_+4MH!1Z04StRC zrC>LpZ{Fx{%)vc~`o@i#gE{9ZP}~I<D7*CnCCdW2^$941=%q2DWPxk%$3nE#272Pv z3vHl}@E@-jrGX8!N3bz!cJx!_c^a`+M$NSIl&7b;Jpbl4B+<zF3ZC^p(MfS4YuXe< zBkJp<f6A$}Pbjt8D0lzuLK|f-ULS0wQJxfRG|JN#D_`>%V!q-i*B5)9;sjlAaYnXY zoJgZM19)))XVNnQZ?#QUzhY_=-ZAI;Uf)LPIo#i(Jy7vIebs2#g;*=2f&Rl7qR7;5 z!`PqL0WR*hmrZ5(x7L75L^%QnYnV~I!A9}=wO+jYglMa6l5Z~0zig8S@UOC>O?E}8 z!LS3da|gqq^W^!<E>j!)n-jz$a`w3ODMrp$7&)7_Lr;-pK&w}pa}3AI+k)k%WiRey zuv*o6f<b++pjm)>@S-6esCw{N?>|Whw<Te_62kF<e_pNi57KLjz>U$KKI)cj6mqDv z{(*<df5cml-SnMU|DlKs=oac;L$U)T#nb7+opj@NOuVRp-bn}%%exad8cp;X4S0BS z<Cx&y0IuLAgc!^u5~VlP`1cJZUXz%f<oYymULwA0X-NA^`By1L6P=sr`ZLLOI(gXl zxIqlD?f)~_^ZZM&x9)_~GOAvE|538*_hi@UX|8`HdV73ft9)IvP583>M?8BD$ykth zed2<|8xrlWSNpzi>E!EZ8nWm2EnL((;?fwM4g9Msi!Fqlo!tPskj-Uj>^gQWo6Y94 zYgh)ef;W?0&*rcNY#RTY$I@j?q|f&`i=`s_BwhrK&0sdzW9%w+HA`X1epcEeb&(&Z zZM&DSOWCkCWhWa5z5$izJe_lb@!fpWSO)_QwBJ)AeI)G<I)DvggV_)^v`wu*D=JT0 zs~X`ZZln>n7%_iqmrMR6&;*u<&nXC$1Ig+9vlBi;c}(a=Al@6HFXs(6kWp;3jE@JM z$m3nvRM0C}2<ynxVf<6rxtI+!rN*$aY#f`wIsNe2g~xi}Gm4F1m$7J`p2p%ORrMHY zO7}9wyYYA||Ln}Vvlte~uH=2?_o1l^-=Z9>;y&6=(>1NVrgaFpsAH$jp<Tj^E4*vB z?maXu0#{FjUKHV1q@=z3L}?LP-;4Y8w+t9KXmCWtkV`HdI&Aoe%c5gO#*P|2W~?^O zm(TxJjQMAbM!*$>OA?9(UZ$^`mQA@x%aebjSdI}VUOK{XHXEOp;#>JrHOAt#v0S1T z>wyt8gpJe&gEvJRz$R#;*;s89W<s<!4*filjnU$`>@4V}Yx59KgU85XIY^5?e2cI) zTpJ0Smuh1)`iiD8+Gy=+NDa`2fY)D3XMME3T0iYNHeBnibw_-VM*pgB(JbKh))uh7 zNQY`Yfwj~6Xm%C`G?8`E!nAJM&Fn^YD;uZ{K#IPA0pIqD&u~bdWq+~|EeM0715&41 zd+isXr`d1pENBb+gMTOJ33iH<_|?LWvwyH(Srh&1J^K#fAM7WDuUP~8k$ns9-`OHo z4;#NQ7xYd7`Ha2GJ_4_fy~o~XU$VDh=^cE&&uZBlh`$YdA3KQHd+Y#sd-3@u+lAO} z@DG9iI(X!xb|NrF&yDs$`#rXY$G7p%?chEOt>@Ve1jb%Ocmd&2wv9c9*t6_$MvEk4 zk0Aa4=r)9h`6pwW3BdIP`wKoFgv?g9iB)sngY0g0C%cQ?!Bh9(^FM$waB!l`D)C7? zajik^Z$Y$ztpm22EyuU(-j4LGYz^XTK^bCBR?3RmV#LcZ5*SvF`S?^<p7sDr5U-M; zHVjw%zqI^I(ylV%if5)*YxGAP5&PGlB%8!TYnK1D{(nuvSN8v!oeR<a@6Yo>+W$gI z{=Y9v<B|S+1GF7h+4k5ogkW#dk#%C7vDS8BVfc38uK0%P?(mWktS9S*@0gCns@n&v zVLSNEi}9_y{h0;3hk<hcKs%P9*s~0mt7Qxu35{5;7s+UC9*fm=2E6Jd{6@f3toGBe zYl_EC$;zf<x0H;XQyQCxT~j>P;Z*Fv=3|GpkY!_MmI>V)?AT^vhvvZEEf+hv$1w*N zVNdr2TY}#c$YTX;DLi66bW7j?3o%Q}kY5?{yBTw~1haZQc=4<XbNms^<NM*`W@ytj zs}_%$T?wypC;ZLRu<|sE)wZ)|*mial-sU+rO{<3=tY=fPN_@daY0t7T_>03|qL!dt zsZG`<X;*0R+C*)FHeS0NYsNUN2eb~1)MB(~?J{iy)`(%+P^<@+U{x556@Wat1*=0p z?P9D5QSke{wMeZOR)Gkt2HoNLyK3R^`CYIwbk;h-_g|!iz|*(KexMyT3PC8z7g#)* z=H;ILcliAl_;&K$<hg%l|CIjy1iXF|{Cgw!??15b*)jP3Z`n8S`d_oJ;M1SO-!u68 zoPElUuus^>@c19H58(63Pru9k{af(rhvC%^!RsG{Pd~u+vl@8vz3er3^4;uJ`0-cR z%kbel*-PxN@Zc|SU+zTPKLtPiBzp|rc`Lm5!|Wk=$Sv^N_rVk2%QnIz-vcjQ4WGOL ze)kUe+}q%R*TMte1P^>8Tgg_y|1M+Y>~f6WVpasdn}HQ}E_Up*uwP8XzUm5$0YZaK zzSid_{(E9#4xtPFhyFq^ANwIh;O}B~wRSOPU^j$|@kev9A9gcCK)Ycs4@B%zd=AIX zmFDCa&`W_0!#?&>gkhL3F$NuvSPW*%N1$WSk{|ID?SLp;jnDCzpR*w`5i|5^%(7(6 z$=Pg*mWc5`5h+T~1HT0Gr-WUqmEyA${k{~RlQCnqVJ6WWc^24GmV_1SD*TBV<C`zB zelun$X3GFRNBZ*l(aSV5e6xb)L=a}dS<C}53;bum35<T<*#C}?dm8m$U`BtA8U6_$ z>#dJ;HO_sbytOg@96ZG{@ET8Hls^H#^ceieBLSoR0r(p+;%TJc2`{t(Bi#j`B*uCr z-(^(5H{C49{YpOK@fG;kZQxt<;qCI^?{eY)a^Mr`j+X9c7hopPy)50yro(^IoJhs2 zm<d0675wWA_*N@C?NmNb;@}-);g?6iQ(uC+zCrNcec;u5!Ow@o|Nl?U9-Ee5P~cdU zSzw``5Xj8Nm+WIg<z_m;$t`fKu#{zI78N;4E%=syM=8GD-@?DXKRUXo*aB(%gn%Wt zxV$KbvE5I3z26}Gf)M_+*BgtFico@3jj#iu4xt$#{2AZ~sR$(q)d)Kf>JXX{!k-0> zkcv=(P>rwyp$?%LA$&V<gj9qQgldEx2z3a}2;t8GM@U5|L8wO9fl!Cgj1c}jaD-HZ z5`=1m9SC&@%?RN;fFq<Llps_i>_DhPXhsNs0XRY`LJ2}O!VZKwgl2^B7l9+BB9tIh zBkVw^Luf__|0{5WRD=?QYJ?pKbqLJ};W)C1MMy;`L8wO9fl!Cgj1Z0krC5Yigc3Sj zLU;n<Lxd0<JDmk3zxZ$TqoXLtQk-kaD$m6aGgu1q%gP-1RR`Yxyr(VErXhe|noyF( z%N(V-1;xu*ei3o=F%Hbbg?^X<hUA4`mY_^>Ru*Lz=4V^*BNN4?D@kYNN;`fg!d~Q9 z;k1h)48@B)%+FLwd0Ad`7Jl)<V&r)~d)fG13a7(tjj{8{JBrH6OO?3zWer{gUh?zk z*=b_<=W^bBr2I;!qYU=5GILZzidGQTBs!$5BkMS%jIrUv#dMo!8B!+Z88sSytH)s( zk`vRB{<lP2fj8%Eq_4d$DCnA?`E8*8@3OU^;C6a@<8+1}%0%?+6^X+a<K!jq++|$c z<>MzzjK5;i<SP>rr%at@oj${sbk)_#DKlrK&Ym+jZ65vel)T<K)oJI>T|0Nyz5MFV zcba#eI=yq}r!6~o?yUL!_0zu}__No}=AFHEz5@oXZ-3u;P{hQ&wlopcF}QO#Z0a@s z%N?D%>#R$UuyE`VaJBD%U4B1C<?R{4uma$y2nFviRdLt8^Gw&BXLokfI)uS==fC?| zhLjie@6ufl>DQ}ckI2ggS;iWgBGR|RMT7aVQ+o}^S7F^Q8WG-MT+iMeqB;y165TZ} zW@N;`KG?j_6+3FoXrZJ&@%W{Ef2}WX-H6F7ebP1k!+Ol`AKm}T{`31^bFJR_x&cGN zqI!6H<A@snKy}q+$vk3wOogGz*DtssGopW1wgdY1Yv$k3e_?J`|C~ivI_9^Znw`J+ znw<Q_*YX^C<mn3+Bwdx9y=3uqsswn$3i@`tec{5)%&e@e?3^4&?xH+?<>xP6ym-ly zB|h2KVsxw*)UI6+ZQ8ZqVAC02a4-NIb4_y;IGp)Ki&zr(XS2&4r7Kw~{kRR7mNfdc znt4UE+zDjv?BrA#ol=~$(lUy1GFp%^tRS<@X>ro;)L2R~oq5a`9nH$Qou!lm^vtQz z_^F*t+%lmo*-p%J*uanYlnN7beO#7ZjGz61T}yrrOC>tJyoj&H?4}`QH(A)!;sQ%? zi3P+LErRVL+=G=max9tf`V?U^i=CEKida`rZoE(|X=du2Su?mPR<^RpnYlu^A!enY z?wM%G$%nft#g7avQk;_Fk`hWv&+b@}msyS<?8#wM@%utW<t1hvOF?n*lFU5%^&kUP z`sllxKK6Pk(7#^{e$VTjjzIq;@+iVr2)*C;deacLA-sj4*Ll4?5v&Mn5%wYcgfQ#_ zuh))nFT&dhKOkrydcA!SE=QPyP>660!TOQcy8&Sz!gmNgk$)1xP<UXz3JxF6vhy6- zOK2>VISSE^`PpSL9kGFz%T1=UxRAVbM>aQg>a1k^1l)A|Y+T}$WITpQv(8CjZ0f9; zbJK_bOiW9g!&rJEK4#&$#nf3T_)JWj1+jTElV;7dCniIRN5P*t4Pp?TdDX0>nUJ0{ zYwlde=2&MYrocM7>MCHfVB0!BiLyveN=c#=C_d8@Vaj4*w4P{D!SVE)b5LN1A3z%- zZhH{>3efqWD?qaz!YhlQ?>*=Bb`EB2F!mC$plR4wq=H_92Z<%1(Rk8Z4Z0Lh!FPaK z@V3CmpxyB<#VOE-L3^}gY%JbB84Fqing+TSZ}>Pt2ki5DH-Zkq`&ci5w!;f&AA??w zH|$P<j={TtJ#_kdCFp~W#OsY|pgEu=pe3NypsPW5fZhRG2f7Kg8T3)m@b--D0*wWI z2Q(G*ThJ2FpFpcYwKt#-ngv=1+UXGVL5F~bcR*W##)3LPQ$e4pMfpK@fo=r-9P}m7 z>pt~*kAl{Mwt#j#>h(s#z268r9`s$%`JlGX(9WO-K{tbr`W*jh1^N)^QP7U{&<8C5 zjl77lqoCtKCw>8a&~2bAKnuTwKIk8yuYlh974$*-eGPrkM?oX8Lm1lteb9rT^Fh<T zfj;PGpqoMSzJ)&M3DBdUOTU9YsCEqco$#Y5p!6k5e+Qip+TnZXgB}Lm3_AV?ueSk| zt{#Fg?Z!DwTM@2Bb?y*St#t?|J|0=KqxXBgBcu$G*5xtgfRTLUX0NvbD<<m_KD|ri zRbic$hg7gD`@|0)Gk74lTz?v93GAZDjLU-9^$4XH;|27u?TKB&Zws0l+TL0j9Guk^ zrNVdxy8_`=+;60#zx`yA+jAKz!(#}?U%(ikawt2&BQz2q{2;;~FXBCOGahu-&_4$J z>%V%vN6dKe2Znw-@bASOo92gK$#DyG2ZR4N%so1hH}Xe4f*$8t@G{Uz;xx?5lV+Kq zpNul(0q^w+?i2j*+YEd?@LPe?nY@ul(A@^U4R{Oi4Sx9T27VZL&fmOVY73wKJ_Gjv z4}qU}$PeFa;34og>wr^R`1HL7J`{L9{L9yV`kx!P4fs&_8~SkrLq9miXyZKK@$f%? z`04*@=&uLf3w~+18Fz4)x9>LK1Au>M#)IDF0`%_nVc;JDA7{o9r}1$N*l}Q;&Dac| z?RM~$M}dc$ahnex4E&Ar;M0J=cpm#X<crUvzZSR~cz1LDGky6#2K;8=_-{mC+s^jk z2Z1}!gC7IF7<ilYZ-<reJoyg>o&-G8oPW^uya3d`(}3Rr{3$>DF$2#5-W_WV-plZn zf1a=WYk`LXA7aKA`tZkqcLR=hP<;C70=Iy5Q0mhUZx~~5#)ja^cEJ;A08$w}kQs?} zj=M?aL#F%k2*G;Q2l!yf8aC{{Jca`A2fQN8gxlcD%EGu1<&g}T8?hfMG}{QuGw=f7 zwZNyE@tb{R*Z}-T;3Z}}Xo;c!EbxigS7GbnD`SutD3t#@zzcz|^23)I`p1DE27Z$t zzTCh&!v_z>9<8nNUj}?B@B%;mMTUMd@Yl|xUjV!#_Ig=<`U?#G4ZxFuw`KoX;G55* z{|@laffxDN&o}HJ2R;;g%QyV+8Uyc)J;S@e>6xf827>M|@XLT-fj#Lxet4CECj);D zIDg`*##oTszzcx)`vhOp<)>d^;2VHf0>9f2-(cX+0zU=3E&J~P&pFaIejND6z}w2d zGuGq@*gLgZf8g7Ix22y9oW7W6tzY?XG0I;6d@1m@%D(~lH^7~K`o)I+v%tq;&sOS( z7aI6Gz;6d`G2<B==Ig+5iSIGvK`(QGY2bCno^2@hfDXc^bP2yJXiAsJJA<uVELH8M zbQ!uqw{?lVt-Y<w_{t6`T@p&Wj8E(mo7iROlr9#?L4Hb?5S$)ke+N6Mu!Cji|GTS# zFQUx&9aVD4bScW$Af)TCzokoxvmANW(_65O-)rSQA3Ss&zxW!0nEKsT@_TeC{Fk%d zVoGn8jjvMz*I^lf3*Z;+7wD43VCk}eavP1Owc^5Ikl%%+lwTpYSU6REJXA*1ei~Da zU%e#VCJU(eTV+I*J4EJ>p~Ekge?OU4a%a4veh}xZvogI<+VlEwuGuWp{UrXIOsjfG z^Z(a~`aSnRgY9L*_LTGzN#i7)E@`@?xsooE^fpO1N&1AOyCgj%=@ChPko2^q?d8Dh zDd{DW#z{I|(sW64B@L{{ze<NxShxsvCxsbPr%tpCotIT!<Se&b9y2y3HhNS!PmQ{H z)cBa#u`#2D2|ial?+5(?@_04iOp^3F%4x0ggPF5cemi4+n9Sg*m(KUmW*)_Z@m_?Q zKV~c#Z%e3g<<AdcYCQV$FJfxk`|~?8H9!3MoeV$W&+p8d)x<Rc!SE&}t@K+k-s7lf zl^<sK9g`W<H=I?N&Yl$(j5Fe)B`W2k!FbZVo-ay19>s$3G*SKTv>6G;U9<9E{`?5m z+WZN|dnd}@_{+n)$noaSk7Sls`O3Tcq-l({WB=sOs(f6mg-8UU-F5`DTNlZ14&V=v z`~>CDr7?W>Ax3Q^v&r&MesoPo&{}B++Iv#IY8@e2x>h1+t+eN6@LMbY<6J(H<;i@N z|D^Zss5~VB{C6dPMF9Ux$*+)n4QaZ5L?AnBCBGf#GQ4#n`0E4gK$y!{2gsA(Cp#Mh z`1E!o@izzXqd7mEZI$Em9y!11NA)y}+k|UnL6D}4eyol2<xzf|U^A=aS4h5EFH<Dn zvOowbewyUh*aiOzxqxIyJ|4yMOYyTfKaxFIVc~q$J~vAKR>@cWayR(Y@0X1dcKA60 zqEAYG{AGgg7KH7Q{Ny2m!Ow;e{ZR66x<v5#nGmAiN&acMpz`x3@J~zrHDiT5KR-ZJ zN4rvaZn;$O`PmVop^`sunBY%?K3&}<-xDp;2L)jRC4ZPSoGJOE!KZ%VFHnM~_8*fa zf8i1#Nb`p-tK@GD;Lnu&2Fa(RHoDT4{Q{9z{DqQlk^IR5=D*BM<yjcOFH!kQzADdh zm9OLvl6L6pW5|w$CNeI?Ujsh1=U39eU;(oY;I}q^saad&{|C3<jrHX>vC@bnt;zod z^5~s&{4ISsj)wP#0{!i7DIe&!-{bsq{r@-I&bj{iSMa-`zP1sfaQs{l(N35*#9t`q zFE<N5{oWYy?;kGYpBID;;e44ek;|ogNs?fy=17$M(Kf+X%T-DncCx_l3O`d*Vc`mD zo-S@fe!aB+xSTJcA{%xO_`-r@Nb;PtZ;|%Ze4mSrxCQUqFv(Y12inN@h|G86)k0DZ zJNB*QAD8VQhaLMz8+J5Qu$#)vL?bxA3!6SmFxN?JSR3+_+Tf>xPwg2SP~U86Uz;Ng z^LuPW>8rM=-|tQF=U0IrPH&qAv=2S6A^9rl$oZKUR3DW5pz*>EKc_;J&d#VjsR8AQ z;O%qn{^u!fN7yibzSai+GnsEk>EAj_rSE0FhXe9GF6FOJ6@t}LJ_z?`RIe0SFX`6V zYK)WC`m3{)KXjQeuu0mvnDb@AM8-(@YT5qlBsN3xhouRIQ}V9|zbo25T$Ufj=9h!> zBiX_Lei^qTg-qmjX@76ve3ASyvcBrR_5sN+m3(#o`xnW7TiW4g#mMJ5$-kc;3gUn3 zWZnlQe=r_b(shp@>?_H)j~0wSB>#lu9}no4;5OQSAm?{szeqpB&m3WEq~zm8NPcBW z`x7PqrrCnAPV#4iPvbn$58MDgjobMF<0nVj$rvLHNO#G~B>yYfK0T%Vn>b%4Oyq7U zzfRiuP-6cHzQrV`qR&bB4br|E=exo08q|x0$Z{(A!(3jaeDo`6=fwa!jcv&PLH5x? z>V8Cx!%n!Lr}>gJQrK>%2}-}IK<!p1%cJBk;qtz6sMthl=lW>D*&u<dCI25Y1Y@e? zUoZL1^8~{o`30OW6DCs827i;ZlM*Y0`Ew;i=?6i=QT}afECP_9PeGpQ^>IMGu95Aj z?(gJs%XUcnqvd*`#^LTZ%2NkE<s0a4zmRsWy-F0MK$gb?KKX|p0p&R<<!_xK1l4*( z&!efo?g*83<c935<Yy%dK0mugGz1GJ$v+z-`24vYqLJWJI~<kys`a!#mlv|;&oR=@ zLurCrDnXm%Z<gaw7K_bp!%lV^{N>=&_z!HiO7Jb_g2?zo+)fwvk=zG%lKjUc{}G#D zNO#8eNdDV$UA|k&zc2Z3$bM1n{I%rwl<QG<Dc>adr(}JVfA~f6BV>karF<tG#0`{j zGr1Ie>X%*8uPT3=%lq-%^NLAQK1|LRi!_!3KJ{aR?8n2BKVQn%$?@=p<QGc*9kO0e zNk07!I+bUnw7*C4?*X6eCj^WWye;D_bK+Igm~58gD0M8tJ4cREyR*=qT~J))C}Vbe zPO*JaL2*`Qfj!4rTv}$&EMI}QoeE3vc9tV2=JL1+m$xot&&@B&w`Z1?X0Eh5ikx_P zE4MVW&|%LhFDzUM6;sL%NvEGEz0H-HSz6{OMZxe+s(2MuybWr17MGmEE6iLG$fI;# zaY2rqUZkc(5s#HoG@C5ixf#lvSoES7kL2X%82K&FcV_3=i;L`z;#?BS%+7X{a482b zSE0k1N&KwLG6zw-21lf51((UrTS6&%^-OBwbtTHk$%O;>*(JqPwpQMM<wlA#eZ^81 z=v7_3HMT6jxV+3~7j12yIWO7nEX^$9wGDWqm(1}OitYSWDkRJ46+7|bFoC=~M3Wmy zF$TySH(Ma;P=Z&^!9uk~q-0UCvsf@>jK60G4u4w<w9LtCSvm^w($QSB%vo9vGv&_w z0`#`sK79_}qq19PPP5yQ@*5jD%s%Z}yk?a&)gKX^XSdIoInQpjNei}VbC`Wb@~kO| z$@W>(r_Z&f+4&1#cI0X=6J6^pmVFI-1^HRo_Uy89K60se4q-MI?;0i~%t%g}GSxmh zW^~Lr^^RFdu8PsyW(;jeL(N}w<x0G)UrG}Rq^Q_lP@J7fZ|Mh0Q6J&$W@b-HOTjQw zQ!y=NDow;RdT|l&BIZEEUlWa&U9!@jXS@REEL8;*-GCC7`HSKmbG$+5&r|9}Iricb zM=9!7%JR$b-eW*EXqU_!e^rz)KcH&TT1jc~VxKvc1)9yrv^#R}nmZa^4a*Yp07&N- zq3WdtjsVMc=?^f?FrM=Zd_@@xC2G(dM^^bF#GQDZUA08f;^O=wU#8T}nFZ(-h}mVa z<j}V#&9YOU`s|wezNi@erCLYoISTSk)mgcc-U~0H>0qb#=VfW|MrN5Kpc6%Dc_~+} zRHdO|2VDqbWO73?8{`6a8JIbLZPgBCA40?2_fouSfb7!ZvNE5L9QS;v+Y2+>=)STN zdc#!~U>W?WjFvj^9|R7wHR?mdnbL?>r9c<b8>ym3=+fL0dYL!Zzjc*x7QK0oNwcUB z&R3L;rY&`<Yz(YSWySV9yf}-Qk&U-nOEGK$jd6L0cn{WZnv5EYnKlcSF<$NE^e+}G zSJMAA7@l9cSiW}T;$J6<iUVz<KWPnA{zEoMc5zXeJ=;-GV0I{cjVa_E>u-h1fHDRQ zF%+e^B(NkX!Xnk`)E9Et2H3M_p>KuTk_EzgUdWO$fM%8#X5pWSsEbiq3`k{7ET_2z zzUmXcEVF=S9lVu)7SgN(xUbtq&%m%_MSg&M?())nXMq2-+u_%ghbM>Es=Hgca(QWH zi7KVhu=eG4?rvp4ic5XPF!cd{wOWid<ppRa(STGnpckxtx^{c^icE6-nFaYb29#H7 zh$&`FJU)Kyyj)J2tJKI-_`mI_ENGwP%YipKMh#lEcqLx@#_0EH+w&X+a3|#B&l$%o zrfg*)JUFPcRM0#X<NpR$!eZc$95IPglA@iNi)3n1QF%;Od454oG+s)Np;TUGSsshQ zfBnFopjaU|f`1+=!>Z($umdY~6l9WujFl8PSqvY|F^I-sjb}03ZN<=T4?@M<g~vGZ z<o+%%2S!v%sEUmq;~FY1{}Bmgq7@(pgP6sj@d~kVlsnk}8liI&4FR{4{8G<N740ke zijb`N8iWM4^oG8AzN)CjER49i&sOYFh?w=&b67<OD?v#E^{0V<8qexg`PFk6MdfWX zp4f^Dw=sSf-Ja0BmC{%5J1B~Wll;Q%GjAuQuiiUI2cJX?eVLJZ4y>M6a3j)&iW9v7 zf!;+>`sz8cq6s8~OO;>ADY^t0z1yJD3#l=2DVo4j_`euX>N{0_$;N+6i#}2MTcy6D z>U|59ztUIrUn}*eNQ3J6w4&;L57MW5$w2)(!J~3f`RG#byC{kiFTX3W|6M@M`s#VN zq7?xHHe6a$bYp<NdM>W0Dz7SpN-Ij|4d(pS`HG_7CMiupRlbV*Xn?+YzeiErp88#Z z^?yq0tNv5xUy42%@F?5jXH9%-3YA~!tLOHL(*IzXufY8G0W|BY=lhCo4yb@?H)Zop zM7kizX=c0!5VBfG1j?(lqMtx4%%rd07YP41^}m5GjXjmWdd?Lo^_!`3xYYPm`Ko@T z=jtS)^ws+ZA-9kgeXoxHrSuj35wKa`INz-hdTO32D@sqLn-L+N%HL99;ZS4+Cv3ee zzeq7=Q4vXh0VR>x0KU>65x`gG%rsz#a1C39P+ZteP+Di`=tz}c)r*FQD!Y&rpWE&c c^ofA+qw-a<bUfIa{>%r3#91XMX`uf90bs=ung9R* diff --git a/SQLPParser.c b/SQLPParser.c deleted file mode 100644 index 53f170b..0000000 --- a/SQLPParser.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 1989, G. E. Weddell. - * - * This file is part of RDM. - * - * RDM is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RDM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RDM. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <stdio.h> -#include "util.h" -#include "lex.yy.c" -#include "SQLPGrammar.tab.c" - -int main() -{ - int Result; - strcpy(LineBuffer, ""); - printf("(\n"); - Result = yyparse(); - if (Result) - printf("**error**"); - else - fprintf(stderr, "checking semantics.\n"); - printf(")\n"); - return (Result); -} diff --git a/SQLPScanner.l b/SQLPScanner.l deleted file mode 100644 index cfb2b22..0000000 --- a/SQLPScanner.l +++ /dev/null @@ -1,165 +0,0 @@ -%{ -/* - * Copyright (C) 1989, G. E. Weddell. - * - * This file is part of RDM. - * - * RDM is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RDM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RDM. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "SQLPGrammar_new.tab.h" -#include <stdio.h> -#include <ctype.h> - -int LineNumber = 1; -char LineBuffer[200]; -%} - -%p 3000 - -D [0-9] -L [a-zA-Z_] -E [Ee][+-]?{D}+ - -%% - -\%.*\n { LineNumber++; } -\n { LineNumber++; strcpy(LineBuffer, ""); } -"all" { strcat(LineBuffer, yytext); return(ALL); } -"and" { strcat(LineBuffer, yytext); return(AND); } -"array" { strcat(LineBuffer, yytext); return(ARRAY); } -"as" { strcat(LineBuffer, yytext); return(AS); } -"asc" { strcat(LineBuffer, yytext); return(ASC); } -"binary" { strcat(LineBuffer, yytext); return(BINARY); } -"by" { strcat(LineBuffer, yytext); return(BY); } -"change" { strcat(LineBuffer, yytext); return(CHANGE); } -"class" { strcat(LineBuffer, yytext); return(CLASS); } -"constraints" { strcat(LineBuffer, yytext); return(CONSTRAINTS); } -"cover" { strcat(LineBuffer, yytext); return(COVER); } -"declare" { strcat(LineBuffer, yytext); return(DECLARE); } -"delete" { strcat(LineBuffer, yytext); return(DELETE); } -"desc" { strcat(LineBuffer, yytext); return(DESC); } -"union" { strcat(LineBuffer, yytext); return(UNION); } -"determined" { strcat(LineBuffer, yytext); return(DETERMINED); } -"distributed" { strcat(LineBuffer, yytext); return(DISTRIBUTED); } -"dynamic" { strcat(LineBuffer, yytext); return(DYNAMIC); } -"exist" { strcat(LineBuffer, yytext); return(EXIST); } -"for" { strcat(LineBuffer, yytext); return(FOR); } -"frequency" { strcat(LineBuffer, yytext); return(FREQUENCY); } -"from" { strcat(LineBuffer, yytext); return(FROM); } -"given" { strcat(LineBuffer, yytext); return(GIVEN); } -"has" { strcat(LineBuffer, yytext); return(HAS); } -"implies" { strcat(LineBuffer, yytext); return(IMPLIES); } -"index" { strcat(LineBuffer, yytext); return(INDEX); } -"insert" { strcat(LineBuffer, yytext); return(INSERT); } -"Integer" { strcat(LineBuffer, yytext); return(INTCLASS); } -"isa" { strcat(LineBuffer, yytext); return(ISA); } -"list" { strcat(LineBuffer, yytext); return(LIST); } -"max" { strcat(LineBuffer, yytext); return(MAX); } -"maxlen" { strcat(LineBuffer, yytext); return(MAXLEN); } -"min" { strcat(LineBuffer, yytext); return(MIN); } -"mod" { strcat(LineBuffer, yytext); return(MOD); } -"not" { strcat(LineBuffer, yytext); return(NOT); } -"of" { strcat(LineBuffer, yytext); return(OF); } -"on" { strcat(LineBuffer, yytext); return(ON); } -"one" { strcat(LineBuffer, yytext); return(ONE); } -"or" { strcat(LineBuffer, yytext); return(OR); } -"order" { strcat(LineBuffer, yytext); return(ORDER); } -"ordered" { strcat(LineBuffer, yytext); return(ORDERED); } -"overlap" { strcat(LineBuffer, yytext); return(OVERLAP); } -"pointer" { strcat(LineBuffer, yytext); return(POINTER); } -"precomputed" { strcat(LineBuffer, yytext); return(PRECOMPUTED); } -"property" { strcat(LineBuffer, yytext); return(PROPERTY); } -"properties" { strcat(LineBuffer, yytext); return(PROPERTIES); } -"query" { strcat(LineBuffer, yytext); return(QUERY); } -"range" { strcat(LineBuffer, yytext); return(RANGE); } -"return" { strcat(LineBuffer, yytext); return(RETURN); } -"schema" { strcat(LineBuffer, yytext); return(SCHEMA); } -"select" { strcat(LineBuffer, yytext); return(SELECT); } -"selectivity" { strcat(LineBuffer, yytext); return(SELECTIVITY); } -"size" { strcat(LineBuffer, yytext); return(SIZE); } -"space" { strcat(LineBuffer, yytext); return(SPACE); } -"static" { strcat(LineBuffer, yytext); return(STATIC); } -"store" { strcat(LineBuffer, yytext); return(STORE); } -"storing" { strcat(LineBuffer, yytext); return(STORING); } -"String" { strcat(LineBuffer, yytext); return(STRCLASS); } -"time" { strcat(LineBuffer, yytext); return(TIME); } -"to" { strcat(LineBuffer, yytext); return(TO); } -"transaction" { strcat(LineBuffer, yytext); return(TRANSACTION); } -"tree" { strcat(LineBuffer, yytext); return(TREE); } -"type" { strcat(LineBuffer, yytext); return(TYPE); } -"unit" { strcat(LineBuffer, yytext); return(UNIT); } -"where" { strcat(LineBuffer, yytext); return(WHERE); } -"->" { strcat(LineBuffer, yytext); return(REF); } - -{L}({L}|{D})* { strcat(LineBuffer, yytext); return(IDENTIFIER); } - -{D}+ { strcat(LineBuffer, yytext); return(INTEGER); } -{D}+{E} { strcat(LineBuffer, yytext); return(REAL); } -{D}*"."{D}+({E})? { strcat(LineBuffer, yytext); return(REAL); } -{D}+"."{D}*({E})? { strcat(LineBuffer, yytext); return(REAL); } - -\"(\\.|[^\\"])*\" { strcat(LineBuffer, yytext); return(STRING); } - -":=" { strcat(LineBuffer, yytext); return(ASSIGN); } -"<=" { strcat(LineBuffer, yytext); return(LE); } -">=" { strcat(LineBuffer, yytext); return(GE); } -"<>" { strcat(LineBuffer, yytext); return(NE); } -";" { strcat(LineBuffer, yytext); return(';'); } -"{" { strcat(LineBuffer, yytext); return('{'); } -"}" { strcat(LineBuffer, yytext); return('}'); } -"," { strcat(LineBuffer, yytext); return(','); } -"=" { strcat(LineBuffer, yytext); return(EQ); } -"(" { strcat(LineBuffer, yytext); return('('); } -")" { strcat(LineBuffer, yytext); return(')'); } -"[" { strcat(LineBuffer, yytext); return('['); } -"]" { strcat(LineBuffer, yytext); return(']'); } -"." { strcat(LineBuffer, yytext); return('.'); } -"-" { strcat(LineBuffer, yytext); return('-'); } -"+" { strcat(LineBuffer, yytext); return('+'); } -"*" { strcat(LineBuffer, yytext); return(STAR); } -"/" { strcat(LineBuffer, yytext); return('/'); } -"<" { strcat(LineBuffer, yytext); return('<'); } -">" { strcat(LineBuffer, yytext); return('>'); } - -" " { strcat(LineBuffer, yytext); } -"\r" { strcat(LineBuffer, yytext); } -. { strcat(LineBuffer, yytext); - yyerror("illegal character"); } -%% - -yyerror(s) -char *s; -{ - int i; - char c; - fprintf( stderr, "\n%s", LineBuffer ); - c = input(); - while ( c != '\n' && c != 0 ) { - putc(c, stderr); - c = input(); - } - putc('\n', stderr); - for (i=1; i <= strlen( LineBuffer ) - strlen( yytext ); i++) - putc(' ', stderr); - for (i=1; i <= strlen( yytext ); i++) - putc('^', stderr); - putc('\n', stderr); - fprintf ( stderr, "** error: %s found in line %d.\n\n", s, LineNumber ); -} - -yywrap() -{ - return(1); -} \ No newline at end of file diff --git a/SQLPSchema b/SQLPSchema index b566414ba5a94ea8d426141915fb5cdf5d135367..3c8d9a3cff83f239469c1b9ab583ab4af4acf6ac 100755 GIT binary patch literal 65120 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 Vt^2&%?N9~Luj^#Ut{3!wgMWY>Z7%=- literal 65248 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 Q|6)Y)pN9(a8+oz#3keZn6951J diff --git a/old b/old deleted file mode 100644 index 1588df7..0000000 --- a/old +++ /dev/null @@ -1,205 +0,0 @@ -%{ - #include "util.h" -%} - -// %union { -// struct node *n; -//} - -%define api.value.type {struct node *} -%token IMPLIES OR AND NOT LE GE LT GT NE HAS MAX MIN AS ASC DESC MOD ASSIGN EQ STAR COMMA DOT - -%token SIZE SELECTIVITY OVERLAP -%token FREQUENCY UNIT TIME SPACE - -%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF - -%token STORE STORING DYNAMIC STATIC OF TYPE ORDERED BY -%token INDEX LIST ARRAY BINARY TREE DISTRIBUTED POINTER - -%token SCHEMA CLASS ISA PROPERTIES CONSTRAINTS PROPERTY -%token ON DETERMINED COVER QUERY GIVEN FROM SELECT WHERE ORDER -%token PRECOMPUTED ONE EXIST FOR ALL TRANSACTION INTCLASS STRCLASS -%token INTEGER REAL DOUBLEREAL STRING MAXLEN RANGE TO -%token INSERT END CHANGE DELETE DECLARE RETURN UNION - -%start SQLPProgram -%% -SQLPProgram - : Query - { printf("Input Query\n"); - struct node *n = new_node(1, SQLPProgram); - n->children[0] = $1; - printf("Printing Tree\n"); - print_tree(n, 0); - struct linked_node *linked_tree = malloc(sizeof(struct linked_node)); - translate(linked_tree, n); - print_linked_tree(linked_tree, 0); - } - ; - -Identifier - : IDENTIFIER - { printf("|%s| ", yytext); - $$ = new_node(1, Identifier); - $$->children[0] = new_node(0, IDENTIFIER); - } - ; - -Query - : Union_Query - { printf("Union Query\n"); - $$ = new_node(1, Query); - $$->children[0] = $1; - } - ; - -Select_Query - : SELECT Select_List Body - { printf("SQLP Query\n"); - $$ = new_node(3, Select_Query); - $$->children[0] = new_node(0, SELECT); - $$->children[1] = $2; - $$->children[2] = $3; - } - ; - -Body - : FROM TablePath - { printf("Body 1\n"); - $$ = new_node(2, Body); - $$->children[0] = new_node(0, FROM); - $$->children[1] = $2;} - | FROM TablePath WHERE Bool - { printf("Body 2\n"); - $$ = new_node(4, Body); - $$->children[0] = new_node(0, FROM); - $$->children[1] = $2; - $$->children[2] = new_node(0, WHERE); - $$->children[3] = $4; - } - | FROM TablePath WHERE Pred - { printf("Body 3\n"); - $$ = new_node(4, Body); - $$->children[0] = new_node(0, FROM); - $$->children[1] = $2; - $$->children[2] = new_node(0, WHERE); - $$->children[3] = $4; - } - ; - -TablePath - : Identifier Identifier - { printf("table path1\n"); - $$ = new_node(2, TablePath); - $$->children[0] = $1; - $$->children[1] = $2; - } - | Identifier Identifier ',' TablePath - { printf("table path2\n"); - $$ = new_node(4, TablePath); - $$->children[0] = $1; - $$->children[1] = $2; - $$->children[2] = new_node(0, COMMA); - $$->children[3] = $4; - } - ; - -Union_Query - : Select_Query - { printf("union query 1\n"); - $$ = new_node(1, Union_Query); - $$->children[0] = $1; - } - | Union_Query UNION Select_Query - { printf("union query 2\n"); - $$ = new_node(3, Union_Query); - $$->children[0] = $1; - $$->children[1] = new_node(0, UNION); - $$->children[2] = $3; - } - ; - -Select_List - : STAR - { printf("star\n"); - $$ = new_node(1, Select_List); - $$->children[0] = new_node(0, STAR); - } - | AttrPath - { printf("select list attr path\n"); - $$ = new_node(1, Select_List); - $$->children[0] = $1; - } - | AttrPath ',' Select_List - { printf("Select list\n"); - $$ = new_node(3, Select_List); - $$->children[0] = $1; - $$->children[1] = new_node(0, COMMA); - $$->children[2] = $3; - } - ; - -AttrPath - : Identifier - { printf("path id\n"); - $$ = new_node(1, AttrPath); - $$->children[0] = $1; - } - | Identifier '.' AttrPath - { printf("Path Function\n"); - $$ = new_node(3, AttrPath); - $$->children[0] = $1; - $$->children[1] = new_node(0, DOT); - $$->children[2] = $3; - } - ; -Operator - : EQ - | NE - | LE - | GE - | LT - | GT - ; - -Bool - : AttrPath Operator AttrPath - { printf("AttrPath op AttrPath\n"); - $$ = new_node(3, Bool); - $$->children[0] = $1; - $$->children[1] = $2; - $$->children[2] = $3; - } - | AttrPath Operator CONSTANT - { printf("AttrPath op Constant\n"); - $$ = new_node(3, Bool); - $$->children[0] = $1; - $$->children[1] = $2; - $$->children[2] = new_node(0, CONSTANT); - } - ; - -Pred - : Bool AND Pred - { printf("pred and pred\n"); - $$ = new_node(3, Pred); - $$->children[0] = $1; - $$->children[1] = new_node(0, AND); - $$->children[2] = $3; - - } - | NOT Pred - { printf("Not Pred\n"); - $$ = new_node(2, Pred); - $$->children[0] = new_node(0, NOT); - $$->children[1] = $2; - - } - | EXIST '(' Query ')' - { printf("Exist query\n"); - $$ = new_node(2, Pred); - $$->children[0] = new_node(0, EXIST); - $$->children[1] = $3; - } - ; \ No newline at end of file diff --git a/parser.c b/parser.c deleted file mode 100644 index 276c7e6..0000000 --- a/parser.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <string.h> -#include "parser.h" - -cons_cell* parse(char* input, int size) { - if (input[0] == NULL) { - assert(size == 0); - return NULL; - } - if (input[0] == '(') { - // Nested case - int count_bracket = 1; - int it = 0; - // Find where the brackets enclose - while (count_bracket > 0) { - it++; - if (input[it] == '(') { - count_bracket++; - } else if (input[it] == ')') { - count_bracket--; - } - } - char buffer[it]; - strncpy(buffer, &input[1], it - 1); - buffer[it - 1] = '\0'; - - // Recurse on what is enclosed by the brackets - cons_cell* car_cons = parse(buffer, it - 1); - - // Copy everything after the brackets - int next_char = it + 1; - while (input[next_char] == ' ' && input[next_char] != NULL) { - next_char++; - } - char buffer_next[500]; - strncpy(buffer_next, &input[next_char], size - next_char + 1); - - // Recurse on everything after the brackets - cons_cell* cdr_cons = parse(buffer_next, size - next_char); - - return create_cons_cell(car_cons, cdr_cons); - } else { - // Not nested case - - // Copy the first term - int first_space_idx = 0; - while (input[first_space_idx] != ' ' && input[first_space_idx] != NULL) { - first_space_idx++; - } - char buff_first[500]; - strncpy(buff_first, input, first_space_idx); - buff_first[first_space_idx] = '\0'; - - // Create cons_cell for first term - cons_cell* car_cons = create_cons_cell_w_atom(buff_first, NULL); - char buff_other[500]; - int next_char = first_space_idx; - while (input[next_char] == ' ' && input[next_char] != NULL) { - next_char++; - } - - // Copy everything after the first term - strncpy(buff_other, &input[next_char], size - next_char + 1); - // Recurse on everything after the first term - cons_cell* cdr_cons = parse(buff_other, size - next_char); - car_cons->cdr = cdr_cons; - return car_cons; - } -} - -int main() { - char str[500]; - printf("Enter the json-string to parse: \n"); - scanf("%[^\n]s", str); - - printf("You entered: %s\n", str); - int size = 0; - while (str[size] != NULL) { - size++; - } - cons_cell* cons = parse(str, size); - print_cons_tree(cons); - return 0; -} diff --git a/parser.h b/parser.h deleted file mode 100644 index 4af3e17..0000000 --- a/parser.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef PARSER_H -#define PARSER_H - -#include "util.h" - -cons_cell* parse(char* input, int size); - -#endif \ No newline at end of file diff --git a/util.c b/util.c deleted file mode 100644 index b4f3f7f..0000000 --- a/util.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "util.h" - -cons_cell* create_cons_cell(void* car, cons_cell* cdr) { - cons_cell* new_cons = malloc(sizeof(cons_cell)); - new_cons->car = car; - new_cons->cdr = cdr; - new_cons->is_atom = false; - return new_cons; -} - - -atom* create_atom(char* val) { - printf("create_atom: %s\n", val); - atom* new_atom = malloc(sizeof(atom)); - new_atom->val = malloc(sizeof(char) * (strlen(val) + 1)); - strcpy(new_atom->val, val); - return new_atom; -} - - -cons_cell* create_cons_cell_w_atom(char* val, cons_cell* cdr) { - atom* new_atom = create_atom(val); - cons_cell* new_cons = malloc(sizeof(cons_cell)); - new_cons->car = new_atom; - new_cons->cdr = cdr; - new_cons->is_atom = true; - return new_cons; -} - -cons_cell* create_spcol(cons_cell* var, cons_cell* pf) { - cons_cell* var_cons = create_cons_cell(var, pf); - char operator[6] = "SPCOL\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, var_cons); - return operator_cons; -} - -cons_cell* create_pf(cons_cell* attr, cons_cell* next_attr) { - cons_cell* attr_cons = create_cons_cell(attr, next_attr); - char operator[3] = "PF\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, attr_cons); - return operator_cons; -} - -cons_cell* create_table(char *table) { - cons_cell* table_cons = create_cons_cell_w_atom(table, NULL); - char operator[6] = "TABLE\0"; - return create_cons_cell_w_atom(operator, table_cons); -} - -cons_cell* create_term(cons_cell* term) { - cons_cell* term_cons = create_cons_cell(term, NULL); - char operator[5] = "TERM\0"; - return create_cons_cell_w_atom(operator, term_cons); -} - -cons_cell* create_constant(char* constant) { - cons_cell* constant_cons = create_cons_cell_w_atom(constant, NULL); - char operator[6] = "CONST\0"; - return create_cons_cell_w_atom(operator, constant_cons); -} - -cons_cell* create_col(char *col) { - cons_cell* col_cons = create_cons_cell_w_atom(col, NULL); - char operator[4] = "COL\0"; - return create_cons_cell_w_atom(operator, col_cons); -} - -cons_cell* create_attr(char *attr) { - cons_cell* attr_cons = create_cons_cell_w_atom(attr, NULL); - char operator[5] = "ATTR\0"; - return create_cons_cell_w_atom(operator, attr_cons); -} - -cons_cell* create_var(char *var) { - cons_cell* var_cons = create_cons_cell_w_atom(var, NULL); - char operator[4] = "VAR\0"; - return create_cons_cell_w_atom(operator, var_cons); -} - -cons_cell* create_op(char *op) { - cons_cell* op_cons = create_cons_cell_w_atom(op, NULL); - char operator[3] = "OP\0"; - return create_cons_cell_w_atom(operator, op_cons); -} - -// todo: why need ra -cons_cell* create_comp_operator(cons_cell* op, cons_cell* term1, cons_cell* term2, cons_cell* ra) { - cons_cell* ra_cons = create_cons_cell(ra, NULL); - cons_cell* term2_cons = create_cons_cell(term2, ra_cons); - cons_cell* term1_cons = create_cons_cell(term1, term2_cons); - cons_cell* op_cons = create_cons_cell(op, term1_cons); - char operator[5] = "COMP\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, op_cons); - return operator_cons; -} - - -cons_cell* create_atom_operator(cons_cell* table, cons_cell* var) { - cons_cell* var_cons = create_cons_cell(var, NULL); - cons_cell* tab_name_cons = create_cons_cell(table, var_cons); - char operator[5] = "ATOM\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, tab_name_cons); - return operator_cons; -} - -// todo: why pass NULL -cons_cell* create_union_all_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[10] = "UNION_ALL\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_union_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[6] = "UNION\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_and_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[4] = "AND\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_or_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[3] = "OR\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_njoin_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[6] = "NJOIN\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_cross_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[6] = "CROSS\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -// For when you want to assign column names to another name -cons_cell* create_rename_operator(cons_cell* table, cons_cell* var) { - cons_cell* original_cons = create_cons_cell(table, var); - char operator[7] = "RENAME\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, original_cons); - return operator_cons; -} - -cons_cell* create_proj_operator(cons_cell* assign, cons_cell* ra) { - cons_cell* ra_cons = create_cons_cell(ra, NULL); - cons_cell* assign_cons = create_cons_cell(assign, ra_cons); - char operator[5] = "PROJ\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, assign_cons); - return operator_cons; -} - -// todo: ra2? -cons_cell* create_not_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[4] = "NOT\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_exist_operator(cons_cell* ra1) { - cons_cell* ra1_cons = create_cons_cell(ra1, NULL); - char operator[6] = "EXIST\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return create_cons_cell_w_atom(operator, ra1_cons); -} - - -cons_cell* create_limit_operator(cons_cell* ra1, cons_cell* ra2) { - cons_cell* ra2_cons = create_cons_cell(ra2, NULL); - cons_cell* ra1_cons = create_cons_cell(ra1, ra2_cons); - char operator[6] = "LIMIT\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_elim_operator(cons_cell* ra1) { - cons_cell* ra1_cons = create_cons_cell(ra1, NULL); - char operator[5] = "ELIM\0"; - cons_cell* operator_cons = create_cons_cell_w_atom(operator, ra1_cons); - return operator_cons; -} - -cons_cell* create_eval_operator(cons_cell* logic, cons_cell* cross) { - cons_cell* var_cons = create_cons_cell(logic, cross); - char operator[5] = "EVAL\0"; - return create_cons_cell_w_atom(operator, var_cons); -} - -void print_cons_tree(cons_cell *root) { - print_cons_tree_helper(root, 0); -} - -void print_cons_tree_helper(cons_cell *root, int indent) { - if (root == NULL) { - return; - } - - if (root->is_atom) { - for (int i = 0; i < indent; i++) { - printf(" "); - } - printf("%s", ((atom*)root->car)->val); - printf("\n"); - - print_cons_tree_helper(root->cdr, indent+1); - } else { - print_cons_tree_helper((cons_cell*)root->car, indent); - print_cons_tree_helper(root->cdr, indent); - } -} - diff --git a/util.h b/util.h deleted file mode 100644 index a32e998..0000000 --- a/util.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef UTIL_H -#define UTIL_H - -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <string.h> -#include <assert.h> - -// Basic building blocks that contain char values -typedef struct atom { - char* val; -} atom; - -// A linked list like structure -// car points to element the node is holding -// cdr points to next cons cell in list or null -// is_atom determines if car is an atom -typedef struct cons_cell { - void* car; - struct cons_cell* cdr; - bool is_atom; -} cons_cell; - -// Creates a cons_cell -cons_cell* create_cons_cell(void* car, cons_cell* cdr); -// Creates an atom -atom* create_atom(char* val); -// Creates a cons_cell that has an atom as its car -cons_cell* create_cons_cell_w_atom(char* val, cons_cell* cdr); - -/* - -Below comment block are functions that implement the following relational -algebra expressions for SQL queries: - -<ra> := (comp <op> <term> <term> <ra>) - | (atom <table> <var>) - | (union-all <ra> <ra>) - | (cross <ra> <ra>) - | (proj ((rename <col> <col>)) <ra>) - | (not <ra> <ra>) - | (elim <ra>) - | (limit n <ra> <ra>) - | (eval <ra> <ra>) - -<term> := <col> | <const> -<col> := <spcol> | <scol> -<spcol> := <var> "." <pf> // for SQLP -<scol> := <var> "." <attr> // for SQL -<pf> := <attr> <attr> -<var> := identifier -<attr> := identifier -<table> := identifier -<term> := identifier -<const> := identifier -<op> := [GT, GE, EQ, LE, LT] - -*/ - -// The following are all helper functions to create the -// various relational algebra expressions -cons_cell* create_spcol(cons_cell* var, cons_cell* pf); -cons_cell* create_pf(cons_cell* attr, cons_cell* next_attr); -cons_cell* create_table(char *table); -cons_cell* create_term(cons_cell *term); -cons_cell* create_constant(char* constant); -cons_cell* create_col(char *col); -cons_cell* create_attr(char *attr); -cons_cell* create_var(char *var); -cons_cell* create_op(char *op); -cons_cell* create_comp_operator(cons_cell* op, cons_cell* term1, cons_cell* term2, cons_cell* ra); -cons_cell* create_atom_operator(cons_cell* table, cons_cell* var); -cons_cell* create_union_all_operator(cons_cell* ra1, cons_cell* ra2); -cons_cell* create_union_operator(cons_cell* ra1, cons_cell* ra2); -cons_cell* create_cross_operator(cons_cell* ra1, cons_cell* ra2); -cons_cell* create_rename_operator(cons_cell* table, cons_cell* var); -cons_cell* create_proj_operator(cons_cell* assign, cons_cell* ra); -cons_cell* create_not_operator(cons_cell* ra1, cons_cell* ra2); -cons_cell* create_exist_operator(cons_cell* ra1); -cons_cell* create_limit_operator(cons_cell* ra1, cons_cell* ra2); -cons_cell* create_elim_operator(cons_cell* ra1); -cons_cell* create_eval_operator(cons_cell* logic, cons_cell* cross); - -// Prints an in order traversal of the tree -void print_cons_tree(cons_cell *root); - -void print_cons_tree_helper(cons_cell *root, int indent); -#endif - - - -- GitLab