codea: nicht wirklich was aufregendes, aber ein paar simple testfaelle gehen schon
authorBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 10:23:49 +0000 (12:23 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 10:23:49 +0000 (12:23 +0200)
codea/Makefile
codea/chelper.c
codea/code.bfe
codea/parser.y
codea/tree.c
codea/tree.h

index 7439d1c4649849e8c7b6967e0ea0cfb34d13e335..b6673a14018d36ff5a8cedba22a3e70f51996fac 100644 (file)
@@ -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    $<"
index 8f9185c251899e17c32d1e3f75e7ac713235d73f..bb0f7005ea1ccd5ac72f56087485889a8e04c9a2 100644 (file)
@@ -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];
 }
 
index 0d4661ba19a598442911f0cae5895c11f913b448..c2a0d6d9a71cb4dff4e30f32ce4947e5feb9e481 100644 (file)
 %}
 
 %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
  */
-
index 9e2d2849523015682981832c4599905e7054bc2f..3ccb81f705bb2cb25cb2accb7b697fd4480c0d44 100644 (file)
@@ -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");
          @}
 
        ;
index 55798f7b3594e3afb479ea2f03f49f59170b2aea..8807c785bcbd42de98f3997bbce7cc1a4342a0ec 100644 (file)
@@ -2,7 +2,7 @@
 #include <stdlib.h>
 #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;
index 152b7c1a215407923784d22c04b7f01a312e6ded..4c4a0d91a44feb59bbc0c41b32ec09a844af50f7 100644 (file)
@@ -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 {