hook up LALR backend stub
This commit is contained in:
parent
ef52f66a8c
commit
976205f9da
5 changed files with 93 additions and 4 deletions
|
|
@ -28,6 +28,7 @@ PARSERS := \
|
||||||
BACKENDS := \
|
BACKENDS := \
|
||||||
packrat \
|
packrat \
|
||||||
llk \
|
llk \
|
||||||
|
lalr \
|
||||||
regex
|
regex
|
||||||
|
|
||||||
HAMMER_PARTS := \
|
HAMMER_PARTS := \
|
||||||
|
|
|
||||||
86
src/backends/lalr.c
Normal file
86
src/backends/lalr.c
Normal 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;
|
||||||
|
}
|
||||||
|
|
@ -30,6 +30,7 @@ static HParserBackendVTable *backends[PB_MAX + 1] = {
|
||||||
&h__packrat_backend_vtable,
|
&h__packrat_backend_vtable,
|
||||||
&h__regex_backend_vtable,
|
&h__regex_backend_vtable,
|
||||||
&h__llk_backend_vtable,
|
&h__llk_backend_vtable,
|
||||||
|
&h__lalr_backend_vtable,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,11 @@ typedef struct HParseState_ HParseState;
|
||||||
typedef enum HParserBackend_ {
|
typedef enum HParserBackend_ {
|
||||||
PB_MIN = 0,
|
PB_MIN = 0,
|
||||||
PB_PACKRAT = PB_MIN, // PB_MIN is always the default.
|
PB_PACKRAT = PB_MIN, // PB_MIN is always the default.
|
||||||
PB_REGULAR, //
|
PB_REGULAR,
|
||||||
PB_LLk, //
|
PB_LLk,
|
||||||
PB_LALR, // Not Implemented
|
PB_LALR,
|
||||||
PB_GLR, // Not Implemented
|
PB_GLR, // Not Implemented
|
||||||
PB_MAX = PB_LLk
|
PB_MAX = PB_LALR
|
||||||
} HParserBackend;
|
} HParserBackend;
|
||||||
|
|
||||||
typedef enum HTokenType_ {
|
typedef enum HTokenType_ {
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,7 @@ struct HBitWriter_ {
|
||||||
// Backends {{{
|
// Backends {{{
|
||||||
extern HParserBackendVTable h__packrat_backend_vtable;
|
extern HParserBackendVTable h__packrat_backend_vtable;
|
||||||
extern HParserBackendVTable h__llk_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.
|
// TODO(thequux): Set symbol visibility for these functions so that they aren't exported.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue