From: Bernhard Urban Date: Mon, 3 May 2010 10:23:49 +0000 (+0200) Subject: codea: nicht wirklich was aufregendes, aber ein paar simple testfaelle gehen schon X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=fdf651dc3e6d5166926e9fac4bc21dcc3eb06fda codea: nicht wirklich was aufregendes, aber ein paar simple testfaelle gehen schon --- diff --git a/codea/Makefile b/codea/Makefile index 7439d1c..b6673a1 100644 --- a/codea/Makefile +++ b/codea/Makefile @@ -1,6 +1,6 @@ SHELL := bash NAME := codea -CFLAGS := -ansi -pedantic -D_GNU_SOURCE +CFLAGS := -ansi -pedantic -D_GNU_SOURCE -g OBJS := scanner.o parser.o symtable.o code.o chelper.o tree.o all: $(NAME) @@ -16,7 +16,9 @@ scanner.c: oxout.l #dirty deps ;) %.o: %.c parser.h symtable.h chelper.h tree.h @echo " CC $<" + @cp $< tmp.c @gcc -c $(CFLAGS) $< #-Wall + @rm tmp.c parser.c: oxout.y chelper.h tree.h @echo " YACC $<" diff --git a/codea/chelper.c b/codea/chelper.c index 8f9185c..bb0f700 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -3,6 +3,10 @@ #include "chelper.h" #include "tree.h" +#if 1 +#define DDCHELP +#endif + void func_header(char *s) { printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s); @@ -25,7 +29,7 @@ char *next_reg(char *s, short skip) char *regs[] = {"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"}; int i=0; if (s != (char*) NULL) { - for(; i < 9;) { + while(i < 9) { if(!strcmp(s, regs[i++])) { break; } @@ -34,12 +38,16 @@ char *next_reg(char *s, short skip) if(skip) { i++; } +#ifdef DDCHELP + fprintf(stderr, "next_reg(): %s\n", regs[i]); +#endif + return regs[i]; } char *param_reg(int num) { char *regs[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9"}; - return regs[num-1]; + return regs[num]; } diff --git a/codea/code.bfe b/codea/code.bfe index 0d4661b..c2a0d6d 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -10,15 +10,17 @@ %} %start begin -%term O_RETURN=1 +%term O_RET=1 O_NOT=2 O_SUB=3 O_MUL=4 O_OR=5 O_LESS=6 O_EQ=7 O_ID=8 %% -begin: ret -ret: O_RETURN # 1 # ret(); +begin: ret # 0 # printf("// end\n"); +ret: O_RET(expr) # 1 # move(bnode->reg, "rax"); ret(); + +expr: O_ID # 1 # if(bnode->param_index!=0) move(param_reg(bnode->param_index), bnode->reg); %% + /* vim: filetype=c */ - diff --git a/codea/parser.y b/codea/parser.y index 9e2d284..3ccb81f 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -32,6 +32,7 @@ @attributes { struct symbol *sin; struct symbol *sout; struct treenode *node; } Statement @traversal @postorder c +@traversal @preorder reg @traversal @postorder gen %% @@ -162,7 +163,8 @@ Statement: @{ statinout() xxputsin(@Expr.s@,) - @i @Statement.node@ = new_node(O_RETURN, @Expr.node@, TREENULL); + @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL); + @reg @Statement.node@->reg = next_reg((char *)NULL, 0); @Expr.node@->reg = @Statement.node@->reg; @} ; @@ -170,7 +172,7 @@ Lexpr: IDENT @{ @i @Lexpr.node@ = TREENULL; - @c check(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM); + @c check(@Lexpr.s@, @IDENT.name@, S_VAR|S_PARM); @} | Feld @@ -178,45 +180,46 @@ Lexpr: Feld: Term '.' IDENT @{ - @c check(@Feld.s@, @IDENT.name@, S_FIELD); + @c check(@Feld.s@, @IDENT.name@, S_FIELD); @i @Feld.node@ = TREENULL; + @reg fprintf(stderr, "w00t8\n"); @} ; Expr: Term @{ - @i @Expr.node@ = TREENULL; + @reg @Term.node@->reg = @Expr.node@->reg; @} | NOT Term @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t2\n"); @} | Term Minusterm @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t3\n"); @} | Term Multerm @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t4\n"); @} | Term Orterm @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t5\n"); @} | Term '<' Term @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t6\n"); @} | Term '=' Term @{ - @i @Expr.node@ = TREENULL; + @i @Expr.node@ = TREENULL; fprintf(stderr, "w00t7\n"); @} ; @@ -224,11 +227,13 @@ Minusterm: '-' Term Minusterm @{ @i @Minusterm.node@ = TREENULL; + @reg fprintf(stderr, "minus1\n"); @} | '-' Term @{ @i @Minusterm.node@ = TREENULL; + @reg fprintf(stderr, "minus2\n"); @} ; @@ -236,11 +241,13 @@ Multerm: '*' Term Multerm @{ @i @Multerm.node@ = TREENULL; + @reg fprintf(stderr, "mul1\n"); @} | '*' Term @{ @i @Multerm.node@ = TREENULL; + @reg fprintf(stderr, "mul2\n"); @} ; @@ -248,10 +255,12 @@ Orterm: OR Term Orterm @{ @i @Orterm.node@ = TREENULL; + @reg fprintf(stderr, "or1\n"); @} | OR Term @{ @i @Orterm.node@ = TREENULL; + @reg fprintf(stderr, "or2\n"); @} ; @@ -260,42 +269,50 @@ Term: '(' Expr ')' @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf1\n"); @} | NUM @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf2\n"); @} | '-' NUM @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf3\n"); @} | THIS @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf4\n"); @} | IDENT @{ - @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM); - @i @Term.node@ = TREENULL; + @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM); + @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); @Term.node@->param_index=1; + @reg fprintf(stderr, "wtf5\n"); @} | Feld @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf6\n"); @} | IDENT '(' Exprs ')' @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf7\n"); @} | Term '.' IDENT '(' Exprs ')' @{ @i @Term.node@ = TREENULL; + @reg fprintf(stderr, "wtf8\n"); @} ; diff --git a/codea/tree.c b/codea/tree.c index 55798f7..8807c78 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -2,7 +2,7 @@ #include #include "tree.h" -#if 0 +#if 1 #define DDTREE #endif @@ -10,8 +10,8 @@ struct treenode *new_node(int op, struct treenode *l, struct treenode *r) { struct treenode *new = (TREECAST) malloc(TREESIZE); -#if DDTREE - printf("new_node: %i (%s)\n", op, o_names[op]); +#ifdef DDTREE + fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]); #endif new->kids[0] = l; diff --git a/codea/tree.h b/codea/tree.h index 152b7c1..4c4a0d9 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -10,12 +10,26 @@ typedef struct burm_state *STATEPTR_TYPE; #endif enum { - O_RETURN=1 + O_RET=1, + O_NOT, + O_SUB, + O_MUL, + O_OR, + O_LESS, + O_EQ, + O_ID }; -static char o_names[100][100] = { +static char *o_names[] = { "", - "O_RETURN" + "O_RET", + "O_NOT", + "O_SUB", + "O_MUL", + "O_OR", + "O_LESS", + "O_EQ", + "O_ID" }; struct treenode {