diff options
| -rw-r--r-- | src/parse.c | 22 | ||||
| -rw-r--r-- | src/preprocess.c | 4 | ||||
| -rw-r--r-- | src/std.h | 6 |
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; } @@ -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); |
