Perliminary parser reworking, required for the proposed multithreading.

This commit is contained in:
Dale Weiler 2013-04-17 00:52:52 +00:00
parent b82efcf0ce
commit 1f0a1b8140
3 changed files with 32 additions and 30 deletions

11
gmqcc.h
View file

@ -1026,12 +1026,13 @@ qcint prog_tempstring(qc_program *prog, const char *_str);
/*===================================================================*/
/*===================== parser.c commandline ========================*/
/*===================================================================*/
struct parser_s;
bool parser_init ();
bool parser_compile_file (const char *);
bool parser_compile_string(const char *, const char *, size_t);
bool parser_finish (const char *);
void parser_cleanup ();
struct parser_s *parser_create ();
bool parser_compile_file (struct parser_s *parser, const char *);
bool parser_compile_string(struct parser_s *parser, const char *, const char *, size_t);
bool parser_finish (struct parser_s *parser, const char *);
void parser_cleanup (struct parser_s *parser);
/*===================================================================*/
/*====================== ftepp.c commandline ========================*/

23
main.c
View file

@ -546,12 +546,13 @@ static bool progs_nextline(char **out, size_t *alen,FILE *src) {
}
int main(int argc, char **argv) {
size_t itr;
int retval = 0;
bool opts_output_free = false;
bool operators_free = false;
bool progs_src = false;
FILE *outfile = NULL;
size_t itr;
int retval = 0;
bool opts_output_free = false;
bool operators_free = false;
bool progs_src = false;
FILE *outfile = NULL;
struct parser_s *parser = NULL;
app_name = argv[0];
con_init ();
@ -626,7 +627,7 @@ int main(int argc, char **argv) {
}
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
if (!parser_init()) {
if (!(parser = parser_create())) {
con_err("failed to initialize parser\n");
retval = 1;
goto cleanup;
@ -740,7 +741,7 @@ srcdone:
}
data = ftepp_get();
if (vec_size(data)) {
if (!parser_compile_string(items[itr].filename, data, vec_size(data))) {
if (!parser_compile_string(parser, items[itr].filename, data, vec_size(data))) {
retval = 1;
goto cleanup;
}
@ -748,7 +749,7 @@ srcdone:
ftepp_flush();
}
else {
if (!parser_compile_file(items[itr].filename)) {
if (!parser_compile_file(parser, items[itr].filename)) {
retval = 1;
goto cleanup;
}
@ -763,7 +764,7 @@ srcdone:
ftepp_finish();
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
if (!parser_finish(OPTS_OPTION_STR(OPTION_OUTPUT))) {
if (!parser_finish(parser, OPTS_OPTION_STR(OPTION_OUTPUT))) {
retval = 1;
goto cleanup;
}
@ -789,7 +790,7 @@ cleanup:
vec_free(ppems);
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY))
parser_cleanup();
parser_cleanup(parser);
if (opts_output_free)
mem_d(OPTS_OPTION_STR(OPTION_OUTPUT));
if (operators_free)

View file

@ -35,7 +35,7 @@
#define PARSER_HT_SIZE 128
#define TYPEDEF_HT_SIZE 16
typedef struct {
typedef struct parser_s {
lex_file *lex;
int tok;
@ -5911,16 +5911,15 @@ static void generate_checksum(parser_t *parser)
code_crc = crc;
}
static parser_t *parser;
bool parser_init()
parser_t *parser_create()
{
parser_t *parser;
lex_ctx empty_ctx;
size_t i;
parser = (parser_t*)mem_a(sizeof(parser_t));
if (!parser)
return false;
return NULL;
memset(parser, 0, sizeof(*parser));
@ -5933,7 +5932,7 @@ bool parser_init()
if (!parser->assign_op) {
printf("internal error: initializing parser: failed to find assign operator\n");
mem_d(parser);
return false;
return NULL;
}
vec_push(parser->variables, parser->htfields = util_htnew(PARSER_HT_SIZE));
@ -5969,10 +5968,11 @@ bool parser_init()
} else {
parser->reserved_version = NULL;
}
return true;
return parser;
}
bool parser_compile()
bool parser_compile(parser_t *parser)
{
/* initial lexer/parser state */
parser->lex->flags.noops = true;
@ -6004,27 +6004,27 @@ bool parser_compile()
return !compile_errors;
}
bool parser_compile_file(const char *filename)
bool parser_compile_file(parser_t *parser, const char *filename)
{
parser->lex = lex_open(filename);
if (!parser->lex) {
con_err("failed to open file \"%s\"\n", filename);
return false;
}
return parser_compile();
return parser_compile(parser);
}
bool parser_compile_string(const char *name, const char *str, size_t len)
bool parser_compile_string(parser_t *parser, const char *name, const char *str, size_t len)
{
parser->lex = lex_open_string(str, len, name);
if (!parser->lex) {
con_err("failed to create lexer for string \"%s\"\n", name);
return false;
}
return parser_compile();
return parser_compile(parser);
}
void parser_cleanup()
void parser_cleanup(parser_t *parser)
{
size_t i;
for (i = 0; i < vec_size(parser->accessors); ++i) {
@ -6100,7 +6100,7 @@ void parser_cleanup()
mem_d(parser);
}
bool parser_finish(const char *output)
bool parser_finish(parser_t *parser, const char *output)
{
size_t i;
ir_builder *ir;