diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2020-08-08 10:28:36 -0400 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2020-08-08 10:28:36 -0400 |
commit | 1ec19679b3db209429b0897f6ccda6d09d018a70 (patch) | |
tree | ef17e28b388a04fadeb14982a5332eb647981d8b /lexer.c | |
parent | 39081609ec4f1f5d96e15e346eecd09ca2cc9f41 (diff) |
Did a ton of stuff.
- Changed the file structure of the SuB Suite, so that
all variable declarations, symbols, and constants
are in a single file.
- Moved the C library functionss into a separate
file, and made them use stack frames.
- Added support for using the emulator's assembler for
realtime debugging, to enter it, get in to stepping
mode by pressing Ctrl+s, press any other key, then
press F1,
The reason for having to press some other key before
pressing F1 is because it only allows entering the
assembler when the keyboard is not ready.
- Added the ".res" directive to the emulator's
assembler, the ".res" directive tells the assembler
to reserve however many bytes specified by the
operand.
- Fixed some bugs in the emulator's assembler.
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 60 |
1 files changed, 42 insertions, 18 deletions
@@ -6,11 +6,12 @@ uint16_t sym_count = 0; token *tokens = NULL; token *last_tok = NULL; symbol *locals = NULL; +symbol *last_loc = NULL; symbol *cur_sym = NULL; symbol *mksymbol(const char *name, uint64_t val, uint8_t def, uint8_t islocal, uint8_t useid, uint16_t id, uint8_t dbg) { uint16_t i = 0; - symbol *s = (!islocal || islocal == 2) ? symbols : locals; + symbol *s = (!islocal) ? symbols : locals; uint8_t flag = 0; for (; s; s = s->next, i++) { if (!useid && name[0] != s->name[0]) { @@ -39,20 +40,29 @@ symbol *mksymbol(const char *name, uint64_t val, uint8_t def, uint8_t islocal, u } } size_t str_size = strlen(name)+1; - s = malloc(sizeof(*s)); + s = malloc(sizeof(symbol)); + s->local = NULL; + if (!islocal) { + (last_sym) ? (last_sym->next = s) : (symbols = s); + } else { + (last_loc) ? (last_loc->next = s) : (locals = s); + } s->name = malloc(str_size); s->def = def; s->val = val; s->count = 0; memcpy(s->name, name, str_size); - s->next = (!islocal) ? symbols : locals; + s->next = NULL; s->id = sym_count++; + (!islocal) ? (last_sym = s) : (last_loc = s); if (!islocal) { s->local = NULL; - symbols = s; + /*if (def) { + locals = NULL; + last_loc = NULL; + }*/ } else { cur_sym->count++; - locals = s; } defined = 0; if (dbg) { @@ -73,12 +83,13 @@ symbol *get_sym(const char *name, uint64_t val, token *t, uint8_t islocal, uint8 if (dbg) { printf("get_sym(): oof, symbol %s, does not exist, yet.\n", name); } - fixup *f = malloc(sizeof(*f)); - f->next = fixups; + fixup *f = malloc(sizeof(fixup)); + (last_fix) ? (last_fix->next = f) : (fixups = f); f->adr = val; f->t = t; f->s = s; - fixups = f; + f->next = NULL; + last_fix = f; fixup_cnt++; return NULL; } @@ -263,8 +274,14 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { offset++; if ((ptok == PTOK_S && toupper(str[i+1]) == 'P') || (ptok == PTOK_P && toupper(str[i+1]) == 'C')) { offset++; + } else if (ptok == PTOK_S || ptok == PTOK_P) { + } switch (get_ptok(str[i+offset], dbg)) { + case PTOK_X : + case PTOK_Y : + case PTOK_S : + case PTOK_P : case PTOK_ALPHA : case PTOK_NUMBER: ptok = PTOK_ALPHA; break; } @@ -277,7 +294,7 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { lexeme[j] = '\0'; i += j; if (!isop) { - for (k = 0; k < 6; k++) { + for (k = 0; k < 7; k++) { if (tolower(lexeme[0]) == dir_t[k][0] && !strcasecmp(lexeme, dir_t[k])) { lex_type = TOK_DIR; break; @@ -353,8 +370,8 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { lt->sym = get_sym(sym, address, lt, islocal, dbg); } if (!islocal) { - cur_sym = symbols; - locals = cur_sym->local; + cur_sym = last_sym; + /*last_loc = NULL;*/ } islocal = 0; isfixup += (lt->sym == NULL); @@ -489,8 +506,12 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { isfixup += (lt->sym == NULL); } if (!islocal) { - cur_sym = symbols; - locals = cur_sym->local; + cur_sym = last_sym; + cur_sym->local = NULL; + locals = NULL; + last_loc = NULL; + } else if (cur_sym->local == NULL) { + cur_sym->local = locals; } islocal = 0; if (dbg) { @@ -535,10 +556,10 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { break; case PTOK_ALPHA: - while (!isdelm2(str[i], dbg)) { - lexeme[j++] = str[i++]; - } + for (; !isdelm2(str[i+j], dbg); j++); + memcpy(lexeme, str+i, j); lexeme[j] = '\0'; + i += j; isch = 0; isop = 0; if (j == 3 && str[i] != ':') { @@ -555,12 +576,15 @@ uint64_t lex(char *str, uint64_t address, uint8_t dbg) { } } if (!isop) { + uint8_t spaces = 0; + for (; isdelm(str[i+spaces], dbg) == 16; spaces++); + if (get_ptok(str[i+spaces], dbg) == PTOK_COLON) { + islocal = (lex_type == TOK_LOCAL); + } lex_type = TOK_SYM; l->count++; t = make_token(lex_type, islocal, 0, "", NULL); memcpy(sym, lexeme, j+1); - uint8_t spaces = 0; - for (; isdelm(str[i+spaces], dbg) == 16; spaces++); if (dbg) { printf("lex(): spaces: %u\n", spaces); } |