Added 'unimplemented' parser
This commit is contained in:
parent
18c2d1f2ca
commit
b6cb84df15
3 changed files with 32 additions and 11 deletions
39
src/hammer.c
39
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));
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ typedef enum token_type {
|
|||
TT_SINT,
|
||||
TT_UINT,
|
||||
TT_SEQUENCE,
|
||||
TT_ERR,
|
||||
TT_MAX
|
||||
} token_type_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue