summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-03-16 05:17:10 +0100
committerkdx <kikoodx@paranoici.org>2023-03-16 05:18:55 +0100
commit57f62e264e2e885d3fa0e48e2be926df8189b354 (patch)
tree54c13ee3821ab8255317e7a60b2c613c0a8660da
parent6639768197e3b3b23ddb2cec685c9431a96be76c (diff)
downloadgolem-57f62e264e2e885d3fa0e48e2be926df8189b354.tar.gz
identify if/else/while and expr
-rw-r--r--group.h22
-rw-r--r--identify.c40
-rw-r--r--identify.h4
-rw-r--r--main.c4
4 files changed, 61 insertions, 9 deletions
diff --git a/group.h b/group.h
index a2cf087..a2bf63f 100644
--- a/group.h
+++ b/group.h
@@ -1,15 +1,19 @@
#pragma once
enum {
- GROUP_NONE = 0,
- GROUP_SCOPE = 's',
- GROUP_ATOM = 'a',
- GROUP_FUNCTION = 'f',
- GROUP_FUNCALL = 'e',
- GROUP_ASSIGN = '=',
- GROUP_LET = 'l',
- GROUP_DEREF = 'd',
- GROUP_RETURN = 'r',
+ GROUP_NONE = 0,
+ GROUP_SCOPE = 's',
+ GROUP_ATOM = 'a',
+ GROUP_FUNCTION = 'f',
+ GROUP_EXPRESSION = 'x',
+ GROUP_FUNCALL = 'e',
+ GROUP_ASSIGN = '=',
+ GROUP_LET = 'l',
+ GROUP_DEREF = 'd',
+ GROUP_RETURN = 'r',
+ GROUP_IF = 'i',
+ GROUP_ELSE = 'o',
+ GROUP_WHILE = 'w',
};
struct Token;
diff --git a/identify.c b/identify.c
index cafa1af..1fd993a 100644
--- a/identify.c
+++ b/identify.c
@@ -18,6 +18,20 @@ identify_dec(Token **list, unsigned int type)
return 1;
}
+static int
+identify_control(Token **list, unsigned int type)
+{
+ if (token_len(*list) != 3)
+ return 0;
+ if ((*list)->type != type)
+ return 0;
+ // TODO: Add checks for condition type.
+ if (!token_isgroup((*list)->next->next, GROUP_SCOPE))
+ return 0;
+ token_delete(list, *list);
+ return 1;
+}
+
void
identify(Token *list, int (*fun)(Token**), unsigned int type, int recurse)
{
@@ -72,3 +86,29 @@ identify_assign(Token **list)
token_delete(list, (*list)->next);
return 1;
}
+
+int
+identify_if(Token **list)
+{
+ return identify_control(list, TOK_KW_IF);
+}
+
+int
+identify_else(Token **list)
+{
+ return identify_control(list, TOK_KW_ELSE);
+}
+
+int
+identify_while(Token **list)
+{
+ return identify_control(list, TOK_KW_WHILE);
+}
+
+int
+identify_expression(Token **list)
+{
+ if (token_len(*list) != 1 || !token_isgroup(*list, GROUP_FUNCALL))
+ return 0;
+ return 1;
+}
diff --git a/identify.h b/identify.h
index e4ca175..4c39a8a 100644
--- a/identify.h
+++ b/identify.h
@@ -6,3 +6,7 @@ int identify_function(Token **list);
int identify_let(Token **list);
int identify_return(Token **list);
int identify_assign(Token **list);
+int identify_if(Token **list);
+int identify_else(Token **list);
+int identify_while(Token **list);
+int identify_expression(Token **list);
diff --git a/main.c b/main.c
index ef2d3b7..65c296d 100644
--- a/main.c
+++ b/main.c
@@ -43,6 +43,10 @@ main(int argc, char **argv)
identify(tokens, identify_let, GROUP_LET, 1);
identify(tokens, identify_return, GROUP_RETURN, 1);
identify(tokens, identify_assign, GROUP_ASSIGN, 1);
+ identify(tokens, identify_if, GROUP_IF, 1);
+ identify(tokens, identify_else, GROUP_ELSE, 1);
+ identify(tokens, identify_while, GROUP_WHILE, 1);
+ identify(tokens, identify_expression, GROUP_EXPRESSION, 1);
token_print(tokens, 1, 0);
token_destroy(tokens);
}