Removed next char from state and moved it to error

This commit is contained in:
Daniel Holden
2014-04-15 14:37:13 +01:00
parent 28e50a3077
commit efabc31c06
2 changed files with 22 additions and 15 deletions

35
mpc.c
View File

@@ -6,7 +6,6 @@
static mpc_state_t mpc_state_invalid(void) { static mpc_state_t mpc_state_invalid(void) {
mpc_state_t s; mpc_state_t s;
s.next = '\0';
s.pos = -1; s.pos = -1;
s.row = -1; s.row = -1;
s.col = -1; s.col = -1;
@@ -15,7 +14,6 @@ static mpc_state_t mpc_state_invalid(void) {
static mpc_state_t mpc_state_new(void) { static mpc_state_t mpc_state_new(void) {
mpc_state_t s; mpc_state_t s;
s.next = '\0';
s.pos = 0; s.pos = 0;
s.row = 0; s.row = 0;
s.col = 0; s.col = 0;
@@ -32,7 +30,7 @@ static mpc_state_t *mpc_state_copy(mpc_state_t s) {
** Error Type ** Error Type
*/ */
static mpc_err_t *mpc_err_new(const char *filename, mpc_state_t s, const char *expected) { static mpc_err_t *mpc_err_new(const char *filename, mpc_state_t s, const char *expected, char recieved) {
mpc_err_t *x = malloc(sizeof(mpc_err_t)); mpc_err_t *x = malloc(sizeof(mpc_err_t));
x->filename = malloc(strlen(filename) + 1); x->filename = malloc(strlen(filename) + 1);
strcpy(x->filename, filename); strcpy(x->filename, filename);
@@ -42,6 +40,7 @@ static mpc_err_t *mpc_err_new(const char *filename, mpc_state_t s, const char *e
x->expected[0] = malloc(strlen(expected) + 1); x->expected[0] = malloc(strlen(expected) + 1);
strcpy(x->expected[0], expected); strcpy(x->expected[0], expected);
x->failure = NULL; x->failure = NULL;
x->recieved = recieved;
return x; return x;
} }
@@ -54,6 +53,7 @@ static mpc_err_t *mpc_err_fail(const char *filename, mpc_state_t s, const char *
x->expected = NULL; x->expected = NULL;
x->failure = malloc(strlen(failure) + 1); x->failure = malloc(strlen(failure) + 1);
strcpy(x->failure, failure); strcpy(x->failure, failure);
x->recieved = ' ';
return x; return x;
} }
@@ -180,7 +180,7 @@ char *mpc_err_string(mpc_err_t *x) {
} }
mpc_err_string_cat(buffer, &pos, &max, " at "); mpc_err_string_cat(buffer, &pos, &max, " at ");
mpc_err_string_cat(buffer, &pos, &max, mpc_err_char_unescape(x->state.next)); mpc_err_string_cat(buffer, &pos, &max, mpc_err_char_unescape(x->recieved));
mpc_err_string_cat(buffer, &pos, &max, "\n"); mpc_err_string_cat(buffer, &pos, &max, "\n");
return realloc(buffer, strlen(buffer) + 1); return realloc(buffer, strlen(buffer) + 1);
@@ -211,6 +211,8 @@ static mpc_err_t *mpc_err_or(mpc_err_t** x, int n) {
break; break;
} }
e->recieved = x[i]->recieved;
for (j = 0; j < x[i]->expected_num; j++) { for (j = 0; j < x[i]->expected_num; j++) {
if (!mpc_err_contains_expected(e, x[i]->expected[j])) { mpc_err_add_expected(e, x[i]->expected[j]); } if (!mpc_err_contains_expected(e, x[i]->expected[j])) { mpc_err_add_expected(e, x[i]->expected[j]); }
} }
@@ -503,10 +505,15 @@ static int mpc_input_failure(mpc_input_t *i, char c) {
} }
i->state.next = c;
return 0; return 0;
} }
static char mpc_input_peekc(mpc_input_t *i) {
char c = mpc_input_getc(i);
mpc_input_failure(i, c);
return c;
}
static int mpc_input_success(mpc_input_t *i, char c, char **o) { static int mpc_input_success(mpc_input_t *i, char c, char **o) {
if (i->type == MPC_INPUT_PIPE && if (i->type == MPC_INPUT_PIPE &&
@@ -537,7 +544,7 @@ static int mpc_input_success(mpc_input_t *i, char c, char **o) {
static int mpc_input_eoi(mpc_input_t *i) { static int mpc_input_eoi(mpc_input_t *i) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 1; } if (mpc_input_terminated(i)) { return 1; }
else { return mpc_input_failure(i, x); } else { return mpc_input_failure(i, x); }
} }
@@ -547,37 +554,37 @@ static int mpc_input_soi(mpc_input_t *i) {
static int mpc_input_any(mpc_input_t *i, char **o) { static int mpc_input_any(mpc_input_t *i, char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return mpc_input_success(i, x, o); return mpc_input_success(i, x, o);
} }
static int mpc_input_char(mpc_input_t *i, char c, char **o) { static int mpc_input_char(mpc_input_t *i, char c, char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return x == c ? mpc_input_success(i, x, o) : mpc_input_failure(i, x); return x == c ? mpc_input_success(i, x, o) : mpc_input_failure(i, x);
} }
static int mpc_input_range(mpc_input_t *i, char c, char d, char **o) { static int mpc_input_range(mpc_input_t *i, char c, char d, char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return x >= c && x <= d ? mpc_input_success(i, x, o) : mpc_input_failure(i, x); return x >= c && x <= d ? mpc_input_success(i, x, o) : mpc_input_failure(i, x);
} }
static int mpc_input_oneof(mpc_input_t *i, const char *c, char **o) { static int mpc_input_oneof(mpc_input_t *i, const char *c, char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return strchr(c, x) != 0 ? mpc_input_success(i, x, o) : mpc_input_failure(i, x); return strchr(c, x) != 0 ? mpc_input_success(i, x, o) : mpc_input_failure(i, x);
} }
static int mpc_input_noneof(mpc_input_t *i, const char *c, char **o) { static int mpc_input_noneof(mpc_input_t *i, const char *c, char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return strchr(c, x) == 0 ? mpc_input_success(i, x, o) : mpc_input_failure(i, x); return strchr(c, x) == 0 ? mpc_input_success(i, x, o) : mpc_input_failure(i, x);
} }
static int mpc_input_satisfy(mpc_input_t *i, int(*cond)(char), char **o) { static int mpc_input_satisfy(mpc_input_t *i, int(*cond)(char), char **o) {
char x = mpc_input_getc(i); char x = mpc_input_getc(i);
if (mpc_input_terminated(i)) { i->state.next = '\0'; return 0; } if (mpc_input_terminated(i)) { return 0; }
return cond(x) ? mpc_input_success(i, x, o) : mpc_input_failure(i, x); return cond(x) ? mpc_input_success(i, x, o) : mpc_input_failure(i, x);
} }
@@ -962,7 +969,7 @@ int mpc_parse_input(mpc_input_t *i, mpc_parser_t *init, mpc_result_t *final) {
MPC_SUCCESS(r.output); MPC_SUCCESS(r.output);
} else { } else {
mpc_err_delete(r.error); mpc_err_delete(r.error);
MPC_FAILURE(mpc_err_new(i->filename, i->state, p->data.expect.m)); MPC_FAILURE(mpc_err_new(i->filename, i->state, p->data.expect.m, mpc_input_peekc(i)));
} }
} }
@@ -1004,7 +1011,7 @@ int mpc_parse_input(mpc_input_t *i, mpc_parser_t *init, mpc_result_t *final) {
if (mpc_stack_popr(stk, &r)) { if (mpc_stack_popr(stk, &r)) {
mpc_input_rewind(i); mpc_input_rewind(i);
p->data.not.dx(r.output); p->data.not.dx(r.output);
MPC_FAILURE(mpc_err_new(i->filename, i->state, "opposite")); MPC_FAILURE(mpc_err_new(i->filename, i->state, "opposite", mpc_input_peekc(i)));
} else { } else {
mpc_input_unmark(i); mpc_input_unmark(i);
mpc_stack_err(stk, r.error); mpc_stack_err(stk, r.error);

2
mpc.h
View File

@@ -25,7 +25,6 @@ typedef struct {
int pos; int pos;
int row; int row;
int col; int col;
char next;
} mpc_state_t; } mpc_state_t;
typedef struct { typedef struct {
@@ -34,6 +33,7 @@ typedef struct {
char *filename; char *filename;
char *failure; char *failure;
char **expected; char **expected;
char recieved;
} mpc_err_t; } mpc_err_t;
void mpc_err_delete(mpc_err_t *e); void mpc_err_delete(mpc_err_t *e);