diff --git a/README.md b/README.md
index 57dd83f..bcad759 100644
--- a/README.md
+++ b/README.md
@@ -105,24 +105,24 @@ $ bash boot.sh
### 支持以下运算符
-| 运算符 | 含义 | 结合性 |
-| ------------------------------------------------------------ | ----------------------------------------------- | -------- |
-| `()` | 初等表达式(字面量、标识符、函数调用、括号) | |
-| `++` `--` `[]` | 后缀自增自减 数组下标 | 从左到右 |
-| `++` `--` `+` `-` `&` `*` `!` `~` | 前缀自增自减 正负号 取地址 解引用 逻辑非 按位非 | 从右到左 |
-| `*` `/` `%` | 乘除余 | 从左到右 |
-| `+` `-` | 加减 | 从左到右 |
-| `<<` `>>` | 左移和算术右移 | 从左到右 |
-| `<` `<=` `>` `>=` | 关系比较 | 从左到右 |
-| `==` `!=` | 相等比较 | 从左到右 |
-| `&` | 按位与 | 从左到右 |
-| `^` | 按位异或 | 从左到右 |
-| |
| 按位或 | 从左到右 |
-| `&&` | 逻辑与 | 从左到右 |
-| ||
| 逻辑或 | 从左到右 |
-| `?:` | 条件 | 从右到左 |
-| `=` `+=` `-=` `*=` `/=` `%=` `<<=` `>>=` `&=` `^=` |=
| 赋值 复合赋值 | 从右到左 |
-| `,` | 逗号 | 从左到右 |
+| 运算符 | 含义 | 结合性 |
+| --------------------------------- | ----------------------------------------------- | -------- |
+| `()` | 初等表达式(字面量、标识符、函数调用、括号) | |
+| `++` `--` `[]` | 后缀自增自减 数组下标 | 从左到右 |
+| `++` `--` `+` `-` `*` `&` `!` `~` | 前缀自增自减 正负号 取地址 解引用 逻辑非 按位非 | 从右到左 |
+| `*` `/` `%` | 乘除余 | 从左到右 |
+| `+` `-` | 加减 | 从左到右 |
+| `<<` `>>` | 左移和算术右移 | 从左到右 |
+| `<` `<=` `>` `>=` | 关系比较 | 从左到右 |
+| `==` `!=` | 相等比较 | 从左到右 |
+| `&` | 按位与 | 从左到右 |
+| `^` | 按位异或 | 从左到右 |
+| |
| 按位或 | 从左到右 |
+| `&&` | 逻辑与 | 从左到右 |
+| ||
| 逻辑或 | 从左到右 |
+| `?:` | 条件 | 从右到左 |
+| `=` `+=` `-=` `*=` `/=` `%=` `<<=` `>>=` `&=` `^=` |=
| 赋值 | 从右到左 |
+| `,` | 逗号 | 从左到右 |
- 同级表达式的求值顺序与结合性一致。
- 加减号支持整数之间,指针与整数,指针之间的运算。
diff --git a/boot.c b/boot.c
index d6749d8..d5c87ef 100644
--- a/boot.c
+++ b/boot.c
@@ -1,11 +1,11 @@
/*
* RVBTCC By Yaossg
- * A lightweight bootstrapping compiler in only ~2000 lines.
+ * A lightweight bootstrapping compiler in 2000 lines.
*
- * This project aims to demonstrate how to write a bootstrapping compiler in no time.
- * Its syntax resembles C, and its output is RISC-V assembly.
- * It relies solely on a few glibc functions for input/output operations.
- * Designed purely for educational purposes and not intended for production use.
+ * It aims to demonstrate how to write a bootstrapping compiler in no time.
+ * Syntax is similar to C, output is RISC-V assembly.
+ * Only dependent on some glibc functions for I/O.
+ * Purely for educational purposes. Do not use in production.
*/
// glibc dependency
@@ -37,19 +37,19 @@ enum {
char echo_buffer[ECHO_BUFFER_SIZE];
int echo_size;
-int next_char() {
+int readchar() {
int ch = getchar();
- if (ch == '\n' || ch == -1) {
+ if (ch != '\n') {
+ echo_buffer[echo_size++] = ch;
+ } else {
echo_buffer[echo_size++] = 0;
printf("#@%s\n", echo_buffer);
echo_size = 0;
- } else {
- echo_buffer[echo_size++] = ch;
}
return ch;
}
-void unget_char(int ch) {
+void ungetchar(int ch) {
--echo_size;
ungetc(ch, stdin);
}
@@ -239,16 +239,16 @@ int is_id_cont(int ch) {
int parse_int(int ch) {
int num = ch - '0';
- while (is_digit(ch = next_char())) {
+ while (is_digit(ch = readchar())) {
num *= 10;
num += ch - '0';
}
- unget_char(ch);
+ ungetchar(ch);
return num;
}
int get_escaped_char() {
- int ch = next_char();
+ int ch = readchar();
if (ch == 'n') return '\n';
if (ch == 't') return '\t';
if (ch == 'r') return '\r';
@@ -260,7 +260,7 @@ int get_escaped_char() {
exit(1);
}
-int token_unget;
+int token_state;
int token_type;
int token_data;
@@ -271,7 +271,7 @@ int string_lut_size;
int parse_string() {
int offset = string_offset;
int ch;
- while ((ch = next_char()) != '"') {
+ while ((ch = readchar()) != '"') {
if (ch == -1 || ch == '\n') {
fprintf(stderr, "expecting '\"'\n");
exit(1);
@@ -286,6 +286,24 @@ int parse_string() {
return string_lut_size++;
}
+void rewind_string(int new_data) {
+ string_offset = string_lut[token_data];
+ token_data = new_data;
+ --string_lut_size;
+}
+
+void dedup_string() {
+ int last_string = string_lut_size - 1;
+ char* latest = string_table + string_lut[last_string];
+ for (int i = 0; i < last_string; i++) {
+ char* candidate = string_table + string_lut[i];
+ if (streq(candidate, latest)) {
+ rewind_string(i);
+ return;
+ }
+ }
+}
+
char id_table[ID_TABLE_SIZE];
int id_offset;
int id_lut[ID_LUT_SIZE];
@@ -293,34 +311,31 @@ int id_lut_size;
int parse_id(int ch) {
int offset = id_offset;
id_table[id_offset++] = ch;
- while (is_id_cont(ch = next_char())) {
+ while (is_id_cont(ch = readchar())) {
id_table[id_offset++] = ch;
}
- unget_char(ch);
+ ungetchar(ch);
id_table[id_offset++] = 0;
id_lut[id_lut_size] = offset;
return id_lut_size++;
}
-void dedup(char* table, int* lut, int* lut_size, int* offset) {
- char* latest = table + lut[*lut_size - 1];
- for (int i = 0; i < *lut_size - 1; i++) {
- char* candidate = table + lut[i];
- if (streq(candidate, latest)) {
- *offset = lut[token_data];
- --*lut_size;
- token_data = i;
- return;
- }
- }
-}
-
-void dedup_string() {
- dedup(string_table, string_lut, &string_lut_size, &string_offset);
+void rewind_id(int new_data) {
+ id_offset = id_lut[token_data];
+ token_data = new_data;
+ --id_lut_size;
}
void dedup_id() {
- dedup(id_table, id_lut, &id_lut_size, &id_offset);
+ int last_id = id_lut_size - 1;
+ char* latest = id_table + id_lut[last_id];
+ for (int i = 0; i < last_id; i++) {
+ char* candidate = id_table + id_lut[i];
+ if (streq(candidate, latest)) {
+ rewind_id(i);
+ return;
+ }
+ }
}
void parse_id_like(int ch) {
@@ -355,25 +370,24 @@ void parse_id_like(int ch) {
token_type = TOKEN_ENUM;
}
if (token_type != TOKEN_ID) {
- id_offset = id_lut[token_data];
- --id_lut_size;
+ rewind_id(0);
} else {
dedup_id();
}
}
void unget_token() {
- token_unget = 1;
+ token_state = 1;
}
void next_token() {
- if (token_unget) {
- token_unget = 0;
+ if (token_state) {
+ token_state = 0;
return;
}
- int ch = next_char();
+ int ch = readchar();
while (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n') {
- ch = next_char();
+ ch = readchar();
}
if (ch == -1) {
token_type = TOKEN_EOF;
@@ -390,50 +404,50 @@ void next_token() {
} else if (ch == '}') {
token_type = TOKEN_BRACE_RIGHT;
} else if (ch == '+') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '+') {
token_type = TOKEN_INC;
} else if (ch2 == '=') {
token_type = TOKEN_ADD_ASSIGN;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_ADD;
}
} else if (ch == '-') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '-') {
token_type = TOKEN_DEC;
} else if (ch2 == '=') {
token_type = TOKEN_SUB_ASSIGN;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_SUB;
}
} else if (ch == '*') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_MUL_ASSIGN;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_MUL;
}
} else if (ch == '/') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_DIV_ASSIGN;
} else if (ch2 == '/') {
- do ch = next_char(); while (ch != -1 && ch != '\n');
+ do ch = readchar(); while (ch != -1 && ch != '\n');
next_token();
return;
} else if (ch2 == '*') {
while (1) {
- ch = next_char();
+ ch = readchar();
if (ch == -1) {
fprintf(stderr, "expecting '*/'\n");
exit(1);
}
if (ch == '*') {
- ch = next_char();
+ ch = readchar();
if (ch == '/') {
break;
}
@@ -442,15 +456,15 @@ void next_token() {
next_token();
return;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_DIV;
}
} else if (ch == '%') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_REM_ASSIGN;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_REM;
}
} else if (ch == ';') {
@@ -462,90 +476,90 @@ void next_token() {
} else if (ch == ',') {
token_type = TOKEN_COMMA;
} else if (ch == '<') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_LE;
} else if (ch2 == '<') {
- int ch3 = next_char();
+ int ch3 = readchar();
if (ch3 == '=') {
token_type = TOKEN_LSHIFT_ASSIGN;
} else {
- unget_char(ch3);
+ ungetchar(ch3);
token_type = TOKEN_LSHIFT;
}
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_LT;
}
} else if (ch == '>') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_GE;
} else if (ch2 == '>') {
- int ch3 = next_char();
+ int ch3 = readchar();
if (ch3 == '=') {
token_type = TOKEN_RSHIFT_ASSIGN;
} else {
- unget_char(ch3);
+ ungetchar(ch3);
token_type = TOKEN_RSHIFT;
}
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_GT;
}
} else if (ch == '=') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_EQ;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_ASSIGN;
}
} else if (ch == '!') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_NE;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_NOT;
}
} else if (ch == '&') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_AND_ASSIGN;
} else if (ch2 == '&') {
token_type = TOKEN_LAND;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_AND;
}
} else if (ch == '|') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_OR_ASSIGN;
} else if (ch2 == '|') {
token_type = TOKEN_LOR;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_OR;
}
} else if (ch == '^') {
- int ch2 = next_char();
+ int ch2 = readchar();
if (ch2 == '=') {
token_type = TOKEN_XOR_ASSIGN;
} else {
- unget_char(ch2);
+ ungetchar(ch2);
token_type = TOKEN_XOR;
}
} else if (ch == '~') {
token_type = TOKEN_INV;
} else if (ch == '\'') {
token_type = TOKEN_NUMBER;
- token_data = next_char();
+ token_data = readchar();
if (token_data == '\\') {
token_data = get_escaped_char();
}
- if (next_char() != '\'') {
+ if (readchar() != '\'') {
fprintf(stderr, "expecting '\n");
exit(1);
}
@@ -555,8 +569,8 @@ void next_token() {
dedup_string();
} else if (ch == '.') {
token_type = 0;
- if (next_char() == '.') {
- if (next_char() == '.') {
+ if (readchar() == '.') {
+ if (readchar() == '.') {
token_type = TOKEN_ELLIPSIS;
}
}
@@ -573,6 +587,16 @@ void next_token() {
fprintf(stderr, "unexpected character: %c(%d)\n", ch, ch);
exit(1);
}
+ // debug info
+ if (0) {
+ fprintf(stderr, "token: %d\n", token_type);
+ if (token_type == TOKEN_ID) {
+ char* name = id_table + id_lut[token_data];
+ fprintf(stderr, " id: %s\n", name);
+ } else if (token_type == TOKEN_NUMBER) {
+ fprintf(stderr, " number: %d\n", token_data);
+ }
+ }
}
void expect_token(int expected_type) {
@@ -893,7 +917,7 @@ void _asm_ri(char* op, int rd, int rs1, int imm) {
void asm_branch(char* op, int rs1, int label) {
char* rs1_name = trivialize(rs1, REG_T0);
- printf(" %s %s, .L%d\n", op, rs1_name, label);
+ printf(" %s %s, L%d\n", op, rs1_name, label);
}
void _asm_i(char* op, int rd, char* prefix1, char* prefix2, int imm) {
@@ -1008,7 +1032,7 @@ void asm_bnez(int rs1, int label) {
}
void asm_j(int label) {
- printf(" j .L%d\n", label);
+ printf(" j L%d\n", label);
}
int next_label_id = 0;
@@ -1017,7 +1041,7 @@ int next_label() {
}
int asm_label(int label) {
- printf(".L%d:\n", label);
+ printf("L%d:\n", label);
return label;
}
@@ -1697,17 +1721,15 @@ void parse_for() {
}
void parse_do_while() {
- int body_label = next_label();
int cont_label = next_label();
int break_label = next_label();
asm_push_label(break_label, cont_label);
- asm_label(body_label);
+ asm_label(cont_label);
parse_stmt(); // body
expect_token(TOKEN_WHILE);
expect_token(TOKEN_PAREN_LEFT);
- asm_label(cont_label);
int cond = parse_expr();
- asm_bnez(cond, body_label);
+ asm_bnez(cond, cont_label);
expect_token(TOKEN_PAREN_RIGHT);
asm_label(break_label);
asm_pop_label();
@@ -1870,7 +1892,7 @@ void parse_function(char* name) {
void parse_global_variable(int id, char* name, int type) {
printf(".data\n");
- printf(".global %s\n", name);
+ printf(".globl %s\n", name);
printf(".align 5\n");
printf("%s:\n", name);
if (token_type == TOKEN_ASSIGN) {
@@ -1971,6 +1993,7 @@ void parse_top_level() {
}
void dump_string_table() {
+ printf("# string table: \n");
printf(".data\n");
for (int i = 0; i < string_lut_size; ++i) {
printf(".LC%d: .string \"", i);
diff --git a/demo/empty.c b/demo/empty.c
deleted file mode 100644
index c272dab..0000000
--- a/demo/empty.c
+++ /dev/null
@@ -1 +0,0 @@
-int main() {}
\ No newline at end of file
diff --git a/demo/for.c b/demo/for.c
index 54fc299..31d696c 100644
--- a/demo/for.c
+++ b/demo/for.c
@@ -2,7 +2,6 @@ int printf(char* format, ...);
int main() {
int i;
- printf("hello for 10 times\n");
for (i = 0;
i < 10;
++i)
diff --git a/test.sh b/test.sh
index 28c9b28..85ce94e 100644
--- a/test.sh
+++ b/test.sh
@@ -35,23 +35,17 @@ for D in *; do
if [ -f $i.out ]; then
../boot.elf < $i.c > $i.s &&
compile $i
- gcc $i.c -o $i.ref.elf 2>/dev/null
if [[ $? == 0 ]]; then
if [ -f $i.in ]; then
run_with_input $i
- echo $? >> $i.ans
- ./$i.ref.elf < $i.in > $i.out
- echo $? >> $i.out
else
run_without_input $i
- echo $? >> $i.ans
- ./$i.ref.elf > $i.out
- echo $? >> $i.out
fi
+ echo $? >> $i.ans
cmp $i.out $i.ans
failed=$?
if [[ $failed == 0 ]]; then
- rm $i.ans $i.elf $i.s $i.ref.elf
+ rm $i.ans $i.elf $i.s
fi
else
failed=1
diff --git a/test/array/arith.c b/test/array/arith.c
index 63c253f..6046875 100644
--- a/test/array/arith.c
+++ b/test/array/arith.c
@@ -1,4 +1,5 @@
int printf(char* format, ...);
+int scanf(char* format, ...);
int exit(int status);
void assert_eq(int expected, int actual) {
@@ -22,7 +23,9 @@ void check(int a[], int i, int j) {
void check_all(int a[], int n) {
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
- check(a, i, j);
+ if (a[i] > a[j]) {
+ check(a, i, j);
+ }
}
}
}
diff --git a/test/array/bigint.c b/test/array/bigint.c
deleted file mode 100644
index 4e05b82..0000000
--- a/test/array/bigint.c
+++ /dev/null
@@ -1,54 +0,0 @@
-int printf(char* format, ...);
-int getchar();
-
-
-void read(int* a) {
- a[0] = 0;
- while (1) {
- int c = getchar();
- if (c == '\n' || c == -1) {
- break;
- }
- if (c >= '0' && c <= '9') {
- a[++a[0]] = c - '0';
- }
- }
- for (int j = 1; j <= a[0] / 2; j++) {
- int temp = a[j];
- a[j] = a[a[0] - j + 1];
- a[a[0] - j + 1] = temp;
- }
-}
-
-void write(int* a) {
- int n = a[0];
- for (int i = n; i > 0; --i) {
- printf("%d", a[i]);
- }
- printf("\n");
-}
-
-void add(int* a, int* b) {
- int n = a[0] > b[0] ? a[0] : b[0];
- int carry = 0;
- for (int i = 1; i <= n; i++) {
- int sum = a[i] + b[i] + carry;
- a[i] = sum % 10;
- carry = sum / 10;
- }
- if (carry) {
- a[n + 1] = carry;
- a[0] = n + 1;
- } else {
- a[0] = n;
- }
-}
-
-int main() {
- int a[100];
- int b[100];
- read(a);
- read(b);
- add(a, b);
- write(a);
-}
\ No newline at end of file
diff --git a/test/array/bigint.in b/test/array/bigint.in
deleted file mode 100644
index c19b030..0000000
--- a/test/array/bigint.in
+++ /dev/null
@@ -1,2 +0,0 @@
-98111111111111111111111111111111107777777777777777777777777777
-89222222222222222222222222222222208888888888888888888888888888
diff --git a/test/array/bigint.out b/test/array/bigint.out
deleted file mode 100644
index 11b00ff..0000000
--- a/test/array/bigint.out
+++ /dev/null
@@ -1,2 +0,0 @@
-187333333333333333333333333333333316666666666666666666666666665
-0
diff --git a/test/array/fib.c b/test/array/fib.c
deleted file mode 100644
index 808f521..0000000
--- a/test/array/fib.c
+++ /dev/null
@@ -1,18 +0,0 @@
-int printf(char* format, ...);
-int scanf(char* format, ...);
-
-int fib[100];
-
-int main() {
- int n;
- scanf("%d", &n);
- fib[0] = 0;
- fib[1] = 1;
- for (int i = 2; i < n; i++) {
- fib[i] = fib[i - 1] + fib[i - 2];
- }
- for (int i = 0; i < n; i++) {
- printf("%d ", fib[i]);
- }
- printf("\n");
-}
\ No newline at end of file
diff --git a/test/array/fib.in b/test/array/fib.in
deleted file mode 100644
index 2edeafb..0000000
--- a/test/array/fib.in
+++ /dev/null
@@ -1 +0,0 @@
-20
\ No newline at end of file
diff --git a/test/array/fib.out b/test/array/fib.out
deleted file mode 100644
index 3cfb40f..0000000
--- a/test/array/fib.out
+++ /dev/null
@@ -1,2 +0,0 @@
-0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
-0
diff --git a/test/array/heap.c b/test/array/heap.c
deleted file mode 100644
index f6e1e4c..0000000
--- a/test/array/heap.c
+++ /dev/null
@@ -1,65 +0,0 @@
-int printf(char* format, ...);
-int scanf(char* format, ...);
-
-// sort by a max heap
-
-int heap[100];
-int heap_size = 0;
-
-void push_heap(int value) {
- heap[heap_size] = value;
- int i = heap_size;
- heap_size++;
- while (i > 0) {
- int parent = (i - 1) / 2;
- if (heap[i] > heap[parent]) {
- int temp = heap[i];
- heap[i] = heap[parent];
- heap[parent] = temp;
- i = parent;
- } else {
- break;
- }
- }
-}
-
-int pop_heap() {
- int value = heap[0];
- heap_size--;
- heap[0] = heap[heap_size];
- int i = 0;
- while (i < heap_size) {
- int left = 2 * i + 1;
- int right = 2 * i + 2;
- if (left >= heap_size) {
- break;
- }
- int max_child = left;
- if (right < heap_size && heap[right] > heap[left]) {
- max_child = right;
- }
- if (heap[i] < heap[max_child]) {
- int temp = heap[i];
- heap[i] = heap[max_child];
- heap[max_child] = temp;
- i = max_child;
- } else {
- break;
- }
- }
- return value;
-}
-
-int main() {
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++) {
- int value;
- scanf("%d", &value);
- push_heap(value);
- }
- for (int i = 0; i < n; i++) {
- printf("%d ", pop_heap());
- }
- printf("\n");
-}
\ No newline at end of file
diff --git a/test/array/heap.in b/test/array/heap.in
deleted file mode 100644
index 2532cac..0000000
--- a/test/array/heap.in
+++ /dev/null
@@ -1,11 +0,0 @@
-100
- 13 49 15 58 24 74 80 81 69 23
- 67 88 59 39 1 12 73 50 55 53
- 71 63 9 90 87 89 51 75 40 84
- 25 94 68 47 48 14 99 33 62 79
- 66 85 56 31 38 29 86 46 70 6
- 10 19 64 72 45 4 11 42 78 7
- 95 27 93 57 21 35 5 22 76 54
- 44 98 61 32 17 92 65 36 20 28
- 83 2 18 60 16 41 30 37 100 97
- 77 3 82 8 26 34 91 43 96 52
\ No newline at end of file
diff --git a/test/array/heap.out b/test/array/heap.out
deleted file mode 100644
index 7e998ff..0000000
--- a/test/array/heap.out
+++ /dev/null
@@ -1,2 +0,0 @@
-100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
-0
diff --git a/test/array/select.c b/test/array/select.c
deleted file mode 100644
index ccbadd0..0000000
--- a/test/array/select.c
+++ /dev/null
@@ -1,41 +0,0 @@
-int printf(char* format, ...);
-int scanf(char* format, ...);
-
-int a[100];
-int n;
-
-void swap(int* a, int* b) {
- int t = *a;
- *a = *b;
- *b = t;
-}
-
-int* max_element(int a[], int n) {
- int* max = a;
- for (int i = 1; i < n; i++) {
- if (a[i] > *max) {
- max = &a[i];
- }
- }
- return max;
-}
-
-void sort(int a[], int n) {
- for (int i = 0; i < n; i++) {
- int* max = max_element(a, n - i);
- swap(max, &a[n - i - 1]);
- }
-}
-
-
-int main() {
- scanf("%d", &n);
- for (int i = 0; i < n; i++) {
- scanf("%d", &a[i]);
- }
- sort(a, n);
- for (int i = 0; i < n; i++) {
- printf("%d ", a[i]);
- }
- printf("\n");
-}
\ No newline at end of file
diff --git a/test/array/select.in b/test/array/select.in
deleted file mode 100644
index 2532cac..0000000
--- a/test/array/select.in
+++ /dev/null
@@ -1,11 +0,0 @@
-100
- 13 49 15 58 24 74 80 81 69 23
- 67 88 59 39 1 12 73 50 55 53
- 71 63 9 90 87 89 51 75 40 84
- 25 94 68 47 48 14 99 33 62 79
- 66 85 56 31 38 29 86 46 70 6
- 10 19 64 72 45 4 11 42 78 7
- 95 27 93 57 21 35 5 22 76 54
- 44 98 61 32 17 92 65 36 20 28
- 83 2 18 60 16 41 30 37 100 97
- 77 3 82 8 26 34 91 43 96 52
\ No newline at end of file
diff --git a/test/array/select.out b/test/array/select.out
deleted file mode 100644
index 7c8f65f..0000000
--- a/test/array/select.out
+++ /dev/null
@@ -1,2 +0,0 @@
-1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
-0
diff --git a/test/array/bubble.c b/test/array/sort.c
similarity index 96%
rename from test/array/bubble.c
rename to test/array/sort.c
index fac27bd..d38e16e 100644
--- a/test/array/bubble.c
+++ b/test/array/sort.c
@@ -1,5 +1,6 @@
int printf(char* format, ...);
int scanf(char* format, ...);
+int exit(int status);
void swap(int* a, int* b) {
int t = *a;
diff --git a/test/array/bubble.in b/test/array/sort.in
similarity index 100%
rename from test/array/bubble.in
rename to test/array/sort.in
diff --git a/test/array/bubble.out b/test/array/sort.out
similarity index 100%
rename from test/array/bubble.out
rename to test/array/sort.out
diff --git a/test/branch/if-else-if.c b/test/branch/if-else-if.c
deleted file mode 100644
index 9e4ee4f..0000000
--- a/test/branch/if-else-if.c
+++ /dev/null
@@ -1,13 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int a = 5;
- if (a == 3) {
- printf("a is 3\n");
- } else if (a == 4) {
- printf("a is 4\n");
- } else {
- printf("a is not 3 or 4\n");
- }
- return 0;
-}
\ No newline at end of file
diff --git a/test/branch/if-else-if.out b/test/branch/if-else-if.out
deleted file mode 100644
index bd022c2..0000000
--- a/test/branch/if-else-if.out
+++ /dev/null
@@ -1,2 +0,0 @@
-a is not 3 or 4
-0
diff --git a/test/branch/if-else.c b/test/branch/if-else.c
deleted file mode 100644
index 9f36db8..0000000
--- a/test/branch/if-else.c
+++ /dev/null
@@ -1,10 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int a = 3;
- if (a == 3) {
- printf("a is 3\n");
- } else {
- printf("a is not 3\n");
- }
-}
\ No newline at end of file
diff --git a/test/branch/if-else.out b/test/branch/if-else.out
deleted file mode 100644
index 9001f38..0000000
--- a/test/branch/if-else.out
+++ /dev/null
@@ -1,2 +0,0 @@
-a is 3
-0
diff --git a/test/branch/if.c b/test/branch/if.c
deleted file mode 100644
index 19facd3..0000000
--- a/test/branch/if.c
+++ /dev/null
@@ -1,9 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int a = 3;
- if (a != 3) {
- printf("a is not 3\n");
- }
- printf("a = %d\n", a);
-}
\ No newline at end of file
diff --git a/test/branch/if.out b/test/branch/if.out
deleted file mode 100644
index 6783c06..0000000
--- a/test/branch/if.out
+++ /dev/null
@@ -1,2 +0,0 @@
-a = 3
-0
diff --git a/test/loop/break.c b/test/loop/break.c
index 940e632..bfa4699 100644
--- a/test/loop/break.c
+++ b/test/loop/break.c
@@ -3,28 +3,34 @@ int printf(char* format, ...);
int main() {
int i;
+ // For loop
+ printf("For loop:\n");
for (i = 0; i < 5; i++) {
if (i == 3) {
- break;
+ break; // Exit the loop when i is 3
}
printf("%d ", i);
}
printf("\n");
+ // While loop
+ printf("While loop:\n");
i = 0;
while (i < 5) {
if (i == 3) {
- break;
+ break; // Exit the loop when i is 3
}
printf("%d ", i);
i++;
}
printf("\n");
+ // Do-while loop
+ printf("Do-while loop:\n");
i = 0;
do {
if (i == 3) {
- break;
+ break; // Exit the loop when i is 3
}
printf("%d ", i);
i++;
diff --git a/test/loop/break.out b/test/loop/break.out
index 25adb52..e8ad5e7 100644
--- a/test/loop/break.out
+++ b/test/loop/break.out
@@ -1,4 +1,7 @@
+For loop:
0 1 2
+While loop:
0 1 2
+Do-while loop:
0 1 2
0
diff --git a/test/loop/continue.c b/test/loop/continue.c
index bb4cd5b..214a62d 100644
--- a/test/loop/continue.c
+++ b/test/loop/continue.c
@@ -3,33 +3,36 @@ int printf(char* format, ...);
int main() {
int i;
+ // For loop
printf("For loop:\n");
for (i = 0; i < 5; i++) {
- if (i > 3) {
- continue;
+ if (i == 3) {
+ continue; // Skip the rest of the loop when i is 3
}
printf("%d ", i);
}
printf("\n");
+ // While loop
printf("While loop:\n");
i = 0;
while (i < 5) {
- if (i > 3) {
+ if (i == 3) {
i++;
- continue;
+ continue; // Skip the rest of the loop when i is 3
}
printf("%d ", i);
i++;
}
printf("\n");
+ // Do-while loop
printf("Do-while loop:\n");
i = 0;
do {
- if (i > 3) {
+ if (i == 3) {
i++;
- continue;
+ continue; // Skip the rest of the loop when i is 3
}
printf("%d ", i);
i++;
diff --git a/test/loop/continue.out b/test/loop/continue.out
index 16f0ca2..a59c441 100644
--- a/test/loop/continue.out
+++ b/test/loop/continue.out
@@ -1,7 +1,7 @@
For loop:
-0 1 2 3
+0 1 2 4
While loop:
-0 1 2 3
+0 1 2 4
Do-while loop:
-0 1 2 3
+0 1 2 4
0
diff --git a/test/loop/do-while.c b/test/loop/do-while.c
deleted file mode 100644
index a1eab0c..0000000
--- a/test/loop/do-while.c
+++ /dev/null
@@ -1,11 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int i = 0;
- do {
- printf("%d ", i);
- i++;
- } while (i < 5);
- printf("\n");
- return 0;
-}
\ No newline at end of file
diff --git a/test/loop/do-while.out b/test/loop/do-while.out
deleted file mode 100644
index a6b5528..0000000
--- a/test/loop/do-while.out
+++ /dev/null
@@ -1,2 +0,0 @@
-0 1 2 3 4
-0
diff --git a/test/loop/for.c b/test/loop/for.c
deleted file mode 100644
index b1ef9c9..0000000
--- a/test/loop/for.c
+++ /dev/null
@@ -1,10 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int i = 0;
- for (i = 0; i < 5; i++) {
- printf("%d ", i);
- }
- printf("\n");
- return 0;
-}
\ No newline at end of file
diff --git a/test/loop/for.out b/test/loop/for.out
deleted file mode 100644
index a6b5528..0000000
--- a/test/loop/for.out
+++ /dev/null
@@ -1,2 +0,0 @@
-0 1 2 3 4
-0
diff --git a/test/loop/while.c b/test/loop/while.c
deleted file mode 100644
index 563cf1c..0000000
--- a/test/loop/while.c
+++ /dev/null
@@ -1,11 +0,0 @@
-int printf(char* format, ...);
-
-int main() {
- int i = 0;
- while (i < 5) {
- printf("%d ", i);
- i++;
- }
- printf("\n");
- return 0;
-}
\ No newline at end of file
diff --git a/test/loop/while.out b/test/loop/while.out
deleted file mode 100644
index a6b5528..0000000
--- a/test/loop/while.out
+++ /dev/null
@@ -1,2 +0,0 @@
-0 1 2 3 4
-0
diff --git a/transcript.py b/transcript.py
index 4a2a55e..d83e8fa 100644
--- a/transcript.py
+++ b/transcript.py
@@ -1,6 +1,5 @@
import sys
import html
-from string import Template
src = ''
asm = ''
@@ -17,22 +16,26 @@ for line in sys.stdin:
style += 1
style %= 5
flip = False
- elif line.startswith(".L") or line.startswith(".data") or line.startswith(".text"):
+ elif line.startswith("# string table: "):
asm += line
+ break
else:
asm += decorate(line)
flip = True
+for line in sys.stdin:
+ asm += line
+
title = 'RVBTCC Code Gen Demo'
-template = Template('''
+template = '''