From 273fa5398ccccf298fa1b1dc27bf02cc5ed00f31 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 15 Apr 2021 16:25:13 -0400 Subject: [PATCH] added build script, removed unnecessary files, and changed name --- .gitignore | 5 +- cerise/ast.c | 193 ------------------------------- cerise/build.sh | 4 +- cerise/{sclpl.h => cerise.h} | 0 cerise/codegen.c | 12 -- cerise/emalloc.c | 3 +- cerise/lex.c | 2 +- cerise/main.c | 2 +- cerise/parser.c | 2 +- cerise/pkg.c | 23 ---- cerise/pprint.c | 217 ----------------------------------- cerise/sclpl | Bin 34928 -> 0 bytes cerise/syms.c | 22 ---- cerise/tests/tokens.txt | 58 ++++++++++ cerise/types.c | 59 ---------- 15 files changed, 70 insertions(+), 532 deletions(-) delete mode 100644 cerise/ast.c rename cerise/{sclpl.h => cerise.h} (100%) delete mode 100644 cerise/codegen.c delete mode 100644 cerise/pkg.c delete mode 100644 cerise/pprint.c delete mode 100755 cerise/sclpl delete mode 100644 cerise/syms.c create mode 100644 cerise/tests/tokens.txt delete mode 100644 cerise/types.c diff --git a/.gitignore b/.gitignore index 33e0039..3cb8f46 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ lex.yyTest tags *.swp lex.yy.* -y.tab.* \ No newline at end of file +y.tab.* +cerisec +cerisec-test + diff --git a/cerise/ast.c b/cerise/ast.c deleted file mode 100644 index a3fd9d4..0000000 --- a/cerise/ast.c +++ /dev/null @@ -1,193 +0,0 @@ -#include - -static AST* ast(ASTType type) { - AST* tree = emalloc(sizeof(AST)); - memset(tree, 0, sizeof(AST)); - tree->nodetype = type; - return tree; -} - -AST* String(char* val) { - AST* node = ast(AST_STRING); - node->value.text = val; - return node; -} - -char* string_value(AST* val) { - assert(val->nodetype == AST_STRING); - return val->value.text; -} - -AST* Char(int val) { - AST* node = ast(AST_CHAR); - node->value.integer = val; - return node; -} - -uint32_t char_value(AST* val) { - assert(val->nodetype == AST_CHAR); - return val->value.integer; -} - -AST* Integer(int val) { - AST* node = ast(AST_INT); - node->value.integer = val; - return node; -} - -intptr_t integer_value(AST* val) { - assert(val->nodetype == AST_INT); - return val->value.integer; -} - -AST* Float(double val) { - AST* node = ast(AST_FLOAT); - node->value.floating = val; - return node; -} - -double float_value(AST* val) { - assert(val->nodetype == AST_FLOAT); - return val->value.floating; -} - -AST* Bool(bool val) { - AST* node = ast(AST_BOOL); - node->value.integer = val; - return node; -} - -bool bool_value(AST* val) { - assert(val->nodetype == AST_BOOL); - return val->value.integer; -} - -AST* Ident(char* val) { - AST* node = ast(AST_IDENT); - node->value.text = strdup(val); - return node; -} - -char* ident_value(AST* val) { - assert(val->nodetype == AST_IDENT); - return val->value.text; -} - -AST* Var(char* name, AST* value, AST* type, int flags) { - (void)type; - AST* node = ast(AST_VAR); - node->value.var.name = name; - node->value.var.value = value; - node->value.var.flags = flags; - return node; -} - -char* var_name(AST* var) { - assert(var->nodetype == AST_VAR); - return var->value.var.name; -} - -AST* var_value(AST* var) { - assert(var->nodetype == AST_VAR); - return var->value.var.value; -} - -bool var_flagset(AST* var, int mask) { - assert(var->nodetype == AST_VAR); - return ((var->value.var.flags & mask) == mask); -} - -AST* Func(AST* args, AST* body, AST* type) -{ - (void)type; - AST* node = ast(AST_FUNC); - node->value.nodes[0] = args; - node->value.nodes[1] = body; - return node; -} - -AST* func_args(AST* func) { - assert(func->nodetype == AST_FUNC); - return func->value.nodes[0]; -} - -AST* func_body(AST* func) { - assert(func->nodetype == AST_FUNC); - return func->value.nodes[1]; -} - -AST* ExpList(void) { - AST* node = ast(AST_EXPLIST); - node->value.explist.nexprs = 0; - node->value.explist.exprs = 0; - return node; -} - -AST** explist_get(AST* explist, size_t* nexprs) { - assert(explist->nodetype == AST_EXPLIST); - *nexprs = explist->value.explist.nexprs; - return explist->value.explist.exprs; -} - -void explist_append(AST* explist, AST* expr) { - assert(explist->nodetype == AST_EXPLIST); - explist->value.explist.nexprs += 1; - explist->value.explist.exprs = realloc(explist->value.explist.exprs, explist->value.explist.nexprs * sizeof(AST*)); - explist->value.explist.exprs[explist->value.explist.nexprs-1] = expr; -} - -void explist_prepend(AST* explist, AST* expr) { - assert(explist->nodetype == AST_EXPLIST); - explist->value.explist.nexprs++; - explist->value.explist.exprs = realloc(explist->value.explist.exprs, explist->value.explist.nexprs * sizeof(AST*)); - memmove(explist->value.explist.exprs+1, explist->value.explist.exprs, explist->value.explist.nexprs-1); - explist->value.explist.exprs[0] = expr; -} - -AST* If(AST* cond, AST* b1, AST* b2) { - AST* node = ast(AST_IF); - node->value.nodes[0] = cond; - node->value.nodes[1] = b1; - node->value.nodes[2] = b2; - return node; -} - -AST* if_cond(AST* ifexp) { - assert(ifexp->nodetype == AST_IF); - return ifexp->value.nodes[0]; -} - -AST* if_then(AST* ifexp) { - assert(ifexp->nodetype == AST_IF); - return ifexp->value.nodes[1]; -} - -AST* if_else(AST* ifexp) { - assert(ifexp->nodetype == AST_IF); - return ifexp->value.nodes[2]; -} - -AST* Apply(AST* func, AST* args) { - AST* node = ast(AST_APPLY); - node->value.nodes[0] = func; - node->value.nodes[1] = args; - return node; -} - -AST* apply_func(AST* apply) { - assert(apply->nodetype == AST_APPLY); - return apply->value.nodes[0]; -} - -AST* apply_args(AST* apply) { - assert(apply->nodetype == AST_APPLY); - return apply->value.nodes[1]; -} - -AST* OpCall(int oper, AST* left, AST* right) { - AST* node = ast(AST_OPER); - node->value.op.oper = oper; - node->value.op.left = left; - node->value.op.right = right; - return node; -} diff --git a/cerise/build.sh b/cerise/build.sh index c5d2f06..dec3fbf 100755 --- a/cerise/build.sh +++ b/cerise/build.sh @@ -1,3 +1,5 @@ #!/bin/sh ctags -R & -cc -Wall -Wextra -Werror --std=c99 -o sclpl -I. *.c +cc -g -D CERISE_TESTS -Wall -Wextra -Werror --std=c99 -o cerisec-test *.c tests/*.c \ + && ./cerisec-test \ + && cc -g -Wall -Wextra -Werror --std=c99 -o cerisec *.c diff --git a/cerise/sclpl.h b/cerise/cerise.h similarity index 100% rename from cerise/sclpl.h rename to cerise/cerise.h diff --git a/cerise/codegen.c b/cerise/codegen.c deleted file mode 100644 index a625f09..0000000 --- a/cerise/codegen.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -void codegen_init(Parser* p) { - sym_add(&(p->syms), SF_TYPEDEF, "void", VoidType()); - sym_add(&(p->syms), SF_TYPEDEF, "bool", UIntType(1u)); - sym_add(&(p->syms), SF_TYPEDEF, "byte", UIntType(8u)); - sym_add(&(p->syms), SF_TYPEDEF, "int", IntType(64u)); - sym_add(&(p->syms), SF_TYPEDEF, "uint", UIntType(64u)); - sym_add(&(p->syms), SF_TYPEDEF, "float", FloatType(32u)); - sym_add(&(p->syms), SF_TYPEDEF, "string", - ArrayOf(sym_get(&(p->syms), "byte")->type, -1)); -} diff --git a/cerise/emalloc.c b/cerise/emalloc.c index 751a40f..b5203a7 100644 --- a/cerise/emalloc.c +++ b/cerise/emalloc.c @@ -1,4 +1,5 @@ -#include +#include "cerise.h" + void fatal(char* estr) { perror(estr); exit(1); diff --git a/cerise/lex.c b/cerise/lex.c index 648295e..0adffdf 100644 --- a/cerise/lex.c +++ b/cerise/lex.c @@ -1,4 +1,4 @@ -#include +#include "cerise.h" #include #include #include diff --git a/cerise/main.c b/cerise/main.c index d1beeeb..8e85037 100644 --- a/cerise/main.c +++ b/cerise/main.c @@ -1,4 +1,4 @@ -#include +#include "cerise.h" char* ARGV0; char* Artifact = "bin"; diff --git a/cerise/parser.c b/cerise/parser.c index 3ed1869..826c710 100644 --- a/cerise/parser.c +++ b/cerise/parser.c @@ -1,4 +1,4 @@ -#include +#include "cerise.h" #include //#define TRACE diff --git a/cerise/pkg.c b/cerise/pkg.c deleted file mode 100644 index 0bed7ff..0000000 --- a/cerise/pkg.c +++ /dev/null @@ -1,23 +0,0 @@ -#include - -void pkg_add_require(Package* p, char* req) -{ - Require* rq = malloc(sizeof(Require)); - rq->path = strdup(req); - rq->next = p->requires; - p->requires = rq; -} - -void pkg_add_provide(Package* p, char* exp) -{ - Provide* pr = malloc(sizeof(Provide)); - pr->name = strdup(exp); - pr->next = p->provides; - p->provides = pr; -} - -void pkg_add_definition(Package* p, AST* ast) -{ - (void)p, (void)ast; -} - diff --git a/cerise/pprint.c b/cerise/pprint.c deleted file mode 100644 index 8a9705c..0000000 --- a/cerise/pprint.c +++ /dev/null @@ -1,217 +0,0 @@ -#include - -static void indent(FILE* file, int depth) { - fprintf(file, "\n"); - if (depth) fprintf(file, "%*c", depth * 2, ' '); -} - -static const char* token_type_to_string(int type) { - #define TOK(name) case (name): return #name - switch(type) { - TOK(T_NONE); TOK(T_ERROR); TOK(T_END_FILE); - TOK(T_REQUIRES); TOK(T_PROVIDES); TOK(T_LET); TOK(T_VAR); - TOK(T_FUN); TOK(T_TYPE); TOK(T_STRUCT); TOK(T_UNION); - TOK(T_RETURN); TOK(T_IF); TOK(T_ELSE); TOK(T_ID); - TOK(T_CHAR); TOK(T_INT); TOK(T_FLOAT); TOK(T_BOOL); - TOK(T_STRING); - case '{': return "T_LBRACE"; - case '}': return "T_RBRACE"; - case '[': return "T_LBRACK"; - case ']': return "T_RBRACK"; - case '(': return "T_LPAR"; - case ')': return "T_RPAR"; - case ',': return "T_COMMA"; - case ':': return "T_COLON"; - case '&': return "T_AMP"; - case '\'': return "T_SQUOTE"; - case '"': return "T_DQUOTE"; - default: return "???"; - } - #undef TOK -} - -static void print_char(FILE* file, char ch) { - int i; - static const char* lookup_table[5] = { - " \0space", - "\n\0newline", - "\r\0return", - "\t\0tab", - "\v\0vtab" - }; - for(i = 0; i < 5; i++) { - if (ch == lookup_table[i][0]) { - fprintf(file, "\\%s", &(lookup_table[i][2])); - break; - } - } - if (i == 5) fprintf(file, "\\%c", ch); -} - -static void pprint_token_type(FILE* file, Tok* token) { - if (token->type > 256) - fprintf(file, "%s", token_type_to_string(token->type)); - else - fprintf(file, "%c", token->type); -} - -static void pprint_token_value(FILE* file, Tok* token) { - #define TOK(name) case (name): fprintf(file, "%s", #name); break - switch(token->type) { - /* value tokens */ - case T_STRING: fprintf(file, "\"%s\"", token->text); break; - case T_ID: fprintf(file, "%s", token->text); break; - case T_CHAR: print_char(file, token->value.integer); break; - case T_INT: fprintf(file, "%lld", token->value.integer); break; - case T_FLOAT: fprintf(file, "%f", token->value.floating); break; - case T_BOOL: fprintf(file, "%s", (token->value.integer)?"true":"false"); break; - - /* keyword tokens */ - TOK(T_NONE); TOK(T_ERROR); TOK(T_END_FILE); - TOK(T_REQUIRES); TOK(T_PROVIDES); TOK(T_LET); TOK(T_VAR); - TOK(T_FUN); TOK(T_TYPE); TOK(T_STRUCT); TOK(T_UNION); TOK(T_RETURN); - TOK(T_IF); TOK(T_ELSE); - - /* evertything else */ - default: - fprintf(file, "???"); - break; - } - #undef TOK -} - -void pprint_token(FILE* file, Tok* token, bool print_loc) -{ - if (print_loc) { - fprintf(file, "%zu:", token->offset); - } - pprint_token_type(file, token); - if (token->type > 256) { - fprintf(file, ":"); - pprint_token_value(file, token); - } - fprintf(file, "\n"); -} - -/*****************************************************************************/ - -static const char* tree_type_to_string(ASTType type) { - switch(type) { - case AST_STRING: return "T_STRING"; - case AST_SYMBOL: return "T_SYMBOL"; - case AST_IDENT: return "T_ID"; - case AST_CHAR: return "T_CHAR"; - case AST_INT: return "T_INT"; - case AST_FLOAT: return "T_FLOAT"; - case AST_BOOL: return "T_BOOL"; - default: return "???"; - } -} - -static void pprint_literal(FILE* file, AST* tree, int depth) -{ - (void)depth; - fprintf(file, "%s:", tree_type_to_string(tree->nodetype)); - switch(tree->nodetype) { - case AST_STRING: fprintf(file, "\"%s\"", string_value(tree)); break; - case AST_IDENT: fprintf(file, "%s", ident_value(tree)); break; - case AST_CHAR: fprintf(file, "%c", char_value(tree)); break; - case AST_INT: fprintf(file, "%ld", integer_value(tree)); break; - case AST_FLOAT: fprintf(file, "%lf", float_value(tree)); break; - case AST_BOOL: - fprintf(file, "%s", bool_value(tree) ? "true" : "false"); - break; - default: fprintf(file, "???"); - } -} - -static char* getvartype(AST* tree) { - if (var_flagset(tree, SF_CONSTANT)) - return "let"; - else if (var_flagset(tree, SF_TYPEDEF)) - return "typedef"; - else - return "var"; -} - -void pprint_fargs(FILE* file, AST* tree) { - size_t nargs = 0; - AST** args = explist_get(tree, &nargs); - fprintf(file, "("); - for (size_t i = 0; i < nargs; i++) { - fprintf(file, "("); - fprintf(file, "%s : type", var_name(args[i])); - fprintf(file, ") "); - } - fprintf(file, ")"); -} - -void pprint_block(FILE* file, AST* tree, int depth) { - if (!tree) return; - size_t nexprs = 0; - AST** exprs = explist_get(tree, &nexprs); - for (size_t i = 0; i < nexprs; i++) { - indent(file, depth); - pprint_tree(file, exprs[i], depth); - } -} - -void pprint_branch(FILE* file, AST* tree, int depth) { - indent(file, depth); - pprint_tree(file, tree, depth); -} - -void pprint_ifexpr(FILE* file, AST* tree, int depth) { - fprintf(file, "(if "); - pprint_tree(file, if_cond(tree), depth); - pprint_branch(file, if_then(tree), depth+1); - pprint_branch(file, if_else(tree), depth+1); - fprintf(file, ")"); -} - -void pprint_apply(FILE* file, AST* tree, int depth) { - fprintf(file, "(apply "); - pprint_tree(file, apply_func(tree), depth); - size_t nexprs = 0; - AST** exprs = explist_get(apply_args(tree), &nexprs); - for (size_t i = 0; i < nexprs; i++) { - indent(file, depth+1); - pprint_tree(file, exprs[i], depth+1); - } - fprintf(file, ")"); -} - -void pprint_tree(FILE* file, AST* tree, int depth) { - if (tree == NULL) return; - switch (tree->nodetype) { - case AST_VAR: - fprintf(file, "(%s %s ", getvartype(tree), var_name(tree)); - pprint_tree(file, var_value(tree), depth); - fprintf(file, ")"); - break; - - case AST_FUNC: - pprint_fargs(file, func_args(tree)); - pprint_block(file, func_body(tree), depth+1); - break; - - case AST_EXPLIST: - fprintf(file, "(block"); - pprint_block(file, tree, depth+1); - fprintf(file, ")"); - break; - - case AST_IF: - pprint_ifexpr(file, tree, depth); - break; - - case AST_APPLY: - pprint_apply(file, tree, depth); - break; - - default: - pprint_literal(file, tree, depth); - break; - } -} - diff --git a/cerise/sclpl b/cerise/sclpl deleted file mode 100755 index 6fd7fbd2bae7ffd297f1fd01748f11a1dce6a5a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34928 zcmeHw4SZC^)%PSJ5Iz$XD^-*giGoTDp8^I=fDIc75JG}j!8Ifs5)IjOKlsp~*ac-> zx6*IhqNT0%(b`t4)gnd+NQqk1pgf97OCCkLYfw|QHLa0-{%7XQ-Ft7cXy4!azR&af zl?!*z%=wx#XJ*dKoqKQYEzZ*7^t3dgj|_3Spj`VY3RB30{98EzP$;H}!T3E}j1>Km z?ZnV%!YsyT0FvATOt-_4%%`EYkRZvWI-VV(C>n|!l_$AON^;%~U%yE4 zX{hN&d4-B@RE+bRM<~38W;yarY`LPxR#~BAfXbIK)Nf}orYQ{IzHwM>^UpsB;_^Ffg{NB8YvfiYhc;_ytlqOOCVpTFv>2q)rkF-1O zR>G$fZWPV~o)=e5|0trn8__JstH_;d!Kh4L3jEL%_ti zxdu<8Smjye_XJ41M$|S11J&}^FIH);8Wb#Q*ZArK9#P%k^?QW3339bfzWT;MEsCgK zTjj2;Z>(ylztJOB_&rs=>N--p%DdV_hE%U2Ll7*g$z~X{s;VCHK92|J+O@z11W_q+ zOcirWOJ>b>Pt2Qaq$cJ~5$=+T`EFR^Sy}H7czhM}XE%5oJrz|e8c4~?Ro+I{?N+RP zGQzFt@*lwrPAiQ5)f_sXi7%>+2C(GQM{M{%GrrY^Kg#%a8$N%I@>_=uznACRm<_+5 z@m)6jtBmiq;g2w0*v9cYj6dX6?>ce5e>%LF4u_k&C8oRuQX=;# zezQjvB1QQ+qQ^TDIC9^hJcaUjyUf2#c?#k2R+)dE@)Ww`kI4KU%F|R7-zM`rC{H0g zzD4FAr96f1_y(E(CFLn($D3sSXOyQ<9luWIe?)l-(eW~w|2E|*G{*~N{tn7hNRH>r z{5L31p*Zf4`5P%uQ(!zt=6#f>kQ^5>e?8?X6vw-c1ChIe@;Q|6kom7so~FupyUdqU zo2pt0s{7&lLdEy91}AJM09Vy2HRkNA{=Wv-0MES1ON)P5#qX7~-hz>&a`m%*($-)*v-p95WYBrh*ThwP^A7!87jP0WF7xQp&RI87& zbDS~I3Qyq3fwH)dpnJzeRou<0xcvaJw?0#KgC>h7yEi+J?V|A=`y06$)ysaO^4J%9 za*!s;L^yG==s^-YfUzu>?nhNN=($GoTVvXdI@SZO&e6TG1 z0xI043jfZ9(z9Qo!ax0|s;Z?K^Ql-@IN0F|R~`z_Ke!8WB9@l4039;fRgnf`nS)G; zR2~eMji8iK2U7>eu%`a|5DMP0MAM?lkF$mr>}BMrFrw#13@#$6-!v1>0e16q6&g{Le_`^#?KnPd>_a;dn7 zYM9KB@vN81Pa(f!lT!IHA^=>mADUxV87eV2qGf5)RF08yz(j}t!KebtafM%{(a|Br zDiPsk$yRVhRIijGyE`∓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 diff --git a/cerise/syms.c b/cerise/syms.c deleted file mode 100644 index 6a8f0e2..0000000 --- a/cerise/syms.c +++ /dev/null @@ -1,22 +0,0 @@ -#include - -static Sym* mksym(int flags, char* name, Type* type, Sym* next) { - Sym* sym = emalloc(sizeof(Sym)); - sym->flags = flags; - sym->name = name; - sym->type = type; - sym->next = next; - return sym; -} - -void sym_add(SymTable* syms, int flags, char* name, Type* type) { - syms->syms = mksym(flags, name, type, syms->syms); -} - -Sym* sym_get(SymTable* syms, char* name) { - Sym* sym = syms->syms; - for (; sym; sym = sym->next) - if (!strcmp(sym->name, name)) - return sym; - return NULL; -} diff --git a/cerise/tests/tokens.txt b/cerise/tests/tokens.txt new file mode 100644 index 0000000..b9068f3 --- /dev/null +++ b/cerise/tests/tokens.txt @@ -0,0 +1,58 @@ ++ +- +/ +* +^ += +:= +!= +< +> +<= +>= +. +, +; +.. +| +: +( +) +[ +] +{ +} +and +array +begin +by +case +const +div +do +else +elsif +end +false +for +if +import +is +mod +module +nil +not +of +or +pointer +procedure +record +repeat +return +then +to +true +type +until +var +while diff --git a/cerise/types.c b/cerise/types.c deleted file mode 100644 index cfaae4c..0000000 --- a/cerise/types.c +++ /dev/null @@ -1,59 +0,0 @@ -#include - -static Type* mktype(Kind kind) { - Type* type = emalloc(sizeof(Type)); - memset(type, 0, sizeof(Type)); - type->kind = kind; - return type; -} - -Type* VoidType(void) { - return mktype(VOID); -} - -Type* IntType(size_t nbits) { - Type* type = mktype(INT); - type->value.bits = nbits; - return type; -} - -Type* UIntType(size_t nbits) { - Type* type = mktype(UINT); - type->value.bits = nbits; - return type; -} - -Type* FloatType(size_t nbits) { - Type* type = mktype(FLOAT); - type->value.bits = nbits; - return type; -} - -Type* ArrayOf(Type* elemtype, size_t count) { - Type* type = mktype(ARRAY); - type->value.array.type = elemtype; - type->value.array.count = count; - return type; -} - -Type* RefTo(Type* type) { - (void)type; - return NULL; -} - -Type* PtrTo(Type* type) { - (void)type; - return NULL; -} - -bool types_equal(Type* type1, Type* type2) { - if (type1->kind != type2->kind) return false; - switch (type1->kind) { - case ARRAY: - return (types_equal(type1->value.array.type, type2->value.array.type) && - (type1->value.array.count == type2->value.array.count)); - default: - return true; - } -} - -- 2.49.0