From 976205f9da21acab80c7bc8ce2e0163d97084f11 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Tue, 4 Jun 2013 22:14:06 +0200 Subject: [PATCH] hook up LALR backend stub --- src/Makefile | 1 + src/backends/lalr.c | 86 +++++++++++++++++++++++++++++++++++++++++++++ src/hammer.c | 1 + src/hammer.h | 8 ++--- src/internal.h | 1 + 5 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 src/backends/lalr.c diff --git a/src/Makefile b/src/Makefile index 7fac881a..1a2bff35 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,6 +28,7 @@ PARSERS := \ BACKENDS := \ packrat \ llk \ + lalr \ regex HAMMER_PARTS := \ diff --git a/src/backends/lalr.c b/src/backends/lalr.c new file mode 100644 index 00000000..22cd3890 --- /dev/null +++ b/src/backends/lalr.c @@ -0,0 +1,86 @@ +#include <assert.h> +#include "../internal.h" +#include "../cfgrammar.h" +#include "../parsers/parser_internal.h" + + + +void h_lalr_free(HParser *parser) +{ + // XXX free data structures + parser->backend_data = NULL; + parser->backend = PB_PACKRAT; +} + + +/* LALR table generation */ + +int h_lalr_compile(HAllocator* mm__, HParser* parser, const void* params) +{ + return -1; +} + + +/* LR driver */ + +HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream* stream) +{ + return NULL; +} + + + + +HParserBackendVTable h__lalr_backend_vtable = { + .compile = h_lalr_compile, + .parse = h_lr_parse, + .free = h_lalr_free +}; + + + + +// dummy! +int test_lalr(void) +{ + /* for k=2: + + S -> A | B + A -> X Y a + B -> Y b + X -> x | '' + Y -> y -- for k=3 use "yy" + */ + + // XXX make LALR example + HParser *X = h_optional(h_ch('x')); + HParser *Y = h_sequence(h_ch('y'), h_ch('y'), NULL); + HParser *A = h_sequence(X, Y, h_ch('a'), NULL); + HParser *B = h_sequence(Y, h_ch('b'), NULL); + HParser *p = h_choice(A, B, NULL); + + HCFGrammar *g = h_cfgrammar(&system_allocator, p); + + if(g == NULL) { + fprintf(stderr, "h_cfgrammar failed\n"); + return 1; + } + + h_pprint_grammar(stdout, g, 0); + // print states of the LR(0) automaton + // print LALR(1) table + + if(h_compile(p, PB_LALR, NULL)) { + fprintf(stderr, "does not compile\n"); + return 2; + } + + + HParseResult *res = h_parse(p, (uint8_t *)"xyya", 4); + if(res) + h_pprint(stdout, res->ast, 0, 2); + else + printf("no parse\n"); + + return 0; +} diff --git a/src/hammer.c b/src/hammer.c index 5f941429..7d5b4e90 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -30,6 +30,7 @@ static HParserBackendVTable *backends[PB_MAX + 1] = { &h__packrat_backend_vtable, &h__regex_backend_vtable, &h__llk_backend_vtable, + &h__lalr_backend_vtable, }; diff --git a/src/hammer.h b/src/hammer.h index 455684cc..a5ebcfff 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -34,11 +34,11 @@ typedef struct HParseState_ HParseState; typedef enum HParserBackend_ { PB_MIN = 0, PB_PACKRAT = PB_MIN, // PB_MIN is always the default. - PB_REGULAR, // - PB_LLk, // - PB_LALR, // Not Implemented + PB_REGULAR, + PB_LLk, + PB_LALR, PB_GLR, // Not Implemented - PB_MAX = PB_LLk + PB_MAX = PB_LALR } HParserBackend; typedef enum HTokenType_ { diff --git a/src/internal.h b/src/internal.h index 926bf02a..01861f5e 100644 --- a/src/internal.h +++ b/src/internal.h @@ -219,6 +219,7 @@ struct HBitWriter_ { // Backends {{{ extern HParserBackendVTable h__packrat_backend_vtable; extern HParserBackendVTable h__llk_backend_vtable; +extern HParserBackendVTable h__lalr_backend_vtable; // }}} // TODO(thequux): Set symbol visibility for these functions so that they aren't exported. -- GitLab