diff options
author | kdx <kikoodx@paranoici.org> | 2023-03-16 05:17:10 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-03-16 05:18:55 +0100 |
commit | 57f62e264e2e885d3fa0e48e2be926df8189b354 (patch) | |
tree | 54c13ee3821ab8255317e7a60b2c613c0a8660da | |
parent | 6639768197e3b3b23ddb2cec685c9431a96be76c (diff) | |
download | golem-57f62e264e2e885d3fa0e48e2be926df8189b354.tar.gz |
identify if/else/while and expr
-rw-r--r-- | group.h | 22 | ||||
-rw-r--r-- | identify.c | 40 | ||||
-rw-r--r-- | identify.h | 4 | ||||
-rw-r--r-- | main.c | 4 |
4 files changed, 61 insertions, 9 deletions
@@ -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; @@ -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; +} @@ -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); @@ -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); } |