Author | Jakob Wakeling <[email protected]> |
Date | 2021-09-06 12:57:38 |
Commit | 431f98e2da1b4d79b70c00c85c1e840f49140215 |
Parent | 064b88e75bc83041db3cd0da086d730d9fbbc236 |
lex: Generalise keyword lexing
Diffstat
M | src/cll/cll.h | | | 3 | --- |
M | src/g.h | | | 32 | ++++++++++---------------------- |
A | src/keyword.c | | | 29 | +++++++++++++++++++++++++++++ |
A | src/keyword.h | | | 21 | +++++++++++++++++++++ |
M | src/lex.c | | | 67 | ++++++++++++++++++++----------------------------------------------- |
M | src/map.c | | | 25 | +++++++++++++++++-------- |
M | src/map.h | | | 8 | ++++---- |
M | src/parse.c | | | 8 | +++----- |
M | src/type.c | | | 85 | ++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- |
M | src/type.h | | | 15 | ++++++++------- |
M | src/value.c | | | 4 | ++-- |
M | src/value.h | | | 4 | ++-- |
12 files changed, 172 insertions, 129 deletions
diff --git a/src/cll/cll.h b/src/cll/cll.h index 83a288f..86642ab 100644 --- a/src/cll/cll.h +++ b/src/cll/cll.h @@ -33,8 +33,6 @@ typedef float f32; typedef double f64; typedef long double f128; -typedef char *str; - #define U8_MIN UINT8_MIN #define U8_MAX UINT8_MAX #define U16_MIN UINT16_MIN diff --git a/src/g.h b/src/g.h index f6db769..5f39dde 100644 --- a/src/g.h +++ b/src/g.h @@ -15,30 +15,20 @@ #include "cll/cll.h" typedef enum { - LK_VOID, LK_EOF, + LK_NIL, LK_EOF, LK_IDN, + LK_INT, LK_FLT, LK_CHR, LK_STR, - LK_IDN, LK_INT, LK_FLT, - LK_CHR, LK_STR, - - LK_LBRACK, LK_RBRACK, - LK_LPAREN, LK_RPAREN, - LK_LBRACE, LK_RBRACE, - LK_COLON, LK_SCOLON, + LK_LPAREN, LK_RPAREN, LK_LBRACK, LK_RBRACK, + LK_LBRACE, LK_RBRACE, LK_COLON, LK_SCOLON, LK_PERIOD, LK_COMMA, LK_RARROW, - LK_ADD, LK_SUB, LK_MUL, LK_DIV, LK_MOD, - LK_LNOT, LK_BNOT, LK_BAND, LK_BOR, LK_BXOR, - LK_SHL, LK_SHR, LK_EQ, LK_NEQ, LK_LT, LK_LTE, - LK_GT, LK_GTE, LK_LAND, LK_LOR, LK_TERN, LK_ASSN, - LK_ADDEQ, LK_SDDEQ, LK_MULEQ, LK_DIVEQ, LK_MODEQ, - LK_ANDEQ, LK_OREQ, LK_XOREQ, LK_SHLEQ, LK_SHREQ, - LK_PROC, LK_RETURN, LK_IF, LK_ELSE, LK_FOR, + LK_PROC, LK_RETURN, } tok_k; typedef enum { - AK_VOID, + AK_NIL, AK_DECL, AK_ASSN, AK_COMP, @@ -51,20 +41,20 @@ typedef enum { AK_RETURN, } ast_k; -typedef struct { UINT fi, fp, ln, cl; } pos; +typedef struct { UINT ln, cl; } pos; +typedef struct { tok_k k; pos p; u8 *s; u64 h; } tok; -typedef struct { tok_k k; pos p; char *s; } tok; -typedef struct { char *s; UINT sp, sl, ln, cl; tok t; } lex; +typedef struct { u8 *s; UINT sp, sl, ln, cl; tok t; } lex; typedef struct ast { - ast_k k; pos p; type *t; val v; str s; + ast_k k; pos p; type *t; val v; u8 *s; struct ast *c, *cl, *cr; stack *cs; } ast; extern char *tok_ks[]; extern char *ast_ks[]; -extern lex lex_init(char *src, UINT len); +extern lex lex_init(u8 *src, UINT len); extern tok lex_next(lex *l); extern tok lex_kind(lex *l, tok_k k); extern tok lex_peek(lex *l); diff --git a/src/keyword.c b/src/keyword.c new file mode 100644 index 0000000..e42526c --- /dev/null +++ b/src/keyword.c @@ -0,0 +1,29 @@ +// keyword.c +// Keyword source file for G +// Copyright (C) 2021, Jakob Wakeling +// All rights reserved. + + + +#include "keyword.h" + +#include "cll/cll.h" +#include "cll/fnv.h" + +#include <string.h> + +typedef enum { KK_PROC, KK_RETURN, } kwd_k; + +static kwd kwds[] = { + { LK_PROC, 0x85729B0E3537BC61, "proc" }, + { LK_RETURN, 0xC5C7B983377CAD5F, "return" }, +}; + +kwd *k_proc = &kwds[KK_PROC]; kwd *k_return = &kwds[KK_RETURN]; + +/* Return pointer to keyword or null if invalid. */ +kwd *kwd_find(u64 hash) { + for (UINT i = 0; i < sizeof (kwds) / sizeof (*kwds); ++i) { + if (hash == kwds[i].h) { return &kwds[i]; } + } return NULL; +} diff --git a/src/keyword.h b/src/keyword.h new file mode 100644 index 0000000..851848f --- /dev/null +++ b/src/keyword.h @@ -0,0 +1,21 @@ +// keyword.h +// Keyword header file for G +// Copyright (C) 2021, Jakob Wakeling +// All rights reserved. + + + +#ifndef G_KEYWORD_H_UEY4FULO +#define G_KEYWORD_H_UEY4FULO + +#include "g.h" + +#include "cll/cll.h" + +typedef struct { tok_k k; u64 h; char *name; } kwd; + +extern kwd *k_proc, *k_return; + +extern kwd *kwd_find(u64 hash); + +#endif // G_KEYWORD_H_UEY4FULO diff --git a/src/lex.c b/src/lex.c index 9cc9018..b7ad3b4 100644 --- a/src/lex.c +++ b/src/lex.c @@ -6,6 +6,7 @@ #include "g.h" +#include "keyword.h" #include "type.h" #include "cll/error.h" @@ -25,30 +26,20 @@ #define ISIDNCB(c) (isalpha(c) || isdigit(c) || c == '_') char *tok_ks[] = { - "LK_VOID", "LK_EOF", + "LK_NIL", "LK_EOF", "LK_IDN", + "LK_INT", "LK_FLT", "LK_CHR", "LK_STR", - "LK_IDN", "LK_INT", "LK_FLT", - "LK_CHR", "LK_STR", - - "LK_LBRACK", "LK_RBRACK", - "LK_LPAREN", "LK_RPAREN", - "LK_LBRACE", "LK_RBRACE", - "LK_COLON", "LK_SCOLON", + "LK_LPAREN", "LK_RPAREN", "LK_LBRACK", "LK_RBRACK", + "LK_LBRACE", "LK_RBRACE", "LK_COLON", "LK_SCOLON", "LK_PERIOD", "LK_COMMA", - "LK_RARROW", - "LK_ADD", "LK_SUB", "LK_MUL", "LK_DIV", "LK_MOD", - "LK_LNOT", "LK_BNOT", "LK_BAND", "LK_BOR", "LK_BXOR", - "LK_SHL", "LK_SHR", "LK_EQ", "LK_NEQ", "LK_LT", "LK_LTE", - "LK_GT", "LK_GTE", "LK_LAND", "LK_LOR", "LK_TERN", "LK_ASSN", - "LK_ADDEQ", "LK_SDDEQ", "LK_MULEQ", "LK_DIVEQ", "LK_MODEQ", - "LK_ANDEQ", "LK_OREQ", "LK_XOREQ", "LK_SHLEQ", "LK_SHREQ", - "LK_PROC", "LK_RETURN", "LK_IF", "LK_ELSE", "LK_FOR", + "LK_RARROW", + "LK_PROC", "LK_RETURN", }; /* Initialise a lexer. */ -lex lex_init(str src, UINT len) { +lex lex_init(u8 *src, UINT len) { lex l = { src, 0, len, 0, 0 }; lex_next(&l); return l; } @@ -57,7 +48,7 @@ tok lex_next(lex *l) { /* Short circuit if the current token is EOF */ if (l->t.k == LK_EOF) { return l->t; } - tok t = l->t, n; str ss = NULL; UINT sl = 0; + tok t = l->t, n; u8 *ss = NULL; UINT sl = 0; skip:; /* Skip null characters and whitespace */ @@ -76,16 +67,12 @@ skip:; } n.p.ln = l->ln; n.p.cl = l->cl; if (l->sp + 1 != l->sl) { - if (ISIDNCA(C)) { /* Identifiers */ + if (ISIDNCA(C)) { /* Identifiers and Keywords */ for (ss = &C, ++sl, ++l->sp; ISIDNCB(C); ++sl, ++l->sp); - // printf("%s[%zu]: %lx\n", ss, sl, hashl(ss, sl)); - - switch (fnv1a64((u8 *)ss, sl)) { - case 0x85729B0E3537BC61: { n.k = LK_PROC; } goto end; - case 0xC5C7B983377CAD5F: { n.k = LK_RETURN; } goto end; - default: { n.k = LK_IDN; goto end; } - } + /* Check for a keyword, and store its hash */ + u64 h = fnv1a64(ss, sl); kwd *k = kwd_find(h); n.h = h; + if (k) { n.k = k->k; } else { n.k = LK_IDN; } goto end; } else if (isdigit(C)) { /* Numbers */ for (ss = &C, ++sl, ++l->sp; isalnum(C); ++sl, ++l->sp); @@ -94,30 +81,19 @@ skip:; } else switch (C) { - case '[': { n.k = LK_LBRACK; } goto esc_1; - case ']': { n.k = LK_RBRACK; } goto esc_1; case '(': { n.k = LK_LPAREN; } goto esc_1; case ')': { n.k = LK_RPAREN; } goto esc_1; + case '[': { n.k = LK_LBRACK; } goto esc_1; + case ']': { n.k = LK_RBRACK; } goto esc_1; case '{': { n.k = LK_LBRACE; } goto esc_1; case '}': { n.k = LK_RBRACE; } goto esc_1; case ':': { n.k = LK_COLON; } goto esc_1; case ';': { n.k = LK_SCOLON; } goto esc_1; case '.': { n.k = LK_PERIOD; } goto esc_1; case ',': { n.k = LK_COMMA; } goto esc_1; - case '=': { n.k = LK_ASSN; } goto esc_1; - case '+': { n.k = LK_ADD; } goto esc_1; case '-': switch (D) { case '>': { n.k = LK_RARROW; } goto esc_2; - default: { n.k = LK_SUB; } goto esc_1; } - case '*': { n.k = LK_MUL; } goto esc_1; - case '/': { n.k = LK_DIV; } goto esc_1; - case '%': { n.k = LK_MOD; } goto esc_1; - case '!': { n.k = LK_LNOT; } goto esc_1; - case '~': { n.k = LK_BNOT; } goto esc_1; - case '&': { n.k = LK_BAND; } goto esc_1; - case '|': { n.k = LK_BOR; } goto esc_1; - case '^': { n.k = LK_BXOR; } goto esc_1; esc_1: { ss = &C; sl += 1; l->sp += 1; } goto end; esc_2: { ss = &C; sl += 2; l->sp += 2; } goto end; esc_3: { ss = &C; sl += 3; l->sp += 3; } goto end; @@ -126,7 +102,7 @@ skip:; } end:; - n.s = strndup(ss, sl); l->cl += sl; + n.s = (u8 *)strndup((char *)ss, sl); l->cl += sl; ret:; l->t = n; return t; diff --git a/src/map.c b/src/map.c index 0130bae..a6b83f6 100644 --- a/src/map.c +++ b/src/map.c @@ -14,9 +14,9 @@ #include <string.h> /* Initialise a new map entry. */ -static inline ent *ent_init(str k, sym v) { +static inline ent *ent_init(u8 *k, sym v) { ent *e = calloc(1, sizeof (*e)); if (!e) { return NULL; } - e->k = strdup(k); e->v = v; return e; + e->k = (u8 *)strdup((char *)k); e->v = v; return e; } /* Grow a map. */ @@ -44,18 +44,23 @@ extern void map_free(map *m) { } /* Get the element associated with a key. */ -extern sym *map_get(map *m, str k) { - register ent *e = m->a[fnv1a64((u8 *)k, strlen(k)) % m->ac]; +extern sym *map_get(map *m, u8 *k) { + register ent *e = m->a[fnv1a64((u8 *)k, strlen((char *)k)) % m->ac]; /* Check if the key is present in the bucket */ - for (; e; e = e->n) { if (!strcmp(k, e->k)) { return &e->v; }} return NULL; + for (; e; e = e->n) { + if (!strcmp((char *)k, (char *)e->k)) { return &e->v; } + } + + return NULL; } /* Set the element associated with a key. */ -extern void map_set(map *m, str k, sym v) { +extern void map_set(map *m, u8 *k, sym v) { if ((f64)m->al / m->ac >= 0.75) { map_grow(m); } - u64 i = fnv1a64((u8 *)k, strlen(k)) % m->ac; register ent *e = m->a[i]; + u64 i = fnv1a64((u8 *)k, strlen((char *)k)) % m->ac; + register ent *e = m->a[i]; /* Check if the bucket is completely empty */ if (!e) { @@ -64,10 +69,12 @@ extern void map_set(map *m, str k, sym v) { } /* Check if the key matches the first entry in the bucket */ - if (!strcmp(k, e->k)) { e->v = v; return; } + if (!strcmp((char *)k, (char *)e->k)) { e->v = v; return; } /* Check if the key is already present in the rest of the bucket */ - for (; e->n; e = e->n) { if (!strcmp(k, e->n->k)) { e->n->v = v; return; }} + for (; e->n; e = e->n) { + if (!strcmp((char *)k, (char *)e->n->k)) { e->n->v = v; return; } + } /* Add a new entry at the end of the bucket */ e->n = ent_init(k, v); /* TODO check memory allocation */ @@ -75,6 +82,6 @@ extern void map_set(map *m, str k, sym v) { } /* Delete the element associated with a key. */ -extern void map_del(map *m, str k) { +extern void map_del(map *m, u8 *k) { /* TODO */ } diff --git a/src/map.h b/src/map.h index 477c85f..585ac67 100644 --- a/src/map.h +++ b/src/map.h @@ -15,14 +15,14 @@ typedef enum { SK_VOID, } ent_k; /* Entry Kind */ typedef enum { SF_VOID = BIT(0), } ent_f; /* Entry Flag */ typedef struct sym { ent_k k; ent_f f; type t; } sym; -typedef struct ent { str k; sym v; struct ent *n, *c; } ent; +typedef struct ent { u8 *k; sym v; struct ent *n, *c; } ent; typedef struct { ent **a, *c; UINT al, ac; } map; extern void map_init(map *m); extern void map_free(map *m); -extern sym *map_get(map *m, str k); -extern void map_put(map *m, str k, sym s); -extern void map_del(map *m, str k); +extern sym *map_get(map *m, u8 *k); +extern void map_put(map *m, u8 *k, sym s); +extern void map_del(map *m, u8 *k); #endif // OMKOV_G_MAP_H_ISL5XLWM diff --git a/src/parse.c b/src/parse.c index 8bd85c3..ca9bc96 100644 --- a/src/parse.c +++ b/src/parse.c @@ -17,10 +17,8 @@ #include <stdlib.h> #include <string.h> -// #define L (p) - char *ast_ks[] = { - "AK_VOID", + "AK_NIL", "AK_DECL", "AK_ASSN", "AK_COMP", @@ -69,7 +67,7 @@ static ast *parser_parse_decl(lex *l) { switch (lex_peek(l).k) { case LK_COLON: { lex_kind(l, LK_COLON); a->k = AK_DECL; } goto decl_expr; - case LK_ASSN: { lex_kind(l, LK_ASSN); a->k = AK_ASSN; } goto decl_expr; + // case LK_ASSN: { lex_kind(l, LK_ASSN); a->k = AK_ASSN; } goto decl_expr; decl_expr: { a->cl = parser_parse_expr(l); } break; default: { error( 1, "%zu:%zu: Unexpected: \"%s\" (parser_parse_decl)", diff --git a/src/type.c b/src/type.c index e06408a..c15934b 100644 --- a/src/type.c +++ b/src/type.c @@ -10,71 +10,71 @@ #include <stdlib.h> static type types[] = { - { TK_VOID, 0, 0, "void" }, - { TK_PTR, TF_PTR, -1, "ptr" }, - { TK_TYPE, 0, -1, "type" }, - { TK_ANY, 0, -1, "any" }, + { TK_VOID, 0, 0, "void" }, + { TK_PTR, TF_PTR, -1, "ptr" }, + { TK_TYPE, 0, -1, "type" }, + { TK_ANY, 0, -1, "any" }, - { TK_BOOL, TF_BOOL, 1, "bool" }, - { TK_B8, TF_BOOL, 1, "b8" }, - { TK_B16, TF_BOOL, 2, "b16" }, - { TK_B32, TF_BOOL, 4, "b32" }, - { TK_B64, TF_BOOL, 8, "b64" }, + { TK_BOOL, TF_BOOL, 1, "bool" }, + { TK_B8, TF_BOOL, 1, "b8" }, + { TK_B16, TF_BOOL, 2, "b16" }, + { TK_B32, TF_BOOL, 4, "b32" }, + { TK_B64, TF_BOOL, 8, "b64" }, - { TK_UINT, TF_INT, -1, "unt" }, - { TK_U8, TF_INT, 1, "u8" }, - { TK_U16, TF_INT, 2, "u16" }, - { TK_U32, TF_INT, 4, "u32" }, - { TK_U64, TF_INT, 8, "u64" }, + { TK_UINT, TF_INT, -1, "unt" }, + { TK_U8, TF_INT, 1, "u8" }, + { TK_U16, TF_INT, 2, "u16" }, + { TK_U32, TF_INT, 4, "u32" }, + { TK_U64, TF_INT, 8, "u64" }, { TK_U128, TF_INT, 16, "u128" }, - { TK_SINT, TF_INT | TF_SIGN, -1, "int" }, - { TK_S8, TF_INT | TF_SIGN, 1, "i8" }, - { TK_S16, TF_INT | TF_SIGN, 2, "i16" }, - { TK_S32, TF_INT | TF_SIGN, 4, "i32" }, - { TK_S64, TF_INT | TF_SIGN, 8, "i64" }, + { TK_SINT, TF_INT | TF_SIGN, -1, "int" }, + { TK_S8, TF_INT | TF_SIGN, 1, "i8" }, + { TK_S16, TF_INT | TF_SIGN, 2, "i16" }, + { TK_S32, TF_INT | TF_SIGN, 4, "i32" }, + { TK_S64, TF_INT | TF_SIGN, 8, "i64" }, { TK_S128, TF_INT | TF_SIGN, 16, "i128" }, - { TK_F16, TF_FLT | TF_SIGN, 2, "f16" }, - { TK_F32, TF_FLT | TF_SIGN, 4, "f32" }, - { TK_F64, TF_FLT | TF_SIGN, 8, "f64" }, + { TK_F16, TF_FLT | TF_SIGN, 2, "f16" }, + { TK_F32, TF_FLT | TF_SIGN, 4, "f32" }, + { TK_F64, TF_FLT | TF_SIGN, 8, "f64" }, { TK_F128, TF_FLT | TF_SIGN, 16, "f128" }, - { TK_C32, TF_FLT | TF_SIGN, 4, "c32" }, - { TK_C64, TF_FLT | TF_SIGN, 8, "c64" }, + { TK_C32, TF_FLT | TF_SIGN, 4, "c32" }, + { TK_C64, TF_FLT | TF_SIGN, 8, "c64" }, { TK_C128, TF_FLT | TF_SIGN, 16, "c128" }, { TK_C256, TF_FLT | TF_SIGN, 32, "c256" }, - { TK_I16LE, TF_INT | TF_SIGN | TF_LE, 2, "i16le" }, - { TK_I32LE, TF_INT | TF_SIGN | TF_LE, 4, "i32le" }, - { TK_I64LE, TF_INT | TF_SIGN | TF_LE, 8, "i64le" }, + { TK_I16LE, TF_INT | TF_SIGN | TF_LE, 2, "i16le" }, + { TK_I32LE, TF_INT | TF_SIGN | TF_LE, 4, "i32le" }, + { TK_I64LE, TF_INT | TF_SIGN | TF_LE, 8, "i64le" }, { TK_I128LE, TF_INT | TF_SIGN | TF_LE, 16, "i128le" }, - { TK_I16BE, TF_INT | TF_SIGN | TF_BE, 2, "i16be" }, - { TK_I32BE, TF_INT | TF_SIGN | TF_BE, 4, "i32be" }, - { TK_I64BE, TF_INT | TF_SIGN | TF_BE, 8, "i64be" }, + { TK_I16BE, TF_INT | TF_SIGN | TF_BE, 2, "i16be" }, + { TK_I32BE, TF_INT | TF_SIGN | TF_BE, 4, "i32be" }, + { TK_I64BE, TF_INT | TF_SIGN | TF_BE, 8, "i64be" }, { TK_I128BE, TF_INT | TF_SIGN | TF_BE, 16, "i128be" }, - { TK_U16LE, TF_INT | TF_LE, 2, "u16le" }, - { TK_U32LE, TF_INT | TF_LE, 4, "u32le" }, - { TK_U64LE, TF_INT | TF_LE, 8, "u64le" }, + { TK_U16LE, TF_INT | TF_LE, 2, "u16le" }, + { TK_U32LE, TF_INT | TF_LE, 4, "u32le" }, + { TK_U64LE, TF_INT | TF_LE, 8, "u64le" }, { TK_U128LE, TF_INT | TF_LE, 16, "u128le" }, - { TK_U16BE, TF_INT | TF_BE, 2, "u16be" }, - { TK_U32BE, TF_INT | TF_BE, 4, "u32be" }, - { TK_U64BE, TF_INT | TF_BE, 8, "u64be" }, + { TK_U16BE, TF_INT | TF_BE, 2, "u16be" }, + { TK_U32BE, TF_INT | TF_BE, 4, "u32be" }, + { TK_U64BE, TF_INT | TF_BE, 8, "u64be" }, { TK_U128BE, TF_INT | TF_BE, 16, "u128be" }, - { TK_F16LE, TF_FLT | TF_SIGN | TF_LE, 2, "f16le" }, - { TK_F32LE, TF_FLT | TF_SIGN | TF_LE, 4, "f32le" }, - { TK_F64LE, TF_FLT | TF_SIGN | TF_LE, 8, "f64le" }, + { TK_F16LE, TF_FLT | TF_SIGN | TF_LE, 2, "f16le" }, + { TK_F32LE, TF_FLT | TF_SIGN | TF_LE, 4, "f32le" }, + { TK_F64LE, TF_FLT | TF_SIGN | TF_LE, 8, "f64le" }, { TK_F128LE, TF_FLT | TF_SIGN | TF_LE, 16, "f128le" }, - { TK_F16BE, TF_FLT | TF_SIGN | TF_BE, 2, "f16be" }, - { TK_F32BE, TF_FLT | TF_SIGN | TF_BE, 4, "f32be" }, - { TK_F64BE, TF_FLT | TF_SIGN | TF_BE, 8, "f64be" }, + { TK_F16BE, TF_FLT | TF_SIGN | TF_BE, 2, "f16be" }, + { TK_F32BE, TF_FLT | TF_SIGN | TF_BE, 4, "f32be" }, + { TK_F64BE, TF_FLT | TF_SIGN | TF_BE, 8, "f64be" }, { TK_F128BE, TF_FLT | TF_SIGN | TF_BE, 16, "f128be" }, { TK_CHAR, TF_INT | TF_CHAR, 1, "char" }, { TK_RUNE, TF_INT | TF_CHAR, 4, "rune" }, - { TK_STR, TF_STR, -1, "str" }, + { TK_STR, TF_STR, -1, "str" }, }; type *t_void = &types[TK_VOID]; type *t_ptr = &types[TK_PTR]; @@ -112,13 +112,13 @@ type *t_char = &types[TK_CHAR]; type *t_rune = &types[TK_RUNE]; type *t_str = &types[TK_STR]; /* Initialise a new type. */ -type *type_new(type *base) { +type *type_init(type *base) { type *t = calloc(1, sizeof (type)); if (!t) { return NULL; } *t = *base; t->base = base; return t; } /* Initialise a new pointer type. */ -type *ptrt_new(type *base) { +type *ptrt_init(type *base) { type *t = calloc(1, sizeof (type)); if (!t) { return NULL; } t->k = TK_PTR; t->l = -1; t->base = base; return t; } diff --git a/src/type.h b/src/type.h index 9503743..2348014 100644 --- a/src/type.h +++ b/src/type.h @@ -5,8 +5,8 @@ -#ifndef OMKOV_G_TYPE_H_QHH0TJJQ -#define OMKOV_G_TYPE_H_QHH0TJJQ +#ifndef G_TYPE_H_QHH0TJJQ +#define G_TYPE_H_QHH0TJJQ #include "cll/cll.h" @@ -31,7 +31,7 @@ typedef enum { TK_F16BE, TK_F32BE, TK_F64BE, TK_F128BE, TK_CHAR, TK_RUNE, TK_STR, -} type_k; /* Type Kind */ +} type_k; typedef enum { TF_VOID = BIT(0), TF_PTR = BIT(1), @@ -43,11 +43,11 @@ typedef enum { TF_CHAR = BIT(16), TF_STR = BIT(17), TF_NUM = TF_INT | TF_FLT | TF_CLX, -} type_f; /* Type Flag */ +} type_f; typedef struct type { type_k k; type_f f; sint l; - str name; struct type *base; + u8 *name; struct type *base; } type; extern type *t_void, *t_ptr, *t_type, *t_any; @@ -68,8 +68,8 @@ extern type *t_f16be, *t_f32be, *t_f64be, *t_f128be; extern type *t_char, *t_rune, *t_str; -extern type *type_new(type *base); -extern type *ptrt_new(type *base); +extern type *type_init(type *base); +extern type *ptrt_init(type *base); extern bool is_num(type *t); extern bool is_int(type *t); @@ -77,4 +77,4 @@ extern bool is_flt(type *t); extern bool is_com(type *t1, type *t2); -#endif // OMKOV_G_TYPE_H_QHH0TJJQ +#endif // G_TYPE_H_QHH0TJJQ diff --git a/src/value.c b/src/value.c index 7bb75e2..0e0e6fa 100644 --- a/src/value.c +++ b/src/value.c @@ -17,7 +17,7 @@ val val_u64(u64 i) { return (val){ VK_INT, .v_int = i }; } val val_f128(f128 f) { return (val){ VK_FLT, .v_flt = f }; } /* Convert an integer string to a val. */ -val val_strint(str s) { +val val_strint(u8 *s) { val v = { VK_INT, .v_int = 0 }; u64 c; UINT b = 10; if (s[0] == '0') switch (s[1]) { @@ -40,6 +40,6 @@ val val_strint(str s) { } /* Convert a float string to a val. */ -val val_strflt(str s) { +val val_strflt(u8 *s) { return val_null; /* TODO */ } diff --git a/src/value.h b/src/value.h index 625e980..867b652 100644 --- a/src/value.h +++ b/src/value.h @@ -23,7 +23,7 @@ extern val val_bool(bool v); extern val val_u64(u64 v); extern val val_f128(f128 v); -extern val val_strint(str s); -extern val val_strflt(str s); +extern val val_strint(u8 *s); +extern val val_strflt(u8 *s); #endif // OMKOV_G_VALUE_H_X2RKXBBA