--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 38
+/svn/private/!svn/ver/759/ublu08/codea
+END
+scanner.lex
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/private/!svn/ver/683/ublu08/codea/scanner.lex
+END
+tree.c
+K 25
+svn:wc:ra_dav:version-url
+V 45
+/svn/private/!svn/ver/736/ublu08/codea/tree.c
+END
+symbol_table.h
+K 25
+svn:wc:ra_dav:version-url
+V 53
+/svn/private/!svn/ver/683/ublu08/codea/symbol_table.h
+END
+parser.y
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/private/!svn/ver/744/ublu08/codea/parser.y
+END
+code_gen.c
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/759/ublu08/codea/code_gen.c
+END
+code.bfe
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/private/!svn/ver/780/ublu08/codea/code.bfe
+END
+tree.h
+K 25
+svn:wc:ra_dav:version-url
+V 45
+/svn/private/!svn/ver/744/ublu08/codea/tree.h
+END
+code_gen.h
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/744/ublu08/codea/code_gen.h
+END
+Makefile
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/private/!svn/ver/683/ublu08/codea/Makefile
+END
+symbol_table.c
+K 25
+svn:wc:ra_dav:version-url
+V 53
+/svn/private/!svn/ver/781/ublu08/codea/symbol_table.c
+END
--- /dev/null
+8
+
+dir
+771
+http://localhost/svn/private/ublu08/codea
+http://localhost/svn/private
+
+
+
+2008-04-09T16:55:17.545963Z
+759
+paulchen
+
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+95840bc9-f7e0-4b9f-abbd-54bb5795df2f
+\f
+scanner.lex
+file
+
+
+
+
+2008-04-04T21:11:26.000000Z
+e5193bdf0f2e3175afb5173efc7ac4ec
+2008-04-04T21:10:31.347771Z
+683
+paulchen
+\f
+tree.c
+file
+
+
+
+
+2008-04-08T17:40:32.000000Z
+685018af3da8e73474391babdd351b88
+2008-04-08T17:48:59.604714Z
+736
+paulchen
+has-props
+\f
+symbol_table.h
+file
+
+
+
+
+2008-04-04T21:11:26.000000Z
+493b0c6d4a6b1f2b370fe1935e7b0706
+2008-04-04T21:10:31.347771Z
+683
+paulchen
+has-props
+\f
+parser.y
+file
+
+
+
+
+2008-04-13T09:53:12.000000Z
+82f5823d7ea48eb83ee4cf4c4056968b
+2008-04-08T22:39:27.776788Z
+744
+paulchen
+\f
+code_gen.c
+file
+
+
+
+
+2008-04-09T16:52:54.000000Z
+54532af314cac61a7b06519105ee632a
+2008-04-09T16:55:17.545963Z
+759
+paulchen
+\f
+code.bfe
+file
+780
+
+
+
+2008-04-12T23:25:30.000000Z
+ccc378cc28365656fe4510c7f2b0ac6e
+2008-04-12T23:25:36.662708Z
+780
+paulchen
+has-props
+\f
+tree.h
+file
+
+
+
+
+2008-04-08T22:36:56.000000Z
+25e9af1aa16f43c9a4881d3117aebef9
+2008-04-08T22:39:27.776788Z
+744
+paulchen
+has-props
+\f
+code_gen.h
+file
+
+
+
+
+2008-04-08T22:38:16.000000Z
+e083019b07480ef42ad0535a35907722
+2008-04-08T22:39:27.776788Z
+744
+paulchen
+\f
+Makefile
+file
+
+
+
+
+2008-04-04T21:11:26.000000Z
+ee3c37f22722c18807f0ab93a5ab4b70
+2008-04-04T21:10:31.347771Z
+683
+paulchen
+\f
+symbol_table.c
+file
+781
+
+
+
+2008-04-13T09:52:22.000000Z
+5f1213508c4c3e3866cadfb1ea8beb48
+2008-04-13T09:53:06.620369Z
+781
+paulchen
+has-props
+\f
--- /dev/null
+K 14
+svn:executable
+V 0
+
+END
--- /dev/null
+K 14
+svn:executable
+V 0
+
+END
--- /dev/null
+K 14
+svn:executable
+V 0
+
+END
--- /dev/null
+K 14
+svn:executable
+V 0
+
+END
--- /dev/null
+K 14
+svn:executable
+V 0
+
+END
--- /dev/null
+all: codea
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+codea: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o codea symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f codea scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO func f(a,a) return a; end; shall do the same as func f(b,a) return a; end; */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15
+
+%%
+
+stat: ret # 0 #
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->value<0) move(get_param_reg(-bnode->value), bnode->reg);
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+expr: OP_Addition(expr, OP_Negation(expr)) # 1 # printf("\tsubq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Addition(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\taddq %%%s, %%%s\n\tneg %%%s\n", bnode->kids[0]->kids[0]->reg, bnode->kids[1]->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Multiplication(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
+
+call: OP_Call(OP_ID,exprs) # 0 # /* ignore at the moment */
+
+exprs: expr # 0 #
+exprs: OP_Exprs(exprs,expr) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+%%
+
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+void function_header(char *name) {
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ return reg_names[index];
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name);
+char *get_next_reg(char *name, int skip_reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars
+@autosyn node defined_vars immediate
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; } Bool Call Lexpr Field Bterm Orterm Exprs
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; } Stat
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @postorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+
+ @codegen @revorder(1) printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen @revorder(1) function_header(@ID.name@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen @revorder(1) function_header(@ID.name@);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_symbol(@Pars.1.pars@, @ID.name@, SYMBOL_TYPE_PARAM, 0, -@Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_symbol(new_table(), @ID.name@, SYMBOL_TYPE_PARAM, 0, -1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ |
+ @{ @i @Stats.defined_vars@ = 0; @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, 0);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 1;
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @}
+
+ | IF Bool THEN Stats ELSE Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stats.1.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Stats.1.defined_vars@;
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+
+ @reg @Stat.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = @Stat.node@->reg;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ ;
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = (treenode *)NULL;
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Term.node@, @Plusterm.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = (@Term.node@->op==OP_ID && table_lookup(@Term.symbols@, @Term.node@->name)->type==SYMBOL_TYPE_PARAM) ? get_param_reg(-table_lookup(@Term.symbols@, @Term.node@->name)->stack_offset) : get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Term.node@, @Malterm.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = (@Term.node@->op==OP_ID && table_lookup(@Term.symbols@, @Term.node@->name)->type==SYMBOL_TYPE_PARAM) ? get_param_reg(-table_lookup(@Term.symbols@, @Term.node@->name)->stack_offset) : get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Term.node@, @Plusterm.1.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = (@Term.node@->op==OP_ID && table_lookup(@Term.symbols@, @Term.node@->name)->type==SYMBOL_TYPE_PARAM) ? get_param_reg(-table_lookup(@Term.symbols@, @Term.node@->name)->stack_offset) : get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Term.node@, @Malterm.1.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = (@Term.node@->op==OP_ID && table_lookup(@Term.symbols@, @Term.node@->name)->type==SYMBOL_TYPE_PARAM) ? get_param_reg(-table_lookup(@Term.symbols@, @Term.node@->name)->stack_offset) : get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset);
+ @i @Term.immediate@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @}
+
+ | Call
+ @{ @i @Term.immediate@ = 0; @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+Bool: Bterm
+ | Bterm Orterm
+ @{ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@); @}
+
+ | NOT Bterm
+ @{ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL); @}
+
+ ;
+
+Orterm: OR Bterm Orterm
+ @{ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@); @}
+
+ | OR Bterm
+ ;
+
+Bterm: Term GREATER Term
+ @{ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@); @}
+
+ | Term '=' Term
+ @{ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@); @}
+
+ | '(' Bool ')'
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), @Exprs.node@); @}
+
+ | ID '(' ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), NULL); @}
+
+ ;
+
+Exprs: Expr
+ | Exprs ',' Expr
+ @{ @i @Exprs.node@ = new_node(OP_Exprs, @Exprs.1.node@, @Expr.node@); @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ printf("%s\n",element->identifier);
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+
--- /dev/null
+all: codea
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+codea: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o codea symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f codea scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o testcodea* a.out
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO func f(a,a) return a; end; shall do the same as func f(b,a) return a; end; */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15
+
+%%
+
+stat: ret # 0 #
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->param_index!=-1) move(get_param_reg(bnode->param_index), bnode->reg);
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op=OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\tadd $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+
+call: OP_Call(OP_ID,exprs) # 0 # /* ignore at the moment */
+
+exprs: expr # 0 #
+exprs: OP_Exprs(exprs,expr) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+%%
+
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+void function_header(char *name) {
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ return reg_names[index];
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name);
+char *get_next_reg(char *name, int skip_reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars
+@autosyn node defined_vars immediate
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; } Bool Call Lexpr Field Bterm Orterm Exprs
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; } Stat
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @postorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+
+ @codegen @revorder(1) printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen @revorder(1) function_header(@ID.name@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen @revorder(1) function_header(@ID.name@);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_param(@Pars.1.pars@, @ID.name@, @Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_param(new_table(), @ID.name@, 1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ |
+ @{ @i @Stats.defined_vars@ = 0; @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, 0);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 1;
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @}
+
+ | IF Bool THEN Stats ELSE Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stats.1.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Stats.1.defined_vars@;
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+
+ @reg @Stat.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = @Stat.node@->reg;
+ @i @Stat.defined_vars@ = 0;
+ @}
+
+ ;
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = (treenode *)NULL;
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Plusterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Malterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Plusterm.1.node@, @Term.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Malterm.1.node@, @Term.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->param_index);
+ @i @Term.immediate@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @}
+
+ | Call
+ @{ @i @Term.immediate@ = 0; @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+Bool: Bterm
+ | Bterm Orterm
+ @{ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@); @}
+
+ | NOT Bterm
+ @{ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL); @}
+
+ ;
+
+Orterm: OR Bterm Orterm
+ @{ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@); @}
+
+ | OR Bterm
+ ;
+
+Bterm: Term GREATER Term
+ @{ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@); @}
+
+ | Term '=' Term
+ @{ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@); @}
+
+ | '(' Bool ')'
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset, -1);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), @Exprs.node@); @}
+
+ | ID '(' ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), NULL); @}
+
+ ;
+
+Exprs: Expr
+ | Exprs ',' Expr
+ @{ @i @Exprs.node@ = new_node(OP_Exprs, @Exprs.1.node@, @Expr.node@); @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+ new_element->param_index=-1;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=SYMBOL_TYPE_PARAM;
+ new_element->param_index=param_index;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ if(element->param_index!=-1) {
+ new_table=table_add_param(new_table,element->identifier,element->param_index);
+ }
+ else {
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+ int param_index; /* -1 if not a parameter */
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+ int param_index; /* -1 if not a parameter */
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value, int param);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 38
+/svn/private/!svn/ver/773/ublu08/codeb
+END
+scanner.lex
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/private/!svn/ver/740/ublu08/codeb/scanner.lex
+END
+tree.c
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/private/!svn/ver/1017/ublu08/codeb/tree.c
+END
+test.c
+K 25
+svn:wc:ra_dav:version-url
+V 45
+/svn/private/!svn/ver/776/ublu08/codeb/test.c
+END
+symbol_table.h
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1017/ublu08/codeb/symbol_table.h
+END
+parser.y
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/private/!svn/ver/1037/ublu08/codeb/parser.y
+END
+code_gen.c
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/760/ublu08/codeb/code_gen.c
+END
+code.bfe
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/private/!svn/ver/1038/ublu08/codeb/code.bfe
+END
+tree.h
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/private/!svn/ver/1017/ublu08/codeb/tree.h
+END
+code_gen.h
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/745/ublu08/codeb/code_gen.h
+END
+Makefile
+K 25
+svn:wc:ra_dav:version-url
+V 48
+/svn/private/!svn/ver/1036/ublu08/codeb/Makefile
+END
+symbol_table.c
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1204/ublu08/codeb/symbol_table.c
+END
+test.input
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/private/!svn/ver/1020/ublu08/codeb/test.input
+END
--- /dev/null
+8
+
+dir
+775
+http://localhost/svn/private/ublu08/codeb
+http://localhost/svn/private
+
+
+
+2008-04-12T18:47:21.735502Z
+773
+paulchen
+
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+95840bc9-f7e0-4b9f-abbd-54bb5795df2f
+\f
+scanner.lex
+file
+
+
+
+
+2008-04-08T18:12:14.000000Z
+e5193bdf0f2e3175afb5173efc7ac4ec
+2008-04-08T18:13:33.517549Z
+740
+paulchen
+\f
+tree.c
+file
+1017
+
+
+
+2008-05-06T18:51:59.000000Z
+ef665922d0ae02b671453df7d0864e46
+2008-05-06T18:52:20.555246Z
+1017
+paulchen
+has-props
+\f
+test.c
+file
+776
+
+
+
+2008-04-12T18:49:19.000000Z
+24ff3cc83bcd13c895a36d347aae7252
+2008-04-12T18:49:39.017368Z
+776
+paulchen
+\f
+symbol_table.h
+file
+1017
+
+
+
+2008-05-06T17:59:32.000000Z
+a09966463523b8d5b80a106a9f546831
+2008-05-06T18:52:20.555246Z
+1017
+paulchen
+has-props
+\f
+parser.y
+file
+1037
+
+
+
+2008-05-19T16:40:46.000000Z
+261f2044f46f41ff3c1c555fc21e1561
+2008-05-19T16:40:54.760875Z
+1037
+paulchen
+\f
+code_gen.c
+file
+
+
+
+
+2008-04-09T16:55:33.000000Z
+02b446ff28eadf7dee853ce68d56fee7
+2008-04-09T16:56:51.768913Z
+760
+paulchen
+\f
+code.bfe
+file
+1038
+
+
+
+2008-05-19T16:44:18.000000Z
+c398e965c269b611388ba5106c722758
+2008-05-19T16:44:57.437042Z
+1038
+paulchen
+has-props
+\f
+tree.h
+file
+1017
+
+
+
+2008-05-06T18:01:20.000000Z
+6a087c7aefd6d16fe331b6abf17902b4
+2008-05-06T18:52:20.555246Z
+1017
+paulchen
+has-props
+\f
+code_gen.h
+file
+
+
+
+
+2008-04-08T22:21:58.000000Z
+60e8a0f6632888fd3b0a133e09aa0bee
+2008-04-08T22:39:36.223435Z
+745
+paulchen
+\f
+Makefile
+file
+1036
+
+
+
+2008-05-19T16:38:53.000000Z
+601045b0c568d7b118408a4e68485b40
+2008-05-19T16:38:57.457263Z
+1036
+paulchen
+\f
+symbol_table.c
+file
+1204
+
+
+
+2008-05-29T18:44:00.000000Z
+b453aa450374c10280eb6fa5888bff27
+2008-05-29T18:44:23.013986Z
+1204
+paulchen
+has-props
+\f
+test.input
+file
+1020
+
+
+
+2008-05-17T15:43:05.000000Z
+eab35c6ab3b6126ed4d3707e4222ee9e
+2008-05-17T18:20:12.118561Z
+1020
+paulchen
+\f
+testcases
+dir
+\f
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+all: codeb
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+codeb: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o codeb symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f codeb scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o testcodeb* a.out
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO imul -> imulq, add -> addq */
+/* TODO bugs - hopefully fixed:
+ * func f(a,b,c,d) return ((a+1)+(b+1))+((c+1)+(d+1)); end;
+ * func f(a,b,c,d) var b:=a; var c:=b; var d:=c; return a+b+c+d; end;
+ * mul, add etc. with direct memory access
+ */
+/* TODO immediate values in assignments */
+/* TODO assignment with immediate value/variable on RHS */
+/* TODO immediate values in boolean expressions */
+/* TODO optimize boolean expressions */
+/* FIXME if_then label not inserted */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15 OP_Assign=16 OP_If=17 OP_Stats=18 OP_Empty=19 OP_Ifstats=20 OP_While=21
+
+%%
+
+stat: ret # 0 #
+stat: assign # 0 #
+stat: bexpr # 0 #
+stat: expr # 0 #
+
+assign: OP_Assign(OP_ID, expr) # 1 # if(bnode->kids[0]->param_index!=-1) { printf("\tmovq %%%s, %%%s\n", bnode->reg, get_param_reg(bnode->kids[0]->param_index)); } else { printf("\tmovq %%%s, %i(%%rsp)\n", bnode->reg, bnode->kids[0]->value); }
+assign: OP_Assign(OP_Field(expr,OP_ID), expr) # 1 # printf("\tmovq %%%s, %li(%%%s)\n", bnode->kids[1]->reg, 8*bnode->kids[0]->value, bnode->kids[0]->reg);
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->param_index!=-1) { move(get_param_reg(bnode->param_index), bnode->reg); } else { printf("\tmovq %i(%%rsp), %%%s\n", bnode->value, bnode->reg); }
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+expr: OP_Addition(expr, OP_Negation(expr)) # 1 # printf("\tsubq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Addition(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\taddq %%%s, %%%s\n\tnegq %%%s\n", bnode->kids[0]->kids[0]->reg, bnode->kids[1]->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Multiplication(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
+
+call: OP_Call(OP_ID,exprs) # 0 # /* ignore at the moment */
+
+exprs: expr # 0 #
+exprs: OP_Exprs(exprs,expr) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+bexpr: OP_Disjunction(bexpr,bexpr) # 0 #
+bexpr: OP_Not(bexpr) # 0 #
+bexpr: OP_Greater(expr,expr) # 0 #
+bexpr: OP_Equal(expr,expr) # 0 #
+
+%%
+
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+int variables;
+
+void function_header(char *name, int vars) {
+ variables = vars;
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+ if(vars>0) {
+ printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*vars);
+ }
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ return reg_names[index];
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ if(variables>0) {
+ printf("\tleave\n");
+ }
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name, int vars);
+char *get_next_reg(char *name, int skip_reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+
+ #define imm_prefix "$"
+
+/* TODO failed test case: func f(a) if not (a=0 or a=1) then return 0; end; end; */
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars if_in jump_true jump_false
+@autosyn node defined_vars immediate if_out
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; int if_in; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; int if_in; int if_out; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; treenode *node; int if_in; int if_out; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; } Call Lexpr Field Exprs
+@attributes { struct symbol_t *symbols; treenode *node; char *jump_true; char *jump_false; int negated; int if_in; int if_out; int negated2; int top_level; } Bool Orterm Subbool Bterm
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; } Stat
+@attributes { struct symbol_t *symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int if_nr; } Blubb
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @preorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+ @i @Program.if_in@ = 0;
+
+ @codegen printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @i @Program.1.if_in@ = @Funcdef.if_out@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_param(@Pars.1.pars@, @ID.name@, @Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_param(new_table(), @ID.name@, 1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+ @i @Stats.node@ = new_node(OP_Stats, @Stat.node@, @Stats.1.node@);
+ @i @Stat.if_in@ = @Stats.if_in@;
+ @i @Stats.1.if_in@ = @Stat.if_out@;
+ @i @Stats.if_out@ = @Stats.1.if_out@;
+ @}
+
+ |
+ @{
+ @i @Stats.node@ = new_leaf(OP_Empty); /* TODO */
+ @i @Stats.defined_vars@ = 0;
+ @i @Stats.if_out@ = @Stats.if_in@;
+ @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr /* Nodes necessary for IF, DO, ... ? */
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, @Stat.stack_offset@);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, new_named_leaf_value(OP_ID, @ID.name@, @Stat.stack_offset@, -1), @Expr.node@);
+ @i @Stat.defined_vars@ = 1;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Expr.node@->reg = get_next_reg((char *)NULL, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, @Lexpr.node@, @Expr.node@);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Lexpr.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = get_next_reg(@Lexpr.node@->reg, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_If, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_end%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | IF Bool THEN Stats Blubb END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Blubb.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Ifstats, @Stats.node@, @Blubb.node@);
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Blubb.defined_vars@;
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Blubb.if_in@ = @Stats.if_out@;
+ @i @Stat.if_out@ = @Blubb.if_out@;
+ @i @Blubb.if_nr@ = @Stats.if_in@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_else%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_else%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_While, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "do_enter%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "do_end%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen printf("do_start%i:\n", @Stats.if_in@); /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz do_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("\tjmp do_start%i\ndo_end%i:\n", @Stats.if_in@, @Stats.if_in@);
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Stat.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = @Stat.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ ;
+
+Blubb: ELSE Stats
+ @{
+ @codegen printf("\tjmp if_end%i\nif_else%i:\n", @Blubb.if_nr@, @Blubb.if_nr@);
+ @}
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->stack_offset, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->param_index);
+
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Plusterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Malterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Plusterm.1.node@, @Term.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Malterm.1.node@, @Term.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->param_index);
+ @i @Term.immediate@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @}
+
+ | Call
+ @{ @i @Term.immediate@ = 0; @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+/* TODO replace by Bool -> Subbool */
+Bool: Bterm
+ @{
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bterm.top_level@ = 1;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Disjunction) { printf("\tjmp %s # foo1\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Orterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Bool.negated Bool.jump_true Bool.if_in; if(!@Bool.negated@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Bool.if_in@); } else { @Bterm.jump_true@ = @Bool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Bool.negated Bool.jump_false Bool.if_in; if(@Bool.negated@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Bool.if_in@); } else { @Bterm.jump_false@ = @Bool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Bool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Bool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@->reg = @Bool.node@->reg; @Orterm.node@->reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) printf("\tjmp %s # foo2\n", @Bool.jump_false@); printf(@Bool.negated@ ? "bool_false%i:\n" : "bool_true%i:\n", @Bool.if_in@); printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Bool.jump_true@;
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 1;
+ @i @Bterm.negated2@ = 1;
+ @i @Bterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@-> reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Not) { printf("\tjmp %s # foo3\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\nnot_break%i:\n\tjmp %s\n%s:\n", @Bool.jump_true@, 0, @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ ;
+
+Subbool: Bterm
+ @{
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = @Subbool.negated2@;
+ @i @Bterm.top_level@ = @Subbool.top_level@;
+ @codegen @revorder(1) /* printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Orterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Subbool.negated Subbool.negated2 Subbool.jump_true Subbool.if_in; if(!@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Subbool.if_in@); } else { @Bterm.jump_true@ = @Subbool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Subbool.negated Subbool.negated2 Subbool.jump_false Subbool.if_in; if(@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Subbool.if_in@); } else { @Bterm.jump_false@ = @Subbool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Subbool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Subbool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @reg @Bterm.node@->reg = @Subbool.node@->reg; @Orterm.node@->reg = @Subbool.node@->reg;
+
+ @codegen @revorder(1) /* TODO output if on top level */ if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo4\n", @Subbool.negated2@ ? @Subbool.jump_true@ : @Subbool.jump_false@); } printf(!@Subbool.negated@ ? "bool_true%i:\n" : "bool_false%i:\n", @Subbool.if_in@); /* printf("\tjmp %s\n# %s:\n", @Subbool.jump_true@, @Subbool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Subbool.jump_true@;
+ @i @Bterm.negated@ = 1 - @Subbool.negated@;
+ @i @Bterm.negated2@ = 1 - @Subbool.negated2@;
+ @i @Bterm.top_level@ = 0;
+
+ @reg @Bterm.node@-> reg = @Subbool.node@->reg; /* printf("%s, %s\n", @Bterm.jump_true@, @Subbool.jump_false@); */
+
+ @codegen @revorder(1) printf("# !!\n"); if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo9\n", @Subbool.negated2@ ? @Subbool.jump_false@ : @Subbool.jump_false@); } /* printf("\tjmp %s\nnot_break%i:\n", @Subbool.negated@ ? @Bterm.jump_true@ : @Subbool.jump_false@, 0); printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ ;
+
+
+Orterm: OR Bterm Orterm
+ @{
+ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@);
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Orterm.1.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.1.negated2@ = 0;
+ @i @Orterm.1.if_in@ = @Bterm.if_out@;
+ @i @Orterm.if_out@ = @Orterm.1.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.1.top_level@ = 0;
+
+ @reg @Bterm.node@->reg = @Orterm.node@->reg; @Orterm.1.node@->reg = @Orterm.node@->reg;
+ @}
+
+ | OR Bterm
+ @{
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = @Orterm.negated2@;
+ @i @Bterm.top_level@ = 0;
+ @}
+
+ ;
+
+Bterm: Term GREATER Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjs %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjns %s # %s %s %i %i\n", @Term.1.node@->reg, @Term.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | Term '=' Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjnz %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjz %s # %s %s %i %i\n", @Term.node@->reg, @Term.1.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | '(' Subbool ')'
+ @{
+ @i @Subbool.negated@ = @Bterm.negated@;
+ @i @Subbool.negated2@ = @Bterm.negated2@;
+ @i @Subbool.top_level@ = @Bterm.top_level@;
+ @}
+
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset, -1);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), @Exprs.node@); @}
+
+ | ID '(' ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), NULL); @}
+
+ ;
+
+Exprs: Expr
+ | Exprs ',' Expr
+ @{ @i @Exprs.node@ = new_node(OP_Exprs, @Exprs.1.node@, @Expr.node@); @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ if(element->param_index!=-1) {
+ new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
+ }
+ else {
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+ new_element->param_index=-1;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=SYMBOL_TYPE_PARAM;
+ new_element->param_index=param_index;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ if(element->param_index!=-1) {
+ new_table=table_add_param(new_table,element->identifier,element->param_index);
+ }
+ else {
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+ int param_index; /* -1 if not a parameter */
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+#include <stdio.h>
+
+extern long f1(long a);
+extern long f2(long a);
+extern long f3(long a);
+extern long f4(long a);
+extern long f5(long a);
+extern long f6(long a);
+extern long f7(long a);
+extern long f8(long a);
+extern long f9(long a);
+extern long f10(long a);
+
+extern long g1(long a, long b);
+extern long g2(long a, long b);
+extern long g3(long a, long b);
+extern long g4(long a, long b);
+extern long g5(long a, long b);
+extern long g6(long a, long b);
+extern long g7(long a, long b);
+extern long g8(long a, long b);
+extern long g9(long a, long b);
+extern long g10(long a, long b);
+extern long g11(long a, long b);
+extern long g12(long a, long b);
+
+extern long h1(long a, long b, long c, long d);
+extern long h2(long a, long b, long c, long d);
+extern long h3(long a, long b, long c, long d);
+extern long h4(long a, long b, long c, long d);
+extern long h5(long a, long b, long c, long d);
+extern long h6(long a, long b, long c, long d);
+extern long h7(long a, long b, long c, long d);
+extern long h8(long a, long b, long c, long d);
+extern long h9(long a, long b, long c, long d);
+extern long h10(long a, long b, long c, long d);
+extern long h11(long a, long b, long c, long d);
+extern long h12(long a, long b, long c, long d);
+extern long h13(long a, long b, long c, long d);
+extern long h14(long a, long b, long c, long d);
+extern long h15(long a, long b, long c, long d);
+extern long h16(long a, long b, long c, long d);
+extern long h17(long a, long b, long c, long d);
+extern long h18(long a, long b, long c, long d);
+extern long h19(long a, long b, long c, long d);
+extern long h20(long a, long b, long c, long d);
+extern long h21(long a, long b, long c, long d);
+extern long h22(long a, long b, long c, long d);
+extern long h23(long a, long b, long c, long d);
+extern long h24(long a, long b, long c, long d);
+
+int check_arg1(char *name, long (*function)(long), long ret0, long ret1, long ret2) {
+ int ret;
+ ret=function(0)==ret0 && function(1)==ret1 && function(2)==ret2;
+ printf("%s: %li/%li, %li/%li, %li/%li - %s\n", name,function(0), ret0, function(1), ret1, function(2), ret2, ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg2(char *name, long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ printf("%li/%li ", function(a,b),blubb[a][b]);
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg4(char *name, long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ printf("%li/%li ", function(a,b,c,d),blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int main(int argc, char **argv) {
+ int ret;
+
+ long ret_g1[2][2]={{1,1},{1,0}};
+ long ret_g2[2][2]={{1,0},{1,1}};
+ long ret_g3[2][2]={{1,1},{0,1}};
+ long ret_g4[2][2]={{0,1},{1,1}};
+ long ret_g5[2][2]={{0,0},{0,1}};
+ long ret_g6[2][2]={{0,1},{0,0}};
+ long ret_g7[2][2]={{0,0},{1,0}};
+ long ret_g8[2][2]={{1,0},{0,0}};
+ long ret_g9[2][2]={{1,1},{1,0}};
+ long ret_g10[2][2]={{1,0},{1,1}};
+ long ret_g11[2][2]={{1,1},{0,1}};
+ long ret_g12[2][2]={{0,1},{1,1}};
+
+ long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+ long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+ long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+ long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+ long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+ long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+ long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ ret=check_arg1("f1",f1,0,1,1);
+ ret&=check_arg1("f2",f2,0,0,1);
+ ret&=check_arg1("f3",f3,1,0,0);
+ ret&=check_arg1("f4",f4,0,1,1);
+ ret&=check_arg1("f5",f5,0,0,1);
+ ret&=check_arg1("f6",f6,1,0,0);
+ ret&=check_arg1("f7",f7,0,1,1);
+ ret&=check_arg1("f8",f8,0,0,1);
+ ret&=check_arg1("f9",f9,1,1,1);
+ ret&=check_arg1("f10",f10,1,0,0);
+
+ ret&=check_arg2("g1",g1,ret_g1);
+ ret&=check_arg2("g2",g2,ret_g2);
+ ret&=check_arg2("g3",g3,ret_g3);
+ ret&=check_arg2("g4",g4,ret_g4);
+ ret&=check_arg2("g5",g5,ret_g5);
+ ret&=check_arg2("g6",g6,ret_g6);
+ ret&=check_arg2("g7",g7,ret_g7);
+ ret&=check_arg2("g8",g8,ret_g8);
+ ret&=check_arg2("g9",g9,ret_g9);
+ ret&=check_arg2("g10",g10,ret_g10);
+ ret&=check_arg2("g11",g11,ret_g11);
+ ret&=check_arg2("g12",g12,ret_g12);
+
+ ret&=check_arg4("h1",h1,ret_h1);
+ ret&=check_arg4("h2",h2,ret_h2);
+ ret&=check_arg4("h3",h3,ret_h3);
+ ret&=check_arg4("h4",h4,ret_h4);
+ ret&=check_arg4("h5",h5,ret_h5);
+ ret&=check_arg4("h6",h6,ret_h6);
+ ret&=check_arg4("h7",h7,ret_h7);
+ ret&=check_arg4("h8",h8,ret_h8);
+ ret&=check_arg4("h9",h9,ret_h9);
+ ret&=check_arg4("h10",h10,ret_h10);
+ ret&=check_arg4("h11",h11,ret_h11);
+ ret&=check_arg4("h12",h12,ret_h12);
+ ret&=check_arg4("h13",h13,ret_h13);
+ ret&=check_arg4("h14",h14,ret_h14);
+ ret&=check_arg4("h15",h15,ret_h15);
+ ret&=check_arg4("h16",h16,ret_h16);
+ ret&=check_arg4("h17",h17,ret_h17);
+ ret&=check_arg4("h18",h18,ret_h18);
+ ret&=check_arg4("h19",h19,ret_h19);
+ ret&=check_arg4("h20",h20,ret_h20);
+ ret&=check_arg4("h21",h21,ret_h21);
+ ret&=check_arg4("h22",h22,ret_h22);
+ ret&=check_arg4("h23",h23,ret_h23);
+ ret&=check_arg4("h24",h24,ret_h24);
+
+ return !ret;
+}
+
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
+func f4(a) if (a=0) then return 0; else return 1; end; end;
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
+
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
+
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call,
+ OP_Assign,
+ OP_If,
+ OP_Stats,
+ OP_Empty,
+ OP_Ifstats,
+ OP_While
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call",
+ "OP_Assign",
+ "OP_If",
+ "OP_Stats",
+ "OP_Empty",
+ "OP_Ifstats",
+ "OP_While"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+ int param_index; /* -1 if not a parameter */
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value, int param);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+
--- /dev/null
+all: codeb
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+codeb: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o codeb symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f codeb scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o testcodeb* a.out
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO imul -> imulq, add -> addq */
+/* TODO bugs - hopefully fixed:
+ * func f(a,b,c,d) return ((a+1)+(b+1))+((c+1)+(d+1)); end;
+ * func f(a,b,c,d) var b:=a; var c:=b; var d:=c; return a+b+c+d; end;
+ * mul, add etc. with direct memory access
+ */
+/* TODO immediate values in assignments */
+/* TODO assignment with immediate value/variable on RHS */
+/* TODO immediate values in boolean expressions */
+/* TODO optimize boolean expressions */
+/* FIXME if_then label not inserted */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15 OP_Assign=16 OP_If=17 OP_Stats=18 OP_Empty=19 OP_Ifstats=20 OP_While=21
+
+%%
+
+stat: ret # 0 #
+stat: assign # 0 #
+stat: bexpr # 0 #
+stat: expr # 0 #
+
+assign: OP_Assign(OP_ID, expr) # 1 # if(bnode->kids[0]->param_index!=-1) { printf("\tmovq %%%s, %%%s\n", bnode->reg, get_param_reg(bnode->kids[0]->param_index)); } else { printf("\tmovq %%%s, %i(%%rsp)\n", bnode->reg, bnode->kids[0]->value); }
+assign: OP_Assign(OP_Field(expr,OP_ID), expr) # 1 # printf("\tmovq %%%s, %li(%%%s)\n", bnode->kids[1]->reg, 8*bnode->kids[0]->value, bnode->kids[0]->reg);
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->param_index!=-1) { move(get_param_reg(bnode->param_index), bnode->reg); } else { printf("\tmovq %i(%%rsp), %%%s\n", bnode->value, bnode->reg); }
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\taddq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+expr: OP_Addition(expr, OP_Negation(expr)) # 1 # printf("\tsubq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Addition(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\taddq %%%s, %%%s\n\tnegq %%%s\n", bnode->kids[0]->kids[0]->reg, bnode->kids[1]->kids[0]->reg, bnode->kids[1]->kids[0]->reg);
+expr: OP_Multiplication(OP_Negation(expr), OP_Negation(expr)) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[0]->reg, bnode->kids[1]->reg);
+
+call: OP_Call(OP_ID,exprs) # 0 # /* ignore at the moment */
+
+exprs: expr # 0 #
+exprs: OP_Exprs(exprs,expr) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+bexpr: OP_Disjunction(bexpr,bexpr) # 0 #
+bexpr: OP_Not(bexpr) # 0 #
+bexpr: OP_Greater(expr,expr) # 0 #
+bexpr: OP_Equal(expr,expr) # 0 #
+
+%%
+
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+int variables;
+
+void function_header(char *name, int vars) {
+ variables = vars;
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+ if(vars>0) {
+ printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*vars);
+ }
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ return reg_names[index];
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ if(variables>0) {
+ printf("\tleave\n");
+ }
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name, int vars);
+char *get_next_reg(char *name, int skip_reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+
+ #define imm_prefix "$"
+
+/* TODO failed test case: func f(a) if not (a=0 or a=1) then return 0; end; end; */
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars if_in jump_true jump_false
+@autosyn node defined_vars immediate if_out
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; int if_in; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; int if_in; int if_out; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; treenode *node; int if_in; int if_out; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; } Call Lexpr Field Exprs
+@attributes { struct symbol_t *symbols; treenode *node; char *jump_true; char *jump_false; int negated; int if_in; int if_out; int negated2; int top_level; } Bool Orterm Subbool Bterm
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; } Stat
+@attributes { struct symbol_t *symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int if_nr; } Blubb
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @preorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+ @i @Program.if_in@ = 0;
+
+ @codegen printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @i @Program.1.if_in@ = @Funcdef.if_out@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_param(@Pars.1.pars@, @ID.name@, @Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_param(new_table(), @ID.name@, 1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+ @i @Stats.node@ = new_node(OP_Stats, @Stat.node@, @Stats.1.node@);
+ @i @Stat.if_in@ = @Stats.if_in@;
+ @i @Stats.1.if_in@ = @Stat.if_out@;
+ @i @Stats.if_out@ = @Stats.1.if_out@;
+ @}
+
+ |
+ @{
+ @i @Stats.node@ = new_leaf(OP_Empty); /* TODO */
+ @i @Stats.defined_vars@ = 0;
+ @i @Stats.if_out@ = @Stats.if_in@;
+ @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr /* Nodes necessary for IF, DO, ... ? */
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, @Stat.stack_offset@);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, new_named_leaf_value(OP_ID, @ID.name@, @Stat.stack_offset@, -1), @Expr.node@);
+ @i @Stat.defined_vars@ = 1;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Expr.node@->reg = get_next_reg((char *)NULL, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, @Lexpr.node@, @Expr.node@);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Lexpr.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = get_next_reg(@Lexpr.node@->reg, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_If, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_end%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | IF Bool THEN Stats Blubb END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Blubb.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Ifstats, @Stats.node@, @Blubb.node@);
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Blubb.defined_vars@;
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Blubb.if_in@ = @Stats.if_out@;
+ @i @Stat.if_out@ = @Blubb.if_out@;
+ @i @Blubb.if_nr@ = @Stats.if_in@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_else%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_else%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_While, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "do_enter%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "do_end%i", @Stats.if_in@);
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen printf("do_start%i:\n", @Stats.if_in@); /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz do_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("\tjmp do_start%i\ndo_end%i:\n", @Stats.if_in@, @Stats.if_in@);
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Stat.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = @Stat.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ ;
+
+Blubb: ELSE Stats
+ @{
+ @codegen printf("\tjmp if_end%i\nif_else%i:\n", @Blubb.if_nr@, @Blubb.if_nr@);
+ @}
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->stack_offset, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->param_index);
+
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Plusterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Malterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Plusterm.1.node@, @Term.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Malterm.1.node@, @Term.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->param_index);
+ @i @Term.immediate@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @}
+
+ | Call
+ @{ @i @Term.immediate@ = 0; @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+/* TODO replace by Bool -> Subbool */
+Bool: Bterm
+ @{
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bterm.top_level@ = 1;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Disjunction) { printf("\tjmp %s # foo1\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Orterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Bool.negated Bool.jump_true Bool.if_in; if(!@Bool.negated@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Bool.if_in@); } else { @Bterm.jump_true@ = @Bool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Bool.negated Bool.jump_false Bool.if_in; if(@Bool.negated@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Bool.if_in@); } else { @Bterm.jump_false@ = @Bool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Bool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Bool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@->reg = @Bool.node@->reg; @Orterm.node@->reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) printf("\tjmp %s # foo2\n", @Bool.jump_false@); printf(@Bool.negated@ ? "bool_false%i:\n" : "bool_true%i:\n", @Bool.if_in@); printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Bool.jump_true@;
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 1;
+ @i @Bterm.negated2@ = 1;
+ @i @Bterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@-> reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Not) { printf("\tjmp %s # foo3\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\nnot_break%i:\n\tjmp %s\n%s:\n", @Bool.jump_true@, 0, @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ ;
+
+Subbool: Bterm
+ @{
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = @Subbool.negated2@;
+ @i @Bterm.top_level@ = @Subbool.top_level@;
+ @codegen @revorder(1) /* printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Orterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Subbool.negated Subbool.negated2 Subbool.jump_true Subbool.if_in; if(!@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Subbool.if_in@); } else { @Bterm.jump_true@ = @Subbool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Subbool.negated Subbool.negated2 Subbool.jump_false Subbool.if_in; if(@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Subbool.if_in@); } else { @Bterm.jump_false@ = @Subbool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Subbool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Subbool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @reg @Bterm.node@->reg = @Subbool.node@->reg; @Orterm.node@->reg = @Subbool.node@->reg;
+
+ @codegen @revorder(1) /* TODO output if on top level */ if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo4\n", @Subbool.negated2@ ? @Subbool.jump_true@ : @Subbool.jump_false@); } printf(!@Subbool.negated@ ? "bool_true%i:\n" : "bool_false%i:\n", @Subbool.if_in@); /* printf("\tjmp %s\n# %s:\n", @Subbool.jump_true@, @Subbool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Subbool.jump_true@;
+ @i @Bterm.negated@ = 1 - @Subbool.negated@;
+ @i @Bterm.negated2@ = 1 - @Subbool.negated2@;
+ @i @Bterm.top_level@ = 0;
+
+ @reg @Bterm.node@-> reg = @Subbool.node@->reg; /* printf("%s, %s\n", @Bterm.jump_true@, @Subbool.jump_false@); */
+
+ @codegen @revorder(1) printf("# !!\n"); if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo9\n", @Subbool.negated2@ ? @Subbool.jump_false@ : @Subbool.jump_false@); } /* printf("\tjmp %s\nnot_break%i:\n", @Subbool.negated@ ? @Bterm.jump_true@ : @Subbool.jump_false@, 0); printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ ;
+
+
+Orterm: OR Bterm Orterm
+ @{
+ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@);
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Orterm.1.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.1.negated2@ = 0;
+ @i @Orterm.1.if_in@ = @Bterm.if_out@;
+ @i @Orterm.if_out@ = @Orterm.1.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.1.top_level@ = 0;
+
+ @reg @Bterm.node@->reg = @Orterm.node@->reg; @Orterm.1.node@->reg = @Orterm.node@->reg;
+ @}
+
+ | OR Bterm
+ @{
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = @Orterm.negated2@;
+ @i @Bterm.top_level@ = 0;
+ @}
+
+ ;
+
+Bterm: Term GREATER Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjs %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjns %s # %s %s %i %i\n", @Term.1.node@->reg, @Term.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | Term '=' Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjnz %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjz %s # %s %s %i %i\n", @Term.node@->reg, @Term.1.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | '(' Subbool ')'
+ @{
+ @i @Subbool.negated@ = @Bterm.negated@;
+ @i @Subbool.negated2@ = @Bterm.negated2@;
+ @i @Subbool.top_level@ = @Bterm.top_level@;
+ @}
+
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset, -1);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), @Exprs.node@); @}
+
+ | ID '(' ')'
+ @{ @i @Call.node@ = new_node(OP_Call, new_named_leaf(OP_ID, @ID.name@), NULL); @}
+
+ ;
+
+Exprs: Expr
+ | Exprs ',' Expr
+ @{ @i @Exprs.node@ = new_node(OP_Exprs, @Exprs.1.node@, @Expr.node@); @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ if(element->param_index!=-1) {
+ new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
+ }
+ else {
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+ new_element->param_index=-1;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=SYMBOL_TYPE_PARAM;
+ new_element->param_index=param_index;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ if(element->param_index!=-1) {
+ new_table=table_add_param(new_table,element->identifier,element->param_index);
+ }
+ else {
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+ int param_index; /* -1 if not a parameter */
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+#include <stdio.h>
+
+extern long f1(long a);
+extern long f2(long a);
+extern long f3(long a);
+extern long f4(long a);
+extern long f5(long a);
+extern long f6(long a);
+extern long f7(long a);
+extern long f8(long a);
+extern long f9(long a);
+extern long f10(long a);
+
+extern long g1(long a, long b);
+extern long g2(long a, long b);
+extern long g3(long a, long b);
+extern long g4(long a, long b);
+extern long g5(long a, long b);
+extern long g6(long a, long b);
+extern long g7(long a, long b);
+extern long g8(long a, long b);
+extern long g9(long a, long b);
+extern long g10(long a, long b);
+extern long g11(long a, long b);
+extern long g12(long a, long b);
+
+extern long h1(long a, long b, long c, long d);
+extern long h2(long a, long b, long c, long d);
+extern long h3(long a, long b, long c, long d);
+extern long h4(long a, long b, long c, long d);
+extern long h5(long a, long b, long c, long d);
+extern long h6(long a, long b, long c, long d);
+extern long h7(long a, long b, long c, long d);
+extern long h8(long a, long b, long c, long d);
+extern long h9(long a, long b, long c, long d);
+extern long h10(long a, long b, long c, long d);
+extern long h11(long a, long b, long c, long d);
+extern long h12(long a, long b, long c, long d);
+extern long h13(long a, long b, long c, long d);
+extern long h14(long a, long b, long c, long d);
+extern long h15(long a, long b, long c, long d);
+extern long h16(long a, long b, long c, long d);
+extern long h17(long a, long b, long c, long d);
+extern long h18(long a, long b, long c, long d);
+extern long h19(long a, long b, long c, long d);
+extern long h20(long a, long b, long c, long d);
+extern long h21(long a, long b, long c, long d);
+extern long h22(long a, long b, long c, long d);
+extern long h23(long a, long b, long c, long d);
+extern long h24(long a, long b, long c, long d);
+
+int check_arg1(char *name, long (*function)(long), long ret0, long ret1, long ret2) {
+ int ret;
+ ret=function(0)==ret0 && function(1)==ret1 && function(2)==ret2;
+ printf("%s: %li/%li, %li/%li, %li/%li - %s\n", name,function(0), ret0, function(1), ret1, function(2), ret2, ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg2(char *name, long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ printf("%li/%li ", function(a,b),blubb[a][b]);
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg4(char *name, long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ printf("%li/%li ", function(a,b,c,d),blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int main(int argc, char **argv) {
+ int ret;
+
+ long ret_g1[2][2]={{1,1},{1,0}};
+ long ret_g2[2][2]={{1,0},{1,1}};
+ long ret_g3[2][2]={{1,1},{0,1}};
+ long ret_g4[2][2]={{0,1},{1,1}};
+ long ret_g5[2][2]={{0,0},{0,1}};
+ long ret_g6[2][2]={{0,1},{0,0}};
+ long ret_g7[2][2]={{0,0},{1,0}};
+ long ret_g8[2][2]={{1,0},{0,0}};
+ long ret_g9[2][2]={{1,1},{1,0}};
+ long ret_g10[2][2]={{1,0},{1,1}};
+ long ret_g11[2][2]={{1,1},{0,1}};
+ long ret_g12[2][2]={{0,1},{1,1}};
+
+ long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+ long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+ long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+ long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+ long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+ long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+ long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ ret=check_arg1("f1",f1,0,1,1);
+ ret&=check_arg1("f2",f2,0,0,1);
+ ret&=check_arg1("f3",f3,1,0,0);
+ ret&=check_arg1("f4",f4,0,1,1);
+ ret&=check_arg1("f5",f5,0,0,1);
+ ret&=check_arg1("f6",f6,1,0,0);
+ ret&=check_arg1("f7",f7,0,1,1);
+ ret&=check_arg1("f8",f8,0,0,1);
+ ret&=check_arg1("f9",f9,1,1,1);
+ ret&=check_arg1("f10",f10,1,0,0);
+
+ ret&=check_arg2("g1",g1,ret_g1);
+ ret&=check_arg2("g2",g2,ret_g2);
+ ret&=check_arg2("g3",g3,ret_g3);
+ ret&=check_arg2("g4",g4,ret_g4);
+ ret&=check_arg2("g5",g5,ret_g5);
+ ret&=check_arg2("g6",g6,ret_g6);
+ ret&=check_arg2("g7",g7,ret_g7);
+ ret&=check_arg2("g8",g8,ret_g8);
+ ret&=check_arg2("g9",g9,ret_g9);
+ ret&=check_arg2("g10",g10,ret_g10);
+ ret&=check_arg2("g11",g11,ret_g11);
+ ret&=check_arg2("g12",g12,ret_g12);
+
+ ret&=check_arg4("h1",h1,ret_h1);
+ ret&=check_arg4("h2",h2,ret_h2);
+ ret&=check_arg4("h3",h3,ret_h3);
+ ret&=check_arg4("h4",h4,ret_h4);
+ ret&=check_arg4("h5",h5,ret_h5);
+ ret&=check_arg4("h6",h6,ret_h6);
+ ret&=check_arg4("h7",h7,ret_h7);
+ ret&=check_arg4("h8",h8,ret_h8);
+ ret&=check_arg4("h9",h9,ret_h9);
+ ret&=check_arg4("h10",h10,ret_h10);
+ ret&=check_arg4("h11",h11,ret_h11);
+ ret&=check_arg4("h12",h12,ret_h12);
+ ret&=check_arg4("h13",h13,ret_h13);
+ ret&=check_arg4("h14",h14,ret_h14);
+ ret&=check_arg4("h15",h15,ret_h15);
+ ret&=check_arg4("h16",h16,ret_h16);
+ ret&=check_arg4("h17",h17,ret_h17);
+ ret&=check_arg4("h18",h18,ret_h18);
+ ret&=check_arg4("h19",h19,ret_h19);
+ ret&=check_arg4("h20",h20,ret_h20);
+ ret&=check_arg4("h21",h21,ret_h21);
+ ret&=check_arg4("h22",h22,ret_h22);
+ ret&=check_arg4("h23",h23,ret_h23);
+ ret&=check_arg4("h24",h24,ret_h24);
+
+ return !ret;
+}
+
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
+func f4(a) if (a=0) then return 0; else return 1; end; end;
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
+
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
+
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases
+END
+f2.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f2.call
+END
+g4.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g4.call
+END
+tiefen.call
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefen.call
+END
+forumx_06.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forumx_06.3
+END
+g11.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g11.0
+END
+my_d.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_d.0
+END
+h6.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h6.call
+END
+h13.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h13.0
+END
+my_h.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_h.0
+END
+negterm1.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/negterm1.call
+END
+h17.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h17.0
+END
+my_l.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_l.0
+END
+my_a.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_a.call
+END
+malandro11.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro11.3
+END
+malandro15.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro15.3
+END
+h13.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h13.call
+END
+g3.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g3.0
+END
+algebran3.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran3.call
+END
+fib.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/fib.call
+END
+g7.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g7.0
+END
+parameter6.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter6.call
+END
+g1.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g1.call
+END
+h3.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h3.call
+END
+f7.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f7.call
+END
+algebra1.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebra1.call
+END
+h22.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h22.0
+END
+g9.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g9.call
+END
+tiefen1.0
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefen1.0
+END
+forum_05.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forum_05.3
+END
+algebran4.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran4.0
+END
+ag_g.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_g.3
+END
+fib.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/fib.0
+END
+malandro03.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro03.3
+END
+parameter3.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter3.0
+END
+ag_k.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_k.3
+END
+h10.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h10.call
+END
+test4.2
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/test4.2
+END
+f1.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f1.0
+END
+my_f.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_f.call
+END
+h22.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h22.call
+END
+malandro07.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro07.3
+END
+tiefen1.call
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefen1.call
+END
+h2.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h2.0
+END
+f5.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f5.0
+END
+h18.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h18.call
+END
+h6.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h6.0
+END
+f9.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f9.0
+END
+parameter3.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter3.call
+END
+f4.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f4.call
+END
+my_a.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_a.0
+END
+f10.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f10.0
+END
+forumx_07.2
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forumx_07.2
+END
+g6.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g6.call
+END
+h10.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h10.0
+END
+g12.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g12.0
+END
+my_e.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_e.0
+END
+h8.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h8.call
+END
+h14.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h14.0
+END
+h18.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h18.0
+END
+my_i.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_i.3
+END
+g10.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g10.call
+END
+malandro12.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro12.3
+END
+my_c.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_c.call
+END
+malandro16.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro16.3
+END
+regfehler.4
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/regfehler.4
+END
+h15.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h15.call
+END
+g4.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g4.0
+END
+tiefen.0
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefen.0
+END
+my_k.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_k.call
+END
+g8.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g8.0
+END
+f1.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f1.call
+END
+negterm1.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/negterm1.0
+END
+g3.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g3.call
+END
+h5.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h5.call
+END
+f9.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f9.call
+END
+algebran1.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran1.0
+END
+h23.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h23.0
+END
+forum_06.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forum_06.3
+END
+ag_h.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_h.3
+END
+f10.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f10.call
+END
+test1.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/test1.3
+END
+malandro04.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro04.3
+END
+parameter4.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter4.0
+END
+h12.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h12.call
+END
+f2.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f2.0
+END
+my_h.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_h.call
+END
+algebran2.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran2.call
+END
+h24.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h24.call
+END
+h3.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h3.0
+END
+f6.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f6.0
+END
+h7.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h7.0
+END
+tiefemax.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefemax.call
+END
+parameter5.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter5.call
+END
+h2.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h2.call
+END
+forumx_04.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forumx_04.3
+END
+my_b.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_b.0
+END
+f6.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f6.call
+END
+h11.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h11.0
+END
+forumx_08.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forumx_08.3
+END
+g8.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g8.call
+END
+my_f.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_f.0
+END
+h15.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h15.0
+END
+my_j.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_j.0
+END
+malandro.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro.3
+END
+h19.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h19.0
+END
+malandro13.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro13.3
+END
+g12.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g12.call
+END
+my_e.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_e.call
+END
+h21.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h21.call
+END
+g1.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g1.0
+END
+algebra.call
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebra.call
+END
+h17.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h17.call
+END
+g5.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g5.0
+END
+parameter2.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter2.call
+END
+g9.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g9.0
+END
+f3.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f3.call
+END
+localx01.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/localx01.3
+END
+g5.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g5.call
+END
+h20.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h20.0
+END
+h7.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h7.call
+END
+algebran2.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran2.0
+END
+h24.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h24.0
+END
+ag_e.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_e.3
+END
+forum_07.2
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forum_07.2
+END
+malandro01.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro01.3
+END
+negterm.0
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/negterm.0
+END
+parameter1.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter1.0
+END
+ag_i.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_i.3
+END
+my_b.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_b.call
+END
+testscriptx03.3
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/testscriptx03.3
+END
+test2.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/test2.3
+END
+malandro05.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro05.3
+END
+parameter5.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter5.0
+END
+f3.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f3.0
+END
+h14.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h14.call
+END
+malandro09.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro09.3
+END
+my_j.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_j.call
+END
+algebran4.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran4.call
+END
+h4.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h4.0
+END
+f7.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f7.0
+END
+h8.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h8.0
+END
+g2.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g2.call
+END
+forumx_05.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forumx_05.3
+END
+h4.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h4.call
+END
+g10.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g10.0
+END
+my_c.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_c.0
+END
+f8.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f8.call
+END
+h12.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h12.0
+END
+my_g.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_g.0
+END
+algebra.0
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebra.0
+END
+local01.3
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/local01.3
+END
+h16.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h16.0
+END
+my_k.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_k.0
+END
+malandro10.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro10.3
+END
+tiefemax.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/tiefemax.0
+END
+h11.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h11.call
+END
+malandro14.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro14.3
+END
+my_g.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_g.call
+END
+algebran1.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran1.call
+END
+h23.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h23.call
+END
+g2.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g2.0
+END
+g6.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g6.0
+END
+h19.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h19.call
+END
+parameter4.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter4.call
+END
+h1.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1022/ublu08/codeb/testcases/h1.call
+END
+f5.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f5.call
+END
+g7.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g7.call
+END
+h21.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h21.0
+END
+ag_b.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_b.3
+END
+h9.call
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h9.call
+END
+forum_04.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forum_04.3
+END
+algebran3.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebran3.0
+END
+forum_08.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/forum_08.3
+END
+malandro02.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro02.3
+END
+parameter2.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter2.0
+END
+ag_j.3
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/ag_j.3
+END
+g11.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/g11.call
+END
+my_d.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_d.call
+END
+h20.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h20.call
+END
+test3.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/test3.3
+END
+malandro06.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/malandro06.3
+END
+parameter6.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter6.0
+END
+h1.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h1.0
+END
+f4.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f4.0
+END
+h16.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h16.call
+END
+h5.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h5.0
+END
+my_l.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/my_l.call
+END
+f8.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/f8.0
+END
+negterm.call
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/negterm.call
+END
+parameter1.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/parameter1.call
+END
+algebra1.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1042/ublu08/codeb/testcases/algebra1.0
+END
+h9.0
+K 25
+svn:wc:ra_dav:version-url
+V 54
+/svn/private/!svn/ver/1019/ublu08/codeb/testcases/h9.0
+END
--- /dev/null
+8
+
+dir
+1019
+http://localhost/svn/private/ublu08/codeb/testcases
+http://localhost/svn/private
+
+
+
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+
+
+svn:special svn:externals svn:needs-lock
+\f
+f2.call
+file
+
+
+
+
+2008-05-17T15:52:09.000000Z
+6fdf6778d8fc38ee5ed996403a0beee7
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g4.call
+file
+
+
+
+
+2008-05-17T16:01:46.000000Z
+91086753970b73e9bdca217572ac9c8d
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+tiefen.call
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+4e4611a55d42deb5d4d01604659aee3d
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forumx_06.3
+file
+1042
+
+
+
+2008-05-19T17:32:49.000000Z
+90f2ef946fd9ef28fcf94df027e89e56
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g11.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+ece252a4a0ec44ce0e3f340b0f3403ec
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_d.0
+file
+1042
+
+
+
+2008-05-19T17:33:22.000000Z
+edb330d048a07ba2fae79cc04d38a7f1
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h6.call
+file
+
+
+
+
+2008-05-17T18:13:35.000000Z
+5e3326d561b87290b4eb674f1303870d
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h13.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+9cd396fc3339078adcaf75a56ec19156
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_h.0
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+24d3908b6b8ece4cc26953a301f0ac98
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+negterm1.call
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+df277ed55a7f4f87cbef2815c8ac3d67
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h17.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+3e6ee293496914c5f2096bd0a8550f3c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_l.0
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+c4a82df390b222018ef51ac46566b0a4
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_a.call
+file
+1042
+
+
+
+2008-05-19T17:33:21.000000Z
+d8e871df2c202de33d975b0b930ae83c
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro11.3
+file
+1042
+
+
+
+2008-05-19T17:33:19.000000Z
+01f2397e7770ffe1210363a85e7cbbc2
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro15.3
+file
+1042
+
+
+
+2008-05-19T17:33:20.000000Z
+d5ee0e5ba80a0bff089d93f5706f7408
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h13.call
+file
+
+
+
+
+2008-05-17T18:14:41.000000Z
+8b9ec70cddc4dc5d4a61e6c67e043ae2
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g3.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+d4145f0545bc34ee767b3ff34657aebd
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran3.call
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+31a43ca0465b0c89a605fdd25d6edefc
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+fib.call
+file
+
+
+
+
+2008-05-17T18:18:30.000000Z
+e56eb5050edfe853fd96c4a2eca3c749
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g7.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+85ed1ed1e6f164ffea7ef137d363cb10
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+parameter6.call
+file
+1042
+
+
+
+2008-05-19T17:33:29.000000Z
+1265633d7de6b2d870ae79b1f20041de
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g1.call
+file
+
+
+
+
+2008-05-17T16:01:15.000000Z
+53187b9d7adde68a9e5933499c8f922e
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h3.call
+file
+
+
+
+
+2008-05-17T18:13:11.000000Z
+c7c83b1c157701d046b33a3a66956187
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f7.call
+file
+
+
+
+
+2008-05-17T15:55:30.000000Z
+e8fddc19e3e601f8cc863dc7b144413c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebra1.call
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+cddcdc6d33203e7c02204531c0c5aa1d
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+tiefen1.0
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+20468ca960f31ebc7c20ccfade82a914
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h22.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+374eb9995cbdb04b5220807a5a3f87b9
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g9.call
+file
+
+
+
+
+2008-05-17T16:02:21.000000Z
+c8351778328bd6445197f503b8139d17
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+forum_05.3
+file
+1042
+
+
+
+2008-05-19T17:32:47.000000Z
+ec3a03b9d419323173761bfd14e4a342
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+algebran4.0
+file
+1042
+
+
+
+2008-05-19T17:31:22.000000Z
+e38a1ef87d78932d67c67aa84e1ccf75
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+fib.0
+file
+
+
+
+
+2008-05-17T18:18:00.000000Z
+b968dfc49c1042155cf7df90e7f8e5ad
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+ag_g.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+20534b17025920c73825550fb87ce080
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter3.0
+file
+1042
+
+
+
+2008-05-19T17:33:27.000000Z
+a84451fa9cf4a391d17e8644f8178316
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro03.3
+file
+1042
+
+
+
+2008-05-19T17:33:17.000000Z
+44d577a75f88e2050610bfdfbd14c6be
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+ag_k.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+e65008728ffa41f53928dffb28f6c94b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h10.call
+file
+
+
+
+
+2008-05-17T18:14:08.000000Z
+2c485b4998bfadced17db390161a05bb
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+test4.2
+file
+1042
+
+
+
+2008-05-19T17:33:30.000000Z
+261f08f201d000da065a3b6e0e4fe522
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_f.call
+file
+1042
+
+
+
+2008-05-19T17:33:23.000000Z
+0a039d15f089d3b7e1e83741ad4fcf00
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f1.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+d00a3189324e0dc908bc4c9ca337b874
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h22.call
+file
+
+
+
+
+2008-05-17T18:16:19.000000Z
+a6ffd7bcd611b80ef7dc135af39112c1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+malandro07.3
+file
+1042
+
+
+
+2008-05-19T17:33:18.000000Z
+c7d7f7ab7fc7362e4f89df7180f12e63
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+tiefen1.call
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+267076ac0db282a9e63d3da134d02ac5
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h2.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+35959e8c523c6f4174e6b55ab6b4c8c5
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f5.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+569ee2be6fb5c62ef86cd3629cac5f3f
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h18.call
+file
+
+
+
+
+2008-05-17T18:15:47.000000Z
+a9a81170498be8f908b88064fd921651
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h6.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+6278e991fa97d2fe44a6b667bf5ce8ce
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f9.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+cacb3a1b2234ad40bb5845121342ecc5
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+parameter3.call
+file
+1042
+
+
+
+2008-05-19T17:33:27.000000Z
+b83655ced953bc57f27e16d99a375090
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f4.call
+file
+
+
+
+
+2008-05-17T15:55:14.000000Z
+86cb296fb35261183e0b7cb47da376ac
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_a.0
+file
+1042
+
+
+
+2008-05-19T17:33:21.000000Z
+3bffa81589a4257a11d417591113c422
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f10.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+2279bf66cdd77b388d7891edd286797c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+forumx_07.2
+file
+1042
+
+
+
+2008-05-19T17:32:49.000000Z
+2eff768369bb8c5041b9f7d6472e6c09
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g6.call
+file
+
+
+
+
+2008-05-17T16:02:02.000000Z
+194d639fa1d782d72d1c44fc2078f323
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h10.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+920dd8ceaaccf2467646b2131bb4cbe8
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g12.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+06094e77abc9ec03ec903a3e24e6b665
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_e.0
+file
+1042
+
+
+
+2008-05-19T17:33:23.000000Z
+8bb24c7ef08877bec6d85c61c7f11486
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h8.call
+file
+
+
+
+
+2008-05-17T18:13:51.000000Z
+ddca9b6763b65ae5d4446c3ce803a4a0
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h14.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+60bf3f187d9a1dbbb3a2465912fe3051
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h18.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+9c1ecac2a855e2fa6a5e099d7785a7c9
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_i.3
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+87e2ed0079b335710ad819a032522b7f
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g10.call
+file
+
+
+
+
+2008-05-17T16:02:56.000000Z
+771617f03dfcc89cecf5527b6598eb51
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+malandro12.3
+file
+1042
+
+
+
+2008-05-19T17:33:20.000000Z
+aa0e79272f940413edf4d665c6bf1b13
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_c.call
+file
+1042
+
+
+
+2008-05-19T17:33:22.000000Z
+8b6e3530f1036c37b21714cbdabc01c2
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro16.3
+file
+1042
+
+
+
+2008-05-19T17:33:20.000000Z
+dd6cb8db3847a3b5b61dd7472759e41e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+regfehler.4
+file
+1042
+
+
+
+2008-05-19T17:33:29.000000Z
+05069199bbd9dcebcc33a29331a5ad2e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h15.call
+file
+
+
+
+
+2008-05-17T18:14:59.000000Z
+6b6c982647c1a7f22e564dd174368033
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g4.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+9034560365c27619e90055b4da8e5372
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+tiefen.0
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+894857a81390988f155cfc843435b294
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_k.call
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+865f8ec640f631c4f6402456858abdca
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g8.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+fe8d7c2e7823e6bdd1c8fc28605bd9f2
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f1.call
+file
+
+
+
+
+2008-05-17T15:54:59.000000Z
+53fc6b9768c09b7c293a1be97bccbbc8
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+negterm1.0
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+1988fa90318ee8b68449221ce78c241b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g3.call
+file
+
+
+
+
+2008-05-17T16:01:37.000000Z
+e24b4fb290f801e18a3bf96d00461914
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h5.call
+file
+
+
+
+
+2008-05-17T18:13:27.000000Z
+d592a3082cc9d79acd5c6156405522e0
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f9.call
+file
+
+
+
+
+2008-05-17T15:55:40.000000Z
+9450201506a4516e5e1b1c9fda7c9bab
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h23.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+f2dc8cde2ccfc3b28c646d065432a62a
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran1.0
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+690865c2dd5b4b91db769c1da6d25140
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forum_06.3
+file
+1042
+
+
+
+2008-05-19T17:32:48.000000Z
+90f2ef946fd9ef28fcf94df027e89e56
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+ag_h.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+650875eb5a2f896670989d5eb855cb15
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f10.call
+file
+
+
+
+
+2008-05-17T15:55:45.000000Z
+f01c2a5bfad5e7cbe354daa82f38bf67
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+test1.3
+file
+1042
+
+
+
+2008-05-19T17:33:29.000000Z
+cf01830ebe0eea03c1eaa4b62661d921
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro04.3
+file
+1042
+
+
+
+2008-05-19T17:33:17.000000Z
+2d2e211032ee1340a92a0c1047c6118b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter4.0
+file
+1042
+
+
+
+2008-05-19T17:33:28.000000Z
+ad9b196b5359debf25e96b7d89594a10
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h12.call
+file
+
+
+
+
+2008-05-17T18:14:31.000000Z
+6215af599791dd3c552445d220889a9a
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f2.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+29979069993c3662a4e9ddde5923a4b4
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_h.call
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+e089414c1c9493efaa9df2ee7a9c5fca
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h24.call
+file
+
+
+
+
+2008-05-17T18:16:31.000000Z
+dfb11c2012a60887f5f3be302c327154
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran2.call
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+b9bdb8dfee8630bde64f5e468a27ab83
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h3.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+40c8a6988c2d1e144c1925fe9c5f5656
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f6.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+ff8ef2815c929123b8b399719f7d74f9
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+tiefemax.call
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+89db20d22c0c8952c78b02832a1d6890
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h7.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+0e9afe918174f0bc89b1808f03e33c05
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+parameter5.call
+file
+1042
+
+
+
+2008-05-19T17:33:29.000000Z
+ec07056887a720babfb611b28d880856
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h2.call
+file
+
+
+
+
+2008-05-17T18:13:01.000000Z
+822191cbe70a0099adee9b3f9e2c86d8
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_b.0
+file
+1042
+
+
+
+2008-05-19T17:33:21.000000Z
+a146ace45773876d04625ec0ff58a056
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forumx_04.3
+file
+1042
+
+
+
+2008-05-19T17:32:48.000000Z
+53d9c7e2e53e504ed29147e475c198ca
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f6.call
+file
+
+
+
+
+2008-05-17T15:55:25.000000Z
+b2fa8363b75b105954deedddefba509f
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h11.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+dff54389b093db24b8108199477d278c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_f.0
+file
+1042
+
+
+
+2008-05-19T17:33:23.000000Z
+0651ad5f3f0b89ff295418768ee0f9b9
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forumx_08.3
+file
+1042
+
+
+
+2008-05-19T17:32:50.000000Z
+79467ccded17f71ad439c95f808fcc2b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g8.call
+file
+
+
+
+
+2008-05-17T16:02:15.000000Z
+563ca6eb8935a8ea48110d8fe29569c1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h15.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+c80e471f2847784226fc2037a551dcd4
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_j.0
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+1ca4a232bb8d070c35c51fcaeb343760
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro.3
+file
+1042
+
+
+
+2008-05-19T17:33:21.000000Z
+841850e2a940609318a3b8cfbcea5ae6
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h19.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+c61fd976033fc4e9663e7e918282db3e
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+malandro13.3
+file
+1042
+
+
+
+2008-05-19T17:33:20.000000Z
+65c411aa64afeeff2977743f66888419
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g12.call
+file
+
+
+
+
+2008-05-17T16:03:24.000000Z
+453b2d8fe412acc52b23bc2508816687
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_e.call
+file
+1042
+
+
+
+2008-05-19T17:33:23.000000Z
+aadf182e68032bd4d62184ec98f22f96
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h21.call
+file
+
+
+
+
+2008-05-17T18:16:13.000000Z
+c69e8ba6d274d469dd2633b623f4f2c9
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g1.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+82a9ac30d92f5afc92769af75534e5ce
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebra.call
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+3017bb3923bd9e6e82471364aaa815b5
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h17.call
+file
+
+
+
+
+2008-05-17T18:15:18.000000Z
+53dfbeab7dcdad7ba8b38eccd01fa8ca
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g5.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+8aef877a7ce8f2b3b26fd597d526b14c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+parameter2.call
+file
+1042
+
+
+
+2008-05-19T17:33:26.000000Z
+e7d734676b659257758b46640ed1edbe
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g9.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+2bf1172b55d9c98b19fc64ebf4ef5013
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f3.call
+file
+
+
+
+
+2008-05-17T15:56:50.000000Z
+9f74f6b9a2f2bb52089896cfd60dd342
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+localx01.3
+file
+1042
+
+
+
+2008-05-19T17:33:15.000000Z
+dca62f2af71a71eb7ed4e232e530befc
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g5.call
+file
+
+
+
+
+2008-05-17T16:01:55.000000Z
+fea54a4aeac466fba2b371477119ade2
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h20.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+31285e1e83984533b1a302c077efb47d
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h7.call
+file
+
+
+
+
+2008-05-17T18:13:44.000000Z
+6e1158562af63768dd7619dc10803233
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h24.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+6fe5899c44e3d873842fdc4e62f5bda2
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran2.0
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+6f66742e13551edc693253c2fab30c31
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+ag_e.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+3c2167748f53462c0b1db85d36117cab
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forum_07.2
+file
+1042
+
+
+
+2008-05-19T17:32:48.000000Z
+2eff768369bb8c5041b9f7d6472e6c09
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro01.3
+file
+1042
+
+
+
+2008-05-19T17:33:16.000000Z
+8d38fe618dc92f98cbddb87c0819c8cb
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+negterm.0
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+1988fa90318ee8b68449221ce78c241b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter1.0
+file
+1042
+
+
+
+2008-05-19T17:33:26.000000Z
+1261f0301022d7e1842bc892c067907e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+ag_i.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+e7c3efc4c07c5fd29267e8dd51cc3837
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_b.call
+file
+1042
+
+
+
+2008-05-19T17:33:22.000000Z
+cf8ce2070e9a5e0209f878697a46df1b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+testscriptx03.3
+file
+1042
+
+
+
+2008-05-19T17:33:30.000000Z
+d2168be28160d4fef8250aa5fd68cfe1
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+test2.3
+file
+1042
+
+
+
+2008-05-19T17:33:30.000000Z
+00abfc26a30c3aab6fc57a21d46ceb2b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter5.0
+file
+1042
+
+
+
+2008-05-19T17:33:28.000000Z
+5486f00b73c73fe463a8eed28381154c
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro05.3
+file
+1042
+
+
+
+2008-05-19T17:33:18.000000Z
+1de8dca763ece7a0cee3a5089cf76270
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f3.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+775d933d70fbc9bf5b376ab7c7ff27a7
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h14.call
+file
+
+
+
+
+2008-05-17T18:14:50.000000Z
+fbad72a47632903211179624698f35d1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+malandro09.3
+file
+1042
+
+
+
+2008-05-19T17:33:19.000000Z
+0609d00302341b6cf4740d436bb87ad0
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_j.call
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+1be4fc525da884e37231e897d8df9153
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h4.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+4426579c1fb1c0be99974b7118572ab1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran4.call
+file
+1042
+
+
+
+2008-05-19T17:31:22.000000Z
+1bbb58f1e36e4916cd12fb28254a749e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f7.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+3dc7d7476bc4d0b46d5fb184022adb52
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h8.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+7fc0ad824e5fd175879cf626dd56f0dc
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g2.call
+file
+
+
+
+
+2008-05-17T16:01:27.000000Z
+b445b24b77fdf47000fc1a23d9471e8c
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+forumx_05.3
+file
+1042
+
+
+
+2008-05-19T17:32:49.000000Z
+e8e353ae2a690dc40e3de8029c7543cb
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_c.0
+file
+1042
+
+
+
+2008-05-19T17:33:22.000000Z
+b4d20db97a644172a90852ab1de2188b
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h4.call
+file
+
+
+
+
+2008-05-17T18:13:17.000000Z
+031adf99ed7c33e89db84c87a4392f69
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g10.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+02cf0f938b64a2e5a50835b4d707b4b1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f8.call
+file
+
+
+
+
+2008-05-17T15:55:35.000000Z
+b6e9fa907dbb258fad6cead558e7f9df
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h12.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+34605d216eab69393ba1ead08a982d22
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_g.0
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+733f1c17fd48c5ceb9a8195302a25c7e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+algebra.0
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+717629790b90ca013c291ef1bb3a95a0
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+local01.3
+file
+1042
+
+
+
+2008-05-19T17:33:14.000000Z
+dca62f2af71a71eb7ed4e232e530befc
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h16.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+566b21ab8cab3072352b9e18a4ed3fed
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_k.0
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+debe02b8fb99a1b6c2bcb67b01cb6239
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro10.3
+file
+1042
+
+
+
+2008-05-19T17:33:19.000000Z
+b3b87392dfb554fa731b5e109e83717d
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+tiefemax.0
+file
+1042
+
+
+
+2008-05-19T17:33:31.000000Z
+6d11b557ca68eb04e5c719a4545b8c04
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h11.call
+file
+
+
+
+
+2008-05-17T18:14:18.000000Z
+aa4a6c331e36040999fdc6091a86de53
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+malandro14.3
+file
+1042
+
+
+
+2008-05-19T17:33:20.000000Z
+cdf5c8269940d7e8c2728eab2f130ddf
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+my_g.call
+file
+1042
+
+
+
+2008-05-19T17:33:24.000000Z
+a825f985690e62f5e01807e59c4c7482
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h23.call
+file
+
+
+
+
+2008-05-17T18:16:26.000000Z
+c51b55fe9488292f6a77ea71d4d4aecb
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g2.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+5e8c78dd741ff50ea614da54efa537b6
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+algebran1.call
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+b63ea91bf59174863748baf043bf7ad6
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g6.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+5ab93cfbb449b62c2cd53515f9df4be3
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h19.call
+file
+
+
+
+
+2008-05-17T18:15:58.000000Z
+4406ad63d0375889d65f96ed4e97d39b
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+parameter4.call
+file
+1042
+
+
+
+2008-05-19T17:33:28.000000Z
+3f3ffcf35a86b82feb72cdd985ca1e1f
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h1.call
+file
+1022
+
+
+
+2008-05-17T18:33:40.000000Z
+be6040170888395b1ae70ab05a943484
+2008-05-17T18:33:50.153407Z
+1022
+paulchen
+\f
+f5.call
+file
+
+
+
+
+2008-05-17T15:55:21.000000Z
+8ff3de3a86a2bf00b8c8785e39034592
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+g7.call
+file
+
+
+
+
+2008-05-17T16:02:09.000000Z
+a6393c3b308f83f522919b795b69b1cd
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h21.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+26f0e09fdf5c2ca9f2ec6444d21a68c8
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+ag_b.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+32a248c9ddfc007209d982212d49f258
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h9.call
+file
+
+
+
+
+2008-05-17T18:13:58.000000Z
+1be02f3e94466102b74b448d10ec04ba
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+forum_04.3
+file
+1042
+
+
+
+2008-05-19T17:32:47.000000Z
+d83d32ffa882e4ec405476b4f6adcd3e
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+algebran3.0
+file
+1042
+
+
+
+2008-05-19T17:31:21.000000Z
+b1363161ef4a8deedb9ed90241d931d8
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro02.3
+file
+1042
+
+
+
+2008-05-19T17:33:17.000000Z
+945b02b282475aeffab4cd808c0b878c
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+forum_08.3
+file
+1042
+
+
+
+2008-05-19T17:32:48.000000Z
+c613ec3ddb7ac662168c2b225a0b3297
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter2.0
+file
+1042
+
+
+
+2008-05-19T17:33:26.000000Z
+549d406f0bafaf114784f2be8988aab0
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+ag_j.3
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+d6e7caf90136e29dd91e2c7d1c93f93a
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+g11.call
+file
+
+
+
+
+2008-05-17T16:03:11.000000Z
+d0ff54d3ff20c20e847a49f57c771142
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_d.call
+file
+1042
+
+
+
+2008-05-19T17:33:22.000000Z
+7dc483abb732b281b49edee6cdcbc30d
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h20.call
+file
+
+
+
+
+2008-05-17T18:16:06.000000Z
+521a7a78c92ca8cf48afffe8360e44c3
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+test3.3
+file
+1042
+
+
+
+2008-05-19T17:33:30.000000Z
+47c8c25fbe3227587a7f10ef1937af2c
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+malandro06.3
+file
+1042
+
+
+
+2008-05-19T17:33:18.000000Z
+c568b31541a0c2fc3d705a83ae0d48b2
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter6.0
+file
+1042
+
+
+
+2008-05-19T17:33:29.000000Z
+d8e483e11fd68ef30c00164967a3a084
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h1.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+7ba7182884f0c9d735e9faaac7dfc7f1
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+f4.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+9184146efc94eceb80f1041fa1d276ce
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h16.call
+file
+
+
+
+
+2008-05-17T18:15:09.000000Z
+0653628e8d663327ddff45fd4eab19ee
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+h5.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+84f8654c81a880f99dc7e3f55b9081ad
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+my_l.call
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+bccf20fd3bc6ceb1985ed3b2573f103d
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+f8.0
+file
+
+
+
+
+2008-05-17T15:47:39.000000Z
+9af62ae20a4a815560b5259d1a43f5af
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
+negterm.call
+file
+1042
+
+
+
+2008-05-19T17:33:25.000000Z
+bdad2e18de2d65822773cd8c924155f1
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+parameter1.call
+file
+1042
+
+
+
+2008-05-19T17:33:26.000000Z
+ec51e4a1adc8afa59fd5160c332b9645
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+algebra1.0
+file
+1042
+
+
+
+2008-05-19T17:31:20.000000Z
+6ff960ca78782ddb093e1d5ed4887afa
+2008-05-19T17:34:50.071196Z
+1042
+paulchen
+\f
+h9.0
+file
+
+
+
+
+2008-05-17T15:47:40.000000Z
+e177856e7e23dc023d0b82bbd086be47
+2008-05-17T18:19:52.308468Z
+1019
+paulchen
+\f
--- /dev/null
+func f()
+ var a := 1;
+ var b := 2;
+
+ c := 5;
+end;
--- /dev/null
+func f(x,y)
+ var a := 1;
+ var b := 2;
+ if a = b then
+ a := 3;
+ x := z;
+ end;
+ b := x;
+end;
--- /dev/null
+struct a b a end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+func f()
+ off := 7;
+ var off:=5;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ else
+ return x;
+ end;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ end;
+ return x;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var s := 2;
+ s.c := 17;
+end;
--- /dev/null
+func test(a, b)
+ return a + 2 + ( 3 * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 2 + (3 * 4)==test(2,4));
--- /dev/null
+func test(a, b)
+ return a + b + ( a * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 4 + (2 * 4)==test(2,4));
--- /dev/null
+func test()
+ return 1 + 2;
+end;
--- /dev/null
+extern long test ();
+return ( 3==test());
--- /dev/null
+func test()
+ return 1 * 2;
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 2==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 );
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 14==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 ) * ( 1 + 2 + 3 + ( 2 * 4 ));
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 196==test());
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
--- /dev/null
+extern long f1(long a);
+
+return f1(0)==0 && f1(1)==1 && f1(2)==1;
+
--- /dev/null
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f10(long a);
+
+return f10(0)==1 && f10(1)==0 && f10(2)==0;
+
--- /dev/null
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
--- /dev/null
+extern long f2(long a);
+
+return f2(0)==0 && f2(1)==0 && f2(2)==1;
+
--- /dev/null
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f3(long a);
+
+return f3(0)==1 && f3(1)==0 && f3(2)==0;
+
--- /dev/null
+func f4(a) if (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f4(long a);
+
+return f4(0)==0 && f4(1)==1 && f4(2)==1;
+
--- /dev/null
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
--- /dev/null
+extern long f5(long a);
+
+return f5(0)==0 && f5(1)==0 && f5(2)==1;
+
--- /dev/null
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f6(long a);
+
+return f6(0)==1 && f6(1)==0 && f6(2)==0;
+
--- /dev/null
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f7(long a);
+
+return f7(0)==0 && f7(1)==1 && f7(2)==1;
+
--- /dev/null
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f8(long a);
+
+return f8(0)==0 && f8(1)==0 && f8(2)==1;
+
--- /dev/null
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f9(long a);
+
+return f9(0)==1 && f9(1)==1 && f9(2)==1;
+
--- /dev/null
+func fib(n)
+ if 1 >= n then return n; end;
+ var fib_n := 1; (* fib(n) *)
+ var fib_n1 := 0; (* fib(n-1) *)
+ var r := 0;
+
+ while n >= 2 do
+ (* calculate fib(n+1) *)
+ r := fib_n + fib_n1;
+ (* update fib(n-1) and fib(n) *)
+ fib_n1 := fib_n;
+ fib_n := r;
+ n := n + (-1);
+ end;
+ return r;
+end;
+
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a2 end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ a := x;
+end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a2 end;
+struct end;
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
+struct end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a.t := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ (* a := x; *)
+end;
+
+struct b end;
--- /dev/null
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g1(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g1[2][2]={{1,1},{1,0}};
+
+return check_arg2(g1,ret_g1);
+
+
--- /dev/null
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g10(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g10[2][2]={{1,0},{1,1}};
+
+return check_arg2(g10,ret_g10);
+
+
--- /dev/null
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g11(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g11[2][2]={{1,1},{0,1}};
+
+return check_arg2(g11,ret_g11);
+
+
--- /dev/null
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g12(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g12[2][2]={{0,1},{1,1}};
+
+return check_arg2(g12,ret_g12);
+
+
--- /dev/null
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g2(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g2[2][2]={{1,0},{1,1}};
+
+return check_arg2(g2,ret_g2);
+
+
--- /dev/null
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g3(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g3[2][2]={{1,1},{0,1}};
+
+return check_arg2(g3,ret_g3);
+
+
--- /dev/null
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g4(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g4[2][2]={{0,1},{1,1}};
+
+return check_arg2(g4,ret_g4);
+
+
--- /dev/null
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g5(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g5[2][2]={{0,0},{0,1}};
+
+return check_arg2(g5,ret_g5);
+
+
--- /dev/null
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g6(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g6[2][2]={{0,1},{0,0}};
+
+return check_arg2(g6,ret_g6);
+
+
--- /dev/null
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g7(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g7[2][2]={{0,0},{1,0}};
+
+return check_arg2(g7,ret_g7);
+
+
--- /dev/null
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g8(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g8[2][2]={{1,0},{0,0}};
+
+return check_arg2(g8,ret_g8);
+
+
--- /dev/null
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g9(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g9[2][2]={{1,1},{1,0}};
+
+return check_arg2(g9,ret_g9);
+
+
--- /dev/null
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h1(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h1,ret_h1);
+
--- /dev/null
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h10(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h10,ret_h10);
+
--- /dev/null
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h11(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+
+return check_arg4(h11,ret_h11);
+
--- /dev/null
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h12(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+
+return check_arg4(h12,ret_h12);
+
--- /dev/null
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h13(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+
+return check_arg4(h13,ret_h13);
+
--- /dev/null
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h14(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h14,ret_h14);
+
--- /dev/null
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h15(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+
+return check_arg4(h15,ret_h15);
+
--- /dev/null
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h16(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h16,ret_h16);
+
--- /dev/null
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h17(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h17,ret_h17);
+
--- /dev/null
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h18(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h18,ret_h18);
+
--- /dev/null
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h19(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h19,ret_h19);
+
--- /dev/null
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h2(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h2,ret_h2);
+
--- /dev/null
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h20(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h20,ret_h20);
+
--- /dev/null
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h21(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h21,ret_h21);
+
--- /dev/null
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h22(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h22,ret_h22);
+
--- /dev/null
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h23(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h23,ret_h23);
+
--- /dev/null
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h24(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h24,ret_h24);
+
--- /dev/null
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h3(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h3,ret_h3);
+
--- /dev/null
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h4(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h4,ret_h4);
+
--- /dev/null
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h5(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h5,ret_h5);
+
--- /dev/null
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h6(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h6,ret_h6);
+
--- /dev/null
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h7(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h7,ret_h7);
+
--- /dev/null
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h8(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h8,ret_h8);
+
--- /dev/null
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h9(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+
+return check_arg4(h9,ret_h9);
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+struct a1 a2 a1 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+end;
--- /dev/null
+func g(x,y)
+ y:=0;
+ return y+z;
+end;
+
--- /dev/null
+func g(x,y)
+ y:=0;
+ z:=5;
+ return y;
+end;
+
--- /dev/null
+(*no se si esto de verdad deberia de dar erro :) ahora si*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ var e:=5;
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return e;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.d2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.c1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 c3 end;
+struct b1 b2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.b2;
+
+
+ return d;
+end;
+
+
+
--- /dev/null
+(*esto no deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.a2;
+
+
+ return d;
+end;
+
+
+struct b1 b2 b3 end;
+
+
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.b2;
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar erro g no esta definida*)
+ var d:=1;
+ if d = g then
+ d:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return d;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+
+ var g:=8;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ g:=x.a2;
+ end;
+ return g;
+
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 a4 end;
+
+func f(a1,a2)
+
+ var a3:=1;
+ var a4:=1;
+ a4:=a2.a2;
+ return a1;
+
+(*esto deberia de dar error t no visible*)
+ if a1 = a3 then
+ a4:=a1.a1;
+ else
+ a4:=a2.a2;
+ end;
+ return a4;
+
+
+end;
+
+
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+
+ var g:=1;
+ var d:=1;
+ if d = g then
+ var t:=5;
+ d:=x.a1;
+ else
+ t:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
--- /dev/null
+func f()
+ return -2;
+end;
--- /dev/null
+extern long f();
+return ( -2==f());
+
--- /dev/null
+
+func f()
+ return 1+2+3+4;
+end;
+
--- /dev/null
+extern long f();
+return (10==f());
+
--- /dev/null
+
+func f()
+ return 1+(2*3)+4;
+end;
+
--- /dev/null
+extern long f();
+return (11==f());
+
--- /dev/null
+
+func f()
+ return 1*2*3*4;
+end;
+
--- /dev/null
+extern long f();
+return (24==f());
+
--- /dev/null
+func f()
+ return (1*((-2)+5))+(-1)+(((-2)+2)*17)+3;
+end;
+
--- /dev/null
+extern long f();
+return (5==f());
+
--- /dev/null
+func f(x)
+ return x;
+end;
+
--- /dev/null
+extern long f(long);
+return (5==f((long)5));
+
--- /dev/null
+func f(x,y)
+ return x+y;
+end;
+
--- /dev/null
+extern long f(long, long);
+return (12==f(5,7));
+
--- /dev/null
+func f(x,y,z)
+ return x+y+1+z+1;
+end;
+
+func g(z)
+ return z+3;
+end;
+
--- /dev/null
+extern long f(long, long, long);
+extern long g(long);
+return (15==f(5,7,1) && 7==g(4));
+
--- /dev/null
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func g(a1)
+ var x := 5;
+ return x.a1;
+end;
+
--- /dev/null
+struct a b c end;
+
+func f(s,s)
+ return s.a+s.b;
+end;
+
--- /dev/null
+struct S {long a1; long a2; long a3;} s={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*);
+
+return ( 3==f((long*)&s, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s,s,s,s,t,s)
+ return s.a+s.b+t.c;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={10,20,30};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={10,20,30};
+struct D {long a1; long a2; long a3;} d={10,20,30};
+struct E {long a1; long a2; long a3;} e={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*,long*,long*,long*,long*);
+
+return ( 33==f((long*)&a, (long*)&b, (long*)&c, (long*)&d, (long*)&e, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s)
+ return s.a.a+((-3)*s.b.c)+s.c.b;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={1,2,3};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={100,200,300};
+struct S {long a1; long a2; long a3;} s={(long*)&a,(long*)&b,(long*)&c};
+extern long f(long*);
+
+return ( 111==f((long*)&s));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (-5==test(5));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (5==test(-5));
--- /dev/null
+func test(a, b)
+ return a + b;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 34==test(29,5));
--- /dev/null
+func test(a, b, c, d, e, f)
+ return a + b + c + d + e + f;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long,long,long,long,long);
+return ( 21==test(1,2,3,4,5,6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 + s2.a2 + s3.a3 + s4.a1 + s5.a2 + s6.a3 ;
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10+50+90+100+140+180)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 * s2.a2 * s3.a3 * s4.a1 * s5.a2 * s6.a3 ;
+end;
\ No newline at end of file
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10L*50L*90L*100L*140L*180L)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2)
+ return s1.a1 * s2.a2;
+end;
--- /dev/null
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+
+extern long test(long*,long*);
+
+return ( (10*50)==test((long*)&s1,(long*)&s2));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return (s1.a1 * s2.a2) + ( s3.a3 * s4.a1) +( s5.a2 * s6.a3 );
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( ((10L*50L)+(90L*100L)+(140L*180L))==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b * (a + b))))));
+end;
--- /dev/null
+struct f1 f2 end;\r
+\r
+func f(p1)\r
+ var fx:=p1;\r
+ p1:=1;\r
+ (* f1 not defined *)\r
+ f1:=4;\r
+ (* shoult throw one of\r
+ - f1 not defined\r
+ - field access not allowed (var fx exists)\r
+ - field fx not defined\r
+ *)\r
+ f1.fx:=p1;\r
+ p1.f1:=p1.f2;\r
+ f(p1,p1.f2).f3:=0AFFEH;\r
+ var f1:=3;\r
+end;\r
+\r
+struct f3 end;\r
--- /dev/null
+func test()\r
+ var v1:=1;\r
+ if 1=1 then\r
+ v1:=2;\r
+ var v2:=1;\r
+ end;\r
+\r
+ (* v2 not visible *)\r
+ v2:=3;\r
+end;\r
--- /dev/null
+struct f end;\r
+\r
+func x()\r
+ (* f is a field, not a variable *)\r
+ f := 4;\r
+end;\r
--- /dev/null
+\r
+func x()\r
+ var z:=3;\r
+ (* field feld not defined *)\r
+ z.feld:=x(4,5,a);\r
+ (* syntax error *)\r
+ return z+z*z;\r
+end;\r
--- /dev/null
+func g(x,y,z)
+ var res:=0;
+ res:=x;
+ while y>=0 or (not x=z) do
+ y:=y+(-1);
+ res:=res+z;
+ end;
+ return res;
+end;
+
+struct end;
+
+func f()
+ var off:=10 + (xx * 3);
+ var bound:= -test.c5;
+ var add:= g(test.c5) + 2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b)))));
+end;
--- /dev/null
+extern long test(long,long);
+return ((3 * 8) + (3 * 8 * ( 3 + 8 + ( 3 * 8 * ( 3 + 8 + ( 3 * 8 ))))) == test(3,8)) ;
--- /dev/null
+
+func test(a,b,c,d,e,f)
+ return (a * b) + ( c * d) + (e * f );
+end;
--- /dev/null
+
+extern long test(long,long, long, long, long, long);
+
+return ( ( 1 * 2 ) + (3 * 4) + ( 5 * 6 ) == test(1,2,3,4,5,6)) ;
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b)));
+end;
--- /dev/null
+
+extern long test(long,long);
+
+return ( ( 3 * 5 ) + ( 3 * 5 * (3 + 5 + ( 3 * 5))) == test(3,5)) ;
--- /dev/null
+func f()
+ var a := 1;
+ var b := 2;
+
+ c := 5;
+end;
--- /dev/null
+func f(x,y)
+ var a := 1;
+ var b := 2;
+ if a = b then
+ a := 3;
+ x := z;
+ end;
+ b := x;
+end;
--- /dev/null
+struct a b a end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+func f()
+ off := 7;
+ var off:=5;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ else
+ return x;
+ end;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ end;
+ return x;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var s := 2;
+ s.c := 17;
+end;
--- /dev/null
+func test(a, b)
+ return a + 2 + ( 3 * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 2 + (3 * 4)==test(2,4));
--- /dev/null
+func test(a, b)
+ return a + b + ( a * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 4 + (2 * 4)==test(2,4));
--- /dev/null
+func test()
+ return 1 + 2;
+end;
--- /dev/null
+extern long test ();
+return ( 3==test());
--- /dev/null
+func test()
+ return 1 * 2;
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 2==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 );
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 14==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 ) * ( 1 + 2 + 3 + ( 2 * 4 ));
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 196==test());
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
--- /dev/null
+extern long f1(long a);
+
+return f1(0)==0 && f1(1)==1 && f1(2)==1;
+
--- /dev/null
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f10(long a);
+
+return f10(0)==1 && f10(1)==0 && f10(2)==0;
+
--- /dev/null
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
--- /dev/null
+extern long f2(long a);
+
+return f2(0)==0 && f2(1)==0 && f2(2)==1;
+
--- /dev/null
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f3(long a);
+
+return f3(0)==1 && f3(1)==0 && f3(2)==0;
+
--- /dev/null
+func f4(a) if (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f4(long a);
+
+return f4(0)==0 && f4(1)==1 && f4(2)==1;
+
--- /dev/null
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
--- /dev/null
+extern long f5(long a);
+
+return f5(0)==0 && f5(1)==0 && f5(2)==1;
+
--- /dev/null
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f6(long a);
+
+return f6(0)==1 && f6(1)==0 && f6(2)==0;
+
--- /dev/null
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f7(long a);
+
+return f7(0)==0 && f7(1)==1 && f7(2)==1;
+
--- /dev/null
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f8(long a);
+
+return f8(0)==0 && f8(1)==0 && f8(2)==1;
+
--- /dev/null
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f9(long a);
+
+return f9(0)==1 && f9(1)==1 && f9(2)==1;
+
--- /dev/null
+func fib(n)
+ if 1 >= n then return n; end;
+ var fib_n := 1; (* fib(n) *)
+ var fib_n1 := 0; (* fib(n-1) *)
+ var r := 0;
+
+ while n >= 2 do
+ (* calculate fib(n+1) *)
+ r := fib_n + fib_n1;
+ (* update fib(n-1) and fib(n) *)
+ fib_n1 := fib_n;
+ fib_n := r;
+ n := n + (-1);
+ end;
+ return r;
+end;
+
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a2 end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ a := x;
+end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a2 end;
+struct end;
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
+struct end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a.t := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ (* a := x; *)
+end;
+
+struct b end;
--- /dev/null
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g1(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g1[2][2]={{1,1},{1,0}};
+
+return check_arg2(g1,ret_g1);
+
+
--- /dev/null
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g10(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g10[2][2]={{1,0},{1,1}};
+
+return check_arg2(g10,ret_g10);
+
+
--- /dev/null
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g11(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g11[2][2]={{1,1},{0,1}};
+
+return check_arg2(g11,ret_g11);
+
+
--- /dev/null
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g12(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g12[2][2]={{0,1},{1,1}};
+
+return check_arg2(g12,ret_g12);
+
+
--- /dev/null
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g2(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g2[2][2]={{1,0},{1,1}};
+
+return check_arg2(g2,ret_g2);
+
+
--- /dev/null
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g3(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g3[2][2]={{1,1},{0,1}};
+
+return check_arg2(g3,ret_g3);
+
+
--- /dev/null
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g4(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g4[2][2]={{0,1},{1,1}};
+
+return check_arg2(g4,ret_g4);
+
+
--- /dev/null
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g5(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g5[2][2]={{0,0},{0,1}};
+
+return check_arg2(g5,ret_g5);
+
+
--- /dev/null
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g6(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g6[2][2]={{0,1},{0,0}};
+
+return check_arg2(g6,ret_g6);
+
+
--- /dev/null
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g7(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g7[2][2]={{0,0},{1,0}};
+
+return check_arg2(g7,ret_g7);
+
+
--- /dev/null
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g8(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g8[2][2]={{1,0},{0,0}};
+
+return check_arg2(g8,ret_g8);
+
+
--- /dev/null
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g9(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g9[2][2]={{1,1},{1,0}};
+
+return check_arg2(g9,ret_g9);
+
+
--- /dev/null
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h1(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h1,ret_h1);
+
--- /dev/null
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h10(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h10,ret_h10);
+
--- /dev/null
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h11(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+
+return check_arg4(h11,ret_h11);
+
--- /dev/null
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h12(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+
+return check_arg4(h12,ret_h12);
+
--- /dev/null
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h13(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+
+return check_arg4(h13,ret_h13);
+
--- /dev/null
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h14(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h14,ret_h14);
+
--- /dev/null
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h15(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+
+return check_arg4(h15,ret_h15);
+
--- /dev/null
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h16(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h16,ret_h16);
+
--- /dev/null
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h17(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h17,ret_h17);
+
--- /dev/null
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h18(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h18,ret_h18);
+
--- /dev/null
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h19(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h19,ret_h19);
+
--- /dev/null
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h2(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h2,ret_h2);
+
--- /dev/null
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h20(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h20,ret_h20);
+
--- /dev/null
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h21(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h21,ret_h21);
+
--- /dev/null
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h22(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h22,ret_h22);
+
--- /dev/null
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h23(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h23,ret_h23);
+
--- /dev/null
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h24(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h24,ret_h24);
+
--- /dev/null
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h3(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h3,ret_h3);
+
--- /dev/null
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h4(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h4,ret_h4);
+
--- /dev/null
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h5(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h5,ret_h5);
+
--- /dev/null
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h6(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h6,ret_h6);
+
--- /dev/null
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h7(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h7,ret_h7);
+
--- /dev/null
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h8(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h8,ret_h8);
+
--- /dev/null
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h9(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+
+return check_arg4(h9,ret_h9);
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+struct a1 a2 a1 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+end;
--- /dev/null
+func g(x,y)
+ y:=0;
+ return y+z;
+end;
+
--- /dev/null
+func g(x,y)
+ y:=0;
+ z:=5;
+ return y;
+end;
+
--- /dev/null
+(*no se si esto de verdad deberia de dar erro :) ahora si*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ var e:=5;
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return e;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.d2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.c1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 c3 end;
+struct b1 b2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.b2;
+
+
+ return d;
+end;
+
+
+
--- /dev/null
+(*esto no deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.a2;
+
+
+ return d;
+end;
+
+
+struct b1 b2 b3 end;
+
+
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.b2;
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar erro g no esta definida*)
+ var d:=1;
+ if d = g then
+ d:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return d;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+
+ var g:=8;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ g:=x.a2;
+ end;
+ return g;
+
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 a4 end;
+
+func f(a1,a2)
+
+ var a3:=1;
+ var a4:=1;
+ a4:=a2.a2;
+ return a1;
+
+(*esto deberia de dar error t no visible*)
+ if a1 = a3 then
+ a4:=a1.a1;
+ else
+ a4:=a2.a2;
+ end;
+ return a4;
+
+
+end;
+
+
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+
+ var g:=1;
+ var d:=1;
+ if d = g then
+ var t:=5;
+ d:=x.a1;
+ else
+ t:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
--- /dev/null
+func f()
+ return -2;
+end;
--- /dev/null
+extern long f();
+return ( -2==f());
+
--- /dev/null
+
+func f()
+ return 1+2+3+4;
+end;
+
--- /dev/null
+extern long f();
+return (10==f());
+
--- /dev/null
+
+func f()
+ return 1+(2*3)+4;
+end;
+
--- /dev/null
+extern long f();
+return (11==f());
+
--- /dev/null
+
+func f()
+ return 1*2*3*4;
+end;
+
--- /dev/null
+extern long f();
+return (24==f());
+
--- /dev/null
+func f()
+ return (1*((-2)+5))+(-1)+(((-2)+2)*17)+3;
+end;
+
--- /dev/null
+extern long f();
+return (5==f());
+
--- /dev/null
+func f(x)
+ return x;
+end;
+
--- /dev/null
+extern long f(long);
+return (5==f((long)5));
+
--- /dev/null
+func f(x,y)
+ return x+y;
+end;
+
--- /dev/null
+extern long f(long, long);
+return (12==f(5,7));
+
--- /dev/null
+func f(x,y,z)
+ return x+y+1+z+1;
+end;
+
+func g(z)
+ return z+3;
+end;
+
--- /dev/null
+extern long f(long, long, long);
+extern long g(long);
+return (15==f(5,7,1) && 7==g(4));
+
--- /dev/null
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func g(a1)
+ var x := 5;
+ return x.a1;
+end;
+
--- /dev/null
+struct a b c end;
+
+func f(s,s)
+ return s.a+s.b;
+end;
+
--- /dev/null
+struct S {long a1; long a2; long a3;} s={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*);
+
+return ( 3==f((long*)&s, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s,s,s,s,t,s)
+ return s.a+s.b+t.c;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={10,20,30};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={10,20,30};
+struct D {long a1; long a2; long a3;} d={10,20,30};
+struct E {long a1; long a2; long a3;} e={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*,long*,long*,long*,long*);
+
+return ( 33==f((long*)&a, (long*)&b, (long*)&c, (long*)&d, (long*)&e, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s)
+ return s.a.a+((-3)*s.b.c)+s.c.b;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={1,2,3};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={100,200,300};
+struct S {long a1; long a2; long a3;} s={(long*)&a,(long*)&b,(long*)&c};
+extern long f(long*);
+
+return ( 111==f((long*)&s));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (-5==test(5));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (5==test(-5));
--- /dev/null
+func test(a, b)
+ return a + b;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 34==test(29,5));
--- /dev/null
+func test(a, b, c, d, e, f)
+ return a + b + c + d + e + f;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long,long,long,long,long);
+return ( 21==test(1,2,3,4,5,6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 + s2.a2 + s3.a3 + s4.a1 + s5.a2 + s6.a3 ;
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10+50+90+100+140+180)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 * s2.a2 * s3.a3 * s4.a1 * s5.a2 * s6.a3 ;
+end;
\ No newline at end of file
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10L*50L*90L*100L*140L*180L)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2)
+ return s1.a1 * s2.a2;
+end;
--- /dev/null
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+
+extern long test(long*,long*);
+
+return ( (10*50)==test((long*)&s1,(long*)&s2));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return (s1.a1 * s2.a2) + ( s3.a3 * s4.a1) +( s5.a2 * s6.a3 );
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( ((10L*50L)+(90L*100L)+(140L*180L))==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b * (a + b))))));
+end;
--- /dev/null
+struct f1 f2 end;\r
+\r
+func f(p1)\r
+ var fx:=p1;\r
+ p1:=1;\r
+ (* f1 not defined *)\r
+ f1:=4;\r
+ (* shoult throw one of\r
+ - f1 not defined\r
+ - field access not allowed (var fx exists)\r
+ - field fx not defined\r
+ *)\r
+ f1.fx:=p1;\r
+ p1.f1:=p1.f2;\r
+ f(p1,p1.f2).f3:=0AFFEH;\r
+ var f1:=3;\r
+end;\r
+\r
+struct f3 end;\r
--- /dev/null
+func test()\r
+ var v1:=1;\r
+ if 1=1 then\r
+ v1:=2;\r
+ var v2:=1;\r
+ end;\r
+\r
+ (* v2 not visible *)\r
+ v2:=3;\r
+end;\r
--- /dev/null
+struct f end;\r
+\r
+func x()\r
+ (* f is a field, not a variable *)\r
+ f := 4;\r
+end;\r
--- /dev/null
+\r
+func x()\r
+ var z:=3;\r
+ (* field feld not defined *)\r
+ z.feld:=x(4,5,a);\r
+ (* syntax error *)\r
+ return z+z*z;\r
+end;\r
--- /dev/null
+func g(x,y,z)
+ var res:=0;
+ res:=x;
+ while y>=0 or (not x=z) do
+ y:=y+(-1);
+ res:=res+z;
+ end;
+ return res;
+end;
+
+struct end;
+
+func f()
+ var off:=10 + (xx * 3);
+ var bound:= -test.c5;
+ var add:= g(test.c5) + 2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b)))));
+end;
--- /dev/null
+extern long test(long,long);
+return ((3 * 8) + (3 * 8 * ( 3 + 8 + ( 3 * 8 * ( 3 + 8 + ( 3 * 8 ))))) == test(3,8)) ;
--- /dev/null
+
+func test(a,b,c,d,e,f)
+ return (a * b) + ( c * d) + (e * f );
+end;
--- /dev/null
+
+extern long test(long,long, long, long, long, long);
+
+return ( ( 1 * 2 ) + (3 * 4) + ( 5 * 6 ) == test(1,2,3,4,5,6)) ;
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b)));
+end;
--- /dev/null
+
+extern long test(long,long);
+
+return ( ( 3 * 5 ) + ( 3 * 5 * (3 + 5 + ( 3 * 5))) == test(3,5)) ;
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call,
+ OP_Assign,
+ OP_If,
+ OP_Stats,
+ OP_Empty,
+ OP_Ifstats,
+ OP_While
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call",
+ "OP_Assign",
+ "OP_If",
+ "OP_Stats",
+ "OP_Empty",
+ "OP_Ifstats",
+ "OP_While"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+ int param_index; /* -1 if not a parameter */
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value, int param);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 39
+/svn/private/!svn/ver/774/ublu08/gesamt
+END
+scanner.lex
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/private/!svn/ver/774/ublu08/gesamt/scanner.lex
+END
+test.c
+K 25
+svn:wc:ra_dav:version-url
+V 46
+/svn/private/!svn/ver/774/ublu08/gesamt/test.c
+END
+tree.c
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/private/!svn/ver/1023/ublu08/gesamt/tree.c
+END
+symbol_table.h
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1023/ublu08/gesamt/symbol_table.h
+END
+parser.y
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/1209/ublu08/gesamt/parser.y
+END
+code_gen.c
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/private/!svn/ver/1209/ublu08/gesamt/code_gen.c
+END
+code.bfe
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/1209/ublu08/gesamt/code.bfe
+END
+tree.h
+K 25
+svn:wc:ra_dav:version-url
+V 47
+/svn/private/!svn/ver/1023/ublu08/gesamt/tree.h
+END
+code_gen.h
+K 25
+svn:wc:ra_dav:version-url
+V 51
+/svn/private/!svn/ver/1209/ublu08/gesamt/code_gen.h
+END
+Makefile
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/private/!svn/ver/1039/ublu08/gesamt/Makefile
+END
+symbol_table.c
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1203/ublu08/gesamt/symbol_table.c
+END
+test.input
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/private/!svn/ver/774/ublu08/gesamt/test.input
+END
--- /dev/null
+8
+
+dir
+774
+http://localhost/svn/private/ublu08/gesamt
+http://localhost/svn/private
+
+
+
+2008-04-12T18:48:48.845570Z
+774
+paulchen
+
+
+svn:special svn:externals svn:needs-lock
+\f
+scanner.lex
+file
+
+
+
+
+2008-06-14T15:59:25.000000Z
+e5193bdf0f2e3175afb5173efc7ac4ec
+2008-04-12T18:48:48.845570Z
+774
+paulchen
+\f
+tree.c
+file
+1023
+
+
+
+2008-06-14T15:59:25.000000Z
+ef665922d0ae02b671453df7d0864e46
+2008-05-17T18:34:11.290176Z
+1023
+paulchen
+has-props
+\f
+test.c
+file
+
+
+
+
+2008-04-12T18:47:12.000000Z
+786bf407e40a331f56122d346a7d9f58
+2008-04-12T18:48:48.845570Z
+774
+paulchen
+\f
+symbol_table.h
+file
+1023
+
+
+
+2008-06-14T15:59:25.000000Z
+a09966463523b8d5b80a106a9f546831
+2008-05-17T18:34:11.290176Z
+1023
+paulchen
+has-props
+\f
+parser.y
+file
+1209
+
+
+
+2008-06-14T15:59:24.000000Z
+3d7898a48f8dd3716587c42f355eec66
+2008-06-14T15:59:36.988491Z
+1209
+paulchen
+\f
+code_gen.c
+file
+1209
+
+
+
+2008-06-14T15:59:24.000000Z
+180200b2225ce36b5c34c4a49c3531f9
+2008-06-14T15:59:36.988491Z
+1209
+paulchen
+\f
+tree.h
+file
+1023
+
+
+
+2008-06-14T15:59:25.000000Z
+c49aaeebea85333816c84c38e382f1a7
+2008-05-17T18:34:11.290176Z
+1023
+paulchen
+has-props
+\f
+code.bfe
+file
+1209
+
+
+
+2008-06-14T15:59:24.000000Z
+a0c3f55d27285d4502f379edc2ceb350
+2008-06-14T15:59:36.988491Z
+1209
+paulchen
+has-props
+\f
+code_gen.h
+file
+1209
+
+
+
+2008-06-14T15:59:24.000000Z
+25a38059196df1fe92fe793da90c564c
+2008-06-14T15:59:36.988491Z
+1209
+paulchen
+\f
+svn-commit.tmp
+file
+775
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+deleted
+\f
+symbol_table.c
+file
+1203
+
+
+
+2008-06-14T15:59:25.000000Z
+b453aa450374c10280eb6fa5888bff27
+2008-05-29T18:44:14.114779Z
+1203
+paulchen
+has-props
+\f
+Makefile
+file
+1039
+
+
+
+2008-06-14T15:59:24.000000Z
+30ad7389bf3ba50050f0cc0d63ae702e
+2008-05-19T16:45:22.394235Z
+1039
+paulchen
+\f
+test.input
+file
+
+
+
+
+2008-04-12T18:26:57.000000Z
+50083309858f4c96c0b9c0873e407393
+2008-04-12T18:48:48.845570Z
+774
+paulchen
+\f
+testcases
+dir
+\f
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+K 14
+svn:executable
+V 1
+*
+END
--- /dev/null
+all: gesamt
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+gesamt: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o gesamt symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f gesamt scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o testgesamt* a.out
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO imul -> imulq, add -> addq */
+/* TODO bugs - hopefully fixed:
+ * func f(a,b,c,d) return ((a+1)+(b+1))+((c+1)+(d+1)); end;
+ * func f(a,b,c,d) var b:=a; var c:=b; var d:=c; return a+b+c+d; end;
+ * mul, add etc. with direct memory access
+ */
+/* TODO immediate values in assignments */
+/* TODO assignment with immediate value/variable on RHS */
+/* TODO immediate values in boolean expressions */
+/* TODO optimize boolean expressions */
+/* FIXME if_then label not inserted */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15 OP_Assign=16 OP_If=17 OP_Stats=18 OP_Empty=19 OP_Ifstats=20 OP_While=21 OP_CallNoParam=22 OP_Arg=23
+
+%%
+
+stat: ret # 0 #
+stat: assign # 0 #
+stat: bexpr # 0 #
+stat: expr # 0 #
+
+assign: OP_Assign(OP_ID, expr) # 1 # if(bnode->kids[0]->param_index!=-1 && !call) { printf("\tmovq %%%s, %%%s /* x */\n", bnode->reg, get_param_reg(bnode->kids[0]->param_index)); } else if(bnode->kids[0]->param_index!=-1 && call) { printf("\tmovq %%%s, %i(%%rsp) /* y */\n", bnode->reg, 8*(variables-bnode->kids[0]->param_index)); } else { printf("\tmovq %%%s, %i(%%rsp) /* z */\n", bnode->reg, bnode->kids[0]->value); }
+assign: OP_Assign(OP_Field(expr,OP_ID), expr) # 1 # printf("\tmovq %%%s, %li(%%%s)\n", bnode->kids[1]->reg, 8*bnode->kids[0]->value, bnode->kids[0]->reg);
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->param_index!=-1 && !call) { move(get_param_reg(bnode->param_index), bnode->reg); } else if(bnode->param_index!=-1 && call) { printf("\tmov %i(%%rsp), %%%s\n", 8*(variables-bnode->param_index), bnode->reg); } else { printf("\tmovq %i(%%rsp), %%%s\n", bnode->value, bnode->reg); }
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s /* x2 */\n", bnode->kids[1]->value, bnode->reg); } else { printf("\taddq $%li, %%%s /* y2 */\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+
+call: OP_Call(exprs) # 0 # prepare_call(bnode->name, bnode->reg); /* reg_return=bnode->reg; */ do_call(bnode->name, bnode->reg);
+call: OP_CallNoParam # 0 # # prepare_call(bnode->name, bnode->reg); /* reg_return=bnode->reg; */ /* prepare_call(bnode->name); */ do_call(bnode->name, bnode->reg);
+
+exprs: OP_Arg(expr) # 0 # /* reg_return=bnode->reg; function_name=bnode->name; */ /* prepare_call(bnode->name); */
+exprs: OP_Exprs(exprs,exprs) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+bexpr: OP_Disjunction(bexpr,bexpr) # 0 #
+bexpr: OP_Not(bexpr) # 0 #
+bexpr: OP_Greater(expr,expr) # 0 #
+bexpr: OP_Equal(expr,expr) # 0 #
+
+%%
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+int variables, call;
+/* char *function_name; */
+/* char *reg_return; */
+extern char *saved_reg;
+
+char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+
+void function_header(char *name, int vars, int has_call, int num_pars) {
+ int a;
+
+ variables = vars+(has_call ? num_pars : 0);
+ printf("# setting call to %i\n", has_call);
+ call = has_call;
+
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+ printf("# %i %i %i %i\n",vars,has_call,num_pars,(has_call ? num_pars : 0));
+ if(vars+(has_call ? num_pars : 0)>0) {
+ printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*(vars+num_pars));
+ if(num_pars>0 && has_call) {
+ for(a=0;a<num_pars;a++) {
+ printf("\tmovq %%%s, %i(%%rsp)\n",get_param_reg(a+1),8*(vars+num_pars-a-1));
+ }
+ }
+ }
+}
+
+void prepare_call(char *function, char *reg_return) {
+ int a;
+ /* TODO don't save all registers */
+ for(a=0;a<9;a++) {
+ printf("\tpushq %%%s\n",reg_names[a]);
+ }
+}
+
+void do_call(char *function, char *reg_return) {
+ int a;
+ /* TODO don't restore all registers */
+ printf("\tcall %s\n", function);
+ move("rax",reg_return);
+ /* TODO return value? */
+ for(a=8;a>=0;a--) {
+ if(strcmp(reg_return,reg_names[a])) {
+ printf("\tpopq %%%s\n",reg_names[a]);
+ }
+ else {
+ printf("\taddq $8, %%rsp\n");
+ }
+ }
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ if(index>8) {
+ return saved_reg;
+ }
+ return reg_names[index];
+}
+
+char *get_next_param_reg(char *reg) {
+ int a=1;
+ while(1) {
+ if(strcmp(get_param_reg(a),reg)==0) {
+ return get_param_reg(a+1);
+ }
+ a++;
+ }
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ if(variables>0) {
+ printf("\tleave\n");
+ }
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name, int vars, int has_call, int num_param);
+char *get_next_reg(char *name, int skip_reg);
+char *get_next_param_reg(char *reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+void do_call(char *function, char *reg_return);
+void prepare_call(char *function, char *reg_return);
+
+/* extern char *function_name; */
+extern int call, variables;
+/* extern char *reg_return; */
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+
+ #define imm_prefix "$"
+
+ char *saved_reg;
+
+/* TODO failed test case: func f(a) if not (a=0 or a=1) then return 0; end; end; */
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars if_in jump_true jump_false
+@autosyn node defined_vars immediate if_out has_call
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; int if_in; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; int if_in; int if_out; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; treenode *node; int if_in; int if_out; int has_call; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; int has_call; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; int has_call; } Call Lexpr Field Exprs
+@attributes { struct symbol_t *symbols; treenode *node; char *jump_true; char *jump_false; int negated; int if_in; int if_out; int negated2; int top_level; int has_call; } Bool Orterm Subbool Bterm
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int has_call; } Stat
+@attributes { struct symbol_t *symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int if_nr; int has_call; } Blubb
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @preorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+ @i @Program.if_in@ = 0;
+
+ @codegen printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @i @Program.1.if_in@ = @Funcdef.if_out@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@, @Stats.has_call@, @Pars.num_pars@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@, @Stats.has_call@, 0);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_param(@Pars.1.pars@, @ID.name@, @Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_param(new_table(), @ID.name@, 1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+ @i @Stats.node@ = new_node(OP_Stats, @Stat.node@, @Stats.1.node@);
+ @i @Stat.if_in@ = @Stats.if_in@;
+ @i @Stats.1.if_in@ = @Stat.if_out@;
+ @i @Stats.if_out@ = @Stats.1.if_out@;
+ @i @Stats.has_call@ = @Stat.has_call@ || @Stats.1.has_call@;
+ @}
+
+ |
+ @{
+ @i @Stats.node@ = new_leaf(OP_Empty); /* TODO */
+ @i @Stats.defined_vars@ = 0;
+ @i @Stats.if_out@ = @Stats.if_in@;
+ @i @Stats.has_call@ = 0;
+ @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr /* Nodes necessary for IF, DO, ... ? */
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, @Stat.stack_offset@);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, new_named_leaf_value(OP_ID, @ID.name@, @Stat.stack_offset@, -1), @Expr.node@);
+ @i @Stat.defined_vars@ = 1;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Expr.node@->reg = get_next_reg((char *)NULL, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, @Lexpr.node@, @Expr.node@);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+ @i @Stat.has_call@ = @Lexpr.has_call@ || @Expr.has_call@;
+
+ @reg @Lexpr.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = get_next_reg(@Lexpr.node@->reg, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_If, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_end%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | IF Bool THEN Stats Blubb END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Blubb.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Ifstats, @Stats.node@, @Blubb.node@);
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Blubb.defined_vars@;
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Blubb.if_in@ = @Stats.if_out@;
+ @i @Stat.if_out@ = @Blubb.if_out@;
+ @i @Blubb.if_nr@ = @Stats.if_in@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_else%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@ || @Blubb.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_else%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_While, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "do_enter%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "do_end%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen printf("do_start%i:\n", @Stats.if_in@); /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz do_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("\tjmp do_start%i\ndo_end%i:\n", @Stats.if_in@, @Stats.if_in@);
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Call.node@->reg = "rax";
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg if(@Expr.node@->op == OP_Call) { @Stat.node@->reg = get_next_reg("rax", 0); } else { @Stat.node@->reg = get_next_reg((char *)NULL, 0); } @Expr.node@->reg = @Stat.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ ;
+
+Blubb: ELSE Stats
+ @{
+ @codegen printf("\tjmp if_end%i\nif_else%i:\n", @Blubb.if_nr@, @Blubb.if_nr@);
+ @}
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->stack_offset, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->param_index);
+
+ @i @Lexpr.has_call@ = 0;
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Plusterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+ @i @Expr.has_call@ = @Term.has_call@ || @Plusterm.has_call@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Malterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+ @i @Expr.has_call@ = @Term.has_call@ || @Malterm.has_call@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Plusterm.1.node@, @Term.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+ @i @Plusterm.has_call@ = @Term.has_call@ || @Plusterm.1.has_call@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Malterm.1.node@, @Term.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+ @i @Malterm.has_call@ = @Term.has_call@ || @Malterm.1.has_call@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->param_index);
+ @i @Term.immediate@ = 0;
+ @i @Term.has_call@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @i @Term.has_call@ = 0;
+ @}
+
+ | Call
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Call.node@->reg = @Term.node@->reg;
+ @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+/* TODO replace by Bool -> Subbool */
+Bool: Bterm
+ @{
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bterm.top_level@ = 1;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Disjunction) { printf("\tjmp %s # foo1\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Orterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Bool.negated Bool.jump_true Bool.if_in; if(!@Bool.negated@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Bool.if_in@); } else { @Bterm.jump_true@ = @Bool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Bool.negated Bool.jump_false Bool.if_in; if(@Bool.negated@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Bool.if_in@); } else { @Bterm.jump_false@ = @Bool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Bool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Bool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bool.has_call@ = @Bterm.has_call@ || @Orterm.has_call@;
+
+ @reg @Bterm.node@->reg = @Bool.node@->reg; @Orterm.node@->reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) printf("\tjmp %s # foo2\n", @Bool.jump_false@); printf(@Bool.negated@ ? "bool_false%i:\n" : "bool_true%i:\n", @Bool.if_in@); printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Bool.jump_true@;
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 1;
+ @i @Bterm.negated2@ = 1;
+ @i @Bterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@-> reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Not) { printf("\tjmp %s # foo3\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\nnot_break%i:\n\tjmp %s\n%s:\n", @Bool.jump_true@, 0, @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ ;
+
+Subbool: Bterm
+ @{
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = @Subbool.negated2@;
+ @i @Bterm.top_level@ = @Subbool.top_level@;
+ @codegen @revorder(1) /* printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Orterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Subbool.negated Subbool.negated2 Subbool.jump_true Subbool.if_in; if(!@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Subbool.if_in@); } else { @Bterm.jump_true@ = @Subbool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Subbool.negated Subbool.negated2 Subbool.jump_false Subbool.if_in; if(@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Subbool.if_in@); } else { @Bterm.jump_false@ = @Subbool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Subbool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Subbool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Subbool.has_call@ = @Bterm.has_call@ || @Orterm.has_call@;
+
+ @reg @Bterm.node@->reg = @Subbool.node@->reg; @Orterm.node@->reg = @Subbool.node@->reg;
+
+ @codegen @revorder(1) /* TODO output if on top level */ if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo4\n", @Subbool.negated2@ ? @Subbool.jump_true@ : @Subbool.jump_false@); } printf(!@Subbool.negated@ ? "bool_true%i:\n" : "bool_false%i:\n", @Subbool.if_in@); /* printf("\tjmp %s\n# %s:\n", @Subbool.jump_true@, @Subbool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Subbool.jump_true@;
+ @i @Bterm.negated@ = 1 - @Subbool.negated@;
+ @i @Bterm.negated2@ = 1 - @Subbool.negated2@;
+ @i @Bterm.top_level@ = 0;
+
+ @reg @Bterm.node@-> reg = @Subbool.node@->reg; /* printf("%s, %s\n", @Bterm.jump_true@, @Subbool.jump_false@); */
+
+ @codegen @revorder(1) printf("# !!\n"); if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo9\n", @Subbool.negated2@ ? @Subbool.jump_false@ : @Subbool.jump_false@); } /* printf("\tjmp %s\nnot_break%i:\n", @Subbool.negated@ ? @Bterm.jump_true@ : @Subbool.jump_false@, 0); printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ ;
+
+
+Orterm: OR Bterm Orterm
+ @{
+ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@);
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Orterm.1.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.1.negated2@ = 0;
+ @i @Orterm.1.if_in@ = @Bterm.if_out@;
+ @i @Orterm.if_out@ = @Orterm.1.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.1.top_level@ = 0;
+ @i @Orterm.has_call@ = @Bterm.has_call@ || @Orterm.1.has_call@;
+
+ @reg @Bterm.node@->reg = @Orterm.node@->reg; @Orterm.1.node@->reg = @Orterm.node@->reg;
+ @}
+
+ | OR Bterm
+ @{
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = @Orterm.negated2@;
+ @i @Bterm.top_level@ = 0;
+ @}
+
+ ;
+
+Bterm: Term GREATER Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+ @i @Bterm.has_call@ = @Term.has_call@ || @Term.1.has_call@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjs %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjns %s # %s %s %i %i\n", @Term.1.node@->reg, @Term.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | Term '=' Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+ @i @Bterm.has_call@ = @Term.has_call@ || @Term.1.has_call@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjnz %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjz %s # %s %s %i %i\n", @Term.node@->reg, @Term.1.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | '(' Subbool ')'
+ @{
+ @i @Subbool.negated@ = @Bterm.negated@;
+ @i @Subbool.negated2@ = @Bterm.negated2@;
+ @i @Subbool.top_level@ = @Bterm.top_level@;
+ @}
+
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset, -1);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{
+ @i @Call.node@ = new_named_node(OP_Call, @Exprs.node@, (treenode *)NULL, @ID.name@);
+ @i @Call.has_call@ = 1;
+
+ @reg saved_reg = @Call.node@->reg; @Exprs.node@->reg = "rdi"; @Exprs.node@->name=@Call.node@->name;
+
+ @codegen /* reg_return=@Call.node@->reg; function_name = @ID.name@; prepare_call(function_name); */
+ @}
+
+ | ID '(' ')'
+ @{
+ @i @Call.node@ = new_node(OP_CallNoParam, (treenode *)NULL, (treenode *)NULL);
+ @i @Call.has_call@ = 1;
+
+ @codegen /* reg_return=@Call.node@->reg; do_call(@ID.name@); */
+ @}
+
+ ;
+
+Exprs: Expr
+ @{
+ @i @Exprs.node@ = new_node(OP_Arg, @Expr.node@, (treenode *)NULL);
+
+ @reg @Expr.node@->reg = @Exprs.node@->reg;
+
+ @codegen /* write_tree(@Expr.node@); */ /* burm_label(@Expr.node@); burm_reduce(@Expr.node@, 1); do_call(function_name); */
+ @}
+
+ | Expr ',' Exprs
+ @{
+ @i @Exprs.node@ = new_node(OP_Exprs, new_node(OP_Arg, @Expr.node@, (treenode *)NULL), @Exprs.1.node@);
+ @i @Exprs.has_call@ = @Exprs.1.has_call@ || @Expr.has_call@;
+
+ @reg @Expr.node@->reg = @Exprs.node@->reg; @Exprs.1.node@->reg = get_next_param_reg(@Exprs.node@->reg); @Exprs.node@->kids[0]->name = @Exprs.node@->name; @Exprs.1.node@->name = @Exprs.node@->name;
+
+ @codegen /* write_tree(@Expr.node@); */ /* burm_label(@Expr.node@); burm_reduce(@Expr.node@, 1); */
+ @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ if(element->param_index!=-1) {
+ new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
+ }
+ else {
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+ new_element->param_index=-1;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=SYMBOL_TYPE_PARAM;
+ new_element->param_index=param_index;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ if(element->param_index!=-1) {
+ new_table=table_add_param(new_table,element->identifier,element->param_index);
+ }
+ else {
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+ int param_index; /* -1 if not a parameter */
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+ #include <stdio.h>
+
+extern long f1(long a);
+extern long f2(long a);
+extern long f3(long a);
+extern long f4(long a);
+extern long f5(long a);
+extern long f6(long a);
+extern long f7(long a);
+extern long f8(long a);
+extern long f9(long a);
+extern long f10(long a);
+
+extern long g1(long a, long b);
+extern long g2(long a, long b);
+extern long g3(long a, long b);
+extern long g4(long a, long b);
+extern long g5(long a, long b);
+extern long g6(long a, long b);
+extern long g7(long a, long b);
+extern long g8(long a, long b);
+extern long g9(long a, long b);
+extern long g10(long a, long b);
+extern long g11(long a, long b);
+extern long g12(long a, long b);
+
+extern long h1(long a, long b, long c, long d);
+extern long h2(long a, long b, long c, long d);
+extern long h3(long a, long b, long c, long d);
+extern long h4(long a, long b, long c, long d);
+extern long h5(long a, long b, long c, long d);
+extern long h6(long a, long b, long c, long d);
+extern long h7(long a, long b, long c, long d);
+extern long h8(long a, long b, long c, long d);
+extern long h9(long a, long b, long c, long d);
+extern long h10(long a, long b, long c, long d);
+extern long h11(long a, long b, long c, long d);
+extern long h12(long a, long b, long c, long d);
+extern long h13(long a, long b, long c, long d);
+extern long h14(long a, long b, long c, long d);
+extern long h15(long a, long b, long c, long d);
+extern long h16(long a, long b, long c, long d);
+extern long h17(long a, long b, long c, long d);
+extern long h18(long a, long b, long c, long d);
+extern long h19(long a, long b, long c, long d);
+extern long h20(long a, long b, long c, long d);
+extern long h21(long a, long b, long c, long d);
+extern long h22(long a, long b, long c, long d);
+extern long h23(long a, long b, long c, long d);
+extern long h24(long a, long b, long c, long d);
+
+int check_arg1(char *name, long (*function)(long), long ret0, long ret1, long ret2) {
+ int ret;
+ ret=function(0)==ret0 && function(1)==ret1 && function(2)==ret2;
+ printf("%s: %li/%li, %li/%li, %li/%li - %s\n", name,function(0), ret0, function(1), ret1, function(2), ret2, ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg2(char *name, long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ printf("%li/%li ", function(a,b),blubb[a][b]);
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg4(char *name, long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ printf("%li/%li ", function(a,b,c,d),blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int main(int argc, char **argv) {
+ int ret;
+
+ long ret_g1[2][2]={{1,1},{1,0}};
+ long ret_g2[2][2]={{1,0},{1,1}};
+ long ret_g3[2][2]={{1,1},{0,1}};
+ long ret_g4[2][2]={{0,1},{1,1}};
+ long ret_g5[2][2]={{0,0},{0,1}};
+ long ret_g6[2][2]={{0,1},{0,0}};
+ long ret_g7[2][2]={{0,0},{1,0}};
+ long ret_g8[2][2]={{1,0},{0,0}};
+ long ret_g9[2][2]={{1,1},{1,0}};
+ long ret_g10[2][2]={{1,0},{1,1}};
+ long ret_g11[2][2]={{1,1},{0,1}};
+ long ret_g12[2][2]={{0,1},{1,1}};
+
+ long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+ long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+ long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+ long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+ long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+ long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+ long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ ret=check_arg1("f1",f1,0,1,1);
+ ret&=check_arg1("f2",f2,0,0,1);
+ ret&=check_arg1("f3",f3,1,0,0);
+ ret&=check_arg1("f4",f4,0,1,1);
+ ret&=check_arg1("f5",f5,0,0,1);
+ ret&=check_arg1("f6",f6,1,0,0);
+ ret&=check_arg1("f7",f7,0,1,1);
+ ret&=check_arg1("f8",f8,0,0,1);
+ ret&=check_arg1("f9",f9,1,1,1);
+ ret&=check_arg1("f10",f10,1,0,0);
+
+ ret&=check_arg2("g1",g1,ret_g1);
+ ret&=check_arg2("g2",g2,ret_g2);
+ ret&=check_arg2("g3",g3,ret_g3);
+ ret&=check_arg2("g4",g4,ret_g4);
+ ret&=check_arg2("g5",g5,ret_g5);
+ ret&=check_arg2("g6",g6,ret_g6);
+ ret&=check_arg2("g7",g7,ret_g7);
+ ret&=check_arg2("g8",g8,ret_g8);
+ ret&=check_arg2("g9",g9,ret_g9);
+ ret&=check_arg2("g10",g10,ret_g10);
+ ret&=check_arg2("g11",g11,ret_g11);
+ ret&=check_arg2("g12",g12,ret_g12);
+
+ ret&=check_arg4("h1",h1,ret_h1);
+ ret&=check_arg4("h2",h2,ret_h2);
+ ret&=check_arg4("h3",h3,ret_h3);
+ ret&=check_arg4("h4",h4,ret_h4);
+ ret&=check_arg4("h5",h5,ret_h5);
+ ret&=check_arg4("h6",h6,ret_h6);
+ ret&=check_arg4("h7",h7,ret_h7);
+ ret&=check_arg4("h8",h8,ret_h8);
+ ret&=check_arg4("h9",h9,ret_h9);
+ ret&=check_arg4("h10",h10,ret_h10);
+ ret&=check_arg4("h11",h11,ret_h11);
+ ret&=check_arg4("h12",h12,ret_h12);
+ ret&=check_arg4("h13",h13,ret_h13);
+ ret&=check_arg4("h14",h14,ret_h14);
+ ret&=check_arg4("h15",h15,ret_h15);
+ ret&=check_arg4("h16",h16,ret_h16);
+ ret&=check_arg4("h17",h17,ret_h17);
+ ret&=check_arg4("h18",h18,ret_h18);
+ ret&=check_arg4("h19",h19,ret_h19);
+ ret&=check_arg4("h20",h20,ret_h20);
+ ret&=check_arg4("h21",h21,ret_h21);
+ ret&=check_arg4("h22",h22,ret_h22);
+ ret&=check_arg4("h23",h23,ret_h23);
+ ret&=check_arg4("h24",h24,ret_h24);
+
+ return !ret;
+}
+
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
+func f4(a) if (a=0) then return 0; else return 1; end; end;
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
+
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
+
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+
+func g(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func h(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func i(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func j(a,b) if not ((not a=0) or (not b=0)) then return 0; else return 1; end; end;
+func k(a,b,c,d) if not ((not (a=0 or b=0)) or (not (c=0 or d=0))) then return 1; else return 0; end; end;
+
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call,
+ OP_Assign,
+ OP_If,
+ OP_Stats,
+ OP_Empty,
+ OP_Ifstats,
+ OP_While,
+ OP_CallNoParam,
+ OP_Arg
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call",
+ "OP_Assign",
+ "OP_If",
+ "OP_Stats",
+ "OP_Empty",
+ "OP_Ifstats",
+ "OP_While",
+ "OP_CallNoParam",
+ "OP_Arg"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+ int param_index; /* -1 if not a parameter */
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value, int param);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+
--- /dev/null
+all: gesamt
+
+scanner.c: oxout.l
+ flex -oscanner.c oxout.l
+
+scanner.o: scanner.c parser.h symbol_table.h
+ gcc -g -c -ansi -pedantic scanner.c -D_GNU_SOURCE
+
+gesamt: scanner.o parser.o symbol_table.o code_gen.o tree.o code.o
+ gcc -o gesamt symbol_table.o scanner.o parser.o code_gen.o tree.o code.o -lfl
+
+tree.o: tree.c tree.h
+ gcc -g -c -ansi -pedantic -Wall tree.c
+
+code_gen.o: code_gen.c code_gen.h
+ gcc -g -c -ansi -pedantic -Wall code_gen.c -D_GNU_SOURCE
+
+symbol_table.o: symbol_table.c symbol_table.h
+ gcc -g -c -ansi -pedantic -Wall symbol_table.c -D_GNU_SOURCE
+
+parser.o: parser.c symbol_table.h code_gen.h tree.h
+ gcc -g -c -ansi -pedantic parser.c
+
+parser.c parser.h: oxout.y
+ yacc -d oxout.y -o parser.c
+
+oxout.y oxout.l: parser.y scanner.lex
+ ox parser.y scanner.lex
+
+code.o: code.c tree.h
+ gcc -g -ansi -c code.c
+
+code.c: code.bfe
+ bfe < code.bfe | iburg > code.c
+
+clean:
+ rm -f gesamt scanner.o scanner.c parser.h parser.c parser.o oxout.y oxout.l symbol_table.o code_gen.o tree.o code.c code.o testgesamt* a.out
+
--- /dev/null
+%{
+/* vim: filetype=c
+ */
+#define CODE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* TODO (-a)+b */
+/* TODO imul -> imulq, add -> addq */
+/* TODO bugs - hopefully fixed:
+ * func f(a,b,c,d) return ((a+1)+(b+1))+((c+1)+(d+1)); end;
+ * func f(a,b,c,d) var b:=a; var c:=b; var d:=c; return a+b+c+d; end;
+ * mul, add etc. with direct memory access
+ */
+/* TODO immediate values in assignments */
+/* TODO assignment with immediate value/variable on RHS */
+/* TODO immediate values in boolean expressions */
+/* TODO optimize boolean expressions */
+/* FIXME if_then label not inserted */
+%}
+
+%start stat
+%term OP_Not=1 OP_Negation=2 OP_Addition=3 OP_Multiplication=4 OP_Disjunction=5 OP_Greater=6 OP_Equal=7 OP_ID=8 OP_Number=9 OP_Field=10 OP_Return=11 OP_Zero=12 OP_One=13 OP_Exprs=14 OP_Call=15 OP_Assign=16 OP_If=17 OP_Stats=18 OP_Empty=19 OP_Ifstats=20 OP_While=21 OP_CallNoParam=22 OP_Arg=23
+
+%%
+
+stat: ret # 0 #
+stat: assign # 0 #
+stat: bexpr # 0 #
+stat: expr # 0 #
+
+assign: OP_Assign(OP_ID, expr) # 1 # if(bnode->kids[0]->param_index!=-1 && !call) { printf("\tmovq %%%s, %%%s /* x */\n", bnode->reg, get_param_reg(bnode->kids[0]->param_index)); } else if(bnode->kids[0]->param_index!=-1 && call) { printf("\tmovq %%%s, %i(%%rsp) /* y */\n", bnode->reg, 8*(variables-bnode->kids[0]->param_index)); } else { printf("\tmovq %%%s, %i(%%rsp) /* z */\n", bnode->reg, bnode->kids[0]->value); }
+assign: OP_Assign(OP_Field(expr,OP_ID), expr) # 1 # printf("\tmovq %%%s, %li(%%%s)\n", bnode->kids[1]->reg, 8*bnode->kids[0]->value, bnode->kids[0]->reg);
+
+ret: OP_Return(expr) # 1 # move(bnode->reg, "rax"); ret();
+
+expr: OP_ID # 1 # if(bnode->param_index!=-1 && !call) { move(get_param_reg(bnode->param_index), bnode->reg); } else if(bnode->param_index!=-1 && call) { printf("\tmov %i(%%rsp), %%%s\n", 8*(variables-bnode->param_index), bnode->reg); } else { printf("\tmovq %i(%%rsp), %%%s\n", bnode->value, bnode->reg); }
+expr: imm # 1 # printf("\tmovq $%li, %%%s\n", bnode->value, bnode->reg);
+expr: call # 0 #
+expr: OP_Negation(expr) # 1 # printf("\tnegq %%%s\n", bnode->reg);
+expr: OP_Addition(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Addition(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Addition(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\taddq $%li, %%%s /* x2 */\n", bnode->kids[1]->value, bnode->reg); } else { printf("\taddq $%li, %%%s /* y2 */\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Multiplication(expr,expr) # 1 # printf("\timulq %%%s, %%%s\n", bnode->kids[1]->reg, bnode->kids[0]->reg);
+expr: OP_Multiplication(imm,expr) # 1 # printf("\timulq $%li, %%%s\n", bnode->kids[0]->value, bnode->kids[1]->reg); move(bnode->kids[1]->reg, bnode->reg);
+expr: OP_Multiplication(expr,imm) # 1 # if(bnode->kids[0]->op==OP_ID) { move(bnode->kids[0]->reg, bnode->reg); printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->reg); } else { printf("\timulq $%li, %%%s\n", bnode->kids[1]->value, bnode->kids[0]->reg); }
+expr: OP_Field(expr,OP_ID) # 2 # printf("\tmovq %li(%%%s), %%%s\n", 8*bnode->value, bnode->kids[0]->reg, bnode->reg);
+expr: OP_Field(imm,OP_ID) # 1 # printf("\tmovq %li, %%%s\n", bnode->kids[0]->value+bnode->value*8, bnode->reg);
+
+call: OP_Call(exprs) # 0 # prepare_call(bnode->name, bnode->reg); /* reg_return=bnode->reg; */ do_call(bnode->name, bnode->reg);
+call: OP_CallNoParam # 0 # # prepare_call(bnode->name, bnode->reg); /* reg_return=bnode->reg; */ /* prepare_call(bnode->name); */ do_call(bnode->name, bnode->reg);
+
+exprs: OP_Arg(expr) # 0 # /* reg_return=bnode->reg; function_name=bnode->name; */ /* prepare_call(bnode->name); */
+exprs: OP_Exprs(exprs,exprs) # 0 #
+
+zero: OP_Negation(zero) # 0 #
+zero: OP_Zero # 0 #
+zero: OP_Multiplication(zexpr,zero) # 0 #
+zero: OP_Multiplication(zero,zexpr) # 0 #
+
+zexpr: zero # 0 #
+zexpr: imm # 0 #
+zexpr: OP_Negation(zexpr) # 0 #
+zexpr: OP_Addition(zexpr,zexpr) # 0 #
+zexpr: OP_Multiplication(zexpr,zexpr) # 0 #
+zexpr: OP_Field(zexpr,OP_ID) # 0 #
+zexpr: OP_ID # 0 #
+
+imm: zero # 0 #
+imm: OP_Negation(imm) # 0 # bnode->value=-bnode->kids[0]->value;
+imm: OP_Addition(imm,imm) # 0 # bnode->value=bnode->kids[0]->value+bnode->kids[1]->value;
+imm: OP_Multiplication(imm,imm) # 0 # bnode->value=bnode->kids[0]->value*bnode->kids[1]->value;
+imm: OP_Number # 0 #
+imm: OP_Zero # 0 #
+imm: OP_One # 0 #
+
+bexpr: OP_Disjunction(bexpr,bexpr) # 0 #
+bexpr: OP_Not(bexpr) # 0 #
+bexpr: OP_Greater(expr,expr) # 0 #
+bexpr: OP_Equal(expr,expr) # 0 #
+
+%%
+
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "code_gen.h"
+
+int variables, call;
+/* char *function_name; */
+/* char *reg_return; */
+extern char *saved_reg;
+
+char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
+
+void function_header(char *name, int vars, int has_call, int num_pars) {
+ int a;
+
+ variables = vars+(has_call ? num_pars : 0);
+ printf("# setting call to %i\n", has_call);
+ call = has_call;
+
+ printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
+ printf("# %i %i %i %i\n",vars,has_call,num_pars,(has_call ? num_pars : 0));
+ if(vars+(has_call ? num_pars : 0)>0) {
+ printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*(vars+num_pars));
+ if(num_pars>0 && has_call) {
+ for(a=0;a<num_pars;a++) {
+ printf("\tmovq %%%s, %i(%%rsp)\n",get_param_reg(a+1),8*(vars+num_pars-a-1));
+ }
+ }
+ }
+}
+
+void prepare_call(char *function, char *reg_return) {
+ int a;
+ /* TODO don't save all registers */
+ for(a=0;a<9;a++) {
+ printf("\tpushq %%%s\n",reg_names[a]);
+ }
+}
+
+void do_call(char *function, char *reg_return) {
+ int a;
+ /* TODO don't restore all registers */
+ printf("\tcall %s\n", function);
+ move("rax",reg_return);
+ /* TODO return value? */
+ for(a=8;a>=0;a--) {
+ if(strcmp(reg_return,reg_names[a])) {
+ printf("\tpopq %%%s\n",reg_names[a]);
+ }
+ else {
+ printf("\taddq $8, %%rsp\n");
+ }
+ }
+}
+
+char *get_next_reg(char *name, int skip_reg) {
+ int index, a;
+ if(name==(char *)NULL) {
+ index=0;
+ }
+ else {
+ for(a=0;a<9;a++) {
+ if(!strcmp(name,reg_names[a])) {
+ index=a+1;
+ break;
+ }
+ }
+ }
+ if(skip_reg) {
+ index++;
+ }
+ if(index>8) {
+ return saved_reg;
+ }
+ return reg_names[index];
+}
+
+char *get_next_param_reg(char *reg) {
+ int a=1;
+ while(1) {
+ if(strcmp(get_param_reg(a),reg)==0) {
+ return get_param_reg(a+1);
+ }
+ a++;
+ }
+}
+
+char *get_param_reg(long number) {
+ char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
+ return reg_names[number-1];
+}
+
+void ret(void) {
+ if(variables>0) {
+ printf("\tleave\n");
+ }
+ printf("\tret\n");
+}
+
+void move(char *src, char *dst) {
+ if(strcmp(src,dst)) {
+ printf("\tmovq %%%s, %%%s\n",src,dst);
+ }
+}
+
--- /dev/null
+#ifndef _CODE_GEN_H_
+#define _CODE_GEN_H_
+
+void function_header(char *name, int vars, int has_call, int num_param);
+char *get_next_reg(char *name, int skip_reg);
+char *get_next_param_reg(char *reg);
+char *get_param_reg(long number);
+void ret(void);
+void move(char *src, char *dest);
+void do_call(char *function, char *reg_return);
+void prepare_call(char *function, char *reg_return);
+
+/* extern char *function_name; */
+extern int call, variables;
+/* extern char *reg_return; */
+
+#endif /* _CODE_GEN_H_ */
+
--- /dev/null
+ .text
+# setting call to 1
+ .globl optfib
+ .type optfib, @function
+optfib:
+# 2 1 1 1
+ pushq %rbp
+ movq %rsp, %rbp
+ subq $24, %rsp
+ movq %rdi, 16(%rsp)
+ movq $5000000, %rdi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call sqr
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ popq %r10
+ addq $8, %rsp
+ movq %rax, 0(%rsp) /* z */
+ movq 0(%rsp), %rdi
+ addq $1000000, %rdi
+ movq $2, %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call div
+ movq %rax, %rdi
+ addq $8, %rsp
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ popq %r10
+ popq %rax
+ mov 16(%rsp), %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call power
+ movq %rax, %rdi
+ addq $8, %rsp
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ popq %r10
+ popq %rax
+ imulq $1000000, %rdi
+ movq 0(%rsp), %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call div
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ popq %r10
+ addq $8, %rsp
+ addq $500000, %rax
+ movq %rax, 8(%rsp) /* z */
+ movq 8(%rsp), %rdi
+ movq $1000000, %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call div
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ popq %r10
+ addq $8, %rsp
+ leave
+ ret
+# setting call to 0
+ .globl divslow
+ .type divslow, @function
+divslow:
+# 1 0 2 0
+ pushq %rbp
+ movq %rsp, %rbp
+ subq $24, %rsp
+ movq $1, %rax
+ movq %rax, 0(%rsp) /* z */
+do_start1:
+ movq %rdi, %rax
+ movq %rsi, %r10
+ movq 0(%rsp), %r11
+ imulq %r11, %r10
+ cmp %r10, %rax
+ jns do_enter1 # do_enter1 do_end1 0 0
+ jmp do_end1 # foo1
+do_enter1:
+ movq 0(%rsp), %r10
+ addq $1, %r10
+ movq %r10, 0(%rsp) /* z */
+ jmp do_start1
+do_end1:
+ movq 0(%rsp), %rax
+ addq $-1, %rax
+ leave
+ ret
+# setting call to 1
+ .globl div
+ .type div, @function
+div:
+# 2 1 2 2
+ pushq %rbp
+ movq %rsp, %rbp
+ subq $32, %rsp
+ movq %rdi, 24(%rsp)
+ movq %rsi, 16(%rsp)
+ movq $1, %rax
+ movq %rax, 0(%rsp) /* z */
+ movq $1000000, %rax
+ movq %rax, 8(%rsp) /* z */
+do_start2:
+ movq 8(%rsp), %rax
+ movq $1, %r10
+ cmp %r10, %rax
+ jns do_enter2 # do_enter2 do_end2 0 0
+ jmp do_end2 # foo1
+do_enter2:
+do_start3:
+ mov 24(%rsp), %rax
+ mov 16(%rsp), %r10
+ movq 0(%rsp), %r11
+ imulq %r11, %r10
+ cmp %r10, %rax
+ jns do_enter3 # do_enter3 do_end3 0 0
+ jmp do_end3 # foo1
+do_enter3:
+ movq 8(%rsp), %r10
+ movq 0(%rsp), %r11
+ addq %r11, %r10
+ movq %r10, 0(%rsp) /* z */
+ jmp do_start3
+do_end3:
+ movq 8(%rsp), %r10
+ negq %r10
+ movq 0(%rsp), %r11
+ addq %r11, %r10
+ movq %r10, 0(%rsp) /* z */
+ movq 8(%rsp), %rdi
+ movq $2, %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call divslow
+ movq %rax, %r10
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ addq $8, %rsp
+ popq %rax
+ movq %r10, 8(%rsp) /* z */
+ jmp do_start2
+do_end2:
+ movq 0(%rsp), %rax
+ leave
+ ret
+# setting call to 1
+ .globl power
+ .type power, @function
+power:
+# 1 1 2 2
+ pushq %rbp
+ movq %rsp, %rbp
+ subq $24, %rsp
+ movq %rdi, 16(%rsp)
+ movq %rsi, 8(%rsp)
+ mov 8(%rsp), %rax
+ movq $0, %r10
+ cmp %rax, %r10
+ jz if_then4 # if_then4 if_end4 0 0
+ jmp if_end4 # foo1
+if_then4:
+ movq $1000000, %rax
+ leave
+ ret
+if_end4:
+ mov 16(%rsp), %rax
+ movq %rax, 0(%rsp) /* z */
+do_start5:
+ mov 8(%rsp), %rax
+ movq $2, %r10
+ cmp %r10, %rax
+ jns do_enter5 # do_enter5 do_end5 0 0
+ jmp do_end5 # foo1
+do_enter5:
+ mov 16(%rsp), %rdi
+ movq 0(%rsp), %(null)
+ imulq %(null), %rdi
+ movq $1000000, %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call div
+ movq %rax, %r10
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ addq $8, %rsp
+ popq %rax
+ movq %r10, 0(%rsp) /* z */
+ mov 8(%rsp), %r10
+ addq $-1, %r10
+ movq %r10, 8(%rsp) /* y */
+ jmp do_start5
+do_end5:
+ movq 0(%rsp), %rax
+ leave
+ ret
+# setting call to 1
+ .globl sqr
+ .type sqr, @function
+sqr:
+# 2 1 1 1
+ pushq %rbp
+ movq %rsp, %rbp
+ subq $24, %rsp
+ movq %rdi, 16(%rsp)
+ movq $1, %rax
+ movq %rax, 0(%rsp) /* z */
+ movq $1000000, %rax
+ movq %rax, 8(%rsp) /* z */
+ mov 16(%rsp), %r10
+ imulq $1000000, %r10
+ movq %r10, 16(%rsp) /* y */
+do_start6:
+ movq 8(%rsp), %rax
+ movq $1, %r10
+ cmp %r10, %rax
+ jns do_enter6 # do_enter6 do_end6 0 0
+ jmp do_end6 # foo1
+do_enter6:
+do_start7:
+ mov 16(%rsp), %rax
+ movq 0(%rsp), %r10
+ movq 0(%rsp), %r11
+ imulq %r11, %r10
+ cmp %r10, %rax
+ jns do_enter7 # do_enter7 do_end7 0 0
+ jmp do_end7 # foo1
+do_enter7:
+ movq 8(%rsp), %r10
+ movq 0(%rsp), %r11
+ addq %r11, %r10
+ movq %r10, 0(%rsp) /* z */
+ jmp do_start7
+do_end7:
+ movq 8(%rsp), %r10
+ negq %r10
+ movq 0(%rsp), %r11
+ addq %r11, %r10
+ movq %r10, 0(%rsp) /* z */
+ movq 8(%rsp), %rdi
+ movq $2, %rsi
+ pushq %rax
+ pushq %r10
+ pushq %r11
+ pushq %r9
+ pushq %r8
+ pushq %rcx
+ pushq %rdx
+ pushq %rsi
+ pushq %rdi
+ call div
+ movq %rax, %r10
+ popq %rdi
+ popq %rsi
+ popq %rdx
+ popq %rcx
+ popq %r8
+ popq %r9
+ popq %r11
+ addq $8, %rsp
+ popq %rax
+ movq %r10, 8(%rsp) /* z */
+ jmp do_start6
+do_end6:
+ movq 0(%rsp), %rax
+ leave
+ ret
--- /dev/null
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "symbol_table.h"
+ #include "code_gen.h"
+ #include "tree.h"
+
+ #define imm_prefix "$"
+
+ char *saved_reg;
+
+/* TODO failed test case: func f(a) if not (a=0 or a=1) then return 0; end; end; */
+%}
+
+%start Input
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
+
+@autoinh symbols stack_offset all_pars if_in jump_true jump_false
+@autosyn node defined_vars immediate if_out has_call
+
+@attributes { char *name; } ID
+@attributes { long value; } NUM
+@attributes { struct symbol_t *fields; struct symbol_t *symbols; int if_in; } Program
+@attributes { struct symbol_t *fields; } Structdef
+@attributes { struct symbol_t *fields; int offset; } Ids
+@attributes { struct symbol_t *pars; int num_pars; int all_pars; } Pars
+@attributes { struct symbol_t *symbols; int defined_vars; int if_in; int if_out; } Funcdef
+@attributes { struct symbol_t *symbols; int defined_vars; int stack_offset; treenode *node; int if_in; int if_out; int has_call; } Stats
+@attributes { struct symbol_t *symbols; treenode *node; int immediate; int has_call; } Expr Term Plusterm Malterm
+@attributes { struct symbol_t *symbols; treenode *node; int has_call; } Call Lexpr Field Exprs
+@attributes { struct symbol_t *symbols; treenode *node; char *jump_true; char *jump_false; int negated; int if_in; int if_out; int negated2; int top_level; int has_call; } Bool Orterm Subbool Bterm
+@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int has_call; } Stat
+@attributes { struct symbol_t *symbols; treenode *node; int defined_vars; int stack_offset; int if_in; int if_out; int if_nr; int has_call; } Blubb
+
+@traversal @postorder check
+@traversal @preorder reg
+@traversal @preorder codegen
+
+%%
+
+Input: Program
+ @{
+ @i @Program.symbols@ = @Program.fields@;
+ @i @Program.if_in@ = 0;
+
+ @codegen printf("\t.text\n");
+ @}
+
+ ;
+
+Program: Funcdef ';' Program
+ @{
+ @i @Program.fields@ = @Program.1.fields@;
+ @i @Program.1.if_in@ = @Funcdef.if_out@;
+ @}
+
+ | Structdef ';' Program
+ @{
+ @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
+ @i @Program.1.symbols@ = @Program.0.symbols@;
+ @}
+
+ |
+ @{ @i @Program.fields@ = new_table(); @}
+
+ ;
+
+Funcdef: FUNC ID '(' Pars ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0);
+ @i @Stats.stack_offset@ = 0;
+ @i @Pars.all_pars@ = @Pars.num_pars@;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@, @Stats.has_call@, @Pars.num_pars@);
+ @}
+
+ | FUNC ID '(' ')' Stats END
+ @{
+ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0);
+ @i @Stats.stack_offset@ = 0;
+
+ @codegen function_header(@ID.name@, @Funcdef.defined_vars@, @Stats.has_call@, 0);
+ @}
+
+ ;
+
+Structdef: STRUCT Ids END
+ @{
+ @i @Structdef.fields@ = @Ids.fields@;
+ @i @Ids.offset@ = 0;
+ @}
+
+ ;
+
+Ids: ID Ids
+ @{
+ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1, @Ids.offset@);
+ @i @Ids.1.offset@ = @Ids.offset@ + 1;
+ @}
+
+ |
+ @{ @i @Ids.fields@ = new_table(); @}
+
+ ;
+
+Pars: Pars ',' ID
+ @{
+ @i @Pars.pars@ = table_add_param(@Pars.1.pars@, @ID.name@, @Pars.num_pars@);
+ @i @Pars.num_pars@ = @Pars.1.num_pars@ + 1;
+ @}
+
+ | ID
+ @{
+ @i @Pars.pars@ = table_add_param(new_table(), @ID.name@, 1);
+ @i @Pars.num_pars@ = 1;
+ @}
+
+ ;
+
+Stats: Stat ';' Stats
+ @{
+ @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stats.1.symbols@ = @Stat.out_symbols@;
+ @i @Stats.defined_vars@ = @Stat.defined_vars@ + @Stats.1.defined_vars@;
+ @i @Stats.1.stack_offset@ = @Stats.stack_offset@ + @Stat.defined_vars@ * 8;
+ @i @Stats.node@ = new_node(OP_Stats, @Stat.node@, @Stats.1.node@);
+ @i @Stat.if_in@ = @Stats.if_in@;
+ @i @Stats.1.if_in@ = @Stat.if_out@;
+ @i @Stats.if_out@ = @Stats.1.if_out@;
+ @i @Stats.has_call@ = @Stat.has_call@ || @Stats.1.has_call@;
+ @}
+
+ |
+ @{
+ @i @Stats.node@ = new_leaf(OP_Empty); /* TODO */
+ @i @Stats.defined_vars@ = 0;
+ @i @Stats.if_out@ = @Stats.if_in@;
+ @i @Stats.has_call@ = 0;
+ @}
+
+ ;
+
+Stat: VAR ID ASSIGN Expr /* Nodes necessary for IF, DO, ... ? */
+ @{
+ @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0, @Stat.stack_offset@);
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, new_named_leaf_value(OP_ID, @ID.name@, @Stat.stack_offset@, -1), @Expr.node@);
+ @i @Stat.defined_vars@ = 1;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Expr.node@->reg = get_next_reg((char *)NULL, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | Lexpr ASSIGN Expr
+ @{
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Lexpr.symbols@ = @Stat.in_symbols@;
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Assign, @Lexpr.node@, @Expr.node@);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+ @i @Stat.has_call@ = @Lexpr.has_call@ || @Expr.has_call@;
+
+ @reg @Lexpr.node@->reg = get_next_reg((char *)NULL, 0); @Expr.node@->reg = get_next_reg(@Lexpr.node@->reg, 0); @Stat.node@->reg = @Expr.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ | IF Bool THEN Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_If, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_end%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | IF Bool THEN Stats Blubb END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Blubb.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Ifstats, @Stats.node@, @Blubb.node@);
+ @i @Stat.defined_vars@ = @Stats.defined_vars@ + @Blubb.defined_vars@;
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Blubb.if_in@ = @Stats.if_out@;
+ @i @Stat.if_out@ = @Blubb.if_out@;
+ @i @Blubb.if_nr@ = @Stats.if_in@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "if_then%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "if_else%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@ || @Blubb.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz if_else%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("if_end%i:\n", @Stats.if_in@);
+ @}
+
+ | WHILE Bool DO Stats END
+ @{
+ @i @Bool.symbols@ = @Stat.in_symbols@;
+ @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_While, @Bool.node@, @Stats.node@);
+ @i @Bool.if_in@ = @Stat.if_in@ + 1;
+ @i @Stats.if_in@ = @Bool.if_out@;
+ @i @Stat.if_out@ = @Stats.if_out@;
+ @e Bool.jump_true : Stats.if_in; @Bool.jump_true@ = malloc(100); sprintf(@Bool.jump_true@, "do_enter%i", @Stats.if_in@);
+ @e Bool.jump_false : Stats.if_in; @Bool.jump_false@ = malloc(100); sprintf(@Bool.jump_false@, "do_end%i", @Stats.if_in@);
+ @i @Stat.has_call@ = @Bool.has_call@ || @Stats.has_call@;
+
+ @reg @Bool.node@->reg = get_next_reg((char *)NULL, 0);
+
+ @codegen printf("do_start%i:\n", @Stats.if_in@); /* write_tree(@Bool.node@, 0); burm_label(@Bool.node@); burm_reduce(@Bool.node@, 1); printf("\ttest %s1, %%%s\n\tjz do_end%i\n", imm_prefix, @Bool.node@->reg, @Stats.if_in@); */
+ @codegen @revorder(1) printf("\tjmp do_start%i\ndo_end%i:\n", @Stats.if_in@, @Stats.if_in@);
+ @}
+
+ | Call
+ @{
+ @i @Call.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = (treenode *)NULL;
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg @Call.node@->reg = "rax";
+ @}
+
+ | RETURN Expr
+ @{
+ @i @Expr.symbols@ = @Stat.in_symbols@;
+ @i @Stat.out_symbols@ = @Stat.in_symbols@;
+ @i @Stat.node@ = new_node(OP_Return, @Expr.node@, (treenode *)NULL);
+ @i @Stat.defined_vars@ = 0;
+ @i @Stat.if_out@ = @Stat.if_in@;
+
+ @reg if(@Expr.node@->op == OP_Call) { @Stat.node@->reg = get_next_reg("rax", 0); } else { @Stat.node@->reg = get_next_reg((char *)NULL, 0); } @Expr.node@->reg = @Stat.node@->reg;
+
+ @codegen /* write_tree(@Stat.node@, 0); */ burm_label(@Stat.node@); burm_reduce(@Stat.node@, 1);
+ @}
+
+ ;
+
+Blubb: ELSE Stats
+ @{
+ @codegen printf("\tjmp if_end%i\nif_else%i:\n", @Blubb.if_nr@, @Blubb.if_nr@);
+ @}
+
+Lexpr: ID
+ @{
+ @i @Lexpr.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->stack_offset, (table_lookup(@Lexpr.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Lexpr.symbols@, @ID.name@)->param_index);
+
+ @i @Lexpr.has_call@ = 0;
+ @check check_variable(@Lexpr.symbols@, @ID.name@);
+ @}
+
+ | Field
+ ;
+
+Expr: '-' Term
+ @{
+ @i @Expr.node@ = new_node(OP_Negation, @Term.node@, (treenode *)NULL);
+
+ @reg @Term.node@->reg = @Expr.node@->reg;
+ @}
+
+ | Term
+ @{ @reg @Term.node@->reg = @Expr.node@->reg; @}
+
+ | Term Plusterm
+ @{
+ @i @Expr.node@ = new_node(OP_Addition, @Plusterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Plusterm.immediate@;
+ @i @Expr.has_call@ = @Term.has_call@ || @Plusterm.has_call@;
+
+ @reg if(!@Plusterm.immediate@) { @Plusterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.node@->reg, @Expr.node@->skip_reg); @Plusterm.node@->skip_reg = 1; } else { @Term.node@->reg = @Expr.node@->reg; @Plusterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ | Term Malterm
+ @{
+ @i @Expr.node@ = new_node(OP_Multiplication, @Malterm.node@, @Term.node@);
+ @i @Expr.immediate@ = @Term.immediate@ && @Malterm.immediate@;
+ @i @Expr.has_call@ = @Term.has_call@ || @Malterm.has_call@;
+
+ @reg if(!@Malterm.immediate@) { @Malterm.node@->reg = @Expr.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.node@->reg, @Expr.node@->skip_reg); @Malterm.node@->skip_reg = 1; } else { @Term.node@-> reg = @Expr.node@->reg; @Malterm.node@->reg = get_next_reg(@Term.node@->reg, @Expr.node@->skip_reg); }
+ @}
+
+ ;
+
+Plusterm: '+' Term Plusterm
+ @{
+ @i @Plusterm.node@ = new_node(OP_Addition, @Plusterm.1.node@, @Term.node@);
+ @i @Plusterm.immediate@ = @Term.immediate@ && @Plusterm.1.immediate@;
+ @i @Plusterm.has_call@ = @Term.has_call@ || @Plusterm.1.has_call@;
+
+ @reg @Plusterm.1.node@->reg = @Plusterm.node@->reg; @Term.node@->reg = get_next_reg(@Plusterm.1.node@->reg, @Plusterm.node@->skip_reg);
+ @}
+
+ | '+' Term
+ @{ @reg @Term.node@->reg = @Plusterm.node@->reg; @}
+
+ ;
+
+Malterm: '*' Term Malterm
+ @{
+ @i @Malterm.node@ = new_node(OP_Multiplication, @Malterm.1.node@, @Term.node@);
+ @i @Malterm.immediate@ = @Term.immediate@ && @Malterm.1.immediate@;
+ @i @Malterm.has_call@ = @Term.has_call@ || @Malterm.1.has_call@;
+
+ @reg @Malterm.1.node@->reg = @Malterm.node@->reg; @Term.node@->reg = get_next_reg(@Malterm.1.node@->reg, @Malterm.node@->skip_reg);
+ @}
+
+ | '*' Term
+ @{ @reg @Term.node@->reg = @Malterm.node@->reg; @}
+
+ ;
+
+Term: '(' Expr ')'
+ @{ @reg @Expr.node@->reg = @Term.node@->reg; @}
+
+ | ID
+ @{
+ @i @Term.node@ = new_named_leaf_value(OP_ID, @ID.name@, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->stack_offset, (table_lookup(@Term.symbols@, @ID.name@)==NULL) ? 0 : table_lookup(@Term.symbols@, @ID.name@)->param_index);
+ @i @Term.immediate@ = 0;
+ @i @Term.has_call@ = 0;
+
+ @check check_variable(@Term.symbols@, @ID.name@);
+ @}
+
+ | NUM
+ @{
+ @i @Term.node@ = new_number_leaf(@NUM.value@);
+ @i @Term.immediate@ = 1;
+ @i @Term.has_call@ = 0;
+ @}
+
+ | Call
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Call.node@->reg = @Term.node@->reg;
+ @}
+
+ | Field
+ @{
+ @i @Term.immediate@ = 0;
+
+ @reg @Field.node@->reg = @Term.node@->reg;
+ @}
+
+ ;
+
+/* TODO replace by Bool -> Subbool */
+Bool: Bterm
+ @{
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bterm.top_level@ = 1;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Disjunction) { printf("\tjmp %s # foo1\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Bool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 0;
+ @i @Orterm.negated@ = 0;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Bool.negated Bool.jump_true Bool.if_in; if(!@Bool.negated@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Bool.if_in@); } else { @Bterm.jump_true@ = @Bool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Bool.negated Bool.jump_false Bool.if_in; if(@Bool.negated@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Bool.if_in@); } else { @Bterm.jump_false@ = @Bool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Bool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Bool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+ @i @Bool.has_call@ = @Bterm.has_call@ || @Orterm.has_call@;
+
+ @reg @Bterm.node@->reg = @Bool.node@->reg; @Orterm.node@->reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) printf("\tjmp %s # foo2\n", @Bool.jump_false@); printf(@Bool.negated@ ? "bool_false%i:\n" : "bool_true%i:\n", @Bool.if_in@); printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\n%s:\n", @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Bool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Bool.jump_true@;
+ @i @Bool.negated@ = 0;
+ @i @Bool.negated2@ = 0;
+ @i @Bterm.negated@ = 1;
+ @i @Bterm.negated2@ = 1;
+ @i @Bterm.top_level@ = 0;
+ @i @Bool.top_level@ = 1;
+
+ @reg @Bterm.node@-> reg = @Bool.node@->reg;
+
+ @codegen @revorder(1) if(@Bterm.node@->op!=OP_Not) { printf("\tjmp %s # foo3\n", @Bool.jump_false@); } printf("%s:\n", @Bool.jump_true@); /* printf("\tjmp %s\nnot_break%i:\n\tjmp %s\n%s:\n", @Bool.jump_true@, 0, @Bool.jump_false@, @Bool.jump_true@); */
+ @}
+
+ ;
+
+Subbool: Bterm
+ @{
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = @Subbool.negated2@;
+ @i @Bterm.top_level@ = @Subbool.top_level@;
+ @codegen @revorder(1) /* printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ | Bterm Orterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.node@);
+ @i @Bterm.negated@ = @Subbool.negated@;
+ @i @Orterm.negated@ = @Subbool.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.negated2@ = 0;
+ @e Bterm.jump_true : Subbool.negated Subbool.negated2 Subbool.jump_true Subbool.if_in; if(!@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_true@ = malloc(100); sprintf(@Bterm.jump_true@, "bool_true%i", @Subbool.if_in@); } else { @Bterm.jump_true@ = @Subbool.jump_true@; }
+ @i @Orterm.jump_true@ = @Bterm.jump_true@;
+ @e Bterm.jump_false : Subbool.negated Subbool.negated2 Subbool.jump_false Subbool.if_in; if(@Subbool.negated@ && @Subbool.negated2@) { @Bterm.jump_false@ = malloc(100); sprintf(@Bterm.jump_false@, "bool_false%i", @Subbool.if_in@); } else { @Bterm.jump_false@ = @Subbool.jump_false@; }
+ @i @Orterm.jump_false@ = @Bterm.jump_false@;
+ @i @Bterm.if_in@ = @Subbool.if_in@ + 1;
+ @i @Orterm.if_in@ = @Bterm.if_out@;
+ @i @Subbool.if_out@ = @Orterm.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.top_level@ = 0;
+ @i @Subbool.has_call@ = @Bterm.has_call@ || @Orterm.has_call@;
+
+ @reg @Bterm.node@->reg = @Subbool.node@->reg; @Orterm.node@->reg = @Subbool.node@->reg;
+
+ @codegen @revorder(1) /* TODO output if on top level */ if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo4\n", @Subbool.negated2@ ? @Subbool.jump_true@ : @Subbool.jump_false@); } printf(!@Subbool.negated@ ? "bool_true%i:\n" : "bool_false%i:\n", @Subbool.if_in@); /* printf("\tjmp %s\n# %s:\n", @Subbool.jump_true@, @Subbool.jump_true@); */
+ @}
+
+ | NOT Bterm
+ @{
+ @i @Subbool.node@ = new_node(OP_Not, @Bterm.node@, (treenode *)NULL);
+ @i @Bterm.jump_true@ = @Subbool.jump_true@;
+ @i @Bterm.negated@ = 1 - @Subbool.negated@;
+ @i @Bterm.negated2@ = 1 - @Subbool.negated2@;
+ @i @Bterm.top_level@ = 0;
+
+ @reg @Bterm.node@-> reg = @Subbool.node@->reg; /* printf("%s, %s\n", @Bterm.jump_true@, @Subbool.jump_false@); */
+
+ @codegen @revorder(1) printf("# !!\n"); if(@Subbool.negated2@ || @Subbool.top_level@) { printf("\tjmp %s # foo9\n", @Subbool.negated2@ ? @Subbool.jump_false@ : @Subbool.jump_false@); } /* printf("\tjmp %s\nnot_break%i:\n", @Subbool.negated@ ? @Bterm.jump_true@ : @Subbool.jump_false@, 0); printf("\tjmp %s\n%s:\n", @Subbool.jump_false@, @Subbool.jump_true@); */
+ @}
+
+ ;
+
+
+Orterm: OR Bterm Orterm
+ @{
+ @i @Orterm.node@ = new_node(OP_Disjunction, @Bterm.node@, @Orterm.1.node@);
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Orterm.1.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = 0;
+ @i @Orterm.1.negated2@ = 0;
+ @i @Orterm.1.if_in@ = @Bterm.if_out@;
+ @i @Orterm.if_out@ = @Orterm.1.if_out@;
+ @i @Bterm.top_level@ = 0;
+ @i @Orterm.1.top_level@ = 0;
+ @i @Orterm.has_call@ = @Bterm.has_call@ || @Orterm.1.has_call@;
+
+ @reg @Bterm.node@->reg = @Orterm.node@->reg; @Orterm.1.node@->reg = @Orterm.node@->reg;
+ @}
+
+ | OR Bterm
+ @{
+ @i @Bterm.negated@ = @Orterm.negated@;
+ @i @Bterm.negated2@ = @Orterm.negated2@;
+ @i @Bterm.top_level@ = 0;
+ @}
+
+ ;
+
+Bterm: Term GREATER Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Greater, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+ @i @Bterm.has_call@ = @Term.has_call@ || @Term.1.has_call@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjs %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjns %s # %s %s %i %i\n", @Term.1.node@->reg, @Term.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | Term '=' Term
+ @{
+ @i @Bterm.node@ = new_node(OP_Equal, @Term.node@, @Term.1.node@);
+ @i @Bterm.if_out@ = @Bterm.if_in@;
+ @i @Bterm.has_call@ = @Term.has_call@ || @Term.1.has_call@;
+
+ @reg @Term.node@->reg = @Bterm.node@->reg; @Term.1.node@->reg = get_next_reg(@Bterm.node@->reg, 0);
+
+ @codegen /* write_tree(@Term.node@, 0); */ burm_label(@Term.node@); burm_reduce(@Term.node@, 1); /* write_tree(@Term.1.node@, 0); */ burm_label(@Term.1.node@); burm_reduce(@Term.1.node@, 1); printf(@Bterm.negated2@ ? "\tcmp %%%s, %%%s\n\tjnz %s # %s %s %i %i\n" : "\tcmp %%%s, %%%s\n\tjz %s # %s %s %i %i\n", @Term.node@->reg, @Term.1.node@->reg, ((@Bterm.negated2@ ^ @Bterm.negated@)) ? @Bterm.jump_false@ : @Bterm.jump_true@, @Bterm.jump_true@, @Bterm.jump_false@, @Bterm.negated2@, @Bterm.negated@);
+ @}
+
+ | '(' Subbool ')'
+ @{
+ @i @Subbool.negated@ = @Bterm.negated@;
+ @i @Subbool.negated2@ = @Bterm.negated2@;
+ @i @Subbool.top_level@ = @Bterm.top_level@;
+ @}
+
+ ;
+
+Field: Term '.' ID
+ @{
+ @i @Field.node@ = new_node_value(OP_Field, @Term.node@, new_named_leaf(OP_ID, @ID.name@), table_lookup(@Field.symbols@, @ID.name@)==(struct symbol_t *)NULL ? 0 : table_lookup(@Field.symbols@, @ID.name@)->stack_offset, -1);
+
+ @check check_field(@Field.symbols@, @ID.name@);
+
+ @reg @Term.node@->reg = @Field.node@->reg; @Field.node@->kids[1]->reg = get_next_reg(@Field.node@->reg, 0);
+ @}
+
+ ;
+
+Call: ID '(' Exprs ')'
+ @{
+ @i @Call.node@ = new_named_node(OP_Call, @Exprs.node@, (treenode *)NULL, @ID.name@);
+ @i @Call.has_call@ = 1;
+
+ @reg saved_reg = @Call.node@->reg; @Exprs.node@->reg = "rdi"; @Exprs.node@->name=@Call.node@->name;
+
+ @codegen /* reg_return=@Call.node@->reg; function_name = @ID.name@; prepare_call(function_name); */
+ @}
+
+ | ID '(' ')'
+ @{
+ @i @Call.node@ = new_node(OP_CallNoParam, (treenode *)NULL, (treenode *)NULL);
+ @i @Call.has_call@ = 1;
+
+ @codegen /* reg_return=@Call.node@->reg; do_call(@ID.name@); */
+ @}
+
+ ;
+
+Exprs: Expr
+ @{
+ @i @Exprs.node@ = new_node(OP_Arg, @Expr.node@, (treenode *)NULL);
+
+ @reg @Expr.node@->reg = @Exprs.node@->reg;
+
+ @codegen /* write_tree(@Expr.node@); */ /* burm_label(@Expr.node@); burm_reduce(@Expr.node@, 1); do_call(function_name); */
+ @}
+
+ | Expr ',' Exprs
+ @{
+ @i @Exprs.node@ = new_node(OP_Exprs, new_node(OP_Arg, @Expr.node@, (treenode *)NULL), @Exprs.1.node@);
+ @i @Exprs.has_call@ = @Exprs.1.has_call@ || @Expr.has_call@;
+
+ @reg @Expr.node@->reg = @Exprs.node@->reg; @Exprs.1.node@->reg = get_next_param_reg(@Exprs.node@->reg); @Exprs.node@->kids[0]->name = @Exprs.node@->name; @Exprs.1.node@->name = @Exprs.node@->name;
+
+ @codegen /* write_tree(@Expr.node@); */ /* burm_label(@Expr.node@); burm_reduce(@Expr.node@, 1); */
+ @}
+
+ ;
+
+%%
+
+extern int yylex();
+extern int yylineno;
+
+int yyerror(char *error_text) {
+ fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+ exit(2);
+}
+
+int main(int argc, char **argv) {
+ yyparse();
+ return 0;
+}
+
--- /dev/null
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include "parser.h"
+ #include "tree.h"
+
+KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not
+IDENTIFIER [[:alpha:]_][[:alnum:]_]*
+NUMBER_HEX [0-9][0-9A-Fa-f]*H
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
+
+%x COMMENT
+%option yylineno
+%%
+
+{COMMENT_START} BEGIN(COMMENT);
+
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
+
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+
+<COMMENT><<EOF>> { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+
+<COMMENT>{WHITESPACE} /* ignore */
+
+<COMMENT>. /* ignore everything inside comment */
+
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
+
+{IDENTIFIER} return(ID); @{ @ID.name@=strdup(yytext); @}
+
+{NUMBER_DEC} return(NUM); @{ @NUM.value@=strtol(yytext,(char **)NULL,10); @}
+{NUMBER_HEX} return(NUM); @{ yytext[strlen(yytext)-1]='\0'; @NUM.value@=strtol(yytext,(char **)NULL,16); @}
+
+\:= return(ASSIGN);
+>= return(GREATER);
+\; return(';');
+\. return('.');
+\( return('(');
+\) return(')');
+\, return(',');
+\- return('-');
+\+ return('+');
+\* return('*');
+= return('=');
+
+{WHITESPACE} /* ignore */
+
+. { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+
+%%
+
+
--- /dev/null
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "symbol_table.h"
+
+struct symbol_t *new_table(void) {
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *clone_table(struct symbol_t *table) {
+ struct symbol_t *element;
+ struct symbol_t *new_tablex;
+
+ element=table;
+ new_tablex=new_table();
+ while((struct symbol_t *)NULL!=element) {
+ /* check return value */
+ if(element->param_index!=-1) {
+ new_tablex=table_add_param(new_tablex,element->identifier,element->param_index);
+ }
+ else {
+ new_tablex=table_add_symbol(new_tablex,element->identifier,element->type,0,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_tablex;
+}
+
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ if(check) {
+ fprintf(stderr,"Duplicate field %s.\n",identifier);
+ exit(3);
+ }
+
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=type;
+ new_element->stack_offset=stack_offset;
+ new_element->param_index=-1;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index) {
+ struct symbol_t *element;
+ struct symbol_t *new_element;
+
+ if(table_lookup(table,identifier)!=(struct symbol_t *)NULL) {
+ table=table_remove_symbol(table,identifier);
+ }
+
+ new_element=(struct symbol_t *)malloc(sizeof(struct symbol_t));
+ new_element->next=(struct symbol_t *)NULL;
+ new_element->identifier=strdup(identifier);
+ new_element->type=SYMBOL_TYPE_PARAM;
+ new_element->param_index=param_index;
+
+ if((struct symbol_t *)NULL==table) {
+ return new_element;
+ }
+ element=table;
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ }
+
+ element->next=new_element;
+
+ return table;
+}
+
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+
+ element=table;
+
+ if((struct symbol_t *)NULL==table) {
+ return (struct symbol_t *)NULL;
+ }
+
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+
+ while((struct symbol_t *)NULL!=element->next) {
+ element=element->next;
+ if(strcmp(element->identifier,identifier)==0) {
+ return element;
+ }
+ }
+
+ return (struct symbol_t *)NULL;
+}
+
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check) {
+ struct symbol_t *element;
+ struct symbol_t *new_table=clone_table(table);
+
+ element=to_add;
+ while(element!=(struct symbol_t *)NULL) {
+ if(element->param_index!=-1) {
+ new_table=table_add_param(new_table,element->identifier,element->param_index);
+ }
+ else {
+ new_table=table_add_symbol(new_table,element->identifier,element->type,check,element->stack_offset);
+ }
+ element=element->next;
+ }
+
+ return new_table;
+}
+
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element;
+ struct symbol_t *previous_element;
+ struct symbol_t *new_element;
+
+ if((struct symbol_t *)NULL==table) {
+ return table;
+ }
+
+ previous_element=(struct symbol_t *)NULL;
+ element=table;
+
+ while((struct symbol_t *)NULL!=element) {
+ if(strcmp(element->identifier,identifier)==0) {
+ if((struct symbol_t *)NULL==previous_element) {
+ new_element=element->next;
+ }
+ else {
+ previous_element->next=element->next;
+ new_element=table;
+ }
+ (void)free(element->identifier);
+ (void)free(element);
+ return new_element;
+ }
+ previous_element=element;
+ element=element->next;
+ }
+
+ return table;
+}
+
+void check_variable(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_VAR && element->type!=SYMBOL_TYPE_PARAM) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
+void check_field(struct symbol_t *table, char *identifier) {
+ struct symbol_t *element=table_lookup(table,identifier);
+ if(element!=(struct symbol_t *)NULL) {
+ if(element->type!=SYMBOL_TYPE_FIELD) {
+ fprintf(stderr,"Identifier %s not a variable.\n",identifier);
+ exit(3);
+ }
+ }
+ else {
+ fprintf(stderr,"Unknown identifier %s.\n",identifier);
+ exit(3);
+ }
+}
+
--- /dev/null
+#ifndef SYMBOL_TABLE_H
+#define SYMBOL_TABLE_H
+
+#define SYMBOL_TYPE_FIELD 1
+#define SYMBOL_TYPE_VAR 2
+#define SYMBOL_TYPE_PARAM 3
+
+struct symbol_t {
+ char *identifier;
+ struct symbol_t *next;
+ short type;
+ int stack_offset;
+ int param_index; /* -1 if not a parameter */
+};
+
+struct symbol_t *clone_table(struct symbol_t *table);
+struct symbol_t *new_table(void);
+struct symbol_t *table_add_symbol(struct symbol_t *table, char *identifier, short type, short check, int stack_offset);
+struct symbol_t *table_add_param(struct symbol_t *table, char *identifier, int param_index);
+struct symbol_t *table_lookup(struct symbol_t *table, char *identifier);
+struct symbol_t *table_remove_symbol(struct symbol_t *table, char *identifier);
+struct symbol_t *table_merge(struct symbol_t *table, struct symbol_t *to_add, short check);
+void check_variable(struct symbol_t *table, char *identifier);
+void check_field(struct symbol_t *table, char *identifier);
+
+#endif /* SYMBOL_TABLE_H */
+
--- /dev/null
+ #include <stdio.h>
+
+extern long f1(long a);
+extern long f2(long a);
+extern long f3(long a);
+extern long f4(long a);
+extern long f5(long a);
+extern long f6(long a);
+extern long f7(long a);
+extern long f8(long a);
+extern long f9(long a);
+extern long f10(long a);
+
+extern long g1(long a, long b);
+extern long g2(long a, long b);
+extern long g3(long a, long b);
+extern long g4(long a, long b);
+extern long g5(long a, long b);
+extern long g6(long a, long b);
+extern long g7(long a, long b);
+extern long g8(long a, long b);
+extern long g9(long a, long b);
+extern long g10(long a, long b);
+extern long g11(long a, long b);
+extern long g12(long a, long b);
+
+extern long h1(long a, long b, long c, long d);
+extern long h2(long a, long b, long c, long d);
+extern long h3(long a, long b, long c, long d);
+extern long h4(long a, long b, long c, long d);
+extern long h5(long a, long b, long c, long d);
+extern long h6(long a, long b, long c, long d);
+extern long h7(long a, long b, long c, long d);
+extern long h8(long a, long b, long c, long d);
+extern long h9(long a, long b, long c, long d);
+extern long h10(long a, long b, long c, long d);
+extern long h11(long a, long b, long c, long d);
+extern long h12(long a, long b, long c, long d);
+extern long h13(long a, long b, long c, long d);
+extern long h14(long a, long b, long c, long d);
+extern long h15(long a, long b, long c, long d);
+extern long h16(long a, long b, long c, long d);
+extern long h17(long a, long b, long c, long d);
+extern long h18(long a, long b, long c, long d);
+extern long h19(long a, long b, long c, long d);
+extern long h20(long a, long b, long c, long d);
+extern long h21(long a, long b, long c, long d);
+extern long h22(long a, long b, long c, long d);
+extern long h23(long a, long b, long c, long d);
+extern long h24(long a, long b, long c, long d);
+
+int check_arg1(char *name, long (*function)(long), long ret0, long ret1, long ret2) {
+ int ret;
+ ret=function(0)==ret0 && function(1)==ret1 && function(2)==ret2;
+ printf("%s: %li/%li, %li/%li, %li/%li - %s\n", name,function(0), ret0, function(1), ret1, function(2), ret2, ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg2(char *name, long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ printf("%li/%li ", function(a,b),blubb[a][b]);
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int check_arg4(char *name, long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ printf("%s - ", name);
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ printf("%li/%li ", function(a,b,c,d),blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ printf("- %s\n", ret ? "ok" : "FAIL");
+ return ret;
+}
+
+int main(int argc, char **argv) {
+ int ret;
+
+ long ret_g1[2][2]={{1,1},{1,0}};
+ long ret_g2[2][2]={{1,0},{1,1}};
+ long ret_g3[2][2]={{1,1},{0,1}};
+ long ret_g4[2][2]={{0,1},{1,1}};
+ long ret_g5[2][2]={{0,0},{0,1}};
+ long ret_g6[2][2]={{0,1},{0,0}};
+ long ret_g7[2][2]={{0,0},{1,0}};
+ long ret_g8[2][2]={{1,0},{0,0}};
+ long ret_g9[2][2]={{1,1},{1,0}};
+ long ret_g10[2][2]={{1,0},{1,1}};
+ long ret_g11[2][2]={{1,1},{0,1}};
+ long ret_g12[2][2]={{0,1},{1,1}};
+
+ long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+ long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+ long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+ long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+ long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+ long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+ long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+ long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+ long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+ long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+ long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+ long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+ long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+ long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+ ret=check_arg1("f1",f1,0,1,1);
+ ret&=check_arg1("f2",f2,0,0,1);
+ ret&=check_arg1("f3",f3,1,0,0);
+ ret&=check_arg1("f4",f4,0,1,1);
+ ret&=check_arg1("f5",f5,0,0,1);
+ ret&=check_arg1("f6",f6,1,0,0);
+ ret&=check_arg1("f7",f7,0,1,1);
+ ret&=check_arg1("f8",f8,0,0,1);
+ ret&=check_arg1("f9",f9,1,1,1);
+ ret&=check_arg1("f10",f10,1,0,0);
+
+ ret&=check_arg2("g1",g1,ret_g1);
+ ret&=check_arg2("g2",g2,ret_g2);
+ ret&=check_arg2("g3",g3,ret_g3);
+ ret&=check_arg2("g4",g4,ret_g4);
+ ret&=check_arg2("g5",g5,ret_g5);
+ ret&=check_arg2("g6",g6,ret_g6);
+ ret&=check_arg2("g7",g7,ret_g7);
+ ret&=check_arg2("g8",g8,ret_g8);
+ ret&=check_arg2("g9",g9,ret_g9);
+ ret&=check_arg2("g10",g10,ret_g10);
+ ret&=check_arg2("g11",g11,ret_g11);
+ ret&=check_arg2("g12",g12,ret_g12);
+
+ ret&=check_arg4("h1",h1,ret_h1);
+ ret&=check_arg4("h2",h2,ret_h2);
+ ret&=check_arg4("h3",h3,ret_h3);
+ ret&=check_arg4("h4",h4,ret_h4);
+ ret&=check_arg4("h5",h5,ret_h5);
+ ret&=check_arg4("h6",h6,ret_h6);
+ ret&=check_arg4("h7",h7,ret_h7);
+ ret&=check_arg4("h8",h8,ret_h8);
+ ret&=check_arg4("h9",h9,ret_h9);
+ ret&=check_arg4("h10",h10,ret_h10);
+ ret&=check_arg4("h11",h11,ret_h11);
+ ret&=check_arg4("h12",h12,ret_h12);
+ ret&=check_arg4("h13",h13,ret_h13);
+ ret&=check_arg4("h14",h14,ret_h14);
+ ret&=check_arg4("h15",h15,ret_h15);
+ ret&=check_arg4("h16",h16,ret_h16);
+ ret&=check_arg4("h17",h17,ret_h17);
+ ret&=check_arg4("h18",h18,ret_h18);
+ ret&=check_arg4("h19",h19,ret_h19);
+ ret&=check_arg4("h20",h20,ret_h20);
+ ret&=check_arg4("h21",h21,ret_h21);
+ ret&=check_arg4("h22",h22,ret_h22);
+ ret&=check_arg4("h23",h23,ret_h23);
+ ret&=check_arg4("h24",h24,ret_h24);
+
+ return !ret;
+}
+
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
+func f4(a) if (a=0) then return 0; else return 1; end; end;
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
+
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
+
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
+
+func g(a) if (a=0 or a=1) then return 0; else return 1; end; end;
+func h(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
+func i(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
+func j(a,b) if not ((not a=0) or (not b=0)) then return 0; else return 1; end; end;
+func k(a,b,c,d) if not ((not (a=0 or b=0)) or (not (c=0 or d=0))) then return 1; else return 0; end; end;
+
--- /dev/null
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases
+END
+fib2.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/fib2.0
+END
+f2.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f2.call
+END
+g4.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g4.call
+END
+tiefen.call
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefen.call
+END
+forumx_06.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forumx_06.3
+END
+g11.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g11.0
+END
+my_d.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_d.0
+END
+h6.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h6.call
+END
+h13.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h13.0
+END
+my_h.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_h.0
+END
+negterm1.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/negterm1.call
+END
+h17.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h17.0
+END
+my_l.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_l.0
+END
+my_a.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_a.call
+END
+malandro11.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro11.3
+END
+malandro15.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro15.3
+END
+h13.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h13.call
+END
+g3.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g3.0
+END
+blubb1
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/blubb1
+END
+algebran3.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran3.call
+END
+blubb2
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/blubb2
+END
+fib.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/fib.call
+END
+g7.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g7.0
+END
+parameter6.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/parameter6.call
+END
+g1.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g1.call
+END
+h3.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h3.call
+END
+f7.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f7.call
+END
+algebra1.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebra1.call
+END
+g9.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g9.call
+END
+h22.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h22.0
+END
+tiefen1.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefen1.0
+END
+forum_05.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forum_05.3
+END
+algebran4.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran4.0
+END
+fib.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/fib.0
+END
+ag_g.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_g.3
+END
+parameter3.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter3.0
+END
+malandro03.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro03.3
+END
+h10.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h10.call
+END
+ag_k.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_k.3
+END
+test4.2
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/test4.2
+END
+f1.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f1.0
+END
+my_f.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_f.call
+END
+h22.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h22.call
+END
+malandro07.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro07.3
+END
+tiefen1.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefen1.call
+END
+h2.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h2.0
+END
+f5.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f5.0
+END
+h18.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h18.call
+END
+h6.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h6.0
+END
+f9.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f9.0
+END
+parameter3.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter3.call
+END
+f4.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f4.call
+END
+my_a.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_a.0
+END
+f10.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f10.0
+END
+forumx_07.2
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forumx_07.2
+END
+g6.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g6.call
+END
+h10.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h10.0
+END
+g12.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g12.0
+END
+my_e.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_e.0
+END
+h8.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h8.call
+END
+h14.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h14.0
+END
+h18.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h18.0
+END
+my_i.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_i.3
+END
+malandro12.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro12.3
+END
+g10.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g10.call
+END
+my_c.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_c.call
+END
+malandro16.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro16.3
+END
+regfehler.4
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/regfehler.4
+END
+h15.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h15.call
+END
+g4.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g4.0
+END
+tiefen.0
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefen.0
+END
+my_k.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_k.call
+END
+g8.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g8.0
+END
+f1.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f1.call
+END
+negterm1.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/negterm1.0
+END
+g3.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g3.call
+END
+h5.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h5.call
+END
+f9.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f9.call
+END
+h23.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h23.0
+END
+algebran1.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran1.0
+END
+forum_06.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forum_06.3
+END
+ag_h.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_h.3
+END
+f10.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f10.call
+END
+test1.3
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/test1.3
+END
+malandro04.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro04.3
+END
+parameter4.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter4.0
+END
+h12.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h12.call
+END
+f2.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f2.0
+END
+my_h.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_h.call
+END
+h24.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h24.call
+END
+algebran2.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran2.call
+END
+h3.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h3.0
+END
+f6.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f6.0
+END
+h7.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h7.0
+END
+tiefemax.call
+K 25
+svn:wc:ra_dav:version-url
+V 64
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefemax.call
+END
+parameter5.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter5.call
+END
+h2.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h2.call
+END
+forumx_04.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forumx_04.3
+END
+my_b.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_b.0
+END
+f6.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f6.call
+END
+h11.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h11.0
+END
+g8.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g8.call
+END
+forumx_08.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forumx_08.3
+END
+my_f.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_f.0
+END
+h15.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h15.0
+END
+my_j.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_j.0
+END
+malandro.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro.3
+END
+h19.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h19.0
+END
+malandro13.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro13.3
+END
+g12.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g12.call
+END
+my_e.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_e.call
+END
+h21.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h21.call
+END
+g1.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g1.0
+END
+algebra.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/algebra.call
+END
+g5.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g5.0
+END
+h17.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h17.call
+END
+parameter2.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter2.call
+END
+g9.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g9.0
+END
+f3.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f3.call
+END
+localx01.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/localx01.3
+END
+g5.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g5.call
+END
+h20.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h20.0
+END
+h7.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h7.call
+END
+h24.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h24.0
+END
+algebran2.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran2.0
+END
+fib2.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/fib2.call
+END
+ag_e.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_e.3
+END
+forum_07.2
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forum_07.2
+END
+parameter1.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter1.0
+END
+malandro01.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro01.3
+END
+negterm.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/negterm.0
+END
+testscriptx03.3
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/testscriptx03.3
+END
+ag_i.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_i.3
+END
+my_b.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_b.call
+END
+test2.3
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/test2.3
+END
+parameter5.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter5.0
+END
+malandro05.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro05.3
+END
+f3.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f3.0
+END
+h14.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h14.call
+END
+malandro09.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro09.3
+END
+my_j.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_j.call
+END
+h4.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h4.0
+END
+algebran4.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran4.call
+END
+f7.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f7.0
+END
+h8.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h8.0
+END
+g2.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g2.call
+END
+g10.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g10.0
+END
+forumx_05.3
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forumx_05.3
+END
+h4.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h4.call
+END
+my_c.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_c.0
+END
+f8.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f8.call
+END
+h12.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h12.0
+END
+my_g.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_g.0
+END
+algebra.0
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/algebra.0
+END
+h16.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h16.0
+END
+local01.3
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/local01.3
+END
+my_k.0
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_k.0
+END
+malandro10.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro10.3
+END
+tiefemax.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/tiefemax.0
+END
+h11.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h11.call
+END
+malandro14.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro14.3
+END
+my_g.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_g.call
+END
+g2.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g2.0
+END
+h23.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h23.call
+END
+algebran1.call
+K 25
+svn:wc:ra_dav:version-url
+V 65
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran1.call
+END
+g6.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g6.0
+END
+h19.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h19.call
+END
+parameter4.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter4.call
+END
+h1.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h1.call
+END
+f5.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f5.call
+END
+g7.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g7.call
+END
+h21.0
+K 25
+svn:wc:ra_dav:version-url
+V 56
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h21.0
+END
+ag_b.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_b.3
+END
+h9.call
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h9.call
+END
+forum_04.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forum_04.3
+END
+algebran3.0
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebran3.0
+END
+malandro02.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro02.3
+END
+forum_08.3
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/forum_08.3
+END
+parameter2.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter2.0
+END
+ag_j.3
+K 25
+svn:wc:ra_dav:version-url
+V 57
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/ag_j.3
+END
+g11.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/g11.call
+END
+my_d.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_d.call
+END
+h20.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h20.call
+END
+test3.3
+K 25
+svn:wc:ra_dav:version-url
+V 58
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/test3.3
+END
+malandro06.3
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/malandro06.3
+END
+parameter6.0
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/parameter6.0
+END
+h1.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h1.0
+END
+f4.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f4.0
+END
+h16.call
+K 25
+svn:wc:ra_dav:version-url
+V 59
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h16.call
+END
+h5.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h5.0
+END
+my_l.call
+K 25
+svn:wc:ra_dav:version-url
+V 60
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/my_l.call
+END
+f8.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/f8.0
+END
+negterm.call
+K 25
+svn:wc:ra_dav:version-url
+V 63
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/negterm.call
+END
+parameter1.call
+K 25
+svn:wc:ra_dav:version-url
+V 66
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/parameter1.call
+END
+algebra1.0
+K 25
+svn:wc:ra_dav:version-url
+V 61
+/svn/private/!svn/ver/1041/ublu08/gesamt/testcases/algebra1.0
+END
+h9.0
+K 25
+svn:wc:ra_dav:version-url
+V 55
+/svn/private/!svn/ver/1024/ublu08/gesamt/testcases/h9.0
+END
--- /dev/null
+8
+
+dir
+1024
+http://localhost/svn/private/ublu08/gesamt/testcases
+http://localhost/svn/private
+
+
+
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+
+
+svn:special svn:externals svn:needs-lock
+\f
+fib2.0
+file
+
+
+
+
+2008-05-17T18:34:47.000000Z
+d2958f8cee3c919b8e9778086e29fe14
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f2.call
+file
+
+
+
+
+2008-05-17T18:34:39.000000Z
+6fdf6778d8fc38ee5ed996403a0beee7
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g4.call
+file
+
+
+
+
+2008-05-17T18:35:03.000000Z
+91086753970b73e9bdca217572ac9c8d
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+tiefen.call
+file
+1041
+
+
+
+2008-05-19T17:30:32.000000Z
+4e4611a55d42deb5d4d01604659aee3d
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+forumx_06.3
+file
+
+
+
+
+2008-05-17T18:34:53.000000Z
+90f2ef946fd9ef28fcf94df027e89e56
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g11.0
+file
+
+
+
+
+2008-05-17T18:34:57.000000Z
+ece252a4a0ec44ce0e3f340b0f3403ec
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_d.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+edb330d048a07ba2fae79cc04d38a7f1
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h6.call
+file
+
+
+
+
+2008-05-17T18:35:39.000000Z
+5e3326d561b87290b4eb674f1303870d
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h13.0
+file
+
+
+
+
+2008-05-17T18:35:13.000000Z
+9cd396fc3339078adcaf75a56ec19156
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_h.0
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+24d3908b6b8ece4cc26953a301f0ac98
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+negterm1.call
+file
+
+
+
+
+2008-05-17T18:35:55.000000Z
+df277ed55a7f4f87cbef2815c8ac3d67
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h17.0
+file
+
+
+
+
+2008-05-17T18:35:19.000000Z
+3e6ee293496914c5f2096bd0a8550f3c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_l.0
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+c4a82df390b222018ef51ac46566b0a4
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+my_a.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+d8e871df2c202de33d975b0b930ae83c
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro11.3
+file
+
+
+
+
+2008-05-17T18:35:50.000000Z
+01f2397e7770ffe1210363a85e7cbbc2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro15.3
+file
+
+
+
+
+2008-05-17T18:35:51.000000Z
+d5ee0e5ba80a0bff089d93f5706f7408
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h13.call
+file
+
+
+
+
+2008-05-17T18:35:14.000000Z
+8b9ec70cddc4dc5d4a61e6c67e043ae2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g3.0
+file
+
+
+
+
+2008-05-17T18:35:01.000000Z
+d4145f0545bc34ee767b3ff34657aebd
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+blubb1
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+f81b880b28e12fe2650547d339c6af6c
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+blubb2
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+de9c96c2092a644ceec2b3677393c0ab
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+algebran3.call
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+31a43ca0465b0c89a605fdd25d6edefc
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+fib.call
+file
+
+
+
+
+2008-05-17T18:34:48.000000Z
+e56eb5050edfe853fd96c4a2eca3c749
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g7.0
+file
+
+
+
+
+2008-05-17T18:35:06.000000Z
+85ed1ed1e6f164ffea7ef137d363cb10
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter6.call
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+1265633d7de6b2d870ae79b1f20041de
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g1.call
+file
+
+
+
+
+2008-05-17T18:34:59.000000Z
+53187b9d7adde68a9e5933499c8f922e
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h3.call
+file
+
+
+
+
+2008-05-17T18:35:35.000000Z
+c7c83b1c157701d046b33a3a66956187
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f7.call
+file
+
+
+
+
+2008-05-17T18:34:44.000000Z
+e8fddc19e3e601f8cc863dc7b144413c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebra1.call
+file
+1041
+
+
+
+2008-05-19T17:29:07.000000Z
+cddcdc6d33203e7c02204531c0c5aa1d
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+tiefen1.0
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+20468ca960f31ebc7c20ccfade82a914
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g9.call
+file
+
+
+
+
+2008-05-17T18:35:09.000000Z
+c8351778328bd6445197f503b8139d17
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h22.0
+file
+
+
+
+
+2008-05-17T18:35:28.000000Z
+374eb9995cbdb04b5220807a5a3f87b9
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebran4.0
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+e38a1ef87d78932d67c67aa84e1ccf75
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+forum_05.3
+file
+
+
+
+
+2008-05-17T18:34:49.000000Z
+ec3a03b9d419323173761bfd14e4a342
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+fib.0
+file
+
+
+
+
+2008-05-17T18:34:46.000000Z
+b968dfc49c1042155cf7df90e7f8e5ad
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_g.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+20534b17025920c73825550fb87ce080
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+parameter3.0
+file
+
+
+
+
+2008-05-17T18:35:58.000000Z
+a84451fa9cf4a391d17e8644f8178316
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro03.3
+file
+
+
+
+
+2008-05-17T18:35:46.000000Z
+44d577a75f88e2050610bfdfbd14c6be
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h10.call
+file
+
+
+
+
+2008-05-17T18:35:10.000000Z
+2c485b4998bfadced17db390161a05bb
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_k.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+e65008728ffa41f53928dffb28f6c94b
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+test4.2
+file
+
+
+
+
+2008-05-17T18:36:03.000000Z
+261f08f201d000da065a3b6e0e4fe522
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f1.0
+file
+
+
+
+
+2008-05-17T18:34:36.000000Z
+d00a3189324e0dc908bc4c9ca337b874
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_f.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+0a039d15f089d3b7e1e83741ad4fcf00
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro07.3
+file
+
+
+
+
+2008-05-17T18:35:48.000000Z
+c7d7f7ab7fc7362e4f89df7180f12e63
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h22.call
+file
+
+
+
+
+2008-05-17T18:35:29.000000Z
+a6ffd7bcd611b80ef7dc135af39112c1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+tiefen1.call
+file
+1041
+
+
+
+2008-05-19T17:30:32.000000Z
+267076ac0db282a9e63d3da134d02ac5
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h2.0
+file
+
+
+
+
+2008-05-17T18:35:24.000000Z
+35959e8c523c6f4174e6b55ab6b4c8c5
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f5.0
+file
+
+
+
+
+2008-05-17T18:34:42.000000Z
+569ee2be6fb5c62ef86cd3629cac5f3f
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h18.call
+file
+
+
+
+
+2008-05-17T18:35:21.000000Z
+a9a81170498be8f908b88064fd921651
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h6.0
+file
+
+
+
+
+2008-05-17T18:35:39.000000Z
+6278e991fa97d2fe44a6b667bf5ce8ce
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f9.0
+file
+
+
+
+
+2008-05-17T18:34:45.000000Z
+cacb3a1b2234ad40bb5845121342ecc5
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter3.call
+file
+
+
+
+
+2008-05-17T18:35:59.000000Z
+b83655ced953bc57f27e16d99a375090
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f4.call
+file
+
+
+
+
+2008-05-17T18:34:41.000000Z
+86cb296fb35261183e0b7cb47da376ac
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_a.0
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+3bffa81589a4257a11d417591113c422
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+f10.0
+file
+
+
+
+
+2008-05-17T18:34:36.000000Z
+2279bf66cdd77b388d7891edd286797c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forumx_07.2
+file
+
+
+
+
+2008-05-17T18:34:54.000000Z
+2eff768369bb8c5041b9f7d6472e6c09
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h10.0
+file
+
+
+
+
+2008-05-17T18:35:10.000000Z
+920dd8ceaaccf2467646b2131bb4cbe8
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g6.call
+file
+
+
+
+
+2008-05-17T18:35:06.000000Z
+194d639fa1d782d72d1c44fc2078f323
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g12.0
+file
+
+
+
+
+2008-05-17T18:34:58.000000Z
+06094e77abc9ec03ec903a3e24e6b665
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_e.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+8bb24c7ef08877bec6d85c61c7f11486
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h8.call
+file
+
+
+
+
+2008-05-17T18:35:42.000000Z
+ddca9b6763b65ae5d4446c3ce803a4a0
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h14.0
+file
+
+
+
+
+2008-05-17T18:35:15.000000Z
+60bf3f187d9a1dbbb3a2465912fe3051
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h18.0
+file
+
+
+
+
+2008-05-17T18:35:21.000000Z
+9c1ecac2a855e2fa6a5e099d7785a7c9
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_i.3
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+87e2ed0079b335710ad819a032522b7f
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+my_c.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+8b6e3530f1036c37b21714cbdabc01c2
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro12.3
+file
+
+
+
+
+2008-05-17T18:35:50.000000Z
+aa0e79272f940413edf4d665c6bf1b13
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g10.call
+file
+
+
+
+
+2008-05-17T18:34:56.000000Z
+771617f03dfcc89cecf5527b6598eb51
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+regfehler.4
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+05069199bbd9dcebcc33a29331a5ad2e
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro16.3
+file
+
+
+
+
+2008-05-17T18:35:52.000000Z
+dd6cb8db3847a3b5b61dd7472759e41e
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h15.call
+file
+
+
+
+
+2008-05-17T18:35:17.000000Z
+6b6c982647c1a7f22e564dd174368033
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g4.0
+file
+
+
+
+
+2008-05-17T18:35:02.000000Z
+9034560365c27619e90055b4da8e5372
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+tiefen.0
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+894857a81390988f155cfc843435b294
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+my_k.call
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+865f8ec640f631c4f6402456858abdca
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g8.0
+file
+
+
+
+
+2008-05-17T18:35:08.000000Z
+fe8d7c2e7823e6bdd1c8fc28605bd9f2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f1.call
+file
+
+
+
+
+2008-05-17T18:34:38.000000Z
+53fc6b9768c09b7c293a1be97bccbbc8
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+negterm1.0
+file
+
+
+
+
+2008-05-17T18:35:54.000000Z
+1988fa90318ee8b68449221ce78c241b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g3.call
+file
+
+
+
+
+2008-05-17T18:35:02.000000Z
+e24b4fb290f801e18a3bf96d00461914
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h5.call
+file
+
+
+
+
+2008-05-17T18:35:38.000000Z
+d592a3082cc9d79acd5c6156405522e0
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f9.call
+file
+
+
+
+
+2008-05-17T18:34:46.000000Z
+9450201506a4516e5e1b1c9fda7c9bab
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebran1.0
+file
+1041
+
+
+
+2008-05-19T17:30:20.000000Z
+690865c2dd5b4b91db769c1da6d25140
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h23.0
+file
+
+
+
+
+2008-05-17T18:35:30.000000Z
+f2dc8cde2ccfc3b28c646d065432a62a
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forum_06.3
+file
+
+
+
+
+2008-05-17T18:34:50.000000Z
+90f2ef946fd9ef28fcf94df027e89e56
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_h.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+650875eb5a2f896670989d5eb855cb15
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+f10.call
+file
+
+
+
+
+2008-05-17T18:34:37.000000Z
+f01c2a5bfad5e7cbe354daa82f38bf67
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+test1.3
+file
+
+
+
+
+2008-05-17T18:36:01.000000Z
+cf01830ebe0eea03c1eaa4b62661d921
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter4.0
+file
+
+
+
+
+2008-05-17T18:35:59.000000Z
+ad9b196b5359debf25e96b7d89594a10
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro04.3
+file
+
+
+
+
+2008-05-17T18:35:47.000000Z
+2d2e211032ee1340a92a0c1047c6118b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h12.call
+file
+
+
+
+
+2008-05-17T18:35:13.000000Z
+6215af599791dd3c552445d220889a9a
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f2.0
+file
+
+
+
+
+2008-05-17T18:34:39.000000Z
+29979069993c3662a4e9ddde5923a4b4
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_h.call
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+e089414c1c9493efaa9df2ee7a9c5fca
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+algebran2.call
+file
+1041
+
+
+
+2008-05-19T17:30:20.000000Z
+b9bdb8dfee8630bde64f5e468a27ab83
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h24.call
+file
+
+
+
+
+2008-05-17T18:35:33.000000Z
+dfb11c2012a60887f5f3be302c327154
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h3.0
+file
+
+
+
+
+2008-05-17T18:35:35.000000Z
+40c8a6988c2d1e144c1925fe9c5f5656
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f6.0
+file
+
+
+
+
+2008-05-17T18:34:43.000000Z
+ff8ef2815c929123b8b399719f7d74f9
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+tiefemax.call
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+89db20d22c0c8952c78b02832a1d6890
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h7.0
+file
+
+
+
+
+2008-05-17T18:35:40.000000Z
+0e9afe918174f0bc89b1808f03e33c05
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter5.call
+file
+
+
+
+
+2008-05-17T18:36:01.000000Z
+ec07056887a720babfb611b28d880856
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h2.call
+file
+
+
+
+
+2008-05-17T18:35:34.000000Z
+822191cbe70a0099adee9b3f9e2c86d8
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forumx_04.3
+file
+
+
+
+
+2008-05-17T18:34:52.000000Z
+53d9c7e2e53e504ed29147e475c198ca
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_b.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+a146ace45773876d04625ec0ff58a056
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+f6.call
+file
+
+
+
+
+2008-05-17T18:34:43.000000Z
+b2fa8363b75b105954deedddefba509f
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h11.0
+file
+
+
+
+
+2008-05-17T18:35:11.000000Z
+dff54389b093db24b8108199477d278c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forumx_08.3
+file
+
+
+
+
+2008-05-17T18:34:54.000000Z
+79467ccded17f71ad439c95f808fcc2b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g8.call
+file
+
+
+
+
+2008-05-17T18:35:08.000000Z
+563ca6eb8935a8ea48110d8fe29569c1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_f.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+0651ad5f3f0b89ff295418768ee0f9b9
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h15.0
+file
+
+
+
+
+2008-05-17T18:35:16.000000Z
+c80e471f2847784226fc2037a551dcd4
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_j.0
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+1ca4a232bb8d070c35c51fcaeb343760
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro.3
+file
+
+
+
+
+2008-05-17T18:35:53.000000Z
+841850e2a940609318a3b8cfbcea5ae6
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h19.0
+file
+
+
+
+
+2008-05-17T18:35:22.000000Z
+c61fd976033fc4e9663e7e918282db3e
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro13.3
+file
+
+
+
+
+2008-05-17T18:35:50.000000Z
+65c411aa64afeeff2977743f66888419
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_e.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+aadf182e68032bd4d62184ec98f22f96
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g12.call
+file
+
+
+
+
+2008-05-17T18:34:59.000000Z
+453b2d8fe412acc52b23bc2508816687
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h21.call
+file
+
+
+
+
+2008-05-17T18:35:27.000000Z
+c69e8ba6d274d469dd2633b623f4f2c9
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g1.0
+file
+
+
+
+
+2008-05-17T18:34:55.000000Z
+82a9ac30d92f5afc92769af75534e5ce
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebra.call
+file
+
+
+
+
+2008-05-17T18:34:36.000000Z
+3017bb3923bd9e6e82471364aaa815b5
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h17.call
+file
+
+
+
+
+2008-05-17T18:35:20.000000Z
+53dfbeab7dcdad7ba8b38eccd01fa8ca
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g5.0
+file
+
+
+
+
+2008-05-17T18:35:04.000000Z
+8aef877a7ce8f2b3b26fd597d526b14c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter2.call
+file
+
+
+
+
+2008-05-17T18:35:58.000000Z
+e7d734676b659257758b46640ed1edbe
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g9.0
+file
+
+
+
+
+2008-05-17T18:35:09.000000Z
+2bf1172b55d9c98b19fc64ebf4ef5013
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f3.call
+file
+
+
+
+
+2008-05-17T18:34:40.000000Z
+9f74f6b9a2f2bb52089896cfd60dd342
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+localx01.3
+file
+
+
+
+
+2008-05-17T18:35:45.000000Z
+dca62f2af71a71eb7ed4e232e530befc
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g5.call
+file
+
+
+
+
+2008-05-17T18:35:04.000000Z
+fea54a4aeac466fba2b371477119ade2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h20.0
+file
+
+
+
+
+2008-05-17T18:35:25.000000Z
+31285e1e83984533b1a302c077efb47d
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h7.call
+file
+
+
+
+
+2008-05-17T18:35:41.000000Z
+6e1158562af63768dd7619dc10803233
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h24.0
+file
+
+
+
+
+2008-05-17T18:35:32.000000Z
+6fe5899c44e3d873842fdc4e62f5bda2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebran2.0
+file
+1041
+
+
+
+2008-05-19T17:30:20.000000Z
+6f66742e13551edc693253c2fab30c31
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+fib2.call
+file
+
+
+
+
+2008-05-17T18:34:47.000000Z
+e56eb5050edfe853fd96c4a2eca3c749
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_e.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+3c2167748f53462c0b1db85d36117cab
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+forum_07.2
+file
+
+
+
+
+2008-05-17T18:34:51.000000Z
+2eff768369bb8c5041b9f7d6472e6c09
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro01.3
+file
+
+
+
+
+2008-05-17T18:35:45.000000Z
+8d38fe618dc92f98cbddb87c0819c8cb
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter1.0
+file
+
+
+
+
+2008-05-17T18:35:56.000000Z
+1261f0301022d7e1842bc892c067907e
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+negterm.0
+file
+
+
+
+
+2008-05-17T18:35:53.000000Z
+1988fa90318ee8b68449221ce78c241b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_i.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+e7c3efc4c07c5fd29267e8dd51cc3837
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+my_b.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+cf8ce2070e9a5e0209f878697a46df1b
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+testscriptx03.3
+file
+
+
+
+
+2008-05-17T18:36:04.000000Z
+d2168be28160d4fef8250aa5fd68cfe1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+test2.3
+file
+
+
+
+
+2008-05-17T18:36:01.000000Z
+00abfc26a30c3aab6fc57a21d46ceb2b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter5.0
+file
+
+
+
+
+2008-05-17T18:36:00.000000Z
+5486f00b73c73fe463a8eed28381154c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro05.3
+file
+
+
+
+
+2008-05-17T18:35:47.000000Z
+1de8dca763ece7a0cee3a5089cf76270
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f3.0
+file
+
+
+
+
+2008-05-17T18:34:40.000000Z
+775d933d70fbc9bf5b376ab7c7ff27a7
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h14.call
+file
+
+
+
+
+2008-05-17T18:35:15.000000Z
+fbad72a47632903211179624698f35d1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro09.3
+file
+
+
+
+
+2008-05-17T18:35:49.000000Z
+0609d00302341b6cf4740d436bb87ad0
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_j.call
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+1be4fc525da884e37231e897d8df9153
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+algebran4.call
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+1bbb58f1e36e4916cd12fb28254a749e
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h4.0
+file
+
+
+
+
+2008-05-17T18:35:36.000000Z
+4426579c1fb1c0be99974b7118572ab1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f7.0
+file
+
+
+
+
+2008-05-17T18:34:44.000000Z
+3dc7d7476bc4d0b46d5fb184022adb52
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h8.0
+file
+
+
+
+
+2008-05-17T18:35:42.000000Z
+7fc0ad824e5fd175879cf626dd56f0dc
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g2.call
+file
+
+
+
+
+2008-05-17T18:35:00.000000Z
+b445b24b77fdf47000fc1a23d9471e8c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h4.call
+file
+
+
+
+
+2008-05-17T18:35:37.000000Z
+031adf99ed7c33e89db84c87a4392f69
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g10.0
+file
+
+
+
+
+2008-05-17T18:34:56.000000Z
+02cf0f938b64a2e5a50835b4d707b4b1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forumx_05.3
+file
+
+
+
+
+2008-05-17T18:34:53.000000Z
+e8e353ae2a690dc40e3de8029c7543cb
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_c.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+b4d20db97a644172a90852ab1de2188b
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+f8.call
+file
+
+
+
+
+2008-05-17T18:34:45.000000Z
+b6e9fa907dbb258fad6cead558e7f9df
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h12.0
+file
+
+
+
+
+2008-05-17T18:35:12.000000Z
+34605d216eab69393ba1ead08a982d22
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_g.0
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+733f1c17fd48c5ceb9a8195302a25c7e
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+algebra.0
+file
+
+
+
+
+2008-05-17T18:34:35.000000Z
+717629790b90ca013c291ef1bb3a95a0
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+local01.3
+file
+
+
+
+
+2008-05-17T18:35:44.000000Z
+dca62f2af71a71eb7ed4e232e530befc
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h16.0
+file
+
+
+
+
+2008-05-17T18:35:18.000000Z
+566b21ab8cab3072352b9e18a4ed3fed
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_k.0
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+debe02b8fb99a1b6c2bcb67b01cb6239
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+malandro10.3
+file
+
+
+
+
+2008-05-17T18:35:49.000000Z
+b3b87392dfb554fa731b5e109e83717d
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+tiefemax.0
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+6d11b557ca68eb04e5c719a4545b8c04
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h11.call
+file
+
+
+
+
+2008-05-17T18:35:12.000000Z
+aa4a6c331e36040999fdc6091a86de53
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro14.3
+file
+
+
+
+
+2008-05-17T18:35:51.000000Z
+cdf5c8269940d7e8c2728eab2f130ddf
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_g.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+a825f985690e62f5e01807e59c4c7482
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h23.call
+file
+
+
+
+
+2008-05-17T18:35:31.000000Z
+c51b55fe9488292f6a77ea71d4d4aecb
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g2.0
+file
+
+
+
+
+2008-05-17T18:35:00.000000Z
+5e8c78dd741ff50ea614da54efa537b6
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebran1.call
+file
+1041
+
+
+
+2008-05-19T17:30:20.000000Z
+b63ea91bf59174863748baf043bf7ad6
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g6.0
+file
+
+
+
+
+2008-05-17T18:35:05.000000Z
+5ab93cfbb449b62c2cd53515f9df4be3
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h19.call
+file
+
+
+
+
+2008-05-17T18:35:23.000000Z
+4406ad63d0375889d65f96ed4e97d39b
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter4.call
+file
+
+
+
+
+2008-05-17T18:36:00.000000Z
+3f3ffcf35a86b82feb72cdd985ca1e1f
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h1.call
+file
+
+
+
+
+2008-05-17T18:35:24.000000Z
+be6040170888395b1ae70ab05a943484
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f5.call
+file
+
+
+
+
+2008-05-17T18:34:42.000000Z
+8ff3de3a86a2bf00b8c8785e39034592
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+g7.call
+file
+
+
+
+
+2008-05-17T18:35:07.000000Z
+a6393c3b308f83f522919b795b69b1cd
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h21.0
+file
+
+
+
+
+2008-05-17T18:35:26.000000Z
+26f0e09fdf5c2ca9f2ec6444d21a68c8
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_b.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+32a248c9ddfc007209d982212d49f258
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h9.call
+file
+
+
+
+
+2008-05-17T18:35:43.000000Z
+1be02f3e94466102b74b448d10ec04ba
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+forum_04.3
+file
+
+
+
+
+2008-05-17T18:34:49.000000Z
+d83d32ffa882e4ec405476b4f6adcd3e
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebran3.0
+file
+1041
+
+
+
+2008-05-19T17:30:21.000000Z
+b1363161ef4a8deedb9ed90241d931d8
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+forum_08.3
+file
+
+
+
+
+2008-05-17T18:34:51.000000Z
+c613ec3ddb7ac662168c2b225a0b3297
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro02.3
+file
+
+
+
+
+2008-05-17T18:35:46.000000Z
+945b02b282475aeffab4cd808c0b878c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter2.0
+file
+
+
+
+
+2008-05-17T18:35:57.000000Z
+549d406f0bafaf114784f2be8988aab0
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+ag_j.3
+file
+1041
+
+
+
+2008-05-19T17:29:03.000000Z
+d6e7caf90136e29dd91e2c7d1c93f93a
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+g11.call
+file
+
+
+
+
+2008-05-17T18:34:58.000000Z
+d0ff54d3ff20c20e847a49f57c771142
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_d.call
+file
+1041
+
+
+
+2008-05-19T17:30:22.000000Z
+7dc483abb732b281b49edee6cdcbc30d
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h20.call
+file
+
+
+
+
+2008-05-17T18:35:26.000000Z
+521a7a78c92ca8cf48afffe8360e44c3
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+test3.3
+file
+
+
+
+
+2008-05-17T18:36:03.000000Z
+47c8c25fbe3227587a7f10ef1937af2c
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+malandro06.3
+file
+
+
+
+
+2008-05-17T18:35:48.000000Z
+c568b31541a0c2fc3d705a83ae0d48b2
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter6.0
+file
+1041
+
+
+
+2008-05-19T17:30:31.000000Z
+d8e483e11fd68ef30c00164967a3a084
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h1.0
+file
+
+
+
+
+2008-05-17T18:35:10.000000Z
+7ba7182884f0c9d735e9faaac7dfc7f1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f4.0
+file
+
+
+
+
+2008-05-17T18:34:41.000000Z
+9184146efc94eceb80f1041fa1d276ce
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h16.call
+file
+
+
+
+
+2008-05-17T18:35:18.000000Z
+0653628e8d663327ddff45fd4eab19ee
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+h5.0
+file
+
+
+
+
+2008-05-17T18:35:37.000000Z
+84f8654c81a880f99dc7e3f55b9081ad
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+my_l.call
+file
+1041
+
+
+
+2008-05-19T17:30:23.000000Z
+bccf20fd3bc6ceb1985ed3b2573f103d
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+negterm.call
+file
+
+
+
+
+2008-05-17T18:35:55.000000Z
+bdad2e18de2d65822773cd8c924155f1
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+parameter1.call
+file
+
+
+
+
+2008-05-17T18:35:56.000000Z
+ec51e4a1adc8afa59fd5160c332b9645
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+f8.0
+file
+
+
+
+
+2008-05-17T18:34:44.000000Z
+9af62ae20a4a815560b5259d1a43f5af
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
+algebra1.0
+file
+1041
+
+
+
+2008-05-19T17:29:06.000000Z
+6ff960ca78782ddb093e1d5ed4887afa
+2008-05-19T17:31:08.560526Z
+1041
+paulchen
+\f
+h9.0
+file
+
+
+
+
+2008-05-17T18:35:43.000000Z
+e177856e7e23dc023d0b82bbd086be47
+2008-05-17T18:36:31.041320Z
+1024
+paulchen
+\f
--- /dev/null
+func f()
+ var a := 1;
+ var b := 2;
+
+ c := 5;
+end;
--- /dev/null
+func f(x,y)
+ var a := 1;
+ var b := 2;
+ if a = b then
+ a := 3;
+ x := z;
+ end;
+ b := x;
+end;
--- /dev/null
+struct a b a end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+func f()
+ off := 7;
+ var off:=5;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ else
+ return x;
+ end;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ end;
+ return x;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var s := 2;
+ s.c := 17;
+end;
--- /dev/null
+func test(a, b)
+ return a + 2 + ( 3 * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 2 + (3 * 4)==test(2,4));
--- /dev/null
+func test(a, b)
+ return a + b + ( a * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 4 + (2 * 4)==test(2,4));
--- /dev/null
+func test()
+ return 1 + 2;
+end;
--- /dev/null
+extern long test ();
+return ( 3==test());
--- /dev/null
+func test()
+ return 1 * 2;
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 2==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 );
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 14==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 ) * ( 1 + 2 + 3 + ( 2 * 4 ));
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 196==test());
--- /dev/null
+ .text
+ .globl f
+ .type f, @function
+f:
+ movq %rdi, %rax
+ movq 16(%rax), %rax
+ movq 8(%rax), %rax
+ movq %rdi, %r11
+ movq 8(%r11), %r11
+ movq 16(%r11), %r11
+ imulq $-3, %r11
+ addq %r11, %rax
+ movq %rdi, %r10
+ movq 0(%r10), %r10
+ movq 0(%r10), %r10
+ addq %r10, %rax
+ ret
--- /dev/null
+ .text
+ .globl f
+ .type f, @function
+f:
+ movq %rdi, %rax
+ movq 16(%rax), %rax
+ movq 8(%rax), %rax
+ movq %rdi, %r11
+ movq 8(%r11), %r11
+ movq 16(%r11), %r11
+ addq $-3, %r11
+ addq %r11, %rax
+ movq %rdi, %r10
+ movq 0(%r10), %r10
+ movq 0(%r10), %r10
+ addq %r10, %rax
+ ret
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
--- /dev/null
+extern long f1(long a);
+
+return f1(0)==0 && f1(1)==1 && f1(2)==1;
+
--- /dev/null
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f10(long a);
+
+return f10(0)==1 && f10(1)==0 && f10(2)==0;
+
--- /dev/null
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
--- /dev/null
+extern long f2(long a);
+
+return f2(0)==0 && f2(1)==0 && f2(2)==1;
+
--- /dev/null
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f3(long a);
+
+return f3(0)==1 && f3(1)==0 && f3(2)==0;
+
--- /dev/null
+func f4(a) if (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f4(long a);
+
+return f4(0)==0 && f4(1)==1 && f4(2)==1;
+
--- /dev/null
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
--- /dev/null
+extern long f5(long a);
+
+return f5(0)==0 && f5(1)==0 && f5(2)==1;
+
--- /dev/null
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f6(long a);
+
+return f6(0)==1 && f6(1)==0 && f6(2)==0;
+
--- /dev/null
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f7(long a);
+
+return f7(0)==0 && f7(1)==1 && f7(2)==1;
+
--- /dev/null
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f8(long a);
+
+return f8(0)==0 && f8(1)==0 && f8(2)==1;
+
--- /dev/null
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f9(long a);
+
+return f9(0)==1 && f9(1)==1 && f9(2)==1;
+
--- /dev/null
+func fib(n)
+ if 1 >= n then return n; end;
+ var fib_n := 1; (* fib(n) *)
+ var fib_n1 := 0; (* fib(n-1) *)
+ var r := 0;
+
+ while n >= 2 do
+ (* calculate fib(n+1) *)
+ r := fib_n + fib_n1;
+ (* update fib(n-1) and fib(n) *)
+ fib_n1 := fib_n;
+ fib_n := r;
+ n := n + (-1);
+ end;
+ return r;
+end;
+
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+ (* fibonacci *)
+ func fib(x)
+ if not x >= 2 then
+ return x;
+ else
+ return fib(x+(-1))+fib(x+(-2));
+ end;
+ end;
+(* func main()
+ if not (fib(9)+(-fib(7))) = fib(8) then
+ return 1;
+ else
+ return 0;
+ end;
+ end;
+*)
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a2 end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ a := x;
+end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a2 end;
+struct end;
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
+struct end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a.t := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ (* a := x; *)
+end;
+
+struct b end;
--- /dev/null
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g1(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g1[2][2]={{1,1},{1,0}};
+
+return check_arg2(g1,ret_g1);
+
+
--- /dev/null
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g10(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g10[2][2]={{1,0},{1,1}};
+
+return check_arg2(g10,ret_g10);
+
+
--- /dev/null
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g11(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g11[2][2]={{1,1},{0,1}};
+
+return check_arg2(g11,ret_g11);
+
+
--- /dev/null
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g12(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g12[2][2]={{0,1},{1,1}};
+
+return check_arg2(g12,ret_g12);
+
+
--- /dev/null
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g2(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g2[2][2]={{1,0},{1,1}};
+
+return check_arg2(g2,ret_g2);
+
+
--- /dev/null
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g3(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g3[2][2]={{1,1},{0,1}};
+
+return check_arg2(g3,ret_g3);
+
+
--- /dev/null
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g4(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g4[2][2]={{0,1},{1,1}};
+
+return check_arg2(g4,ret_g4);
+
+
--- /dev/null
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g5(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g5[2][2]={{0,0},{0,1}};
+
+return check_arg2(g5,ret_g5);
+
+
--- /dev/null
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g6(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g6[2][2]={{0,1},{0,0}};
+
+return check_arg2(g6,ret_g6);
+
+
--- /dev/null
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g7(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g7[2][2]={{0,0},{1,0}};
+
+return check_arg2(g7,ret_g7);
+
+
--- /dev/null
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g8(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g8[2][2]={{1,0},{0,0}};
+
+return check_arg2(g8,ret_g8);
+
+
--- /dev/null
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g9(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g9[2][2]={{1,1},{1,0}};
+
+return check_arg2(g9,ret_g9);
+
+
--- /dev/null
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h1(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h1,ret_h1);
+
--- /dev/null
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h10(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h10,ret_h10);
+
--- /dev/null
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h11(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+
+return check_arg4(h11,ret_h11);
+
--- /dev/null
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h12(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+
+return check_arg4(h12,ret_h12);
+
--- /dev/null
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h13(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+
+return check_arg4(h13,ret_h13);
+
--- /dev/null
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h14(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h14,ret_h14);
+
--- /dev/null
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h15(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+
+return check_arg4(h15,ret_h15);
+
--- /dev/null
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h16(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h16,ret_h16);
+
--- /dev/null
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h17(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h17,ret_h17);
+
--- /dev/null
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h18(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h18,ret_h18);
+
--- /dev/null
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h19(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h19,ret_h19);
+
--- /dev/null
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h2(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h2,ret_h2);
+
--- /dev/null
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h20(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h20,ret_h20);
+
--- /dev/null
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h21(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h21,ret_h21);
+
--- /dev/null
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h22(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h22,ret_h22);
+
--- /dev/null
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h23(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h23,ret_h23);
+
--- /dev/null
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h24(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h24,ret_h24);
+
--- /dev/null
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h3(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h3,ret_h3);
+
--- /dev/null
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h4(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h4,ret_h4);
+
--- /dev/null
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h5(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h5,ret_h5);
+
--- /dev/null
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h6(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h6,ret_h6);
+
--- /dev/null
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h7(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h7,ret_h7);
+
--- /dev/null
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h8(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h8,ret_h8);
+
--- /dev/null
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h9(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+
+return check_arg4(h9,ret_h9);
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+struct a1 a2 a1 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+end;
--- /dev/null
+func g(x,y)
+ y:=0;
+ return y+z;
+end;
+
--- /dev/null
+func g(x,y)
+ y:=0;
+ z:=5;
+ return y;
+end;
+
--- /dev/null
+(*no se si esto de verdad deberia de dar erro :) ahora si*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ var e:=5;
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return e;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.d2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.c1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 c3 end;
+struct b1 b2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.b2;
+
+
+ return d;
+end;
+
+
+
--- /dev/null
+(*esto no deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.a2;
+
+
+ return d;
+end;
+
+
+struct b1 b2 b3 end;
+
+
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.b2;
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar erro g no esta definida*)
+ var d:=1;
+ if d = g then
+ d:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return d;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+
+ var g:=8;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ g:=x.a2;
+ end;
+ return g;
+
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 a4 end;
+
+func f(a1,a2)
+
+ var a3:=1;
+ var a4:=1;
+ a4:=a2.a2;
+ return a1;
+
+(*esto deberia de dar error t no visible*)
+ if a1 = a3 then
+ a4:=a1.a1;
+ else
+ a4:=a2.a2;
+ end;
+ return a4;
+
+
+end;
+
+
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+
+ var g:=1;
+ var d:=1;
+ if d = g then
+ var t:=5;
+ d:=x.a1;
+ else
+ t:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
--- /dev/null
+func f()
+ return -2;
+end;
--- /dev/null
+extern long f();
+return ( -2==f());
+
--- /dev/null
+
+func f()
+ return 1+2+3+4;
+end;
+
--- /dev/null
+extern long f();
+return (10==f());
+
--- /dev/null
+
+func f()
+ return 1+(2*3)+4;
+end;
+
--- /dev/null
+extern long f();
+return (11==f());
+
--- /dev/null
+
+func f()
+ return 1*2*3*4;
+end;
+
--- /dev/null
+extern long f();
+return (24==f());
+
--- /dev/null
+func f()
+ return (1*((-2)+5))+(-1)+(((-2)+2)*17)+3;
+end;
+
--- /dev/null
+extern long f();
+return (5==f());
+
--- /dev/null
+func f(x)
+ return x;
+end;
+
--- /dev/null
+extern long f(long);
+return (5==f((long)5));
+
--- /dev/null
+func f(x,y)
+ return x+y;
+end;
+
--- /dev/null
+extern long f(long, long);
+return (12==f(5,7));
+
--- /dev/null
+func f(x,y,z)
+ return x+y+1+z+1;
+end;
+
+func g(z)
+ return z+3;
+end;
+
--- /dev/null
+extern long f(long, long, long);
+extern long g(long);
+return (15==f(5,7,1) && 7==g(4));
+
--- /dev/null
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func g(a1)
+ var x := 5;
+ return x.a1;
+end;
+
--- /dev/null
+struct a b c end;
+
+func f(s,s)
+ return s.a+s.b;
+end;
+
--- /dev/null
+struct S {long a1; long a2; long a3;} s={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*);
+
+return ( 3==f((long*)&s, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s,s,s,s,t,s)
+ return s.a+s.b+t.c;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={10,20,30};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={10,20,30};
+struct D {long a1; long a2; long a3;} d={10,20,30};
+struct E {long a1; long a2; long a3;} e={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*,long*,long*,long*,long*);
+
+return ( 33==f((long*)&a, (long*)&b, (long*)&c, (long*)&d, (long*)&e, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s)
+ return s.a.a+((-3)*s.b.c)+s.c.b;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={1,2,3};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={100,200,300};
+struct S {long a1; long a2; long a3;} s={(long*)&a,(long*)&b,(long*)&c};
+extern long f(long*);
+
+return ( 111==f((long*)&s));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (-5==test(5));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (5==test(-5));
--- /dev/null
+func test(a, b)
+ return a + b;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 34==test(29,5));
--- /dev/null
+func test(a, b, c, d, e, f)
+ return a + b + c + d + e + f;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long,long,long,long,long);
+return ( 21==test(1,2,3,4,5,6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 + s2.a2 + s3.a3 + s4.a1 + s5.a2 + s6.a3 ;
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10+50+90+100+140+180)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 * s2.a2 * s3.a3 * s4.a1 * s5.a2 * s6.a3 ;
+end;
\ No newline at end of file
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10L*50L*90L*100L*140L*180L)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2)
+ return s1.a1 * s2.a2;
+end;
--- /dev/null
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+
+extern long test(long*,long*);
+
+return ( (10*50)==test((long*)&s1,(long*)&s2));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return (s1.a1 * s2.a2) + ( s3.a3 * s4.a1) +( s5.a2 * s6.a3 );
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( ((10L*50L)+(90L*100L)+(140L*180L))==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b * (a + b))))));
+end;
--- /dev/null
+struct f1 f2 end;\r
+\r
+func f(p1)\r
+ var fx:=p1;\r
+ p1:=1;\r
+ (* f1 not defined *)\r
+ f1:=4;\r
+ (* shoult throw one of\r
+ - f1 not defined\r
+ - field access not allowed (var fx exists)\r
+ - field fx not defined\r
+ *)\r
+ f1.fx:=p1;\r
+ p1.f1:=p1.f2;\r
+ f(p1,p1.f2).f3:=0AFFEH;\r
+ var f1:=3;\r
+end;\r
+\r
+struct f3 end;\r
--- /dev/null
+func test()\r
+ var v1:=1;\r
+ if 1=1 then\r
+ v1:=2;\r
+ var v2:=1;\r
+ end;\r
+\r
+ (* v2 not visible *)\r
+ v2:=3;\r
+end;\r
--- /dev/null
+struct f end;\r
+\r
+func x()\r
+ (* f is a field, not a variable *)\r
+ f := 4;\r
+end;\r
--- /dev/null
+\r
+func x()\r
+ var z:=3;\r
+ (* field feld not defined *)\r
+ z.feld:=x(4,5,a);\r
+ (* syntax error *)\r
+ return z+z*z;\r
+end;\r
--- /dev/null
+func g(x,y,z)
+ var res:=0;
+ res:=x;
+ while y>=0 or (not x=z) do
+ y:=y+(-1);
+ res:=res+z;
+ end;
+ return res;
+end;
+
+struct end;
+
+func f()
+ var off:=10 + (xx * 3);
+ var bound:= -test.c5;
+ var add:= g(test.c5) + 2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b)))));
+end;
--- /dev/null
+extern long test(long,long);
+return ((3 * 8) + (3 * 8 * ( 3 + 8 + ( 3 * 8 * ( 3 + 8 + ( 3 * 8 ))))) == test(3,8)) ;
--- /dev/null
+
+func test(a,b,c,d,e,f)
+ return (a * b) + ( c * d) + (e * f );
+end;
--- /dev/null
+
+extern long test(long,long, long, long, long, long);
+
+return ( ( 1 * 2 ) + (3 * 4) + ( 5 * 6 ) == test(1,2,3,4,5,6)) ;
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b)));
+end;
--- /dev/null
+
+extern long test(long,long);
+
+return ( ( 3 * 5 ) + ( 3 * 5 * (3 + 5 + ( 3 * 5))) == test(3,5)) ;
--- /dev/null
+func f()
+ var a := 1;
+ var b := 2;
+
+ c := 5;
+end;
--- /dev/null
+func f(x,y)
+ var a := 1;
+ var b := 2;
+ if a = b then
+ a := 3;
+ x := z;
+ end;
+ b := x;
+end;
--- /dev/null
+struct a b a end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+func f()
+ off := 7;
+ var off:=5;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ else
+ return x;
+ end;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var off:=10;
+ var bound:=5;
+ var add:=2;
+ if (1=1) then
+ var x :=17;
+ end;
+ return x;
+end;
+
--- /dev/null
+struct a b end;
+
+func f()
+ var s := 2;
+ s.c := 17;
+end;
--- /dev/null
+func test(a, b)
+ return a + 2 + ( 3 * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 2 + (3 * 4)==test(2,4));
--- /dev/null
+func test(a, b)
+ return a + b + ( a * b);
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 2 + 4 + (2 * 4)==test(2,4));
--- /dev/null
+func test()
+ return 1 + 2;
+end;
--- /dev/null
+extern long test ();
+return ( 3==test());
--- /dev/null
+func test()
+ return 1 * 2;
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 2==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 );
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 14==test());
--- /dev/null
+func test()
+ return 1 * 2 * ( 3 + 4 ) * ( 1 + 2 + 3 + ( 2 * 4 ));
+end;
\ No newline at end of file
--- /dev/null
+extern long test ();
+return ( 196==test());
--- /dev/null
+ .text
+ .globl f
+ .type f, @function
+f:
+ movq %rdi, %rax
+ movq 16(%rax), %rax
+ movq 8(%rax), %rax
+ movq %rdi, %r11
+ movq 8(%r11), %r11
+ movq 16(%r11), %r11
+ imulq $-3, %r11
+ addq %r11, %rax
+ movq %rdi, %r10
+ movq 0(%r10), %r10
+ movq 0(%r10), %r10
+ addq %r10, %rax
+ ret
--- /dev/null
+ .text
+ .globl f
+ .type f, @function
+f:
+ movq %rdi, %rax
+ movq 16(%rax), %rax
+ movq 8(%rax), %rax
+ movq %rdi, %r11
+ movq 8(%r11), %r11
+ movq 16(%r11), %r11
+ addq $-3, %r11
+ addq %r11, %rax
+ movq %rdi, %r10
+ movq 0(%r10), %r10
+ movq 0(%r10), %r10
+ addq %r10, %rax
+ ret
--- /dev/null
+func f1(a) if a=0 then return 0; else return 1; end; end;
--- /dev/null
+extern long f1(long a);
+
+return f1(0)==0 && f1(1)==1 && f1(2)==1;
+
--- /dev/null
+func f10(a) if (not (not (not (a=0)))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f10(long a);
+
+return f10(0)==1 && f10(1)==0 && f10(2)==0;
+
--- /dev/null
+func f2(a) if a=0 or a=1 then return 0; else return 1; end; end;
--- /dev/null
+extern long f2(long a);
+
+return f2(0)==0 && f2(1)==0 && f2(2)==1;
+
--- /dev/null
+func f3(a) if not (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f3(long a);
+
+return f3(0)==1 && f3(1)==0 && f3(2)==0;
+
--- /dev/null
+func f4(a) if (a=0) then return 0; else return 1; end; end;
--- /dev/null
+extern long f4(long a);
+
+return f4(0)==0 && f4(1)==1 && f4(2)==1;
+
--- /dev/null
+func f5(a) if (a=0 or a=1) then return 0; else return 1; end; end;
--- /dev/null
+extern long f5(long a);
+
+return f5(0)==0 && f5(1)==0 && f5(2)==1;
+
--- /dev/null
+func f6(a) if (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f6(long a);
+
+return f6(0)==1 && f6(1)==0 && f6(2)==0;
+
--- /dev/null
+func f7(a) if not (not (a=0)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f7(long a);
+
+return f7(0)==0 && f7(1)==1 && f7(2)==1;
+
--- /dev/null
+func f8(a) if not (not (a=0 or a=1)) then return 0; else return 1; end; end;
--- /dev/null
+extern long f8(long a);
+
+return f8(0)==0 && f8(1)==0 && f8(2)==1;
+
--- /dev/null
+func f9(a) if not ((not (a=0)) or (not (a=1))) then return 0; else return 1; end; end;
--- /dev/null
+extern long f9(long a);
+
+return f9(0)==1 && f9(1)==1 && f9(2)==1;
+
--- /dev/null
+func fib(n)
+ if 1 >= n then return n; end;
+ var fib_n := 1; (* fib(n) *)
+ var fib_n1 := 0; (* fib(n-1) *)
+ var r := 0;
+
+ while n >= 2 do
+ (* calculate fib(n+1) *)
+ r := fib_n + fib_n1;
+ (* update fib(n-1) and fib(n) *)
+ fib_n1 := fib_n;
+ fib_n := r;
+ n := n + (-1);
+ end;
+ return r;
+end;
+
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+ (* fibonacci *)
+ func fib(x)
+ if not x >= 2 then
+ return x;
+ else
+ return fib(x+(-1))+fib(x+(-2));
+ end;
+ end;
+(* func main()
+ if not (fib(9)+(-fib(7))) = fib(8) then
+ return 1;
+ else
+ return 0;
+ end;
+ end;
+*)
--- /dev/null
+unsigned long fib(unsigned long n);
+
+return fib(7)+fib(8)==fib(9);
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a2 end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ a := x;
+end;
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a2 end;
+struct end;
+
--- /dev/null
+(* a2 wird 2 mal definiert *)
+struct end;
+struct a1 a2 a3 end;
+struct a4 a5 a2 end;
+struct end;
--- /dev/null
+func bla()
+abs.a1 := 100;
+ert.a1 := 200;
+end;
--- /dev/null
+func f(x, y)
+ if x = y then
+ var a := y;
+ a.t := x;
+ end;
+
+ (* zugriff auf a nicht mehr erlaubt *)
+ (* a := x; *)
+end;
+
+struct b end;
--- /dev/null
+func g1(a,b) if (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g1(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g1[2][2]={{1,1},{1,0}};
+
+return check_arg2(g1,ret_g1);
+
+
--- /dev/null
+func g10(a,b) if not (not ((not (a=0)) or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g10(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g10[2][2]={{1,0},{1,1}};
+
+return check_arg2(g10,ret_g10);
+
+
--- /dev/null
+func g11(a,b) if not (not (a=0 or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g11(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g11[2][2]={{1,1},{0,1}};
+
+return check_arg2(g11,ret_g11);
+
+
--- /dev/null
+func g12(a,b) if not (not ((not (a=0)) or (not (b=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g12(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g12[2][2]={{0,1},{1,1}};
+
+return check_arg2(g12,ret_g12);
+
+
--- /dev/null
+func g2(a,b) if ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g2(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g2[2][2]={{1,0},{1,1}};
+
+return check_arg2(g2,ret_g2);
+
+
--- /dev/null
+func g3(a,b) if (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g3(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g3[2][2]={{1,1},{0,1}};
+
+return check_arg2(g3,ret_g3);
+
+
--- /dev/null
+func g4(a,b) if ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g4(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g4[2][2]={{0,1},{1,1}};
+
+return check_arg2(g4,ret_g4);
+
+
--- /dev/null
+func g5(a,b) if not (a=0 or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g5(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g5[2][2]={{0,0},{0,1}};
+
+return check_arg2(g5,ret_g5);
+
+
--- /dev/null
+func g6(a,b) if not ((not (a=0)) or b=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long g6(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g6[2][2]={{0,1},{0,0}};
+
+return check_arg2(g6,ret_g6);
+
+
--- /dev/null
+func g7(a,b) if not (a=0 or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g7(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g7[2][2]={{0,0},{1,0}};
+
+return check_arg2(g7,ret_g7);
+
+
--- /dev/null
+func g8(a,b) if not ((not (a=0)) or (not (b=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long g8(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g8[2][2]={{1,0},{0,0}};
+
+return check_arg2(g8,ret_g8);
+
+
--- /dev/null
+func g9(a,b) if not (not (a=0 or b=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long g9(long a, long b);
+
+int check_arg2(long (*function)(long, long), long blubb[2][2]) {
+ int ret,a,b;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ ret&=(function(a,b)==blubb[a][b]);
+ }
+ }
+ return ret;
+}
+
+long ret_g9[2][2]={{1,1},{1,0}};
+
+return check_arg2(g9,ret_g9);
+
+
--- /dev/null
+func h1(a,b,c,d) if (a=0 or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h1(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h1[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h1,ret_h1);
+
--- /dev/null
+func h10(a,b,c,d) if not (((not (a=0)) or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h10(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h10[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,1}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h10,ret_h10);
+
--- /dev/null
+func h11(a,b,c,d) if not ((a=0 or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h11(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h11[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,1}},{{0,0},{0,0}}}};
+
+return check_arg4(h11,ret_h11);
+
--- /dev/null
+func h12(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h12(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h12[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,1},{0,0}}}};
+
+return check_arg4(h12,ret_h12);
+
--- /dev/null
+func h13(a,b,c,d) if not ((a=0 or b=0) or (c=0 or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h13(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h13[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{1,0}}}};
+
+return check_arg4(h13,ret_h13);
+
--- /dev/null
+func h14(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h14(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h14[2][2][2][2]={{{{0,0},{0,1}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h14,ret_h14);
+
--- /dev/null
+func h15(a,b,c,d) if not ((a=0 or b=0) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h15(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h15[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{1,0},{0,0}}}};
+
+return check_arg4(h15,ret_h15);
+
--- /dev/null
+func h16(a,b,c,d) if not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0)))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h16(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h16[2][2][2][2]={{{{1,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,0}}}};
+
+return check_arg4(h16,ret_h16);
+
--- /dev/null
+func h17(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h17(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h17[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,0}}}};
+
+return check_arg4(h17,ret_h17);
+
--- /dev/null
+func h18(a,b,c,d) if not (not (((not (a=0)) or b=0) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h18(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h18[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h18,ret_h18);
+
--- /dev/null
+func h19(a,b,c,d) if not (not ((a=0 or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h19(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h19[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h19,ret_h19);
+
--- /dev/null
+func h2(a,b,c,d) if ((not (a=0)) or b=0) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h2(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h2[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,0}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h2,ret_h2);
+
--- /dev/null
+func h20(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h20(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h20[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h20,ret_h20);
+
--- /dev/null
+func h21(a,b,c,d) if not (not ((a=0 or b=0) or (c=0 or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h21(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h21[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h21,ret_h21);
+
--- /dev/null
+func h22(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or (c=0 or d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h22(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h22[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h22,ret_h22);
+
--- /dev/null
+func h23(a,b,c,d) if not (not ((a=0 or b=0) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h23(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h23[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h23,ret_h23);
+
--- /dev/null
+func h24(a,b,c,d) if not (not (((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h24(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h24[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h24,ret_h24);
+
--- /dev/null
+func h3(a,b,c,d) if (a=0 or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h3(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h3[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,0}},{{1,1},{1,1}}}};
+
+return check_arg4(h3,ret_h3);
+
--- /dev/null
+func h4(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h4(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h4[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,0},{1,1}}}};
+
+return check_arg4(h4,ret_h4);
+
--- /dev/null
+func h5(a,b,c,d) if (a=0 or b=0) or (c=0 or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h5(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h5[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{0,1}}}};
+
+return check_arg4(h5,ret_h5);
+
--- /dev/null
+func h6(a,b,c,d) if ((not (a=0)) or (not (b=0))) or (c=0 or d=0) then return 1; else return 0; end; end;
--- /dev/null
+extern long h6(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h6[2][2][2][2]={{{{1,1},{1,0}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h6,ret_h6);
+
--- /dev/null
+func h7(a,b,c,d) if (a=0 or b=0) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h7(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h7[2][2][2][2]={{{{1,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{0,1},{1,1}}}};
+
+return check_arg4(h7,ret_h7);
+
--- /dev/null
+func h8(a,b,c,d) if ((not (a=0)) or (not (b=0))) or ((not (c=0)) or (not (d=0))) then return 1; else return 0; end; end;
--- /dev/null
+extern long h8(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h8[2][2][2][2]={{{{0,1},{1,1}},{{1,1},{1,1}}},{{{1,1},{1,1}},{{1,1},{1,1}}}};
+
+return check_arg4(h8,ret_h8);
+
--- /dev/null
+func h9(a,b,c,d) if not ((a=0 or b=0) or (c=0 or d=0)) then return 1; else return 0; end; end;
--- /dev/null
+extern long h9(long a, long b, long c, long d);
+
+int check_arg4(long (*function)(long, long, long, long), long blubb[2][2][2][2]) {
+ int ret,a,b,c,d;
+ ret=1;
+ for(a=0;a<2;a++) {
+ for(b=0;b<2;b++) {
+ for(c=0;c<2;c++) {
+ for(d=0;d<2;d++) {
+ ret&=(function(a,b,c,d)==blubb[a][b][c][d]);
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+long ret_h9[2][2][2][2]={{{{0,0},{0,0}},{{0,0},{0,0}}},{{{0,0},{0,0}},{{0,0},{0,1}}}};
+
+return check_arg4(h9,ret_h9);
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+
+struct a1 a2 a3 end;
+
+(* ein Name darf nur einmal im Programm als Feldname definiert werden:
+ * a2, a3 werden hier nochmals definiert *)
+struct b1 a2 a3 end;
+
--- /dev/null
+struct a1 a2 a1 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+end;
--- /dev/null
+func g(x,y)
+ y:=0;
+ return y+z;
+end;
+
--- /dev/null
+func g(x,y)
+ y:=0;
+ z:=5;
+ return y;
+end;
+
--- /dev/null
+(*no se si esto de verdad deberia de dar erro :) ahora si*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ var e:=5;
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return e;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ if x = y then
+ return a;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.d2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.c1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func f(x,y)
+ if x = y then
+ return x;
+ end;
+
+ var a:=0;
+ var b := (y+8);
+ var c := y.b2;
+ if b = c then
+ a:=x.a1;
+ else
+ a:=x.a2;
+ end;
+ return a;
+ var d:=1;
+ if d = a then
+ a:=3;
+ end;
+ return a;
+end;
+
+struct c1 c2 c3 end;
+struct b1 b2 b3 end;
--- /dev/null
+(*esto si deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.b2;
+
+
+ return d;
+end;
+
+
+
--- /dev/null
+(*esto no deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+ d:=x.a2;
+
+
+ return d;
+end;
+
+
+struct b1 b2 b3 end;
+
+
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.b2;
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar erro g no esta definida*)
+ var d:=1;
+ if d = g then
+ d:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return d;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+ var a:=1;
+ a:=x.f1;
+
+ return a;
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+ var d:=1;
+
+ var c:=1;
+ d:=x.a2;
+ return d;
+
+(*esto deberia de dar error t no visible*)
+ var d:=1;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ d:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
+struct b1 b2 b3 end;
+
+(*un comentario*)
+
+
+func f(x,y)
+
+ var g:=8;
+ if d = g then
+ var t:=5;
+ t:=x.a1;
+ else
+ g:=x.a2;
+ end;
+ return g;
+
+end;
+
+struct c1 c2 c3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
+struct f1 f2 d3 end;
+
+func f(z)
+ var d:=1;
+ d:=z.b2;
+
+
+ return d;
+end;
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 a4 end;
+
+func f(a1,a2)
+
+ var a3:=1;
+ var a4:=1;
+ a4:=a2.a2;
+ return a1;
+
+(*esto deberia de dar error t no visible*)
+ if a1 = a3 then
+ a4:=a1.a1;
+ else
+ a4:=a2.a2;
+ end;
+ return a4;
+
+
+end;
+
+
+
--- /dev/null
+(*esto deberia de dar erro*)
+struct a1 a2 a3 end;
+
+func f(x,y)
+
+ var g:=1;
+ var d:=1;
+ if d = g then
+ var t:=5;
+ d:=x.a1;
+ else
+ t:=x.a2;
+ end;
+ return t;
+
+
+end;
+
+
--- /dev/null
+func f()
+ return -2;
+end;
--- /dev/null
+extern long f();
+return ( -2==f());
+
--- /dev/null
+
+func f()
+ return 1+2+3+4;
+end;
+
--- /dev/null
+extern long f();
+return (10==f());
+
--- /dev/null
+
+func f()
+ return 1+(2*3)+4;
+end;
+
--- /dev/null
+extern long f();
+return (11==f());
+
--- /dev/null
+
+func f()
+ return 1*2*3*4;
+end;
+
--- /dev/null
+extern long f();
+return (24==f());
+
--- /dev/null
+func f()
+ return (1*((-2)+5))+(-1)+(((-2)+2)*17)+3;
+end;
+
--- /dev/null
+extern long f();
+return (5==f());
+
--- /dev/null
+func f(x)
+ return x;
+end;
+
--- /dev/null
+extern long f(long);
+return (5==f((long)5));
+
--- /dev/null
+func f(x,y)
+ return x+y;
+end;
+
--- /dev/null
+extern long f(long, long);
+return (12==f(5,7));
+
--- /dev/null
+func f(x,y,z)
+ return x+y+1+z+1;
+end;
+
+func g(z)
+ return z+3;
+end;
+
--- /dev/null
+extern long f(long, long, long);
+extern long g(long);
+return (15==f(5,7,1) && 7==g(4));
+
--- /dev/null
+struct a1 a2 a3 end;
+struct b1 b2 b3 end;
+
+func g(a1)
+ var x := 5;
+ return x.a1;
+end;
+
--- /dev/null
+struct a b c end;
+
+func f(s,s)
+ return s.a+s.b;
+end;
+
--- /dev/null
+struct S {long a1; long a2; long a3;} s={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*);
+
+return ( 3==f((long*)&s, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s,s,s,s,t,s)
+ return s.a+s.b+t.c;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={10,20,30};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={10,20,30};
+struct D {long a1; long a2; long a3;} d={10,20,30};
+struct E {long a1; long a2; long a3;} e={10,20,30};
+struct T {long a1; long a2; long a3;} t={1,2,3};
+extern long f(long*,long*,long*,long*,long*,long*);
+
+return ( 33==f((long*)&a, (long*)&b, (long*)&c, (long*)&d, (long*)&e, (long*)&t));
--- /dev/null
+struct a b c end;
+
+func f(s)
+ return s.a.a+((-3)*s.b.c)+s.c.b;
+end;
+
--- /dev/null
+struct A {long a1; long a2; long a3;} a={1,2,3};
+struct B {long a1; long a2; long a3;} b={10,20,30};
+struct C {long a1; long a2; long a3;} c={100,200,300};
+struct S {long a1; long a2; long a3;} s={(long*)&a,(long*)&b,(long*)&c};
+extern long f(long*);
+
+return ( 111==f((long*)&s));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (-5==test(5));
--- /dev/null
+func test(a)
+ return -a;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long);
+return (5==test(-5));
--- /dev/null
+func test(a, b)
+ return a + b;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long);
+return ( 34==test(29,5));
--- /dev/null
+func test(a, b, c, d, e, f)
+ return a + b + c + d + e + f;
+end;
\ No newline at end of file
--- /dev/null
+extern long test (long,long,long,long,long,long);
+return ( 21==test(1,2,3,4,5,6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 + s2.a2 + s3.a3 + s4.a1 + s5.a2 + s6.a3 ;
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10+50+90+100+140+180)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return s1.a1 * s2.a2 * s3.a3 * s4.a1 * s5.a2 * s6.a3 ;
+end;
\ No newline at end of file
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( (10L*50L*90L*100L*140L*180L)==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2)
+ return s1.a1 * s2.a2;
+end;
--- /dev/null
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+
+extern long test(long*,long*);
+
+return ( (10*50)==test((long*)&s1,(long*)&s2));
--- /dev/null
+struct a1 a2 a3 end;
+
+func test(s1,s2,s3,s4,s5,s6)
+ return (s1.a1 * s2.a2) + ( s3.a3 * s4.a1) +( s5.a2 * s6.a3 );
+end;
--- /dev/null
+
+typedef struct S {long a1; long a2; long a3;} S_t;
+S_t s1 ={10,20,30};
+S_t s2 ={40,50,60};
+S_t s3 ={70,80,90};
+S_t s4 ={100,110,120};
+S_t s5 ={130,140,150};
+S_t s6 ={160,170,180};
+
+extern long test(long*,long*, long*, long*, long*, long*);
+
+return ( ((10L*50L)+(90L*100L)+(140L*180L))==test((long*)&s1,(long*)&s2,(long*)&s3,(long*)&s4,(long*)&s5,(long*)&s6));
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b * (a + b))))));
+end;
--- /dev/null
+struct f1 f2 end;\r
+\r
+func f(p1)\r
+ var fx:=p1;\r
+ p1:=1;\r
+ (* f1 not defined *)\r
+ f1:=4;\r
+ (* shoult throw one of\r
+ - f1 not defined\r
+ - field access not allowed (var fx exists)\r
+ - field fx not defined\r
+ *)\r
+ f1.fx:=p1;\r
+ p1.f1:=p1.f2;\r
+ f(p1,p1.f2).f3:=0AFFEH;\r
+ var f1:=3;\r
+end;\r
+\r
+struct f3 end;\r
--- /dev/null
+func test()\r
+ var v1:=1;\r
+ if 1=1 then\r
+ v1:=2;\r
+ var v2:=1;\r
+ end;\r
+\r
+ (* v2 not visible *)\r
+ v2:=3;\r
+end;\r
--- /dev/null
+struct f end;\r
+\r
+func x()\r
+ (* f is a field, not a variable *)\r
+ f := 4;\r
+end;\r
--- /dev/null
+\r
+func x()\r
+ var z:=3;\r
+ (* field feld not defined *)\r
+ z.feld:=x(4,5,a);\r
+ (* syntax error *)\r
+ return z+z*z;\r
+end;\r
--- /dev/null
+func g(x,y,z)
+ var res:=0;
+ res:=x;
+ while y>=0 or (not x=z) do
+ y:=y+(-1);
+ res:=res+z;
+ end;
+ return res;
+end;
+
+struct end;
+
+func f()
+ var off:=10 + (xx * 3);
+ var bound:= -test.c5;
+ var add:= g(test.c5) + 2;
+ return g(off,bound,add);
+end;
+
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b * ( a + b + ( a * b)))));
+end;
--- /dev/null
+extern long test(long,long);
+return ((3 * 8) + (3 * 8 * ( 3 + 8 + ( 3 * 8 * ( 3 + 8 + ( 3 * 8 ))))) == test(3,8)) ;
--- /dev/null
+
+func test(a,b,c,d,e,f)
+ return (a * b) + ( c * d) + (e * f );
+end;
--- /dev/null
+
+extern long test(long,long, long, long, long, long);
+
+return ( ( 1 * 2 ) + (3 * 4) + ( 5 * 6 ) == test(1,2,3,4,5,6)) ;
--- /dev/null
+
+func test(a,b)
+ return (a * b) + ( a * b * ( a + b + ( a * b)));
+end;
--- /dev/null
+
+extern long test(long,long);
+
+return ( ( 3 * 5 ) + ( 3 * 5 * (3 + 5 + ( 3 * 5))) == test(3,5)) ;
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "tree.h"
+#include "code_gen.h"
+
+/* new_node: create "standard node" with one or two children and
+ * given operation
+ */
+treenode *new_node(int op, treenode *left, treenode *right) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_node_value: create "standard node" with one or two children and
+ * given operation and the given value
+ */
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_node: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=(char *)NULL;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_leaf: create leaf - node with no children */
+treenode *new_leaf(int op) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_leaf: %i (%s)\n",op,rule_names[op]);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=(char *)NULL;
+
+ return new;
+}
+
+/* new_named_leaf: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf(int op, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+/* new_named_leaf_value: create leaf with name (used for identifier or
+ * value of number)
+ */
+treenode *new_named_leaf_value(int op, char *name, long value, int param) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_leaf_value: %i (%s), %s, %li\n",op,rule_names[op],name,value);
+#endif
+
+ new->kids[0]=(treenode *)NULL;
+ new->kids[1]=(treenode *)NULL;
+ new->op=op;
+ new->name=name;
+ new->value=value;
+ new->param_index=param;
+
+ return new;
+}
+
+/* new_named_node: create node with one or two children and a name (can be
+ * used for storing a procedure's name)
+ */
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name) {
+ treenode *new=(treenode *)malloc(sizeof(treenode));
+
+#ifdef DEBUG
+ printf("new_named_node: %i (%s), %s\n",op,rule_names[op],name);
+#endif
+
+ new->kids[0]=left;
+ new->kids[1]=right;
+ new->op=op;
+ new->name=name;
+
+ return new;
+}
+
+void write_indent(int indent) {
+ int a;
+ for(a=0;a<indent;a++) {
+ printf("|");
+ }
+}
+
+/* write_tree: display the tree generated by the attributed grammar; this tree willk
+ * be traversed by iburg
+ */
+void write_tree(treenode *node, int indent) {
+ write_indent(indent);
+ printf("%s, %s, %s\n",rule_names[node->op],node->name,node->reg);
+ if(node->kids[0]!=(treenode *)NULL || node->kids[1]!=(treenode *)NULL) {
+ if(node->kids[0]!=(treenode *)NULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1]!=(treenode *)NULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+ }
+}
+
+treenode *new_number_leaf(long value) {
+ treenode *node;
+
+ if(value==0) {
+ node=new_leaf(OP_Zero);
+ }
+ else if(value==1) {
+ node=new_leaf(OP_One);
+ }
+ else {
+ node=new_leaf(OP_Number);
+ }
+
+ node->value=value;
+
+ return node;
+}
+
--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call,
+ OP_Assign,
+ OP_If,
+ OP_Stats,
+ OP_Empty,
+ OP_Ifstats,
+ OP_While,
+ OP_CallNoParam,
+ OP_Arg
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call",
+ "OP_Assign",
+ "OP_If",
+ "OP_Stats",
+ "OP_Empty",
+ "OP_Ifstats",
+ "OP_While",
+ "OP_CallNoParam",
+ "OP_Arg"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+ int param_index; /* -1 if not a parameter */
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value, int param);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+