summaryrefslogtreecommitdiff
path: root/c/libdietc.l
diff options
context:
space:
mode:
authorMatthew Sotoudeh <matthew@masot.net>2023-07-30 21:16:09 -0700
committerMatthew Sotoudeh <matthew@masot.net>2023-07-30 21:16:09 -0700
commitc8ef4cf86bb97033238e3aa5c95789ea665341b1 (patch)
tree9af6be822a495554d26691233b8031bf10833995 /c/libdietc.l
parent4de60a709d3af497781b7467f2c6fe7e09b39595 (diff)
C dynamic typing pass works as well
Diffstat (limited to 'c/libdietc.l')
-rw-r--r--c/libdietc.l59
1 files changed, 41 insertions, 18 deletions
diff --git a/c/libdietc.l b/c/libdietc.l
index cd167b2..7133803 100644
--- a/c/libdietc.l
+++ b/c/libdietc.l
@@ -21,17 +21,20 @@ static void end_function();
^[#].*$ {}
"typedef Type_"[0-9]*" * Type_"[0-9]*" ;" { declare_pointer(yytext); }
"typedef Type_"[0-9]*" Type_"[0-9]*" [ "[^ ]*" ] ;" { declare_array(yytext); }
-"typedef Type_"[0-9]*" ( "[^)\n]*") ;" { declare_function(yytext); }
+"typedef Type_"[0-9]*" Type_"[0-9]*" ( "[^)\n]*") ;" { declare_function(yytext); }
"typedef struct Struct_"[0-9]*" Type_"[0-9]*" ;" { predeclare_struct(yytext); }
"struct Struct_"[0-9]*" { "[^}\n]*"} ;" { define_aggregate(yytext); }
"typedef union Union_"[0-9]*" Type_"[0-9]*" ;" { predeclare_union(yytext); }
"union Union_"[0-9]*" { "[^}\n]*"} ;" { define_aggregate(yytext); }
-"typedef ".*" ;" { declare_basic(yytext); }
+"typedef "[^*\n\t(]*" ;" { declare_basic(yytext); }
"extern Type_"[0-9]*" "[^ \n]*" ;" { declare_object(yytext); }
"static Type_"[0-9]*" "[^ \n]*" ;" { declare_object(yytext); }
^[^=\n\t]*"= ".*$ { /* definition */ }
^[^{\n]*"{"$ { start_function(yytext); }
-\tType_[0-9]*" "[a-zA-Z0-9_]*" ;" { declare_object(yytext); add_instruction(yytext); }
+^\tType_[0-9]*" "[a-zA-Z0-9_]*" ;"$ {
+ declare_object(yytext);
+ add_instruction(yytext);
+ }
\t[^\n]*$ { add_instruction(yytext); }
"}"$ { end_function(); }
\n { }
@@ -124,7 +127,7 @@ static void define_aggregate(char *line) {
*insert_at = field_type;
insert_at = &(field_type->next_member);
- line = strchrnul(strchrnul(line, ','), 'T');
+ line = strchrnul(strchrnul(line, ';'), 'T');
}
*insert_at = 0;
}
@@ -132,11 +135,12 @@ static void define_aggregate(char *line) {
static void declare_basic(char *line) {
char *basic = strdup(line + strlen("typedef "));
char *basic_end = basic;
- while (strncmp(basic_end + 1, "Type_", strlen(basic_end))) basic_end++;
+ while (strncmp(basic_end, "Type_", strlen("Type_"))) basic_end++;
+ basic_end--;
// now basic_end is the space right before Type_
*basic_end = '\0';
- line += (basic_end - basic);
- struct type type = {strdup(line), TYPE_BASIC, next_number(&line), 0};
+ char *type_name = line + (basic_end - basic);
+ struct type type = {strdup(line), TYPE_BASIC, next_number(&type_name), 0};
type.basic = basic;
add_type(type);
}
@@ -152,30 +156,31 @@ static unsigned long hash(char *str) { // djb2
}
// ... Type_# name ;
-static void declare_object(char *line) {
+static void insert_object(struct object *object) {
// MAYBE REHASH
if (PROGRAM.n_objects >= PROGRAM.cap_objects / 2) {
unsigned long old_cap = PROGRAM.cap_objects;
struct object **old_objects = PROGRAM.objects;
PROGRAM.cap_objects = 4 * (PROGRAM.n_objects + 1);
PROGRAM.objects = calloc(PROGRAM.cap_objects, sizeof(void*));
- for (unsigned long i = 0; i < old_cap; i++) {
- if (!old_objects[i]) continue;
- unsigned long h = hash(old_objects[i]->name) % old_cap;
- while (PROGRAM.objects[h]) h = (h + 1) % old_cap;
- PROGRAM.objects[h] = old_objects[i];
- }
+ for (unsigned long i = 0; i < old_cap; i++)
+ if (old_objects[i])
+ insert_object(old_objects[i]);
free(old_objects);
}
// INSERT
- struct object *object = malloc(sizeof(*object));
- object->type = PROGRAM.id2type[next_number(&line)];
- object->name = libdietc_tokdup(line + 1);
PROGRAM.n_objects++;
unsigned long h = hash(object->name) % PROGRAM.cap_objects;
- while (PROGRAM.objects[h]) h = (h + 1) % PROGRAM.cap_objects;
+ while (PROGRAM.objects[h])
+ h = ((h + 1) % PROGRAM.cap_objects);
PROGRAM.objects[h] = object;
}
+static void declare_object(char *line) {
+ struct object *object = calloc(1, sizeof(object));
+ object->type = PROGRAM.id2type[next_number(&line)];
+ object->name = libdietc_tokdup(line + 1);
+ insert_object(object);
+}
static void start_function(char *line) {
FUNCTION = (struct function){0};
@@ -241,3 +246,21 @@ void libdietc_print(struct program program) {
printf("}\n");
}
}
+
+char *libdietc_nth_token(char *string, int n) {
+ while (isspace(*string)) string++;
+ for (int i = 0; i < n; i++) {
+ while (!isspace(*string)) string++;
+ while (isspace(*string)) string++;
+ }
+ return string;
+}
+
+struct type *libdietc_object_type(struct program program, char *name) {
+ char *name_tok = libdietc_tokdup(name);
+ unsigned long h = hash(name_tok) % program.cap_objects;
+ while (program.objects[h] && strcmp(program.objects[h]->name, name))
+ h = (h + 1) % program.cap_objects;
+ free(name_tok);
+ return program.objects[h] ? program.objects[h]->type : 0;
+}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback