hook up LALR backend stub

This commit is contained in:
Sven M. Hallberg 2013-06-04 22:14:06 +02:00
parent ef52f66a8c
commit 976205f9da
5 changed files with 93 additions and 4 deletions

86
src/backends/lalr.c Normal file
View file

@ -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;
}