This commit is contained in:
retoor 2025-11-23 00:17:01 +01:00
parent f315874236
commit 5e1901105a
12 changed files with 69 additions and 4 deletions

View File

@ -24,13 +24,14 @@ TESTS = $(TEST_DIR)/feature_test.rc \
$(TEST_DIR)/endless_loop_test.rc \ $(TEST_DIR)/endless_loop_test.rc \
$(TEST_DIR)/math_test.rc \ $(TEST_DIR)/math_test.rc \
$(TEST_DIR)/string_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 \ EXAMPLES = $(EXAMPLE_DIR)/http_simple.rc \
$(EXAMPLE_DIR)/http_persistent.rc \ $(EXAMPLE_DIR)/http_persistent.rc \
$(EXAMPLE_DIR)/http_multi.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) all: dirs $(TARGET)
@ -40,7 +41,7 @@ dirs:
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@ $(CC) $(CFLAGS) -c $< -o $@
$(TARGET): $(OBJECTS) $(TARGET): dirs $(OBJECTS)
$(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS) $(CC) $(OBJECTS) -o $(TARGET) $(LDFLAGS)
clean: clean:
@ -64,6 +65,9 @@ test: $(TARGET)
@echo "Running string manipulation tests..." @echo "Running string manipulation tests..."
@$(TARGET) $(TEST_DIR)/string_manip_test.rc 2>&1 | grep -v "Error at token" || true @$(TARGET) $(TEST_DIR)/string_manip_test.rc 2>&1 | grep -v "Error at token" || true
@echo "" @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 ===" @echo "=== All Tests Completed ==="
run-feature-test: $(TARGET) run-feature-test: $(TARGET)
@ -81,6 +85,9 @@ run-string-test: $(TARGET)
run-string-manip: $(TARGET) run-string-manip: $(TARGET)
$(TARGET) $(TEST_DIR)/string_manip_test.rc $(TARGET) $(TEST_DIR)/string_manip_test.rc
run-increment-decrement-test: $(TARGET)
$(TARGET) $(TEST_DIR)/increment_decrement_test.rc
run-http-simple: $(TARGET) run-http-simple: $(TARGET)
$(TARGET) $(EXAMPLE_DIR)/http_simple.rc $(TARGET) $(EXAMPLE_DIR)/http_simple.rc

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -119,6 +119,17 @@ long factor() {
Symbol *sym = &locals[idx]; 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 (pc >= MAX_TOK) return 0;
if (tokens[pc].type == '[') { if (tokens[pc].type == '[') {
pc++; pc++;
@ -158,6 +169,21 @@ long factor() {
long unary() { long unary() {
if (pc >= MAX_TOK) return 0; 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 == '*') { if (tokens[pc].type == '*') {
pc++; pc++;
int addr = unary(); int addr = unary();

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 = Ge; s += 2; continue; }
if (!strncmp(s, "&&", 2)) { t->type = And; 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 = 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 = Lt; s++; continue; }
if (*s == '>') { t->type = Gt; s++; continue; } if (*s == '>') { t->type = Gt; s++; continue; }

View File

@ -9,7 +9,7 @@
enum { enum {
Num = 128, Str, Id, Int, Char, Else, If, While, Return, Printf, 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 { typedef struct {

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;
}