From 066286f9803380fd892f3fac9da14b1963c9f52a Mon Sep 17 00:00:00 2001 From: setanta Date: Wed, 23 Jan 2008 13:32:33 +0000 Subject: [PATCH] Iniciado trabalho com llvm_codegen_visitor. git-svn-id: https://toypasc.googlecode.com/svn/trunk@48 cbd757d2-8441-0410-81db-47b75ec2d254 --- base.c | 8 +- base.h | 2 +- c_codegen_visitor.c | 35 +++--- c_codegen_visitor.h | 3 +- graphprinter_visitor.c | 4 +- c_codegen_visitor.c => llvm_codegen_visitor.c | 149 +++++++++++++------------- llvm_codegen_visitor.h | 60 +++++++---- parser.y | 13 ++- pascal/sample2.pas | 12 ++- simpleprinter_visitor.c | 2 +- symbol_table.c | 2 +- typecheck_visitor.c | 15 ++- 12 files changed, 161 insertions(+), 144 deletions(-) copy c_codegen_visitor.c => llvm_codegen_visitor.c (60%) rewrite llvm_codegen_visitor.h (84%) diff --git a/base.c b/base.c index c1c4270..3c0a171 100755 --- a/base.c +++ b/base.c @@ -32,14 +32,14 @@ type_get_lexeme(Type type) } void -value_print(Value *value, Type type) +value_print(FILE *file, Value *value, Type type) { if (type == INTEGER) { - printf("%d", value->integer); + fprintf(file, "%d", value->integer); } else if (type == BOOLEAN) { - printf("%s", value->boolean ? "true" : "false"); + fprintf(file, "%s", value->boolean ? "true" : "false"); } else if (type == CHAR) { - printf("'%c'", value->character); + fprintf(file, "'%c'", value->character); } } diff --git a/base.h b/base.h index 8d3eae2..49685b4 100755 --- a/base.h +++ b/base.h @@ -63,7 +63,7 @@ void value_set_from_int(Value *value, int val); void value_set_from_bool(Value *value, bool val); void value_set_from_char(Value *value, char val); -void value_print(Value *value, Type type); +void value_print(FILE *file, Value *value, Type type); #endif // BASE_H diff --git a/c_codegen_visitor.c b/c_codegen_visitor.c index 2b342a2..8034453 100644 --- a/c_codegen_visitor.c +++ b/c_codegen_visitor.c @@ -22,8 +22,8 @@ c_codegen_new() visitor->visit_vardecl = &c_codegen_visit_vardecl; visitor->visit_identifier_list = &c_codegen_visit_identifier_list; visitor->visit_procfunc_list = &c_codegen_visit_procfunc_list; - visitor->visit_procedure = &c_codegen_visit_procedure; - visitor->visit_function = &c_codegen_visit_function; + visitor->visit_procedure = &c_codegen_visit_procfunc; + visitor->visit_function = &c_codegen_visit_procfunc; visitor->visit_param_list = &c_codegen_visit_param_list; visitor->visit_parameter = &c_codegen_visit_parameter; visitor->visit_statement_list = &c_codegen_visit_statement_list; @@ -77,8 +77,8 @@ c_codegen_visit_programdecl(struct _Visitor *visitor, struct AstNode *node) printf("/* program "); ast_node_accept(node->children, visitor); printf("; */\n\n"); - printf("#include \n"); - printf("#ifndef FALSE\n#define FALSE\t0\n#endif\n"); + printf("#include \n\n"); + printf("#ifndef FALSE\n#define FALSE\t0\n#endif\n\n"); printf("#ifndef TRUE\n#define TRUE\t1\n#endif\n"); } @@ -108,18 +108,7 @@ c_codegen_visit_procfunc_list (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_procedure (struct _Visitor *visitor, struct AstNode *node) -{ - printf("void\n%s ()\n{\n", node->children->symbol->name); - printf(TAB"/* declaracoes */\n\n"); - - ast_node_accept(node->children, visitor); - - printf("}\n\n"); -} - -void -c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) +c_codegen_visit_procfunc (struct _Visitor *visitor, struct AstNode *node) { const char *type; struct AstNode *child; @@ -142,7 +131,8 @@ c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) printf(")\n{\n"); - printf(TAB"%s %s;\n", type, pf_name); + if (node->kind == FUNCTION) + printf(TAB"%s %s;\n", type, pf_name); if (child->kind == VARDECL_LIST) { ast_node_accept(child, visitor); @@ -153,7 +143,10 @@ c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) ast_node_accept(child, visitor); - printf("\n"TAB"return %s;\n}\n\n", pf_name); + if (node->kind == FUNCTION) + printf("\n"TAB"return %s;\n", pf_name); + printf("}\n\n"); + free(pf_name); } @@ -206,7 +199,7 @@ c_codegen_visit_literal (struct _Visitor *visitor, struct AstNode *node) if (node->type == BOOLEAN) { printf("%s", node->value.boolean ? "TRUE" : "FALSE"); } else - value_print(&node->value, node->type); + value_print(stdout, &node->value, node->type); } void @@ -334,6 +327,7 @@ c_codegen_visit_for_stmt (struct _Visitor *visitor, struct AstNode *node) child = child->sibling; // Statements ast_node_accept_children(child, visitor); + printf("\n"); _tab(node); printf("}\n"); } @@ -386,8 +380,9 @@ static char break; case CHAR: return "char"; + default: + return "void"; } - return "void"; } static char diff --git a/c_codegen_visitor.h b/c_codegen_visitor.h index 7cc3733..41cfe92 100644 --- a/c_codegen_visitor.h +++ b/c_codegen_visitor.h @@ -10,8 +10,7 @@ Visitor *c_codegen_new(); void c_codegen_visit_program (struct _Visitor *, struct AstNode *); void c_codegen_visit_programdecl (struct _Visitor *, struct AstNode *); void c_codegen_visit_procfunc_list (struct _Visitor *, struct AstNode *); -void c_codegen_visit_procedure(struct _Visitor *, struct AstNode *); -void c_codegen_visit_function(struct _Visitor *, struct AstNode *); +void c_codegen_visit_procfunc (struct _Visitor *, struct AstNode *); void c_codegen_visit_vardecl_list (struct _Visitor *, struct AstNode *); void c_codegen_visit_vardecl (struct _Visitor *, struct AstNode *); void c_codegen_visit_identifier_list (struct _Visitor *, struct AstNode *); diff --git a/graphprinter_visitor.c b/graphprinter_visitor.c index c8e06c8..fa86d5f 100644 --- a/graphprinter_visitor.c +++ b/graphprinter_visitor.c @@ -218,7 +218,7 @@ graphprinter_visit_literal (struct _Visitor *visitor, struct AstNode *node) { printf("\tnode_%x -> literal_%x;\n", node->parent, node); printf("\tliteral_%x [label=\"", node); - value_print(&node->value, node->type); + value_print(stdout, &node->value, node->type); printf("\",style=filled,color=\"#FFFFCC\"];\n"); ast_node_accept_children(node->children, visitor); } @@ -274,7 +274,7 @@ _print_graph(struct AstNode *self) self, self->symbol); } else if (strstr(self->name, "Literal")) { printf("\tliteral_%x [label=\"", self); - value_print(&self->value, self->type); + value_print(stdout, &self->value, self->type); printf("\",style=filled,color=\"#FFFFCC\"];\n"); printf("\tnode_%x -> literal_%x;\n", self, self); } diff --git a/c_codegen_visitor.c b/llvm_codegen_visitor.c similarity index 60% copy from c_codegen_visitor.c copy to llvm_codegen_visitor.c index 2b342a2..551c30f 100644 --- a/c_codegen_visitor.c +++ b/llvm_codegen_visitor.c @@ -1,7 +1,7 @@ #include #include #include -#include "c_codegen_visitor.h" +#include "llvm_codegen_visitor.h" static char *pf_name; static int tmp_var = 0; @@ -12,47 +12,47 @@ static char *_create_temporary(); static void _print_op_symbol(struct AstNode *node); Visitor * -c_codegen_new() +llvm_codegen_new() { Visitor *visitor = (Visitor *) malloc (sizeof(Visitor)); - visitor->visit_program = &c_codegen_visit_program; - visitor->visit_programdecl = &c_codegen_visit_programdecl; - visitor->visit_vardecl_list = &c_codegen_visit_vardecl_list; - visitor->visit_vardecl = &c_codegen_visit_vardecl; - visitor->visit_identifier_list = &c_codegen_visit_identifier_list; - visitor->visit_procfunc_list = &c_codegen_visit_procfunc_list; - visitor->visit_procedure = &c_codegen_visit_procedure; - visitor->visit_function = &c_codegen_visit_function; - visitor->visit_param_list = &c_codegen_visit_param_list; - visitor->visit_parameter = &c_codegen_visit_parameter; - visitor->visit_statement_list = &c_codegen_visit_statement_list; - visitor->visit_printint_stmt = &c_codegen_visit_printint_stmt; - visitor->visit_printchar_stmt = &c_codegen_visit_printchar_stmt; - visitor->visit_printbool_stmt = &c_codegen_visit_printbool_stmt; - visitor->visit_printline_stmt = &c_codegen_visit_printline_stmt; - visitor->visit_assignment_stmt = &c_codegen_visit_assignment_stmt; - visitor->visit_if_stmt = &c_codegen_visit_if_stmt; - visitor->visit_while_stmt = &c_codegen_visit_while_stmt; - visitor->visit_for_stmt = &c_codegen_visit_for_stmt; - visitor->visit_rel_expr = &c_codegen_visit_binary_expr; - visitor->visit_add_expr = &c_codegen_visit_binary_expr; - visitor->visit_mul_expr = &c_codegen_visit_binary_expr; - visitor->visit_notfactor = &c_codegen_visit_notfactor; - visitor->visit_call = &c_codegen_visit_call; - visitor->visit_callparam_list = &c_codegen_visit_callparam_list; - visitor->visit_identifier = &c_codegen_visit_identifier; - visitor->visit_literal = &c_codegen_visit_literal; - visitor->visit_add_op = &c_codegen_visit_binary_op; - visitor->visit_mul_op = &c_codegen_visit_binary_op; - visitor->visit_rel_op = &c_codegen_visit_binary_op; - visitor->visit_not_op = &c_codegen_visit_not_op; + visitor->visit_program = &llvm_codegen_visit_program; + visitor->visit_programdecl = &llvm_codegen_visit_programdecl; + visitor->visit_vardecl_list = &llvm_codegen_visit_vardecl_list; + visitor->visit_vardecl = &llvm_codegen_visit_vardecl; + visitor->visit_identifier_list = &llvm_codegen_visit_identifier_list; + visitor->visit_procfunc_list = &llvm_codegen_visit_procfunc_list; + visitor->visit_procedure = &llvm_codegen_visit_procfunc; + visitor->visit_function = &llvm_codegen_visit_procfunc; + visitor->visit_param_list = &llvm_codegen_visit_param_list; + visitor->visit_parameter = &llvm_codegen_visit_parameter; + visitor->visit_statement_list = &llvm_codegen_visit_statement_list; + visitor->visit_printint_stmt = &llvm_codegen_visit_printint_stmt; + visitor->visit_printchar_stmt = &llvm_codegen_visit_printchar_stmt; + visitor->visit_printbool_stmt = &llvm_codegen_visit_printbool_stmt; + visitor->visit_printline_stmt = &llvm_codegen_visit_printline_stmt; + visitor->visit_assignment_stmt = &llvm_codegen_visit_assignment_stmt; + visitor->visit_if_stmt = &llvm_codegen_visit_if_stmt; + visitor->visit_while_stmt = &llvm_codegen_visit_while_stmt; + visitor->visit_for_stmt = &llvm_codegen_visit_for_stmt; + visitor->visit_rel_expr = &llvm_codegen_visit_binary_expr; + visitor->visit_add_expr = &llvm_codegen_visit_binary_expr; + visitor->visit_mul_expr = &llvm_codegen_visit_binary_expr; + visitor->visit_notfactor = &llvm_codegen_visit_notfactor; + visitor->visit_call = &llvm_codegen_visit_call; + visitor->visit_callparam_list = &llvm_codegen_visit_callparam_list; + visitor->visit_identifier = &llvm_codegen_visit_identifier; + visitor->visit_literal = &llvm_codegen_visit_literal; + visitor->visit_add_op = &llvm_codegen_visit_binary_op; + visitor->visit_mul_op = &llvm_codegen_visit_binary_op; + visitor->visit_rel_op = &llvm_codegen_visit_binary_op; + visitor->visit_not_op = &llvm_codegen_visit_not_op; return visitor; } void -c_codegen_visit_program(struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_program(struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; @@ -72,25 +72,25 @@ c_codegen_visit_program(struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_programdecl(struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_programdecl(struct _Visitor *visitor, struct AstNode *node) { printf("/* program "); ast_node_accept(node->children, visitor); printf("; */\n\n"); - printf("#include \n"); - printf("#ifndef FALSE\n#define FALSE\t0\n#endif\n"); + printf("#include \n\n"); + printf("#ifndef FALSE\n#define FALSE\t0\n#endif\n\n"); printf("#ifndef TRUE\n#define TRUE\t1\n#endif\n"); } void -c_codegen_visit_vardecl_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_vardecl_list (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept_children(node->children, visitor); printf("\n"); } void -c_codegen_visit_identifier_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_identifier_list (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; @@ -102,24 +102,13 @@ c_codegen_visit_identifier_list (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_procfunc_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_procfunc_list (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept_children(node->children, visitor); } void -c_codegen_visit_procedure (struct _Visitor *visitor, struct AstNode *node) -{ - printf("void\n%s ()\n{\n", node->children->symbol->name); - printf(TAB"/* declaracoes */\n\n"); - - ast_node_accept(node->children, visitor); - - printf("}\n\n"); -} - -void -c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_procfunc (struct _Visitor *visitor, struct AstNode *node) { const char *type; struct AstNode *child; @@ -142,7 +131,8 @@ c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) printf(")\n{\n"); - printf(TAB"%s %s;\n", type, pf_name); + if (node->kind == FUNCTION) + printf(TAB"%s %s;\n", type, pf_name); if (child->kind == VARDECL_LIST) { ast_node_accept(child, visitor); @@ -153,12 +143,15 @@ c_codegen_visit_function (struct _Visitor *visitor, struct AstNode *node) ast_node_accept(child, visitor); - printf("\n"TAB"return %s;\n}\n\n", pf_name); + if (node->kind == FUNCTION) + printf("\n"TAB"return %s;\n", pf_name); + printf("}\n\n"); + free(pf_name); } void -c_codegen_visit_param_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_param_list (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; @@ -171,7 +164,7 @@ c_codegen_visit_param_list (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_statement_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_statement_list (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; @@ -183,34 +176,34 @@ c_codegen_visit_statement_list (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_binary_expr (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_binary_expr (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept_children(node->children, visitor); } void -c_codegen_visit_callparam_list (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_callparam_list (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept(node->children, visitor); } void -c_codegen_visit_identifier (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_identifier (struct _Visitor *visitor, struct AstNode *node) { printf("%s", node->symbol->name); } void -c_codegen_visit_literal (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_literal (struct _Visitor *visitor, struct AstNode *node) { if (node->type == BOOLEAN) { printf("%s", node->value.boolean ? "TRUE" : "FALSE"); } else - value_print(&node->value, node->type); + value_print(stdout, &node->value, node->type); } void -c_codegen_visit_vardecl (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_vardecl (struct _Visitor *visitor, struct AstNode *node) { const char *type = _get_type_string(node->type); @@ -220,13 +213,13 @@ c_codegen_visit_vardecl (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_parameter (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_parameter (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept(node->children, visitor); } void -c_codegen_visit_printint_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_printint_stmt (struct _Visitor *visitor, struct AstNode *node) { printf("printf(\"%%d\", "); ast_node_accept(node->children, visitor); @@ -234,7 +227,7 @@ c_codegen_visit_printint_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_printchar_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_printchar_stmt (struct _Visitor *visitor, struct AstNode *node) { printf("printf(\"%%c\", "); ast_node_accept(node->children, visitor); @@ -242,7 +235,7 @@ c_codegen_visit_printchar_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_printbool_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_printbool_stmt (struct _Visitor *visitor, struct AstNode *node) { printf("printf(\"%%s\", "); ast_node_accept(node->children, visitor); @@ -250,14 +243,14 @@ c_codegen_visit_printbool_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_printline_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_printline_stmt (struct _Visitor *visitor, struct AstNode *node) { printf("printf(\"\\n\");"); ast_node_accept(node->children, visitor); } void -c_codegen_visit_assignment_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_assignment_stmt (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept(node->children, visitor); printf(" = "); @@ -266,7 +259,7 @@ c_codegen_visit_assignment_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_if_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_if_stmt (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; const char *var; @@ -296,7 +289,7 @@ c_codegen_visit_if_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_while_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_while_stmt (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; const char *var; @@ -314,7 +307,7 @@ c_codegen_visit_while_stmt (struct _Visitor *visitor, struct AstNode *node) } void -c_codegen_visit_for_stmt (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_for_stmt (struct _Visitor *visitor, struct AstNode *node) { struct AstNode *child; const char *var; @@ -334,37 +327,38 @@ c_codegen_visit_for_stmt (struct _Visitor *visitor, struct AstNode *node) child = child->sibling; // Statements ast_node_accept_children(child, visitor); + printf("\n"); _tab(node); printf("}\n"); } void -c_codegen_visit_notfactor (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_notfactor (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept_children(node->children, visitor); } void -c_codegen_visit_call (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_call (struct _Visitor *visitor, struct AstNode *node) { printf("%s ();\n", node->symbol->name); ast_node_accept(node->children, visitor); } void -c_codegen_visit_simplenode (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_simplenode (struct _Visitor *visitor, struct AstNode *node) { ast_node_accept_children(node->children, visitor); } void -c_codegen_visit_binary_op (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_binary_op (struct _Visitor *visitor, struct AstNode *node) { _print_op_symbol(node); } void -c_codegen_visit_not_op (struct _Visitor *visitor, struct AstNode *node) +llvm_codegen_visit_not_op (struct _Visitor *visitor, struct AstNode *node) { printf(" !", node->name); } @@ -386,8 +380,9 @@ static char break; case CHAR: return "char"; + default: + return "void"; } - return "void"; } static char diff --git a/llvm_codegen_visitor.h b/llvm_codegen_visitor.h dissimilarity index 84% index c3eae0b..dc6606d 100644 --- a/llvm_codegen_visitor.h +++ b/llvm_codegen_visitor.h @@ -1,23 +1,37 @@ -#ifndef LLVM_CODEGEN_VISITOR_H -#define LLVM_CODEGEN_VISITOR_H - -#include "ast.h" - -Visitor *llvm_codegen_new(); - -void llvm_codegen_visit_program (struct AstNode *node); -void llvm_codegen_visit_programdecl (struct AstNode *node); -void llvm_codegen_visit_vardecl_list (struct AstNode *node); -void llvm_codegen_visit_identifier_list (struct AstNode *node); -void llvm_codegen_visit_procfunc_list (struct AstNode *node); -void llvm_codegen_visit_procfunc (struct AstNode *node); -void llvm_codegen_visit_param_list (struct AstNode *node); -void llvm_codegen_visit_statement_list (struct AstNode *node); -void llvm_codegen_visit_binary_expr (struct AstNode *node); -void llvm_codegen_visit_callparam_list (struct AstNode *node); -void llvm_codegen_visit_identifier (struct AstNode *node); -void llvm_codegen_visit_literal (struct AstNode *node); - -void llvm_codegen_visit_simplenode (struct AstNode *node); - -#endif // LLVM_CODEGEN_VISITOR_H +#ifndef LLVM_CODEGEN_VISITOR_H +#define LLVM_CODEGEN_VISITOR_H + +#include "ast.h" + +#define TAB " " + +Visitor *llvm_codegen_new(); + +void llvm_codegen_visit_program (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_programdecl (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_procfunc_list (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_procfunc (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_vardecl_list (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_vardecl (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_identifier_list (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_param_list (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_parameter (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_statement_list(struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_printint_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_printchar_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_printbool_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_printline_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_assignment_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_if_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_while_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_for_stmt (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_binary_expr (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_notfactor (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_call (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_callparam_list (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_identifier (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_literal (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_binary_op (struct _Visitor *, struct AstNode *); +void llvm_codegen_visit_not_op (struct _Visitor *, struct AstNode *); + +#endif // LLVM_CODEGEN_VISITOR_H diff --git a/parser.y b/parser.y index a564056..4970900 100755 --- a/parser.y +++ b/parser.y @@ -17,10 +17,9 @@ bool simple_flag = FALSE; bool graph_flag = FALSE; bool c_flag = FALSE; bool llvm_flag = FALSE; -char *output = NULL; +//char *output = NULL; int opts; -opterr = 0; /*extern char *yytext;*/ extern FILE *yyin; @@ -739,7 +738,9 @@ main (int argc, char **argv) { Visitor *visitor; - while ((opts = getopt (argc, argv, "sgclo:")) != -1) { + opterr = 0; + + while ((opts = getopt (argc, argv, "sgcl")) != -1) { switch (opts) { case 's': simple_flag = TRUE; @@ -753,7 +754,7 @@ main (int argc, char **argv) case 'l': llvm_flag = TRUE; break; - case 'o': + /*case 'o': output = optarg; break; case '?': @@ -765,6 +766,7 @@ main (int argc, char **argv) else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); + */ default: return 1; } @@ -775,9 +777,6 @@ main (int argc, char **argv) else yyin = stdin; - if (output != NULL) - stdout = fopen("/tmp/test", "w"); - /*yylloc.first_line = yylloc.last_line = 1; yylloc.first_column = yylloc.last_column = 0;*/ diff --git a/pascal/sample2.pas b/pascal/sample2.pas index 55a81c3..b05c3a9 100644 --- a/pascal/sample2.pas +++ b/pascal/sample2.pas @@ -4,16 +4,18 @@ var b: boolean; var c: char; var i, j: Integer; -{Procedure myproc (); +Procedure myproc (); var mp : boolean; Begin b := false; mp := not b; + { printint(i); printchar(c); + } printbool(mp); println() -End;} +End; function myfunc (a : integer, b : integer) : integer; var mf1, mf2 : boolean; @@ -29,6 +31,7 @@ Begin j := 0; b := not false or (13 <> j); + { while j <= 10 do begin printint(i); @@ -44,6 +47,11 @@ Begin for i := 2 * 3 to 10 + 1 do printint(i); + } + + myproc(); + j := myfunc(false, i); + printint(j); i := 70 + 80 * 5 + 3; i := 1 * 2 + 3 * 4 diff --git a/simpleprinter_visitor.c b/simpleprinter_visitor.c index 32a334a..5be9117 100644 --- a/simpleprinter_visitor.c +++ b/simpleprinter_visitor.c @@ -56,7 +56,7 @@ simpleprinter_visit(struct _Visitor *visitor, struct AstNode *node) printf("kind: %d\n", node->kind); printf("type: %d\n", node->type); printf("value: "); - value_print(&node->value, node->type); + value_print(stdout, &node->value, node->type); printf("\nlinenum: %d\n", node->linenum); if (node->symbol != NULL) printf("symbol: %x (\"%s\")\n", node->symbol, node->symbol->name); diff --git a/symbol_table.c b/symbol_table.c index c6f7abd..6bc1bf9 100755 --- a/symbol_table.c +++ b/symbol_table.c @@ -97,7 +97,7 @@ symbol_print(Symbol *symbol) printf("name: %s\n", symbol->name); printf("type: %d\n", symbol->type); printf("value:"); - value_print(&symbol->value, symbol->type); + value_print(stdout, &symbol->value, symbol->type); printf("\ndeclaration line: %d\n", symbol->decl_linenum); printf("next: %x\n\n", symbol->next); } diff --git a/typecheck_visitor.c b/typecheck_visitor.c index e5a8dd5..97ef103 100644 --- a/typecheck_visitor.c +++ b/typecheck_visitor.c @@ -300,9 +300,16 @@ typecheck_visit_callparam_list (struct _Visitor *visitor, struct AstNode *node) i = 0; for (temp = node->children; temp != NULL; temp = temp->sibling) { if (temp->type != procfunc_symbol->param_types[i]) { - fprintf(stderr, "Error: Call '%s' on line %d, expecting %s, received %s.\n", + fprintf(stderr, "Error: Call '%s' on line %d, expecting %s " + "on parameter %d (", procfunc_symbol->name, node->linenum, - type_get_lexeme(procfunc_symbol->param_types[i]), + type_get_lexeme(procfunc_symbol->param_types[i]), i+1); + if (temp->symbol != NULL) + fprintf(stderr, "'%s'", temp->symbol->name); + else + value_print(stderr, &temp->value, temp->type); + + fprintf(stderr, "), received %s.\n", type_get_lexeme(temp->type)); } @@ -360,7 +367,7 @@ typecheck_visit_identifier (struct _Visitor *visitor, struct AstNode *node) } if (node->parent->kind == CALLPARAM_LIST) { - int i; + /*int i; //procfunc_symbol->param_types[procfunc_symbol->params] = node->symbol->type; //procfunc_symbol->params++; fprintf(stderr, "Parameter: %s (%x)\n", @@ -370,7 +377,7 @@ typecheck_visit_identifier (struct _Visitor *visitor, struct AstNode *node) fprintf(stderr, "%d ", procfunc_symbol->param_types[procfunc_symbol->params]); } - fprintf(stderr, "\n"); + fprintf(stderr, "\n");*/ } } -- 2.11.4.GIT