Skip to content

Commit bec465a

Browse files
committed
Implement identification of keywords
1 parent 71d1e33 commit bec465a

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

parse.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,48 @@ char STRING_CE[] = "ce";
4848
char STRING_COMMENT_START[] = "comments-start";
4949
char STRING_COMMENT_END[] = "comments-end";
5050

51+
struct KeywordMap {
52+
char *string;
53+
enum Keyword symbol;
54+
};
55+
56+
struct KeywordMap KEYWORD_MAP[] = {
57+
{"Dim", KWD_DIM},
58+
{"Local", KWD_LOCAL},
59+
{"Global", KWD_GLOBAL},
60+
{"Enum", KWD_ENUM},
61+
{"Const", KWD_CONST},
62+
{"Static", KWD_STATIC},
63+
{"ContinueCase", KWD_CONT_CASE},
64+
{"ContinueLoop", KWD_CONT_LOOP},
65+
{"Default", KWD_DEFAULT},
66+
{"Null", KWD_NULL},
67+
{"Do", KWD_DO},
68+
{"Until", KWD_UNTIL},
69+
{"While", KWD_WHILE},
70+
{"WEnd", KWD_END_WHILE},
71+
{"For", KWD_FOR},
72+
{"In", KWD_IN},
73+
{"To", KWD_TO},
74+
{"Step", KWD_STEP},
75+
{"Next", KWD_NEXT},
76+
{"Exit", KWD_EXIT},
77+
{"ExitLoop", KWD_EXITLOOP},
78+
{"Func", KWD_FUNC},
79+
{"Return", KWD_RETURN},
80+
{"EndFunc", KWD_END_FUNC},
81+
{"If", KWD_IF},
82+
{"Else", KWD_ELSE},
83+
{"ElseIf", KWD_ELSE_IF},
84+
{"EndIf", KWD_END_IF},
85+
{"ReDim", KWD_REDIM},
86+
{"Select", KWD_SELECT},
87+
{"Switch", KWD_SWITCH},
88+
{"Case", KWD_CASE},
89+
{"EndSelect", KWD_END_SELECT},
90+
{"EndSwitch", KWD_END_SWITCH},
91+
};
92+
5193
static void print_token(struct Token *token) {
5294
puts("---### TOKEN ###---");
5395
char *token_type;
@@ -119,6 +161,7 @@ struct Token token_get(char *code, char **next) {
119161
.type = TOK_UNKNOWN,
120162
.data = NULL,
121163
.data_len = 0,
164+
.info = NULL,
122165
};
123166
size_t length;
124167
char *next_code = NULL;
@@ -193,6 +236,12 @@ struct Token token_get(char *code, char **next) {
193236
token.type = TOK_WORD;
194237
token.data = code;
195238
token.data_len = length;
239+
240+
// Identify keywords
241+
for (size_t i = 0; i < sizeof KEYWORD_MAP / sizeof(struct KeywordMap); ++i) if (strncmp(KEYWORD_MAP[i].string, code, length) == 0) {
242+
token.info = &(KEYWORD_MAP[i].symbol);
243+
break;
244+
}
196245
} else if (*code == CHR_MACRO || *code == CHR_VARIABLE){
197246
// Macro or Variable
198247
token.type = *code == CHR_MACRO ? TOK_MACRO : TOK_VARIABLE;

parse.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,48 @@ enum TokenType {
3939
TOK_COMMA,
4040
};
4141

42+
enum Keyword {
43+
KWD_DIM,
44+
KWD_LOCAL,
45+
KWD_GLOBAL,
46+
KWD_ENUM,
47+
KWD_CONST,
48+
KWD_STATIC,
49+
KWD_CONT_CASE,
50+
KWD_CONT_LOOP,
51+
KWD_DEFAULT,
52+
KWD_NULL,
53+
KWD_DO,
54+
KWD_UNTIL,
55+
KWD_WHILE,
56+
KWD_END_WHILE,
57+
KWD_FOR,
58+
KWD_IN,
59+
KWD_TO,
60+
KWD_STEP,
61+
KWD_NEXT,
62+
KWD_EXIT,
63+
KWD_EXITLOOP,
64+
KWD_FUNC,
65+
KWD_RETURN,
66+
KWD_END_FUNC,
67+
KWD_IF,
68+
KWD_ELSE,
69+
KWD_ELSE_IF,
70+
KWD_END_IF,
71+
KWD_REDIM,
72+
KWD_SELECT,
73+
KWD_SWITCH,
74+
KWD_CASE,
75+
KWD_END_SELECT,
76+
KWD_END_SWITCH,
77+
};
78+
4279
struct Token {
4380
enum TokenType type;
4481
char *data;
4582
size_t data_len;
83+
void *info;
4684
};
4785

4886
struct TokenList {

0 commit comments

Comments
 (0)