From 1deeb8c9cfeeadd6b8073b38e76257c3c16cdc72 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Mon, 9 Apr 2012 09:36:16 -0400 Subject: [PATCH] Work in progress preprocessor --- Makefile | 2 +- cpp.c | 10 ++++++++++ error.c | 3 ++- gmqcc | Bin 17486 -> 17547 bytes gmqcc.h | 11 ++++------- lex.c | 10 +++++----- main.c | 13 +++++++------ parse.c | 10 +++++++++- 8 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 cpp.c diff --git a/Makefile b/Makefile index ae46f26..98f79a1 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC = gcc CFLAGS = -O3 -Wall -OBJ = main.o lex.o error.o parse.o +OBJ = main.o lex.o error.o parse.o cpp.o %.o: %.c $(CC) -c -o $@ $< $(CFLAGS) diff --git a/cpp.c b/cpp.c new file mode 100644 index 0000000..e2f8021 --- /dev/null +++ b/cpp.c @@ -0,0 +1,10 @@ +#include +#include "gmqcc.h" + +/* + * Returns the next token back to the caller + * which is what we parse for the preprocessor here. + */ +int cpp(struct lex_file *file) { + /* TODO ... */ +} diff --git a/error.c b/error.c index 1bd792e..eb77080 100644 --- a/error.c +++ b/error.c @@ -55,7 +55,8 @@ static const char *const error_list[] = { "Parsing Error:", "Lexing Error:", "Internal Error:", - "Compilation Error:" + "Compilation Error:", + "Preprocessor Error:" }; int error(int status, const char *msg, ...) { diff --git a/gmqcc b/gmqcc index f34c8a62d65e4d80880e4e4ec6ad0dde46d5cf60..257c415afc2dd5fd5fef3f972261d33851f2d63c 100755 GIT binary patch delta 5703 zcmb7I4RBP|6~1pbo9yOi^EM&wE`(%5eo27M#)KqbU?UV?_%n#KK?qrhWT2wihM?He zNy37%Ml|tQCv6!GcBVtAKiKGug^&ag2@G`-Y@OiGxB}{~A_P=Sweot-efMcff5zUO zchCLK`R+aE{=U2Kja^cEQ0j0b)x>!jB`s&nHKQ~C_m%VWxsvG;^;{ug9*vJ8>`K0m z>vg%uz#$s~n`F271r7j(HtQ?otrX9-pYwl`c0txo+*aPrt1 z!+V<^8{KnizYQ5q!6ISDCkme!0+>?pvG5XOi6|%Fa}z!kaWX!!_*h|BN(bMJC>S)z zCI@QF@PQ#YApuL&zKl;2NXFz0BbKPP-se^-w8;k2k!J^#8*`->VXd(rTB96L7NtN} zRLD6x&4*TOm*ms4*s39TT769mg}mWV0O} zMQ!ystqGQ(wimU&aoQO8C2B9C);~^bf#*@1YK~869jA?h_fWeSwH@QMR!FeeVVgPL z**#86W1^>hu-9yN9vEj$(oHB|g<-S~jI+}G>uC@qi@ik&Tr`K0)YjJm!h%UMvybK;}qD#guIzOamAh;`r++hz*1XIKE04+h&mi9DhQX z7HOngRa>xubEKfziF9zn+k|O$Bdr{tAxyIr@pF8NFs-GCkK?0+X_ZH+IX+03R(8b8 z@t+9C5iaC-KVe!q5f}Mav!5jeE%%7b3BMt1CCoT}f^Z_?(d)#2gfLA*B*gJ{!n9Q) zLmdB{Fik{cfa4~@wA~^H5U*HHV;)cqiH|)-8*KOOs%OCSndhCv^c~27H)8WQ?8@*m z&p`Njq$|No{h-085%$f_^fD#*ez+1NQFabAHz>gq;VA5`5$CUOtYgW}p%5bhUSLnm~hxl6RptM2> ze#m>?T2YPhs|*tbWv=btfR5Bq z?J*u#2keSZirIku4kvsId*gegU9cj-E!Duzgv;`VZ&bB?xg1$f3nA-o1F*yDmZtW+ zY#o!NLU>-bOOBr7a)L2N%JQ|n!Fi70ywvbXXiG^?z}UYJ9=cN|#-00|rvLrm@$f!4o^n!(g2!*#EhWHY zds>SumO=SdRSh0}73Y-gJd?QNC>9PH5%i@9f(ENkR0}v3&I^5f!q=y`JL|=6@uY`#SVw1QXm=bbvRlU2y}Ur_mK{PooAZ2X~8WL z#xt6cP6Ra8X`R1A7+=whbUL8%R;^}@Fm`E1Ix5hZtr_ct@fV|NPn2_)6l=z%fjh$y z{tBL&xUywQl8fO!ef<)j-0-EZRkcEG!42_xVtOmK#QLkTLim2Pw>M`+^*3O9cosZF zxHzl-0S!KYu)m9lOEhA9|1Ql^i+FzUdjGFAxRk?d{rfdIcNJ9(QN^PYw*h%g#+|0Rx<-S@Z_@2)q8uY88B#cAyEj8@{1WNE@rAw*5HoraU6;}?9QG5JxFUr0yFs84o ze?Ng!!gZg}z9|_ZxVtxt?gZgQT$j*`I&GOqG;aGTj!|x^*o&s{4l1|3HsWF|ID*H6 z(q0ineV-qRIHV;om_DPWszPdItohao1BuxcMiRvpjKuWz<&K?aw&n!J49%5+vCJ*6 z(UIEB7(ZHjztpF$S39ZDw&Cxp%6H?cV;zAp*Ov75MUI^(w>s$ENp*K&oxoV^mh)Wy z;Ke}oSYG0ed+>BQcs~wW-v%6je)5g+9sX8T`8!QJs5&}67e|(kmEfkVk;TEgvqH-5 z>2F$GZ1L{w)9@?TG-(kWb^SEH3{^^COl@`^QlKm&TdIRK8NQa~ja!=P*Si`vZdyOf zmA%<@Ut_bYp>fN7chgIgrxjK&mjekuOfC}qrGmflf7Qda&MI$kPP;T1c;ug+jW7l!atMj;3n${5`hJ>xSg&ruF`&#`^V}H#au9e$>>| z*fa~T*J)StBz8ikf()wSIEn-GAFZzF8y?O=s1T931#TKs*a%?_)t|tgi)5^ zav%LzRsAUaVO8x$*@0_)5M?3mL%c0BAMV&fltUQ`yX*^MukL6ogu zsj34He;F69V#J&C5EkgZ7DCyI(vJt!KCtBGnub15)oLio&Ae;mf~ro$VAy=CyuxZ` zw_tHK1&2XXusFZ+LxxJLBVe3wbs3(BwK`BU&uXrWo3E8Ct>z_hO;*QJtBl2BtU?{{ zz5vhW7McEv#jS8Qw;(zSdo=hF#O6(jo`%JNFcjq#neN779&F4jnEoV{E~;uh*3g_* z=}vFAIxsqHJQYp7$n(RIyh+jTVyXKgoXg8M#bfsi!8UbL^fW9DjY84Xg{Ey-^g-Ly zf{N#`G=STcW`Wuc7!3EuTFtl8TLdpx>@+d2sVa)^QWlmjprQtbr)FB>arg#^fomWc zP4dY@1#gSGkT9@*&Sh+c`5x=da!qj}DlSJ?Iac?w?2ciSA(eB7@455blE zbekOG<=PmYdU7{bSU>LRQqP?86PV}Y-Y=v%1m(X@W zRbi=RP@q8w7M6b31zGeV1jB{ySbgY5%@FIEX_G~~GTrOlqUHE@?~%;OE*DM(F~jZuUr2&z6X{SxszPET2)uBM$R(A6GbyD`rms6 zP8O9~=u%3l1}rz1TIhO7X#-Rt`u?we@aEE3SeUDNePu`)v85r(-2lbZApQp(5qQiL1)P`k_?`i zcFBu*iZOfEtoA}@`M-NSEb1~iQeH=+GRwZuFJ3k+qKT`5 zGb;2Bv6Zh2y=?Px<}*Scivd$S2a;j?tff*O4A07hCudD)na6vQj9;gGyn>$HiFygo zbbS%(`r7}(rx%LEaOlOF)AVl>V+Hpeu;YW>ze5072Xo(jY_rFCSw?64NcIj^_;_4 zs?f7EO&`EkC{01V4PyuiFHxGB(dnOr-^cW0La130?7hV`fqO}|6v0b#LA07OTfK7G?y*J*=9q>B^mY(8~KS#N#A2}|1fjZw5><+w3Q{pdX zlxI2n5@*xr&m>|mnLs7{LU`k0Hj(Rb6rEmb1aI3~$`bl+F^awDjnWLgMayki;@>TM a&dyyd8SDN2o+*_>62#2&a8LJlJZO$vg<2ocLz%vP?q z<^&k8$=~W26#Bs?I&3~}<>OX9C>GbG*H2Sz>ZkcxMUy*KTG$EQBCOne{@U#KKbtad z?k7FFhwo20x#4$R12(jn$gM~?F~?vw6Tmb9vx(JkgedKp9hhmv<1xo$PK0;FGzi4R zz)798%7u&(a~x&^<^;@IvS1|%GxeIxNt)g`UMHc)Og(6EX{1V%RYx3+&IMk5mUsXj z(L10oEvA;W#NV_2&kdq$rG?pVl+Yo5ri9lYB(P z(;T!kqPCO6f<^PZp11=Ak*_~f8KErB;j)g=(qd`J36G#w8l$BFYAGA`#5v5KFy!(BAZ}LFjtIW&G1uX=OP;z!zRKXkll!E%^21OA0YbzvW;WdWH1{Y z@D{RdV^}+s8XXO^&9o#p4;dqXvyM!`y%6~T11UEjH6GFQO5rn8BtgmCiDhD%A8Ujk zAa!&=!IZg!FoiSP$MDYyQy8ORhJQ?0Pq>5OO$|g)B%|$&c#tqHRlQM?WCy0h#bOn2BTJn zrx2#o6BQVqNH~%3@Ha?gCK0Bc8XaIbo-m!VXdlBm!gTVYVTQjo|T)=4OiT`=tS6xHu8zy zMv26Uj(EQiao`9(Z)>AXCASzvNfP93;aZ*2$M#g)*t9|po?lLejir5PC)6!@BO9+- zxuwByiu{@eC4#+Q>E-4@Q7-P^oKcP85O8~jMLB5Li$==$W6Y?<@Eo}m_is9T+|Z0w zk@~|4RaaNfOibH~vm?LKld0GdbzGa&#V8z{adpUp9Vr7ieU`wNkQBEa=N9?;8r+f4 zDb|C*>=tDxG+(w>ex)ca%dOG-Xk%pjV*m;)Zqe1b&N3p360Ej5L}O>2)vS+8&+rR9 z&Z(Wj4WJY&)H}^)OZr>Jju5as#7kK;t5VJ!C+~u*b&@E?i+P zkP{iuvqCkP#|@6F26VQ`U=0~G(3pD`a*MsH1)X-Xm`4_Lw0myl23u7F>X!^s$$+eT z?&Jn*RReM&gKH=cQinY&xxoU}fVw4vFPk`8g=rUxN@(mqLx=YHpQ zF+LkN4IT++w1%ZIXcJ_fMDD;zllgsVJpN10I#*iD`}4k`Ssvhe$Q*TWT|6 zLXTs6cwQeRT#ylZPKEa)40VxVscM)I+NWx6MZ7ThO{iOi^BBAuI;BGQDsmJu(b2#( zmqPEUnh6Yk92!z#974R5zE;ubMK&5^$bwyZ!*c5eX=&?PW8@>`Lo&5?0Bhh+Nr7KZ zdeWH2tRfjOJ>`(t*ZFZui)fr=k%SWac{6O8oHF?fGoI|=1$mde_UgixnAfFg7^9Yi zV}6u9UC=rC-nDB~lgRC#&>gC5$uAMNZu&BE{_#jboUpO4Csl*-G`M zqy3T~uu~8U$-5U(a_%=IY;H)ixN4X(==kXvW`#3TtzTQh5+PRbKEz>Cs@2?Iuq zLGy@G>w3cq&h$+27ceh9(6IU8x=m~Eld9KmyiW>bZVpHfJzOhQKV0|FI(lAG+H3JM zY5gDN^W5$?X4S8o%bWV+-W8s{q2VWPz&CY7zyFu7zg6<(P#SqyhxnevSe^wVr0O_N-I!;L}dLoSE7yarX%rZ&*00KE|OpH-9&l)iI{ zGK|vsv7+=7Mk(P=lp~5#iSi`M?IBIZJ z4dn>R4wU_0C!2Uk{>LBgQ~;Coq97yHgD3i}FKXtA!a z7==6>&^?&_|567jlv%8g>&h(7X8kRe4pH|~yv2!BnZ>w(u0^2$^OKmZ=izWxzTqfV zBQTnk8~Zudd>0@mdrE8y4&D=mW!d?LJF&V8g4wwCyPKI!9B@Bo$q7PmzN~RiAW?x_Jfn4SxgrTg! zZEDX8FxU=T3W`i&j`l-$!F*h#(SrH9p*)yVIM3cusJi)h5GEs>3$2B@rpSC%Qw_a^ zyG18d&351$Xw_`HK2GR@rxDS%vFlCPWiO&(hQG99pSAr|WYs3z?V~%5S zm_I@qcoUy;8-JpoF?4lP`UW$NHemA;6n1ky9tTXkFdkl;a~p$EG0D?nABhCNq7VwQ!0`!v|<1(X+%m#M*KR`)-)|DDl{ic8_UeHA4D4hc^}D zKr^TBXi7m=3c?J|xATbH!ucZd5|>c9Xbsv>tRpw{xK8sO=jUFk*nm8(=)et8`w?qx z2XF1hm3x-Ard=fTCPV3Y&bKA_8Pti_qcnGb+RtZq5($C>_F{C>2v{re&yQKO^yv$x^X% ibJ^Qs68jnH_usN~(Sq_d`7`rp7D8!xdFR&hIPpKN37@F| diff --git a/gmqcc.h b/gmqcc.h index 091725b..7fda6fd 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -173,27 +173,24 @@ struct lex_file { #define LEX_CHRLIT 129 #define LEX_STRLIT 130 #define LEX_IDENT 131 -#define LEX_DO 132 -#define LEX_ELSE 133 -#define LEX_IF 134 -#define LEX_WHILE 135 -#define LEX_INCLUDE 136 -#define LEX_DEFINE 137 int lex_token(struct lex_file *); void lex_reset(struct lex_file *); int lex_debug(struct lex_file *); int lex_close(struct lex_file *); -struct lex_file *lex_open (const char *); +struct lex_file *lex_open (FILE *); /* errors */ #define ERROR_LEX (SHRT_MAX+0) #define ERROR_PARSE (SHRT_MAX+1) #define ERROR_INTERNAL (SHRT_MAX+2) #define ERROR_COMPILER (SHRT_MAX+3) +#define ERROR_PREPRO (SHRT_MAX+4) int error(int, const char *, ...); /* parse.c */ int parse(struct lex_file *); +/* cpp.c */ +int cpp (struct lex_file *); #endif diff --git a/lex.c b/lex.c index e94252d..9d15301 100644 --- a/lex.c +++ b/lex.c @@ -39,13 +39,13 @@ static const char *const lex_keywords[] = { "string", "float", "vector", - "entity" + "entity", }; -struct lex_file *lex_open(const char *name) { +struct lex_file *lex_open(FILE *fp) { struct lex_file *lex = mem_a(sizeof(struct lex_file)); if (lex) { - lex->file = fopen(name, "r"); + lex->file = fp; fseek(lex->file, 0, SEEK_END); lex->length = ftell(lex->file); lex->size = lex->length; /* copy, this is never changed */ @@ -244,7 +244,7 @@ static int lex_skipcmt(struct lex_file *file) { lex_addch(ch, file); while ((ch = lex_getch(file)) != '*') { if (ch == EOF) - return error(ERROR_LEX, "malformatted comment"," "); + return error(ERROR_LEX, "malformatted comment", " "); else lex_addch(ch, file); } @@ -276,7 +276,7 @@ int lex_token(struct lex_file *file) { /* valid identifier */ if (ch > 0 && (ch == '_' || isalpha(ch))) { lex_clear(file); - while (ch > 0 && (isalpha(ch) || isdigit(ch) || ch == '_')) { + while (ch > 0 && (isalpha(ch) || ch == '_')) { lex_addch(ch, file); ch = lex_getsource(file); } diff --git a/main.c b/main.c index 22662db..248f94f 100644 --- a/main.c +++ b/main.c @@ -23,7 +23,6 @@ #include #include #include -#include #include "gmqcc.h" int usage(const char *name) { @@ -32,7 +31,6 @@ int usage(const char *name) { } int main(int argc, char **argv) { - struct stat chk; const char *ofile = NULL; const char *ifile = NULL; int i; @@ -58,11 +56,14 @@ int main(int argc, char **argv) { printf("ifile: %s\n", ifile); printf("ofile: %s\n", ofile); - /* we check here for file existance, not in the lexer */ - if (stat(ifile, &chk) != 0) - return error(ERROR_COMPILER, "source file `%s` not found\n", ifile); + /* Open file */ + FILE *fp = fopen(ifile, "r"); + if (!fp) { + fclose(fp); + return error(ERROR_COMPILER, "Source file: %s not found\n", ifile); + } - struct lex_file *lex = lex_open(ifile); + struct lex_file *lex = lex_open(fp); lex_debug(lex); parse (lex); lex_close(lex); diff --git a/parse.c b/parse.c index 7743360..129bcb1 100644 --- a/parse.c +++ b/parse.c @@ -25,7 +25,11 @@ int parse(struct lex_file *file) { int token = 0; - while ((token = lex_token(file)) != ERROR_LEX && file->length >= 0) { + while ((token = lex_token(file)) != ERROR_LEX && \ + token != ERROR_COMPILER && \ + token != ERROR_INTERNAL && \ + token != ERROR_PARSE && \ + token != ERROR_PREPRO && file->length >= 0) { switch (token) { case TOKEN_IF: token = lex_token(file); @@ -35,6 +39,10 @@ int parse(struct lex_file *file) { if (token != '(') error(ERROR_PARSE, "Expected `(` after if\n", ""); break; + + /* TODO: Preprocessor */ + case '#': + token = cpp(file); } } lex_reset(file); -- 2.39.2