diff --git a/src/main.cc b/src/main.cc index decda47..9730e4b 100644 --- a/src/main.cc +++ b/src/main.cc @@ -38,12 +38,20 @@ bool preprocess(const char * input_fname) return true; } +void emit_c(Node * node) +{ +} + int main(int argc, char * argv[]) { bool preprocess_successful = preprocess(argv[1]); if (preprocess_successful) { - parse(preprocessed_fname); + Node * node = parse(preprocessed_fname); + if (node != nullptr) + { + emit_c(node); + } } /* Clean up temporary files. */ if (preprocessed_fname_created) diff --git a/src/parser/parser.cc b/src/parser/parser.cc index 8ea59c9..de0bc86 100644 --- a/src/parser/parser.cc +++ b/src/parser/parser.cc @@ -11,21 +11,23 @@ std::unordered_set type_names; extern FILE * yyin; static const char * input_fname; +static Node * translation_unit_node = nullptr; -void parse(const char * filename) +Node * parse(const char * filename) { input_fname = filename; yyin = fopen(filename, "r"); if (yyin == NULL) { fprintf(stderr, "Error opening \"%s\"\n", filename); - return; + return nullptr; } if (yyparse() != 0) { fprintf(stderr, "Parsing error\n"); - return; + return nullptr; } + return translation_unit_node; } static char * read_file(const char * filename, size_t * length) @@ -253,3 +255,8 @@ bool is_type_name(const std::string & type_name) } return false; } + +void set_translation_unit_node(Node * _translation_unit_node) +{ + translation_unit_node = _translation_unit_node; +} diff --git a/src/parser/parser.h b/src/parser/parser.h index cf4f205..a6ded94 100644 --- a/src/parser/parser.h +++ b/src/parser/parser.h @@ -10,9 +10,10 @@ extern std::unordered_set type_names; -void parse(const char * filename); +Node * parse(const char * filename); void handle_parse_error(const char * str, const YYLTYPE * yylloc); void observe_type_name(const Node * node); bool is_type_name(const std::string & type_name); +void set_translation_unit_node(Node * _translation_unit_node); #endif diff --git a/src/parser/parser.yc b/src/parser/parser.yc index b07d0aa..7580f67 100644 --- a/src/parser/parser.yc +++ b/src/parser/parser.yc @@ -1225,11 +1225,15 @@ primary_expressions ; translation_unit - : external_declaration { $$ = $1; } + : external_declaration { + $$ = $1; + set_translation_unit_node($$); + } | translation_unit external_declaration { $$ = new Node(NODE_TYPE_LIST); $$->list->push_back($1); $$->list->push_back($2); + set_translation_unit_node($$); } ;