This commit is contained in:
2025-11-23 00:17:01 +01:00
parent f315874236
commit 5e1901105a
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;
}