Initial ability to get state
This commit is contained in:
55
mpc.c
55
mpc.c
@@ -22,6 +22,12 @@ static mpc_state_t mpc_state_new(void) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static mpc_state_t *mpc_state_copy(mpc_state_t s) {
|
||||||
|
mpc_state_t *r = malloc(sizeof(mpc_state_t));
|
||||||
|
memcpy(r, &s, sizeof(mpc_state_t));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Error Type
|
** Error Type
|
||||||
*/
|
*/
|
||||||
@@ -608,28 +614,29 @@ enum {
|
|||||||
MPC_TYPE_LIFT = 3,
|
MPC_TYPE_LIFT = 3,
|
||||||
MPC_TYPE_LIFT_VAL = 4,
|
MPC_TYPE_LIFT_VAL = 4,
|
||||||
MPC_TYPE_EXPECT = 5,
|
MPC_TYPE_EXPECT = 5,
|
||||||
|
MPC_TYPE_STATE = 6,
|
||||||
|
|
||||||
MPC_TYPE_SOI = 6,
|
MPC_TYPE_SOI = 7,
|
||||||
MPC_TYPE_EOI = 7,
|
MPC_TYPE_EOI = 8,
|
||||||
MPC_TYPE_ANY = 8,
|
MPC_TYPE_ANY = 9,
|
||||||
MPC_TYPE_SINGLE = 9,
|
MPC_TYPE_SINGLE = 10,
|
||||||
MPC_TYPE_ONEOF = 10,
|
MPC_TYPE_ONEOF = 11,
|
||||||
MPC_TYPE_NONEOF = 11,
|
MPC_TYPE_NONEOF = 12,
|
||||||
MPC_TYPE_RANGE = 12,
|
MPC_TYPE_RANGE = 13,
|
||||||
MPC_TYPE_SATISFY = 13,
|
MPC_TYPE_SATISFY = 14,
|
||||||
MPC_TYPE_STRING = 14,
|
MPC_TYPE_STRING = 15,
|
||||||
|
|
||||||
MPC_TYPE_APPLY = 15,
|
MPC_TYPE_APPLY = 16,
|
||||||
MPC_TYPE_APPLY_TO = 16,
|
MPC_TYPE_APPLY_TO = 17,
|
||||||
MPC_TYPE_PREDICT = 17,
|
MPC_TYPE_PREDICT = 18,
|
||||||
MPC_TYPE_NOT = 18,
|
MPC_TYPE_NOT = 19,
|
||||||
MPC_TYPE_MAYBE = 19,
|
MPC_TYPE_MAYBE = 20,
|
||||||
MPC_TYPE_MANY = 20,
|
MPC_TYPE_MANY = 21,
|
||||||
MPC_TYPE_MANY1 = 21,
|
MPC_TYPE_MANY1 = 22,
|
||||||
MPC_TYPE_COUNT = 22,
|
MPC_TYPE_COUNT = 23,
|
||||||
|
|
||||||
MPC_TYPE_OR = 23,
|
MPC_TYPE_OR = 24,
|
||||||
MPC_TYPE_AND = 24
|
MPC_TYPE_AND = 25
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct { char *m; } mpc_pdata_fail_t;
|
typedef struct { char *m; } mpc_pdata_fail_t;
|
||||||
@@ -932,7 +939,8 @@ int mpc_parse_input(mpc_input_t *i, mpc_parser_t *init, mpc_result_t *final) {
|
|||||||
case MPC_TYPE_FAIL: MPC_FAILURE(mpc_err_fail(i->filename, i->state, p->data.fail.m));
|
case MPC_TYPE_FAIL: MPC_FAILURE(mpc_err_fail(i->filename, i->state, p->data.fail.m));
|
||||||
case MPC_TYPE_LIFT: MPC_SUCCESS(p->data.lift.lf());
|
case MPC_TYPE_LIFT: MPC_SUCCESS(p->data.lift.lf());
|
||||||
case MPC_TYPE_LIFT_VAL: MPC_SUCCESS(p->data.lift.x);
|
case MPC_TYPE_LIFT_VAL: MPC_SUCCESS(p->data.lift.x);
|
||||||
|
case MPC_TYPE_STATE: MPC_SUCCESS(mpc_state_copy(i->state));
|
||||||
|
|
||||||
/* Basic Parsers */
|
/* Basic Parsers */
|
||||||
|
|
||||||
case MPC_TYPE_SOI: MPC_PRIMATIVE(NULL, mpc_input_soi(i));
|
case MPC_TYPE_SOI: MPC_PRIMATIVE(NULL, mpc_input_soi(i));
|
||||||
@@ -1368,6 +1376,12 @@ mpc_parser_t *mpc_lift(mpc_ctor_t lf) {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpc_parser_t *mpc_state(void) {
|
||||||
|
mpc_parser_t *p = mpc_undefined();
|
||||||
|
p->type = MPC_TYPE_STATE;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
mpc_parser_t *mpc_expect(mpc_parser_t *a, const char *expected) {
|
mpc_parser_t *mpc_expect(mpc_parser_t *a, const char *expected) {
|
||||||
mpc_parser_t *p = mpc_undefined();
|
mpc_parser_t *p = mpc_undefined();
|
||||||
p->type = MPC_TYPE_EXPECT;
|
p->type = MPC_TYPE_EXPECT;
|
||||||
@@ -2222,6 +2236,7 @@ static void mpc_print_unretained(mpc_parser_t *p, int force) {
|
|||||||
if (p->type == MPC_TYPE_PASS) { printf("<:>"); }
|
if (p->type == MPC_TYPE_PASS) { printf("<:>"); }
|
||||||
if (p->type == MPC_TYPE_FAIL) { printf("<!>"); }
|
if (p->type == MPC_TYPE_FAIL) { printf("<!>"); }
|
||||||
if (p->type == MPC_TYPE_LIFT) { printf("<#>"); }
|
if (p->type == MPC_TYPE_LIFT) { printf("<#>"); }
|
||||||
|
if (p->type == MPC_TYPE_STATE) { printf("<S#>"); }
|
||||||
if (p->type == MPC_TYPE_EXPECT) {
|
if (p->type == MPC_TYPE_EXPECT) {
|
||||||
printf("%s", p->data.expect.m);
|
printf("%s", p->data.expect.m);
|
||||||
/*mpc_print_unretained(p->data.expect.x, 0);*/
|
/*mpc_print_unretained(p->data.expect.x, 0);*/
|
||||||
|
1
mpc.h
1
mpc.h
@@ -91,6 +91,7 @@ mpc_parser_t *mpc_fail(const char *m);
|
|||||||
mpc_parser_t *mpc_failf(const char *fmt, ...);
|
mpc_parser_t *mpc_failf(const char *fmt, ...);
|
||||||
mpc_parser_t *mpc_lift(mpc_ctor_t f);
|
mpc_parser_t *mpc_lift(mpc_ctor_t f);
|
||||||
mpc_parser_t *mpc_lift_val(mpc_val_t *x);
|
mpc_parser_t *mpc_lift_val(mpc_val_t *x);
|
||||||
|
mpc_parser_t *mpc_state(void);
|
||||||
|
|
||||||
mpc_parser_t *mpc_any(void);
|
mpc_parser_t *mpc_any(void);
|
||||||
mpc_parser_t *mpc_char(char c);
|
mpc_parser_t *mpc_char(char c);
|
||||||
|
Reference in New Issue
Block a user