diff options
author | Bad Diode <bd@badd10de.dev> | 2022-03-30 16:17:45 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-03-30 16:17:45 +0200 |
commit | f585af63190b3eb5a3337fb1667da72c7f5b5eca (patch) | |
tree | 02b5ebc34d24a6492e9900f2981a993f23aefc38 | |
parent | 5fc604279a9fb156dd3a8ade7bdf5c0936e9f9a7 (diff) | |
download | bdl-f585af63190b3eb5a3337fb1667da72c7f5b5eca.tar.gz bdl-f585af63190b3eb5a3337fb1667da72c7f5b5eca.zip |
Add support for logic builtins and bools
-rw-r--r-- | src/lexer.c | 6 | ||||
-rw-r--r-- | src/lexer.h | 5 | ||||
-rw-r--r-- | src/parser.c | 24 | ||||
-rw-r--r-- | src/parser.h | 4 |
4 files changed, 38 insertions, 1 deletions
diff --git a/src/lexer.c b/src/lexer.c index 9346880..2ccd577 100644 --- a/src/lexer.c +++ b/src/lexer.c | |||
@@ -26,6 +26,9 @@ static const char* token_str[] = { | |||
26 | [TOKEN_MUL] = "TOKEN_MUL", | 26 | [TOKEN_MUL] = "TOKEN_MUL", |
27 | [TOKEN_DIV] = "TOKEN_DIV", | 27 | [TOKEN_DIV] = "TOKEN_DIV", |
28 | [TOKEN_MOD] = "TOKEN_MOD", | 28 | [TOKEN_MOD] = "TOKEN_MOD", |
29 | [TOKEN_NOT] = "TOKEN_NOT", | ||
30 | [TOKEN_AND] = "TOKEN_AND", | ||
31 | [TOKEN_OR] = "TOKEN_OR", | ||
29 | [TOKEN_COLON] = "TOKEN_COLON", | 32 | [TOKEN_COLON] = "TOKEN_COLON", |
30 | [TOKEN_DOT] = "TOKEN_DOT", | 33 | [TOKEN_DOT] = "TOKEN_DOT", |
31 | [TOKEN_AT] = "TOKEN_AT", | 34 | [TOKEN_AT] = "TOKEN_AT", |
@@ -55,6 +58,9 @@ static const Keyword keywords[] = { | |||
55 | KEYWORD("*", TOKEN_MUL), | 58 | KEYWORD("*", TOKEN_MUL), |
56 | KEYWORD("/", TOKEN_DIV), | 59 | KEYWORD("/", TOKEN_DIV), |
57 | KEYWORD("%", TOKEN_MOD), | 60 | KEYWORD("%", TOKEN_MOD), |
61 | KEYWORD("not", TOKEN_NOT), | ||
62 | KEYWORD("and", TOKEN_AND), | ||
63 | KEYWORD("or", TOKEN_OR), | ||
58 | }; | 64 | }; |
59 | 65 | ||
60 | void | 66 | void |
diff --git a/src/lexer.h b/src/lexer.h index a214096..fa43ebb 100644 --- a/src/lexer.h +++ b/src/lexer.h | |||
@@ -37,6 +37,11 @@ typedef enum TokenType { | |||
37 | TOKEN_DIV, | 37 | TOKEN_DIV, |
38 | TOKEN_MOD, | 38 | TOKEN_MOD, |
39 | 39 | ||
40 | // Boolean operations. | ||
41 | TOKEN_NOT, | ||
42 | TOKEN_AND, | ||
43 | TOKEN_OR, | ||
44 | |||
40 | // Special operators. | 45 | // Special operators. |
41 | TOKEN_COLON, | 46 | TOKEN_COLON, |
42 | TOKEN_DOT, | 47 | TOKEN_DOT, |
diff --git a/src/parser.c b/src/parser.c index 2a5e3e3..9703061 100644 --- a/src/parser.c +++ b/src/parser.c | |||
@@ -108,6 +108,14 @@ parse_string(Parser *parser) { | |||
108 | } | 108 | } |
109 | 109 | ||
110 | Node * | 110 | Node * |
111 | parse_bool(Parser *parser) { | ||
112 | Token tok = next_token(parser); | ||
113 | Node *node = alloc_node(NODE_BOOL); | ||
114 | node->boolean = tok.type == TOKEN_TRUE; | ||
115 | return node; | ||
116 | } | ||
117 | |||
118 | Node * | ||
111 | parse_builtin(Parser *parser) { | 119 | parse_builtin(Parser *parser) { |
112 | Token op = next_token(parser); | 120 | Token op = next_token(parser); |
113 | Node *node = alloc_node(NODE_BUILTIN); | 121 | Node *node = alloc_node(NODE_BUILTIN); |
@@ -139,7 +147,10 @@ parse_paren(Parser *parser) { | |||
139 | case TOKEN_SUB: | 147 | case TOKEN_SUB: |
140 | case TOKEN_MUL: | 148 | case TOKEN_MUL: |
141 | case TOKEN_DIV: | 149 | case TOKEN_DIV: |
142 | case TOKEN_MOD: { | 150 | case TOKEN_MOD: |
151 | case TOKEN_NOT: | ||
152 | case TOKEN_AND: | ||
153 | case TOKEN_OR: { | ||
143 | return parse_builtin(parser); | 154 | return parse_builtin(parser); |
144 | } break; | 155 | } break; |
145 | default: break; | 156 | default: break; |
@@ -159,6 +170,10 @@ parse_next(Parser *parser) { | |||
159 | case TOKEN_STRING: { | 170 | case TOKEN_STRING: { |
160 | return parse_string(parser); | 171 | return parse_string(parser); |
161 | } break; | 172 | } break; |
173 | case TOKEN_TRUE: | ||
174 | case TOKEN_FALSE: { | ||
175 | return parse_bool(parser); | ||
176 | } break; | ||
162 | case TOKEN_LPAREN: { | 177 | case TOKEN_LPAREN: { |
163 | return parse_paren(parser); | 178 | return parse_paren(parser); |
164 | } break; | 179 | } break; |
@@ -188,6 +203,13 @@ print_node(Node *node) { | |||
188 | case NODE_STRING: { | 203 | case NODE_STRING: { |
189 | sv_write(&node->string); | 204 | sv_write(&node->string); |
190 | } break; | 205 | } break; |
206 | case NODE_BOOL: { | ||
207 | if (node->boolean) { | ||
208 | printf("true"); | ||
209 | } else { | ||
210 | printf("false"); | ||
211 | } | ||
212 | } break; | ||
191 | case NODE_BUILTIN: { | 213 | case NODE_BUILTIN: { |
192 | printf("("); | 214 | printf("("); |
193 | printf("{#%s}", token_str[node->builtin.type]); | 215 | printf("{#%s}", token_str[node->builtin.type]); |
diff --git a/src/parser.h b/src/parser.h index 2957356..c275195 100644 --- a/src/parser.h +++ b/src/parser.h | |||
@@ -12,6 +12,7 @@ typedef enum NodeType { | |||
12 | // NODE_FUNCALL, | 12 | // NODE_FUNCALL, |
13 | NODE_BUILTIN, | 13 | NODE_BUILTIN, |
14 | NODE_NUMBER, | 14 | NODE_NUMBER, |
15 | NODE_BOOL, | ||
15 | NODE_STRING, | 16 | NODE_STRING, |
16 | } NodeType; | 17 | } NodeType; |
17 | 18 | ||
@@ -29,6 +30,9 @@ typedef struct Node { | |||
29 | // String. | 30 | // String. |
30 | StringView string; | 31 | StringView string; |
31 | 32 | ||
33 | // Boolean. | ||
34 | bool boolean; | ||
35 | |||
32 | // Builtin primitive. | 36 | // Builtin primitive. |
33 | struct { | 37 | struct { |
34 | TokenType type; | 38 | TokenType type; |