progress toward more complex parser gen
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user