summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-03-14 21:45:49 +0100
committerkdx <kikoodx@paranoici.org>2023-03-14 21:51:27 +0100
commit29f0cf60472ad791e4ef62460c55e213bc9d8fd2 (patch)
treea058454f3876faccaf652ad47124cacb7200cea8
parenta2222a6e270b38cdb214f5975903fef6699f61f4 (diff)
downloadgolem-29f0cf60472ad791e4ef62460c55e213bc9d8fd2.tar.gz
group declarations
-rw-r--r--README.md3
-rw-r--r--group.c55
-rw-r--r--group.h13
-rw-r--r--main.c2
-rw-r--r--mvp.golem3
5 files changed, 65 insertions, 11 deletions
diff --git a/README.md b/README.md
index a9eaa1c..8749cd1 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,7 @@ Work in progress bytecode language created by and for [kdx](https://kdx.re).
// Global scope is initialized to zero.
global g_heap;
+global g_another g_one;
main(argc argv) {
local hello;
@@ -43,6 +44,8 @@ strdup(str) {
i = 0;
while (lesseq i [str 0]) {
+ local smile please;
+
[dest i] = [str i];
i = (add i 1);
}
diff --git a/group.c b/group.c
index dd0ce3f..f166193 100644
--- a/group.c
+++ b/group.c
@@ -3,7 +3,32 @@
#include <stdlib.h>
#include <stdio.h>
-Token *group_create(Token **list, Token *begin, Token *end)
+static int
+group_dec(Token **list, unsigned int tok_type, unsigned int group_type)
+{
+ for (;;) {
+ Token *begin = token_search(*list, tok_type);
+ if (begin == NULL)
+ break;
+ Token *end = token_search(begin, TOK_END);
+ if (end == NULL) {
+ fprintf(stderr, "ill formed declaration\n");
+ return 1;
+ }
+ Token *group = group_create(list, begin, end);
+ if (group == NULL) {
+ fprintf(stderr, "group_create failed\n");
+ return 1;
+ }
+ group->group.type = group_type;
+ token_delete(&group->group.tokens, begin);
+ token_delete(&group->group.tokens, end);
+ }
+ return 0;
+}
+
+Token *
+group_create(Token **list, Token *begin, Token *end)
{
Token *group = malloc(sizeof(Token));
if (group == NULL) {
@@ -15,20 +40,36 @@ Token *group_create(Token **list, Token *begin, Token *end)
group->group.tokens = begin;
group->prev = begin->prev;
group->next = end->next;
- if (*list == begin)
- *list = group;
- else
- begin->prev->next = group;
begin->prev = NULL;
end->next = NULL;
+ if (*list == begin)
+ *list = group;
+ else if (group->prev != NULL)
+ group->prev->next = group;
+ if (group->next != NULL)
+ group->next->prev = group;
return group;
}
-int group_scope(Token **list)
+int
+group_local(Token **list)
+{
+ return group_dec(list, TOK_KW_LOCAL, GROUP_DEC_LOCAL);
+}
+
+int
+group_global(Token **list)
+{
+ return group_dec(list, TOK_KW_GLOBAL, GROUP_DEC_GLOBAL);
+}
+
+int
+group_scope(Token **list)
{
for (;;) {
Token *begin = token_search(*list, TOK_OPEN_CURL);
- Token *end = token_search_closing(*list, TOK_CLOS_CURL, TOK_OPEN_CURL);
+ Token *end = token_search_closing(begin, TOK_CLOS_CURL,
+ TOK_OPEN_CURL);
if (begin == NULL && end == NULL)
return 0;
if (begin == NULL || end == NULL) {
diff --git a/group.h b/group.h
index 303b44e..cd3c9b2 100644
--- a/group.h
+++ b/group.h
@@ -1,10 +1,12 @@
#pragma once
enum {
- GROUP_NONE = 0,
- GROUP_SCOPE = 's',
- GROUP_FUNCTION = 'f',
- GROUP_ASSIGN = '=',
+ GROUP_NONE = 0,
+ GROUP_SCOPE = 's',
+ GROUP_FUNCTION = 'f',
+ GROUP_ASSIGN = '=',
+ GROUP_DEC_LOCAL = 'l',
+ GROUP_DEC_GLOBAL = 'g',
};
struct Token;
@@ -13,4 +15,7 @@ typedef struct {
struct Token *tokens;
} Group;
+struct Token *group_create(struct Token **l, struct Token *b, struct Token *e);
+int group_local(struct Token **list);
+int group_global(struct Token **list);
int group_scope(struct Token **list);
diff --git a/main.c b/main.c
index 5bd22c3..61af8be 100644
--- a/main.c
+++ b/main.c
@@ -24,6 +24,8 @@ main(int argc, char **argv)
fclose(file);
Token *tokens = lexer(slice);
+ group_global(&tokens);
+ group_local(&tokens);
group_scope(&tokens);
token_print(tokens, 1, 0);
token_destroy(tokens);
diff --git a/mvp.golem b/mvp.golem
index 9877673..41c9db5 100644
--- a/mvp.golem
+++ b/mvp.golem
@@ -4,6 +4,7 @@
// Global scope is initialized to zero.
global g_heap;
+global g_another g_one;
main(argc argv) {
local hello;
@@ -36,6 +37,8 @@ strdup(str) {
i = 0;
while (lesseq i [str 0]) {
+ local smile please;
+
[dest i] = [str i];
i = (add i 1);
}