From 929eb4ea2a597fa997c0e78cd342d1df399b022f Mon Sep 17 00:00:00 2001 From: Daniel Holden Date: Wed, 16 Oct 2013 14:38:37 +0100 Subject: [PATCH] Fixed some of the regex behaviour --- mpc.c | 55 +++++++++++++++++++++++++++++++++++-------------------- mpc.h | 2 ++ 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/mpc.c b/mpc.c index 3f141de..80bddf0 100644 --- a/mpc.c +++ b/mpc.c @@ -1907,9 +1907,7 @@ static mpc_val_t* mpc_re_fold_many(mpc_val_t* t, mpc_val_t* x) { static mpc_val_t* mpc_re_escape(mpc_val_t* x) { - printf("Unescaped '%s'\n", (char*)x); char* s = mpcf_unescape(x); - printf("Escaped '%s'\n", s); mpc_parser_t* p; /* Regex Special Characters */ @@ -1941,22 +1939,25 @@ static mpc_val_t* mpc_re_escape(mpc_val_t* x) { static mpc_val_t* mpc_re_range(mpc_val_t* x) { - char* s = mpcf_unescape(x); + char* unescaped = mpcf_unescape(x); + char* s = unescaped; int i; int comp = 0; char* range; char start, end; - char buff[3]; + char buff[2]; mpc_parser_t* p; - - if (*s == '\0') { free(s); return mpc_failf("Invalid Regex Range Specifier '%s'", s); } + + /* TODO: Print Escaped String */ + if (*s == '\0') { free(unescaped); return mpc_failf("Invalid Regex Range Specifier '%s'", s); } if (*s == '^') { comp = 1; s++; } - - if (*s == '\0') { free(s); return mpc_failf("Invalid Regex Range Specifier '%s'", s); } + + /* TODO: Print Escaped String */ + if (*s == '\0') { free(unescaped); return mpc_failf("Invalid Regex Range Specifier '%s'", s); } range = calloc(1, 1); @@ -1965,7 +1966,7 @@ static mpc_val_t* mpc_re_range(mpc_val_t* x) { if (*s == '\\') { if (*(s+1) == '\0') { break; } range = realloc(range, strlen(range) + 2); - buff[0] = *(s+0); buff[1] = *(s+1); buff[2] = '\0'; + buff[0] = *(s+1); buff[1] = '\0'; strcat(range, buff); s++; } @@ -2000,7 +2001,7 @@ static mpc_val_t* mpc_re_range(mpc_val_t* x) { p = (comp ? mpc_noneof(range) : mpc_oneof(range)); free(range); - free(s); + free(unescaped); return p; } @@ -2275,6 +2276,8 @@ mpc_val_t* mpcf_maths(int n, mpc_val_t** xs) { */ static void mpc_print_unretained(mpc_parser_t* p, int force) { + + /* TODO: Print Everything Escaped */ int i; char *s, *e; @@ -2558,6 +2561,13 @@ void mpc_ast_add_child(mpc_ast_t* r, mpc_ast_t* a) { r->children[r->children_num-1] = a; } + +void mpc_ast_add_tag(mpc_ast_t* a, const char* t) { + a->tag = realloc(a->tag, strlen(t) + 1 + strlen(a->tag) + 1); + memmove(a->tag + strlen(t) + 1, a->tag, strlen(a->tag)+1); + memmove(a->tag, t, strlen(t)); + memmove(a->tag + strlen(t), "|", 1); +} void mpc_ast_tag(mpc_ast_t* a, const char* t) { a->tag = realloc(a->tag, strlen(t) + 1); @@ -2589,7 +2599,7 @@ void mpc_ast_print(mpc_ast_t* a) { mpc_val_t* mpcf_fold_ast(mpc_val_t* a, mpc_val_t* b) { int i; - mpc_ast_t* r = mpc_ast_new("", ""); + mpc_ast_t* r = mpc_ast_new(">", ""); mpc_ast_t* x = a; mpc_ast_t* y = b; @@ -2631,10 +2641,19 @@ mpc_val_t* mpcf_apply_str_ast(mpc_val_t* c) { static mpc_val_t* mpcf_apply_tag(mpc_val_t* x, void* d) { mpc_ast_tag(x, d); return x; +} + +static mpc_val_t* mpcf_apply_add_tag(mpc_val_t* x, void* d) { + mpc_ast_add_tag(x, d); + return x; } mpc_parser_t* mpca_tag(mpc_parser_t* a, const char* t) { return mpc_apply_to(a, mpcf_apply_tag, (void*)t); +} + +mpc_parser_t* mpca_add_tag(mpc_parser_t* a, const char* t) { + return mpc_apply_to(a, mpcf_apply_add_tag, (void*)t); } mpc_parser_t* mpca_not(mpc_parser_t* a) { return mpc_not(a, (mpc_dtor_t)mpc_ast_delete); } @@ -2855,15 +2874,13 @@ static mpc_val_t* mpca_grammar_apply_id(mpc_val_t* x, void* y) { free(x); if (p->name) { - return mpc_apply(mpca_tag(p, p->name), (mpc_apply_t)mpc_ast_insert_root); + return mpc_apply(mpca_add_tag(p, p->name), (mpc_apply_t)mpc_ast_insert_root); } else { return mpc_apply(p, (mpc_apply_t)mpc_ast_insert_root); } } -static mpc_val_t* mpcf_make_root(mpc_val_t* x) { return mpca_tag(x, "root"); } - mpc_parser_t* mpca_grammar_st(const char* grammar, mpca_grammar_st_t* st) { char* err_msg; @@ -2877,7 +2894,7 @@ mpc_parser_t* mpca_grammar_st(const char* grammar, mpca_grammar_st_t* st) { Base = mpc_new("base"); mpc_define(GrammarTotal, - mpc_apply(mpc_predictive(mpc_total(Grammar, mpc_soft_delete)), mpcf_make_root) + mpc_predictive(mpc_total(Grammar, mpc_soft_delete)) ); mpc_define(Grammar, mpc_also( @@ -3038,14 +3055,12 @@ static mpc_err_t* mpca_lang_st(mpc_input_t* i, mpca_grammar_st_t* st) { free, free, mpc_soft_delete )); - mpc_define(Grammar, mpc_apply( - mpc_also( + mpc_define(Grammar, mpc_also( Term, mpc_maybe(mpc_also(mpc_sym("|"), Grammar, free, mpcf_snd_free)), mpc_soft_delete, - mpca_grammar_fold_or), - mpcf_make_root - )); + mpca_grammar_fold_or) + ); mpc_define(Term, mpc_many_else(Factor, mpca_grammar_fold_many, mpca_grammar_lift)); diff --git a/mpc.h b/mpc.h index a276c02..840d1f9 100644 --- a/mpc.h +++ b/mpc.h @@ -249,6 +249,7 @@ mpc_ast_t* mpc_ast_build(int n, const char* tag, ...); mpc_ast_t* mpc_ast_insert_root(mpc_ast_t* a); void mpc_ast_add_child(mpc_ast_t* r, mpc_ast_t* a); +void mpc_ast_add_tag(mpc_ast_t* a, const char* t); void mpc_ast_tag(mpc_ast_t* a, const char* t); void mpc_ast_print(mpc_ast_t* a); int mpc_ast_eq(mpc_ast_t* a, mpc_ast_t* b); @@ -258,6 +259,7 @@ mpc_val_t* mpcf_afold_ast(int n, mpc_val_t** as); mpc_val_t* mpcf_apply_str_ast(mpc_val_t* c); mpc_parser_t* mpca_tag(mpc_parser_t* a, const char* t); +mpc_parser_t* mpca_add_tag(mpc_parser_t* a, const char* t); mpc_parser_t* mpca_total(mpc_parser_t* a); mpc_parser_t* mpca_not(mpc_parser_t* a); mpc_parser_t* mpca_maybe(mpc_parser_t* a);