/* * Integer-range parser combinator exhaustive test * */ #include <hammer/hammer.h> #include <hammer/glue.h> #include <string.h> #include <stdlib.h> #define BKEND PB_LALR //#define BKEND PB_MIN HParser *int16_ranger(int16_t left, int16_t right) { H_RULE(littleint16, h_with_endianness(BYTE_BIG_ENDIAN,h_int16())); H_RULE(int16range, h_int_range(littleint16, left, right)); return h_sequence(int16range,h_end_p(),NULL); } int run_parse(HParser *parser, HParserBackend backend, uint8_t *input, size_t input_len) { assert(h_compile(parser, backend, NULL) == 0); return h_parse(parser, input, input_len); } int main(int argc, char *argv[]) { assert(argc == 3); int16_t low = atoi(argv[1]); int16_t high = atoi(argv[2]); printf("%d %d\n", low, high); HParser *pp = int16_ranger(low, high); int16_t k; for (k=INT16_MIN; k<INT16_MAX; k++) { uint8_t tmp1[2], tmp2[2]; // if (0) { // memcpy(tmp1, &k, 2); // tmp2[0] = tmp1[1]; // tmp2[1] = tmp1[0]; // } else // { memcpy(tmp2, &k, 2); // } if(!run_parse(pp, BKEND, tmp2, 2)) { printf("parse failed %d\n", k); } else { printf("parse success 0x%hx\n", k); } } return 0; }