chore: add increment/decrement operators and test suite to parser and tokenizer

Implement prefix and postfix ++/-- operators in the tokenizer (Inc/Dec token types) and parser (factor/unary functions) with correct pre/post semantics. Add increment_decrement_test.rc covering all four operator forms. Update Makefile to include the new test file in TESTS, add run-increment-decrement-test target, and fix .PHONY and TARGET dependency on dirs.
This commit is contained in:
2025-11-22 23:17:01 +00:00
parent 82722a757a
commit eb3d29ac8d
12 changed files with 69 additions and 4 deletions
+10 -3
View File
@@ -24,13 +24,14 @@ TESTS = $(TEST_DIR)/feature_test.rc \
$(TEST_DIR)/endless_loop_test.rc \
$(TEST_DIR)/math_test.rc \
$(TEST_DIR)/string_test.rc \
$(TEST_DIR)/string_manip_test.rc
$(TEST_DIR)/string_manip_test.rc \
$(TEST_DIR)/increment_decrement_test.rc
EXAMPLES = $(EXAMPLE_DIR)/http_simple.rc \
$(EXAMPLE_DIR)/http_persistent.rc \
$(EXAMPLE_DIR)/http_multi.rc
.PHONY: all clean test run-tests run-examples help dirs
.PHONY: all clean test run-tests run-examples help
all: dirs $(TARGET)
@@ -40,7 +41,7 @@ dirs:
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(TARGET): $(OBJECTS)
$(TARGET): dirs $(OBJECTS)
$(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS)
clean:
@@ -64,6 +65,9 @@ test: $(TARGET)
@echo "Running string manipulation tests..."
@$(TARGET) $(TEST_DIR)/string_manip_test.rc 2>&1 | grep -v "Error at token" || true
@echo ""
@echo "Running increment decrement tests..."
@$(TARGET) $(TEST_DIR)/increment_decrement_test.rc 2>&1 | grep -v "Error at token" || true
@echo ""
@echo "=== All Tests Completed ==="
run-feature-test: $(TARGET)
@@ -81,6 +85,9 @@ run-string-test: $(TARGET)
run-string-manip: $(TARGET)
$(TARGET) $(TEST_DIR)/string_manip_test.rc
run-increment-decrement-test: $(TARGET)
$(TARGET) $(TEST_DIR)/increment_decrement_test.rc
run-http-simple: $(TARGET)
$(TARGET) $(EXAMPLE_DIR)/http_simple.rc
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+26
View File
@@ -119,6 +119,17 @@ long factor() {
Symbol *sym = &locals[idx];
if (pc < MAX_TOK && (tokens[pc].type == Inc || tokens[pc].type == Dec)) {
long val = memory[sym->addr];
if (tokens[pc].type == Inc) {
memory[sym->addr]++;
} else {
memory[sym->addr]--;
}
pc++;
return val;
}
if (pc >= MAX_TOK) return 0;
if (tokens[pc].type == '[') {
pc++;
@@ -158,6 +169,21 @@ long factor() {
long unary() {
if (pc >= MAX_TOK) return 0;
if (tokens[pc].type == Inc || tokens[pc].type == Dec) {
int op = tokens[pc++].type;
Token *t = &tokens[pc];
if (t->type != Id) error("Expected identifier after ++/--");
int idx = find_local(t->text, t->val);
if (idx == -1) error("Undefined variable");
pc++;
long addr = locals[idx].addr;
if (op == Inc) {
memory[addr]++;
} else {
memory[addr]--;
}
return memory[addr];
}
if (tokens[pc].type == '*') {
pc++;
int addr = unary();
+2
View File
@@ -77,6 +77,8 @@ void tokenize(char *src) {
if (!strncmp(s, ">=", 2)) { t->type = Ge; s += 2; continue; }
if (!strncmp(s, "&&", 2)) { t->type = And; s += 2; continue; }
if (!strncmp(s, "||", 2)) { t->type = Or; s += 2; continue; }
if (!strncmp(s, "++", 2)) { t->type = Inc; s += 2; continue; }
if (!strncmp(s, "--", 2)) { t->type = Dec; s += 2; continue; }
if (*s == '<') { t->type = Lt; s++; continue; }
if (*s == '>') { t->type = Gt; s++; continue; }
+1 -1
View File
@@ -9,7 +9,7 @@
enum {
Num = 128, Str, Id, Int, Char, Else, If, While, Return, Printf,
Assign, Eq, Ne, Lt, Gt, Le, Ge, Or, And
Assign, Eq, Ne, Lt, Gt, Le, Ge, Or, And, Inc, Dec
};
typedef struct {
+30
View File
@@ -0,0 +1,30 @@
int main() {
int a;
int b;
a = 5;
b = a++;
printf("a = %d, b = %d\n", a, b);
a = 5;
b = ++a;
printf("a = %d, b = %d\n", a, b);
a = 5;
b = a--;
printf("a = %d, b = %d\n", a, b);
a = 5;
b = --a;
printf("a = %d, b = %d\n", a, b);
a = 5;
a++;
printf("a = %d\n", a);
a = 5;
a--;
printf("a = %d\n", a);
return 0;
}