From baccbb015ee26385b52b9e88d17fafb1d8a188e7 Mon Sep 17 00:00:00 2001
From: JasonJPu <cub1@live.ca>
Date: Sat, 30 Mar 2019 15:39:07 -0400
Subject: [PATCH] Add comments

---
 Parser     | Bin 14308 -> 14364 bytes
 README.md  |   4 +++-
 SQLPParser | Bin 42568 -> 42632 bytes
 parser.c   |  16 ++++++++++++++++
 util.h     |  29 +++++++++++++++++++++++++++++
 util.o     | Bin 7628 -> 7884 bytes
 6 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/Parser b/Parser
index 0440ebd7ba1e19ef0801e8a356e211c737d58823..82c275741d8da0deb6c35c9eab373c8d70a19251 100755
GIT binary patch
delta 2486
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

delta 2502
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

diff --git a/README.md b/README.md
index 210ac94..2edc947 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,9 @@
-To run the parser, run `make` then run `./SQLPParser`. An example of a test input is `select s.name from student s where s.name = "John";`. Currently a syntax error will be reported when the semi-colon is read, but the parse tree that is outputted is correct.
+To run the SQLP parser, run `make` then run `./SQLPParser`. An example of a test input is `select s.name from student s where s.name = "John" and s.num = 10;`. Currently a syntax error will be reported when the semi-colon is read, but the parse tree that is outputted is correct.
 
 The grammar is located in `SQLPGrammar.y`, and non-keyword types (such as `INTEGER`, `IDENTIFIER`, `STRING`) are defined in `SQLPScanner.l`. `util.c` contains the functions needed to build the con cell structure.
 
+For parsing any general string into a tree of `cons_cells`, run `make` then run `./Parser`. An example of a test input is `PROJ (AS (SPCOL (VAR (s) PF (ATTR (name)))) ATOM (TABLE (student) VAR (s)))`. Every clause encosed in brackets is nested within a child `cons_cell`, and any two adjacent terms are connected via the `next` pointer.
+
 A common way of defining the behavior of a process or thread in cases where
 performance is critical is in terms of a collection of n+1 files containing
 code in the C programming language: n "module" files with a ".c" suffix that
diff --git a/SQLPParser b/SQLPParser
index e22a4f61718ea40e54e8f783f0c190796c33b7fb..0645f020f73123bc69119ce5228dfdf102a26ea1 100755
GIT binary patch
delta 13116
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
TPShRRBD?Xu)QMjj7AgM+bs2dI

delta 12970
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

