aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-30 16:17:45 +0200
committerBad Diode <bd@badd10de.dev>2022-03-30 16:17:45 +0200
commitf585af63190b3eb5a3337fb1667da72c7f5b5eca (patch)
tree02b5ebc34d24a6492e9900f2981a993f23aefc38 /src
parent5fc604279a9fb156dd3a8ade7bdf5c0936e9f9a7 (diff)
downloadbdl-f585af63190b3eb5a3337fb1667da72c7f5b5eca.tar.gz
bdl-f585af63190b3eb5a3337fb1667da72c7f5b5eca.zip
Add support for logic builtins and bools
Diffstat (limited to 'src')
-rw-r--r--src/lexer.c6
-rw-r--r--src/lexer.h5
-rw-r--r--src/parser.c24
-rw-r--r--src/parser.h4
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
60void 66void
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
110Node * 110Node *
111parse_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
118Node *
111parse_builtin(Parser *parser) { 119parse_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;