Skip to content

Commit 773115a

Browse files
committed
Add "while" statement
1 parent 3493ccc commit 773115a

File tree

5 files changed

+16
-3
lines changed

5 files changed

+16
-3
lines changed

chibicc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ typedef enum {
7272
ND_ASSIGN, // =
7373
ND_RETURN, // "return"
7474
ND_IF, // "if"
75-
ND_FOR, // "for"
75+
ND_FOR, // "for" or "while"
7676
ND_BLOCK, // { ... }
7777
ND_EXPR_STMT, // Expression statement
7878
ND_VAR, // Variable

codegen.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ static void gen_stmt(Node *node) {
115115
}
116116
case ND_FOR: {
117117
int c = count();
118-
gen_stmt(node->init);
118+
if (node->init)
119+
gen_stmt(node->init);
119120
printf(".L.begin.%d:\n", c);
120121
if (node->cond) {
121122
gen_expr(node->cond);

parse.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ static Obj *new_lvar(char *name) {
6565
// stmt = "return" expr ";"
6666
// | "if" "(" expr ")" stmt ("else" stmt)?
6767
// | "for" "(" expr-stmt expr? ";" expr? ")" stmt
68+
// | "while" "(" expr ")" stmt
6869
// | "{" compound-stmt
6970
// | expr-stmt
7071
static Node *stmt(Token **rest, Token *tok) {
@@ -104,6 +105,15 @@ static Node *stmt(Token **rest, Token *tok) {
104105
return node;
105106
}
106107

108+
if (equal(tok, "while")) {
109+
Node *node = new_node(ND_FOR);
110+
tok = skip(tok->next, "(");
111+
node->cond = expr(&tok, tok);
112+
tok = skip(tok, ")");
113+
node->then = stmt(rest, tok);
114+
return node;
115+
}
116+
107117
if (equal(tok, "{"))
108118
return compound_stmt(rest, tok->next);
109119

test.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,6 @@ assert 3 '{ if (1) { 1; 2; return 3; } else { return 4; } }'
7272
assert 55 '{ i=0; j=0; for (i=0; i<=10; i=i+1) j=i+j; return j; }'
7373
assert 3 '{ for (;;) {return 3;} return 5; }'
7474

75+
assert 10 '{ i=0; while(i<10) { i=i+1; } return i; }'
76+
7577
echo OK

tokenize.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static bool is_ident2(char c) {
7272
}
7373

7474
static bool is_keyword(Token *tok) {
75-
static char *kw[] = {"return", "if", "else", "for"};
75+
static char *kw[] = {"return", "if", "else", "for", "while"};
7676

7777
for (int i = 0; i < sizeof(kw) / sizeof(*kw); i++)
7878
if (equal(tok, kw[i]))

0 commit comments

Comments
 (0)