summaryrefslogtreecommitdiff
path: root/igen/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'igen/lexer.c')
-rw-r--r--igen/lexer.c121
1 files changed, 47 insertions, 74 deletions
diff --git a/igen/lexer.c b/igen/lexer.c
index 275bcdd..03f7e87 100644
--- a/igen/lexer.c
+++ b/igen/lexer.c
@@ -5,87 +5,60 @@
#include "lexer.h"
#include "misc.h"
-atom get_token_id(const char c, const int dbg) {
- switch (c) {
- case '(': return ATOM_LBRACK;
- case ')': return ATOM_RBRACK;
- case '/': return ATOM_SLASH;
- case '+': return ATOM_PLUS;
- case '-': return ATOM_MINUS;
- case '*': return ATOM_ASTR;
- case '%': return ATOM_PRCNT;
- case '&': return ATOM_AMPR;
- case '|': return ATOM_PIPE;
- case '^': return ATOM_CARROT;
- case '#': return ATOM_HASH;
- case ':': return ATOM_COL;
- case ';': return ATOM_SCOL;
- case ' ': return ATOM_SPACE;
- case '_': return ATOM_USCORE;
- case '=': return ATOM_EQUAL;
- case '.': return ATOM_DOT;
- case '?': return ATOM_QMARK;
- case '!': return ATOM_BANG;
- case '<': return ATOM_LT;
- case '>': return ATOM_GT;
- case '%': return ATOM_PERCENT;
- case ',': return ATOM_COMMA;
- case '\\': return ATOM_BSLASH;
- case '\"': return ATOM_QUOTE;
- case '\'': return ATOM_SQUOTE;
- case '\t': return ATOM_TAB;
- case '\n': return ATOM_NLINE;
- default:
- if (isalpha(c)) {
- return ATOM_ALPHA;
- } else if (isdigit(c)) {
- return ATOM_NUM;
- }
- break;
+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 ATOM_NONE;
+ return NULL;
}
-int get_atom_span(const char *str, const atom *atoms, int inv, int dbg) {
- int i;
- for (i = 0; str[i] != '\0'; ++i) {
- const enum atom atom = get_atom_id(str[i], dbg);
- for (int j = 0; atoms[j] != ATOM_NONE; ++j) {
- const int is_done = (inv) ? (atom == atoms[j]) : (atom != atoms[j]);
- if (is_done) {
- return i;
- }
+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 i;
+
+ 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) {
- int in_inst_stmt = 0;
- lexeme *lex_start = NULL;
- lexeme *lex_end = NULL;
+ stmt *start = NULL;
+ stmt *end = NULL;
- for (int i = 0; str[i] != '\0'; ++i) {
- atom atom_id = get_atom_id(str[i], dbg);
- switch (atom_id) {
- case ATOM_PERCENT:
- if (get_atom_id(str[++i]) == ATOM_PERCENT) {
- in_inst_stmt = !in_inst_stmt;
- }
- break;
- case ATOM_LBRACK:
- break;
- case ATOM_ALPHA:
- do {
- const int ident_len = get_atom_span(&str[i], (const atom []) {
- ATOM_ALPHA,
- ATOM_USCORE,
- ATOM_NUM,
- ATOM_NONE
- }, 0, dbg);
- char *ident = calloc(ident_len+1, sizeof(char));
- } while(0);
- break;
- }
- }
+ start = library(&str, &end, dbg);
+ return (start != NULL && end != NULL);
}