// dummy! int test_lalr(void) { HAllocator *mm__ = &system_allocator; /* E -> E '-' T | T T -> '(' E ')' | 'n' -- also try [0-9] for the charset paths */ HParser *n = h_ch('n'); HParser *E = h_indirect(); HParser *T = h_choice(h_sequence(h_ch('('), E, h_ch(')'), NULL), n, NULL); HParser *E_ = h_choice(h_sequence(E, h_ch('-'), T, NULL), T, NULL); h_bind_indirect(E, E_); HParser *p = E; printf("\n==== G R A M M A R ====\n"); HCFGrammar *g = h_cfgrammar_(mm__, h_desugar_augmented(mm__, p)); if (g == NULL) { fprintf(stderr, "h_cfgrammar failed\n"); return 1; } h_pprint_grammar(stdout, g, 0); printf("\n==== D F A ====\n"); HLRDFA *dfa = h_lr0_dfa(g); if (dfa) { h_pprint_lrdfa(stdout, g, dfa, 0); } else { fprintf(stderr, "h_lalr_dfa failed\n"); } printf("\n==== L R ( 0 ) T A B L E ====\n"); HLRTable *table0 = h_lr0_table(g, dfa); if (table0) { h_pprint_lrtable(stdout, g, table0, 0); } else { fprintf(stderr, "h_lr0_table failed\n"); } h_lrtable_free(table0); printf("\n==== L A L R T A B L E ====\n"); if (h_compile(p, PB_LALR, NULL)) { fprintf(stderr, "does not compile\n"); return 2; } h_pprint_lrtable(stdout, g, (HLRTable *)p->backend_data, 0); printf("\n==== P A R S E R E S U L T ====\n"); HParseResult *res = h_parse(p, (uint8_t *)"n-(n-((n)))-n", 13); if (res) { h_pprint(stdout, res->ast, 0, 2); } else { printf("no parse\n"); } return 0; }
void h_pprint(FILE* stream, const HParsedToken* tok, int indent, int delta) { switch (tok->token_type) { case TT_NONE: fprintf(stream, "%*snull\n", indent, ""); break; case TT_BYTES: if (tok->bytes.len == 0) fprintf(stream, "%*s<>\n", indent, ""); else { fprintf(stream, "%*s", indent, ""); for (size_t i = 0; i < tok->bytes.len; i++) { fprintf(stream, "%c%02hhx", (i == 0) ? '<' : '.', tok->bytes.token[i]); } fprintf(stream, ">\n"); } break; case TT_SINT: if (tok->sint < 0) fprintf(stream, "%*ss -%#" PRIx64 "\n", indent, "", -tok->sint); else fprintf(stream, "%*ss %#" PRIx64 "\n", indent, "", tok->sint); break; case TT_UINT: fprintf(stream, "%*su %#" PRIx64 "\n", indent, "", tok->uint); break; case TT_SEQUENCE: { fprintf(stream, "%*s[\n", indent, ""); for (size_t i = 0; i < tok->seq->used; i++) { h_pprint(stream, tok->seq->elements[i], indent + delta, delta); } fprintf(stream, "%*s]\n", indent, ""); } break; case TT_USER: fprintf(stream, "%*sUSER:%s\n", indent, "", h_get_token_type_name(tok->token_type)); break; default: if(tok->token_type > TT_USER) { fprintf(stream, "%*sUSER:%s %d\n", indent, "", h_get_token_type_name(tok->token_type), tok->token_type-TT_USER); } else { assert_message(0, "Should not reach here."); } } }
int main(int argc, char **argv) { uint8_t input[102400]; size_t inputsize; const HParseResult *result; init_parser(); inputsize = fread(input, 1, sizeof(input), stdin); fprintf(stderr, "inputsize=%lu\ninput=", inputsize); fwrite(input, 1, inputsize, stderr); result = h_parse(document, input, inputsize); if(result) { fprintf(stderr, "parsed=%lld bytes\n", result->bit_length/8); h_pprint(stdout, result->ast, 0, 0); return 0; } else { return 1; } }