output: emit include statement for header

This commit is contained in:
Matthias Schiffer 2015-04-06 20:34:12 +02:00
parent fda24d9c22
commit 1bb22babd9
2 changed files with 21 additions and 1 deletions

View file

@ -27,6 +27,7 @@
#include "output.hpp" #include "output.hpp"
#include <cerrno> #include <cerrno>
#include <cstring>
#include <system_error> #include <system_error>
@ -36,7 +37,8 @@ output_t::output_t(const generator_t *generator0, const char *header, const char
: prefix_str("parse_"), : prefix_str("parse_"),
token_prefix_str("TOK_"), token_prefix_str("TOK_"),
stack_size(100), stack_size(100),
generator(generator0) { generator(generator0),
header_filename(header) {
header_file = std::fopen(header, "w"); header_file = std::fopen(header, "w");
if (!header_file) if (!header_file)
throw std::system_error(errno, std::generic_category(), "unable to open header output file for writing"); throw std::system_error(errno, std::generic_category(), "unable to open header output file for writing");
@ -249,7 +251,22 @@ void output_t::emit_states() {
emit_state(i); emit_state(i);
} }
void output_t::emit_header_include() {
#ifdef _WIN32
const char sep = '\\';
#else
const char sep = '/';
#endif
const char *slash = std::strrchr(header_filename.c_str(), sep);
const char *basename = slash ? slash+1 : header_filename.c_str();
std::fprintf(source_file, "#include \"%s\"\n\n\n", basename);
}
void output_t::emit_source() { void output_t::emit_source() {
emit_header_include();
std::fprintf(source_file, "typedef union %ssymbol_value {\n", prefix()); std::fprintf(source_file, "typedef union %ssymbol_value {\n", prefix());
std::fprintf(source_file, "\t%stoken_value_t token;\n", prefix()); std::fprintf(source_file, "\t%stoken_value_t token;\n", prefix());

View file

@ -41,6 +41,8 @@ private:
const generator_t *generator; const generator_t *generator;
std::string header_filename;
std::FILE *header_file; std::FILE *header_file;
std::FILE *source_file; std::FILE *source_file;
@ -67,6 +69,7 @@ private:
void emit_state_reduce(const item_t &item, int rule_id); void emit_state_reduce(const item_t &item, int rule_id);
void emit_state(unsigned i); void emit_state(unsigned i);
void emit_states(); void emit_states();
void emit_header_include();
void emit_source(); void emit_source();
public: public: