From 92f16a4d14be273721fff1c46a55864aba2116f4 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Fri, 14 Jun 2013 12:24:18 +0200 Subject: [PATCH] proper LALR example with conflict in LR(0) --- src/backends/lalr.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/backends/lalr.c b/src/backends/lalr.c index 7e83c538..9c9b864e 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -667,6 +667,8 @@ int h_lalr_compile(HAllocator* mm__, HParser* parser, const void* params) H_FOREACH(eg->smap, HCFChoice *lhs, HLRTransition *t) if(t->symbol != item->lhs) continue; + assert(lhs->type == HCF_CHOICE); // XXX could be CHARSET + for(HCFSequence **p=lhs->seq; *p; p++) { HCFChoice **rhs = (*p)->items; if(!match_production(eg, rhs, item->rhs, state)) @@ -986,21 +988,21 @@ HParserBackendVTable h__lalr_backend_vtable = { // 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" + /* + S -> E + E -> E '-' T + | T + T -> '(' E ')' + | N + N -> '0' -- also try [0-9] for the charset paths */ - // XXX make LALR example - HParser *X = h_optional(h_in((uint8_t *)"rst", 3)); - 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); + HParser *N = h_sequence(h_ch('n'), NULL); + 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 = h_sequence(E, NULL); printf("\n==== G R A M M A R ====\n"); HCFGrammar *g = h_cfgrammar(&system_allocator, p); -- GitLab