From f585af63190b3eb5a3337fb1667da72c7f5b5eca Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 30 Mar 2022 16:17:45 +0200 Subject: Add support for logic builtins and bools --- src/lexer.c | 6 ++++++ src/lexer.h | 5 +++++ src/parser.c | 24 +++++++++++++++++++++++- src/parser.h | 4 ++++ 4 files changed, 38 insertions(+), 1 deletion(-) (limited to 'src') 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[] = { [TOKEN_MUL] = "TOKEN_MUL", [TOKEN_DIV] = "TOKEN_DIV", [TOKEN_MOD] = "TOKEN_MOD", + [TOKEN_NOT] = "TOKEN_NOT", + [TOKEN_AND] = "TOKEN_AND", + [TOKEN_OR] = "TOKEN_OR", [TOKEN_COLON] = "TOKEN_COLON", [TOKEN_DOT] = "TOKEN_DOT", [TOKEN_AT] = "TOKEN_AT", @@ -55,6 +58,9 @@ static const Keyword keywords[] = { KEYWORD("*", TOKEN_MUL), KEYWORD("/", TOKEN_DIV), KEYWORD("%", TOKEN_MOD), + KEYWORD("not", TOKEN_NOT), + KEYWORD("and", TOKEN_AND), + KEYWORD("or", TOKEN_OR), }; 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 { TOKEN_DIV, TOKEN_MOD, + // Boolean operations. + TOKEN_NOT, + TOKEN_AND, + TOKEN_OR, + // Special operators. TOKEN_COLON, TOKEN_DOT, diff --git a/src/parser.c b/src/parser.c index 2a5e3e3..9703061 100644 --- a/src/parser.c +++ b/src/parser.c @@ -107,6 +107,14 @@ parse_string(Parser *parser) { return node; } +Node * +parse_bool(Parser *parser) { + Token tok = next_token(parser); + Node *node = alloc_node(NODE_BOOL); + node->boolean = tok.type == TOKEN_TRUE; + return node; +} + Node * parse_builtin(Parser *parser) { Token op = next_token(parser); @@ -139,7 +147,10 @@ parse_paren(Parser *parser) { case TOKEN_SUB: case TOKEN_MUL: case TOKEN_DIV: - case TOKEN_MOD: { + case TOKEN_MOD: + case TOKEN_NOT: + case TOKEN_AND: + case TOKEN_OR: { return parse_builtin(parser); } break; default: break; @@ -159,6 +170,10 @@ parse_next(Parser *parser) { case TOKEN_STRING: { return parse_string(parser); } break; + case TOKEN_TRUE: + case TOKEN_FALSE: { + return parse_bool(parser); + } break; case TOKEN_LPAREN: { return parse_paren(parser); } break; @@ -188,6 +203,13 @@ print_node(Node *node) { case NODE_STRING: { sv_write(&node->string); } break; + case NODE_BOOL: { + if (node->boolean) { + printf("true"); + } else { + printf("false"); + } + } break; case NODE_BUILTIN: { printf("("); 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 { // NODE_FUNCALL, NODE_BUILTIN, NODE_NUMBER, + NODE_BOOL, NODE_STRING, } NodeType; @@ -29,6 +30,9 @@ typedef struct Node { // String. StringView string; + // Boolean. + bool boolean; + // Builtin primitive. struct { TokenType type; -- cgit v1.2.1