Removed next char from state and moved it to error
This commit is contained in:
35
mpc.c
35
mpc.c
@@ -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
2
mpc.h
@@ -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);
|
||||||
|
Reference in New Issue
Block a user