#include #include #include #include #include "lexer.h" #include "misc.h" cond_stmt *lex_cond_stmt(char **str, int dbg) { } stmt *lex_comp_stmt(char **str, int dbg) { char *tmp = *str; if (*tmp++ == '{') { stmt *s = lex_stmt(&tmp, dbg); if (*tmp++ == '}') { *str = tmp; return s; } else { throw_error("Missing \'}\' in stmt."); } } return NULL; } stmt *lex_stmt(char **str, int dbg) { const alt_stmt alts[] = { {STMT_DIR, offsetof(stmt, dir), lex_dir}, {STMT_FUNC, offsetof(stmt, func), lex_func}, {STMT_EXPR, offsetof(stmt, expr), lex_exprs}, {STMT_COND, offsetof(stmt, cond_stmt), lex_cond_stmt}, {STMT_COMP, offsetof(stmt, down), lex_comp_stmt}, }; for (int i = 0; i < NUM_STMTS; ++i) { char *tmp = *str; void *data = alts[i].lex(&tmp, dbg); if (data != NULL) { stmt *s = calloc(1, sizeof(stmt)); void **member = (char **)s+alts[i].offset; *member = data; return s; } } return NULL; } stmt *lex_library(char **str, stmt **end, int dbg) { stmt *start = lex_stmt(str, dbg); end = (end != NULL) ? end : &start; for (stmt *s = start; s != NULL; s = lex_stmt(str, dbg)) { (*end)->next = s; *end = s; } return start; }; int lex(char *str, int dbg) { stmt *start = NULL; stmt *end = NULL; start = library(&str, &end, dbg); return (start != NULL && end != NULL); }