diff --git a/parser.c b/parser.c
index 0f1002e..276c7e6 100644
--- a/parser.c
+++ b/parser.c
@@ -10,8 +10,10 @@ cons_cell* parse(char* input, int size) {
         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] == '(') {
@@ -23,16 +25,26 @@ cons_cell* parse(char* input, int size) {
         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++;
@@ -40,6 +52,8 @@ cons_cell* parse(char* input, int size) {
 		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;
@@ -47,7 +61,9 @@ cons_cell* parse(char* input, int size) {
             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;
diff --git a/util.h b/util.h
index e225a0f..ef4abde 100644
--- a/util.h
+++ b/util.h
@@ -32,6 +32,35 @@ 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);
diff --git a/util.o b/util.o
index 5cfc16b647bdf6acfb66fb5796182f59bc5e1c47..997f706995632ac4a978ec92192bd65c22298e13 100644
GIT binary patch
delta 2264
zcmZ{ke`wTY9LJyMdq1}CcDo;Q=f2xKPF;Cg-nLZIG<C|3ZrJ8jl9t9ca%Ni-SrQdn
zcP50lwc7bnP|Q*+`X|$vQbf>ELP9Pp5HXCLA*gBWT1yGc-k<w^mMQdb&%K`a=lyv;
z&-4B9d`~SpwRo_$I2lm6Hr24145U{t3I1f>i8?VnFiEM-^!sxI6GqbZ)vffErJ>dW
z$#&RGdX(bf&B;oYQB2PbB#R`Ui=iE$l%5~WlqyvNl_^)s1E&z<CbrRdTinagA3%3g
zR#)#doHW%~r(YfFF@jpZOgkNIMkt@g9gX@ss&lR^cs)<4RKu@*K_~g#79Dq18H@7h
zlCx1~X`X9o!EyIp{%%*5?w}K{S|jQvw|l=%(|hhNW2TEd=6y6juUUUY>AXQB;-p{9
z<#SS}<Ed{iV>c>3&^r=O#V+>;&)`Z^PmFA=>v!?RZLCYhF4grFVI5Vsqk$R=EImjW
z$6TY^fql-Qv+jjDj|$EEQQl9FnG5yX^qSeCYw4o7PG6-Z1sil99V!@H@Ha{vRk`I-
zv1|RY(d`+Xij7`5bNlw~_`u?eyp8_Y&3HdhBZ-I)Q)l4^=IU7EvWA#iwuUTE^ibSm
z=oYH?hAHl~rj7FE&^l~r8+ZO&X`45!Gjz}!o>r4@$JhQ(?jVgIca*d*Z1_!@?pvZ;
zsm&MBJ1FIgm=}J>X3^GC+E?M)g(4Q6gWF2lAJKbgmOo-<#_XKsoa3H{?OYzCSNt=y
zpAI5vCav;Ux;{j>iL%g}s4Nh{Jza+Xe0mQ5O_UBqjFaQ^Szw0g|I@D4l3VcvUh6oG
z1S*TJVU!fFgT0~>Jh_wqX15iGO?AVb`+RQh2KaH>R$N*121ZHoR^{d%L*!G5gmRJd
zh#Zy3Fe0UiT{uKlN=5rXEFRo0x?A*9qSuIafU}T)7Ps62zXAP9g}wxN{xJ|ICc0Jp
zXF(tQr^R0>e!1-@q8<#qNYIinhQq-Heij}Ed7*<KFF+Dc2;<@}0&##t4}qLlDZWp5
z4(}7!83u9mLtlZ0N?^wr@PfUPum!{+4{Z=OgIsV0$a&=;7xIAkri8TkV=mda@N*C!
zh3H=JL8TV=fjqAV#7zus0S)Rc$t&Zk4N%N#khAkai}sh4)^qeUPAzjE$Ti*sab2P9
zAn$Ff_^rang$sm#;kjFMtE9A<XCGk&9s+sxZqb{B>p?6ZS|ff;;$h(=iMvGqh$0qs
z1xrn?x+A9spm@g%bLy~oS8zZq8WyiFr>+M}*K_7dDCRiMUlhMfU@`a!I2+t6@f27M
z-6OgS<TrR7$X8P#asIlaq??|coJsHz^P>NTJJ0RB=s!efMc)v8SoAH?6{y7X4Losf
z4~zDQ-Xr-z(Qk=w**c-Vmq17o0y1H`=*{BK7X705b3`8z{}It^#eY<EgZMGgS<x$U
zx)M8<2~Cpl60X9Bq(QvC+&0oIt6FcPW-A;Rz^!9%qBT&;nxB~X%AQ3yHxnn8+dOpE
z8N89)!sx79MMtGt2ITg&=mWCCb;LM-;*0OVn01Zp>;*f&T-C^gAEW?3Zf><yUlvYG
zlV}p;c0u&0Y||9&mq+?8v=q$cXYbJ;-=m#4OaIOP;%?ue7C45kmIbu8<(cmGwyo_g
b-R+y(y4r`b<(swJ9@9G&Q-)fmbn1Tq4IqZm

delta 2095
zcmZWqeN0<b6u<ZN1IkAqrIu1i*D7X(xdPiT8!BJJ&d$ijgfI>2MnpqmFf+PrOUA$<
zaRo8Jahb#rzjcYpM7xEUxCFMv;6lRwaB-r`f@T49nj&m=E)jpX@8B{#>Ak=EJHK<!
zx%a($Unj~Y9_*{kjAw|1`85OM8U2r!yM}DHy=DxvokFzqf4sr5EVLQAINd*2;q|95
zGZ|Q!CWIP3k%gHQk{cZUbVIqc96=GeF_`TZq7XvdBgA)5QZcSI0)<+ZYT0P{XjYn+
zMFX0d{92<dj~>)qQkK$ysY$z>MAuE*WFI|j-k!20Nr*_zZ{034>DFvIWiHfiS?Q{I
zoBV=GEEOqxt#{~0EroIoowHPGzgx&^9g;ifBWtTRYbIw>n|zV_llrt76On1R)?-4M
z^~IIpNLxG{*&7RYw#9_r<-pp)y=B!{{;-$@5s}cuy3xot;hvgUI5J6pSo5@06Y||_
zuYCIK^RPnQ_Zs5pkgZw{(iz(>Sw{DyG|Cw|l+r9;r(aU~Hr+zNfBCNUgkqheG7^f-
zU0hmPLb)rD!#$yRxCc<of$*QF&r(0NR@I4}^;@VhEg0=eGih|(o=xxBlRcf71(OEc
z?)@}v_sI^Dy6^579-y)Y1O69VOI5m04pWov(=H^_VZB_A(wH8Qvoxm%Y?TXGAgqDr
z^<2waNV1<wGXjWdLLa9{M!@D@G-5WZ7;6bigcoTlW3}8v(h-nHr~v&i?La?H2hhjp
zee^B#ZNfkA2x$2?C?|8ZZO;uOQ=`h1ehx?YID0zjrA(hK<1a(sl~~PPct>HH&df`H
z2%|pMjFmRSGfwNAdFgLpB;v+AZ(`m_c;fV`)7M^)Yq3^{;G;kkb5%26&pd~@llj?X
zAp(d$2E<tp_5gJuyoZ5m{wqM-kzfhy0iYeamvx=>DZCWSZx2pjfUD#k1F8g3pi1yA
zV=GV<YGS>P{S}Oo^+j9*TvG3^K$Yhwpvp7OcnYXCdV=)>K)2W_f~^?fntGpQp&qCv
z<|G0{Fb#;WfmgD=U@`P7j9&xu5kCkl5TdLb=%#d++oQ77a8wbi$qBX0<=(2)NqmVE
zz5`U7d=rTMcsqfKr^)(m#>W^pG5(GB=%yi;`$;wXbH#uk0@duJ%v%_r0;0UPj`a}x
zeT+`_TbNHF33ig@wyCT~5-bR&R{TJM)vz{)6Yr*0*18j{H_KhGBDaGnypBV7AMh#=
zpP1kXa1C&f{Sjagzk|$Mf$D`d0@ZGE*+1YOZSRJ|j&=g4QrQR0Pck22KEnKE=BJsP
zuqHMC4D(gYCzwCO@fVrzWBroB+r?MxxXb}Jng7hZf%!G&$C&@gyqpW%WPU&E8vpP7
zz&x4xDvnQ2aQt=c$F6k*72{MYTT9c~Me-4Hczh1^ewDUtPO9>3+`9Z3{2p$l*5W2A
zD?wAd0|!r;4^44D^97Vvd=y!g_0pKfUC_sMOSx7tB9y(oTpP2LS;>*(YoFm99h~D6
yjvD4QOtOA~`E$@YVIs@O3chazKfi)^-N{YjA1(T2jzdO&%x#v@ChrRp1^)%tGHVO~

-- 
GitLab