progress toward more complex parser gen

This commit is contained in:
Andrew Kelley
2015-11-04 17:15:46 -07:00
parent c36cd9d313
commit 174baa49bd
9 changed files with 151 additions and 101 deletions

View File

@@ -190,12 +190,17 @@ struct RuleNode {
enum ParserStateType {
ParserStateTypeError,
ParserStateTypeOk,
ParserStateTypeCapture,
};
struct ParserStateError {
Buf *msg;
};
struct ParserStateCapture {
Buf *body;
};
struct ParserState {
ParserStateType type;
// One for each token ID.
@@ -203,6 +208,7 @@ struct ParserState {
int index;
union {
ParserStateError error;
ParserStateCapture capture;
};
};
@@ -278,6 +284,8 @@ static void gen(Gen *g, RuleNode *node) {
RuleNode *child = node->tuple.children.at(i);
gen(g, child);
}
g->cur_state->type = ParserStateTypeCapture;
g->cur_state->capture.body = &node->tuple.body;
}
break;
case RuleNodeTypeMany:
@@ -598,7 +606,8 @@ int main(int argc, char **argv) {
g.cur_state = create_state(&g, ParserStateTypeOk);
gen(&g, g.root);
fprintf(out_f, "/* This file is auto-generated by parsergen.cpp */\n");
fprintf(out_f, "/* This file is generated by parsergen.cpp */\n");
fprintf(out_f, "\n");
fprintf(out_f, "#include \"src/parser.hpp\"\n");
fprintf(out_f, "#include <stdio.h>\n");
@@ -616,6 +625,17 @@ int main(int argc, char **argv) {
fprintf(out_f, "static_assert(TokenId%s == %d, \"wrong token id\");\n",
buf_ptr(&token->name), token->id);
}
fprintf(out_f, "\n");
/* TODO
fprintf(out_f, "struct ParserGenNode{\n");
fprintf(out_f, " union {\n");
fprintf(out_f, " [%d];\n", biggest_tuple_len);
fprintf(out_f, " Token *token;\n");
fprintf(out_f, " };\n");
fprintf(out_f, "};\n");
fprintf(out_f, "\n");
*/
fprintf(out_f, "AstNode * ast_parse(Buf *buf, ZigList<Token> *tokens) {\n");
@@ -644,7 +664,6 @@ int main(int argc, char **argv) {
for (int i = 0; i < g.transition_table.length; i += 1) {
ParserState *state = g.transition_table.at(i);
fprintf(out_f, " case %d:\n", i);
fprintf(out_f, " fprintf(stderr, \"state = %%d\\n\", state);\n");
switch (state->type) {
case ParserStateTypeError:
fprintf(out_f, " ast_error(token, \"%s\");\n", buf_ptr(state->error.msg));
@@ -655,6 +674,10 @@ int main(int argc, char **argv) {
state->index, g.transition_table.length);
fprintf(out_f, " state = transition[%d][token->id];\n", state->index);
break;
case ParserStateTypeCapture:
// TODO fprintf(out_f, " %s\n", buf_ptr(state->capture.body));
fprintf(out_f, " state = transition[%d][token->id];\n", state->index);
break;
}
fprintf(out_f, " break;\n");
}