From fd7d82869eb42d086174ec02938b49e4f233c319 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 11 Aug 2025 13:22:02 +0900 Subject: feat: implement '*=', '/=' and '%=' operators --- preprocess.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'preprocess.c') diff --git a/preprocess.c b/preprocess.c index b7e52bf..c4b1c16 100644 --- a/preprocess.c +++ b/preprocess.c @@ -13,6 +13,9 @@ enum TokenKind { TokenKind_arrow, TokenKind_assign, TokenKind_assign_add, + TokenKind_assign_div, + TokenKind_assign_mod, + TokenKind_assign_mul, TokenKind_assign_sub, TokenKind_brace_l, TokenKind_brace_r, @@ -111,6 +114,12 @@ const char* token_kind_stringify(TokenKind k) { return "="; else if (k == TokenKind_assign_add) return "+="; + else if (k == TokenKind_assign_div) + return "/="; + else if (k == TokenKind_assign_mod) + return "%="; + else if (k == TokenKind_assign_mul) + return "*="; else if (k == TokenKind_assign_sub) return "-="; else if (k == TokenKind_brace_l) @@ -493,9 +502,17 @@ void pp_tokenize_all(Preprocessor* pp) { tok->kind = TokenKind_minus; } } else if (c == '*') { - tok->kind = TokenKind_star; + if (pp->src[pp->pos] == '=') { + ++pp->pos; + tok->kind = TokenKind_assign_mul; + } else { + tok->kind = TokenKind_star; + } } else if (c == '/') { - if (pp->src[pp->pos] == '/') { + if (pp->src[pp->pos] == '=') { + ++pp->pos; + tok->kind = TokenKind_assign_div; + } else if (pp->src[pp->pos] == '/') { start = pp->pos - 1; ++pp->pos; while (pp->src[pp->pos] && pp->src[pp->pos] != '\n' && pp->src[pp->pos] != '\r') { @@ -524,7 +541,12 @@ void pp_tokenize_all(Preprocessor* pp) { tok->kind = TokenKind_slash; } } else if (c == '%') { - tok->kind = TokenKind_percent; + if (pp->src[pp->pos] == '=') { + ++pp->pos; + tok->kind = TokenKind_assign_mod; + } else { + tok->kind = TokenKind_percent; + } } else if (c == '.') { if (pp->src[pp->pos] == '.') { ++pp->pos; -- cgit v1.2.3-70-g09d2