aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-31 17:07:52 +0900
committernsfisis <nsfisis@gmail.com>2025-08-31 17:07:52 +0900
commit7bbfa1e32537ea0c5e98c0dbb5f77f7bf342118b (patch)
tree43f46ccc3f2610b342672a55fec82ab7dd74cff5
parent8ac323ccf3e7c012912d8f333abf267e32628a0f (diff)
downloadducc-7bbfa1e32537ea0c5e98c0dbb5f77f7bf342118b.tar.gz
ducc-7bbfa1e32537ea0c5e98c0dbb5f77f7bf342118b.tar.zst
ducc-7bbfa1e32537ea0c5e98c0dbb5f77f7bf342118b.zip
feat: support cast expression (any types can be coerced to any types for now)
-rw-r--r--src/parse.c22
-rw-r--r--src/preprocess.c4
-rw-r--r--src/std.h6
3 files changed, 22 insertions, 10 deletions
diff --git a/src/parse.c b/src/parse.c
index f65c065..467e702 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -183,6 +183,10 @@ static Token* peek_token(Parser* p) {
return &p->tokens->data[p->pos];
}
+static Token* peek_token2(Parser* p) {
+ return &p->tokens->data[p->pos + 1];
+}
+
static Token* next_token(Parser* p) {
return &p->tokens->data[p->pos++];
}
@@ -644,13 +648,27 @@ static AstNode* parse_prefix_expr(Parser* p) {
return parse_postfix_expr(p);
}
+static AstNode* parse_cast_expr(Parser* p) {
+ if (peek_token(p)->kind == TokenKind_paren_l && is_type_token(p, peek_token2(p))) {
+ next_token(p);
+ Type* ty = parse_type(p);
+ expect(p, TokenKind_paren_r);
+
+ // TODO: check whether the original type can be casted to the result type.
+ AstNode* e = parse_cast_expr(p);
+ e->ty = ty;
+ return e;
+ }
+ return parse_prefix_expr(p);
+}
+
static AstNode* parse_multiplicative_expr(Parser* p) {
- AstNode* lhs = parse_prefix_expr(p);
+ AstNode* lhs = parse_cast_expr(p);
while (1) {
TokenKind op = peek_token(p)->kind;
if (op == TokenKind_star || op == TokenKind_slash || op == TokenKind_percent) {
next_token(p);
- AstNode* rhs = parse_prefix_expr(p);
+ AstNode* rhs = parse_cast_expr(p);
lhs = ast_new_binary_expr(op, lhs, rhs);
} else {
break;
diff --git a/src/preprocess.c b/src/preprocess.c
index b1753c2..e471b1f 100644
--- a/src/preprocess.c
+++ b/src/preprocess.c
@@ -690,12 +690,12 @@ static const char* resolve_include_name(Preprocessor* pp, const Token* include_n
char* current_filename = strdup(include_name_token->loc.filename);
const char* current_dir = dirname(current_filename);
char* buf = calloc(strlen(include_name) - 2 + 1 + strlen(current_dir) + 1, sizeof(char));
- sprintf(buf, "%s/%.*s", current_dir, INT_CAST strlen(include_name) - 2, include_name + 1);
+ sprintf(buf, "%s/%.*s", current_dir, (int)(strlen(include_name) - 2), include_name + 1);
return buf;
} else {
for (int i = 0; i < pp->n_include_paths; ++i) {
char* buf = calloc(strlen(include_name) - 2 + 1 + strlen(pp->include_paths[i]) + 1, sizeof(char));
- sprintf(buf, "%s/%.*s", pp->include_paths[i], INT_CAST strlen(include_name) - 2, include_name + 1);
+ sprintf(buf, "%s/%.*s", pp->include_paths[i], (int)(strlen(include_name) - 2), include_name + 1);
if (access(buf, F_OK | R_OK) == 0) {
return buf;
}
diff --git a/src/std.h b/src/std.h
index b6b0e3d..ad31747 100644
--- a/src/std.h
+++ b/src/std.h
@@ -46,12 +46,6 @@ int system(const char*);
} \
} while (0)
-#ifdef __ducc__
-#define INT_CAST
-#else
-#define INT_CAST (int)
-#endif
-
#include <stdarg.h>
int vfprintf(FILE*, const char*, va_list);