begin getting ready to emit C

This commit is contained in:
Josh Holtrop 2018-05-20 15:42:16 -04:00
parent e1f1bbcbb8
commit 2d76d34bc7
4 changed files with 26 additions and 6 deletions

View File

@ -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)

View File

@ -11,21 +11,23 @@ std::unordered_set<std::string> 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;
}

View File

@ -10,9 +10,10 @@
extern std::unordered_set<std::string> 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

View File

@ -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($$);
}
;