output: emit include statement for header
This commit is contained in:
parent
fda24d9c22
commit
1bb22babd9
2 changed files with 21 additions and 1 deletions
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Reference in a new issue