11 MEM_VECTOR_MAKE(ast_value*, globals);
14 MEM_VEC_FUNCTIONS(parser_t, ast_value*, globals)
16 void parseerror(parser_t *parser, const char *fmt, ...)
21 printf("error %s:%lu: ", parser->lex->tok->ctx.file, (unsigned long)parser->lex->tok->ctx.line);
32 bool parser_next(parser_t *parser)
34 /* lex_do kills the previous token */
35 parser->tok = lex_do(parser->lex);
36 if (parser->tok == TOKEN_EOF || parser->tok >= TOKEN_ERROR)
41 /* lift a token out of the parser so it's not destroyed by parser_next */
42 token *parser_lift(parser_t *parser)
44 token *tok = parser->lex->tok;
45 parser->lex->tok = NULL;
49 #define parser_tokval(p) (p->lex->tok->value)
50 #define parser_token(p) (p->lex->tok)
51 #define parser_ctx(p) (p->lex->tok->ctx)
53 ast_value* parser_find_global(parser_t *parser, const char *name)
56 for (i = 0; i < parser->globals_count; ++i) {
57 if (!strcmp(parser->globals[i]->name, name))
58 return parser->globals[i];
63 bool parser_do(parser_t *parser)
65 if (parser->tok == TOKEN_TYPENAME)
68 int vtype = parser->lex->tok->constval.t;
70 /* Declaring a variable */
71 if (!parser_next(parser))
74 if (parser->tok != TOKEN_IDENT) {
75 parseerror(parser, "expected variable name\n");
79 var = parser_find_global(parser, parser_tokval(parser));
82 parseerror(parser, "global already exists: %s\n", parser_tokval(parser));
86 var = ast_value_new(parser_ctx(parser), parser_tokval(parser), vtype);
87 if (!parser_t_globals_add(parser, var))
90 /* Constant assignment */
91 if (!parser_next(parser))
94 if (parser->tok == ';')
95 return parser_next(parser);
97 if (parser->tok != '=') {
98 parseerror(parser, "expected '=' or ';'");
102 /* '=' found, assign... */
103 parseerror(parser, "TODO, const assignment");
106 else if (parser->tok == TOKEN_KEYWORD)
108 /* handle 'var' and 'const' */
111 else if (parser->tok == '.')
113 /* entity-member declaration */
118 parseerror(parser, "unexpected token: %s", parser->lex->tok->value);
124 bool parser_compile(const char *filename)
129 parser = (parser_t*)mem_a(sizeof(parser_t));
133 MEM_VECTOR_INIT(parser, globals);
134 parser->lex = lex_open(filename);
137 printf("failed to open file \"%s\"\n", filename);
141 /* initial lexer/parser state */
142 parser->lex->flags.noops = true;
144 if (parser_next(parser))
146 while (parser->tok != TOKEN_EOF && parser->tok < TOKEN_ERROR)
148 if (!parser_do(parser)) {
149 if (parser->tok == TOKEN_EOF)
151 printf("parse error\n");
152 lex_close(parser->lex);
159 lex_close(parser->lex);
160 for (i = 0; i < parser->globals_count; ++i) {
161 ast_value_delete(parser->globals[i]);
163 MEM_VECTOR_CLEAR(parser, globals);