diff --git a/src/hammer.c b/src/hammer.c index 58c7157ebb26cae7a5b1fbcc15f4f3e7cfaffd45..0e48b85cafd27a3d345dd62c064ac74f2f5f3980 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -81,6 +81,23 @@ typedef struct { uint8_t len; } token_t; +static parse_result_t* parse_unimplemented(void* env, parse_state_t *state) { + (void) env; + (void) state; + static parsed_token_t token = { + .token_type = TT_ERR + }; + static parse_result_t result = { + .ast = &token + }; + return &result; +} + +static parser_t unimplemented = { + .fn = parse_unimplemented, + .env = NULL +}; + static parse_result_t* parse_token(void *env, parse_state_t *state) { token_t *t = (token_t*)env; for (int i=0; i<t->len; ++i) { @@ -145,7 +162,7 @@ const parser_t* whitespace(const parser_t* p) { return ret; } -const parser_t* action(const parser_t* p, const action_t a) { return NULL; } +const parser_t* action(const parser_t* p, const action_t a) { return &unimplemented; } static parse_result_t* parse_charset(void *env, parse_state_t *state) { uint8_t in = read_bits(&state->input_stream, 8, false); @@ -441,16 +458,16 @@ const parser_t* xor(const parser_t* p1, const parser_t* p2) { return ret; } -const parser_t* repeat0(const parser_t* p) { return NULL; } -const parser_t* repeat1(const parser_t* p) { return NULL; } -const parser_t* repeat_n(const parser_t* p, const size_t n) { return NULL; } -const parser_t* optional(const parser_t* p) { return NULL; } -const parser_t* ignore(const parser_t* p) { return NULL; } -const parser_t* list(const parser_t* p, const parser_t* sep) { return NULL; } -const parser_t* epsilon_p() { return NULL; } -const parser_t* attr_bool(const parser_t* p, attr_bool_t a) { return NULL; } -const parser_t* and(const parser_t* p) { return NULL; } -const parser_t* not(const parser_t* p) { return NULL; } +const parser_t* repeat0(const parser_t* p) { return &unimplemented; } +const parser_t* repeat1(const parser_t* p) { return &unimplemented; } +const parser_t* repeat_n(const parser_t* p, const size_t n) { return &unimplemented; } +const parser_t* optional(const parser_t* p) { return &unimplemented; } +const parser_t* ignore(const parser_t* p) { return &unimplemented; } +const parser_t* list(const parser_t* p, const parser_t* sep) { return &unimplemented; } +const parser_t* epsilon_p() { return &unimplemented; } +const parser_t* attr_bool(const parser_t* p, attr_bool_t a) { return &unimplemented; } +const parser_t* and(const parser_t* p) { return &unimplemented; } +const parser_t* not(const parser_t* p) { return &unimplemented; } static guint cache_key_hash(gconstpointer key) { return djbhash(key, sizeof(parser_cache_key_t)); diff --git a/src/hammer.h b/src/hammer.h index 6d68ab4457667bf6ecce1861b3506a8a605e7b08..7c7e2967e57ca0aea151a908873365de2a55fd9e 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -57,6 +57,7 @@ typedef enum token_type { TT_SINT, TT_UINT, TT_SEQUENCE, + TT_ERR, TT_MAX } token_type_t; diff --git a/src/pprint.c b/src/pprint.c index cf39c0e9a1f0adafa73c03b92d45907dd11f130f..a4fe43d50cb1d9ce6c94732e46cdff1d7646b3a7 100644 --- a/src/pprint.c +++ b/src/pprint.c @@ -102,6 +102,9 @@ static void unamb_sub(const parsed_token_t* tok, struct result_buf *buf) { len = asprintf(&tmpbuf, "s%#lx", tok->uint); append_buf(buf, tmpbuf, len); break; + case TT_ERR: + append_buf(buf, "ERR", 3); + break; case TT_SEQUENCE: { GSequenceIter *it; int at_begin = 1;