From 9c26b9593cbba6b26b90524e5a63b8d697219042 Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 13 Jan 2010 21:13:22 +0000 Subject: [PATCH] more nodes git-svn-id: svn://anubis/jtlc/trunk@15 f5bc74b8-7b62-4e90-9214-7121d538519f --- main/jtlc.cc | 5 ++++- nodes/Node.h | 12 ++++++++++++ parser/parser.yy | 30 +++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/main/jtlc.cc b/main/jtlc.cc index 7478bb4..6f65df4 100644 --- a/main/jtlc.cc +++ b/main/jtlc.cc @@ -1,6 +1,7 @@ #include /* tmpfile() */ #include /* exit() */ +#include /* unlink() */ #include #include "util/refptr.h" #include "parser/parser.h" @@ -42,8 +43,10 @@ int main(int argc, char * argv[]) void compile(const char * filename) { - FILE * out = tmpfile(); + string out_filename = string(filename) + ".c"; + FILE * out = fopen(out_filename.c_str(), "w"); refptr tree = parse(filename); tree->process(out); fclose(out); +// unlink(out_filename.c_str()); } diff --git a/nodes/Node.h b/nodes/Node.h index be14244..c51f0a4 100644 --- a/nodes/Node.h +++ b/nodes/Node.h @@ -33,6 +33,10 @@ class ArrayTypeNode : public Node { }; +class AssignExprNode : public Node +{ +}; + class CStatementNode : public Node { public: @@ -66,6 +70,10 @@ class ItemsNode : public Node { }; +class LValueNode : public Node +{ +}; + class PrimitiveTypeNode : public Node { public: @@ -76,6 +84,10 @@ class ProgramNode : public Node { }; +class ReturnStatementNode : public Node +{ +}; + class StringNode : public Node { public: diff --git a/parser/parser.yy b/parser/parser.yy index 2cf7828..bc9fdc7 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -93,6 +93,7 @@ static YYSTYPE parse_result; program: program_items { $$ = new ProgramNode(); $$->addChildren($1); + parse_result = $$; } ; @@ -241,24 +242,39 @@ type: primitive_type { } ; -statement: expression SEMICOLON - | return_statement +statement: expression SEMICOLON { + $$ = $1; + } + | return_statement { + $$ = $1; + } | c_statement { $$ = $1; } ; -return_statement: RETURN expression SEMICOLON +return_statement: RETURN expression SEMICOLON { + $$ = new ReturnStatementNode(); + $$->addChild($2); + } ; -expression: assign_expr +expression: assign_expr { + $$ = $1; + } ; -assign_expr: lvalue ASSIGN expression - | lvalue DASSIGN expression +assign_expr: lvalue ASSIGN expression { + $$ = new AssignExprNode(); + $$->addChild($1); + $$->addChild($3); + } ; -lvalue: IDENTIFIER +lvalue: IDENTIFIER { + $$ = new LValueNode(); + $$->addChild($1); + } ; c_statement: C LPAREN STRING_LITERAL RPAREN SEMICOLON {