diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-05-08 23:36:33 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-05-08 23:36:33 +0900 |
| commit | e8068fbe25c84e62299495fab1b1b1475e35ef56 (patch) | |
| tree | 5e07baf5a7b042863464acd87368792d6c524454 /main.c | |
| parent | ad400b7377433fb4bc30d883c9a8389f78e3565d (diff) | |
| download | ducc-e8068fbe25c84e62299495fab1b1b1475e35ef56.tar.gz ducc-e8068fbe25c84e62299495fab1b1b1475e35ef56.tar.zst ducc-e8068fbe25c84e62299495fab1b1b1475e35ef56.zip | |
support ellipsis in functiion parameters
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -9,8 +9,8 @@ int isalpha(int); int isdigit(int); int isspace(int); void* memcpy(void*, void*, size_t); -int printf(); -int sprintf(); +int printf(const char*, ...); +int sprintf(char*, const char*, ...); int strcmp(const char*, const char*); char* strstr(const char*, const char*); @@ -54,6 +54,7 @@ enum TokenKind { TokenKind_bracket_r, TokenKind_comma, TokenKind_dot, + TokenKind_ellipsis, TokenKind_eq, TokenKind_ge, TokenKind_gt, @@ -173,7 +174,17 @@ Token* tokenize(char* src) { } else if (c == '%') { tok->kind = TokenKind_percent; } else if (c == '.') { - tok->kind = TokenKind_dot; + if (src[pos] == '.') { + ++pos; + if (src[pos] == '.') { + ++pos; + tok->kind = TokenKind_ellipsis; + } else { + fatal_error("unknown token: .."); + } + } else { + tok->kind = TokenKind_dot; + } } else if (c == '!') { if (src[pos] == '=') { ++pos; @@ -1418,6 +1429,10 @@ AstNode* parse_param_list(Parser* p) { int has_void = 0; AstNode* list = ast_new_list(6); while (peek_token(p)->kind != TokenKind_paren_r) { + if (peek_token(p)->kind == TokenKind_ellipsis) { + next_token(p); + break; + } AstNode* param = parse_param(p); has_void = has_void || param->ty->kind == TypeKind_void; ast_append(list, param); |
