chibicc - Simple c compiler if statement
Commit history for if statement feature
What is changed ?
For parser, new node type called ND_IF
is introduced. Three new nodes are introduced for Node
type in parser. They are called cond
, then
, els
which corresponds to code in if(cond){ } else {}
. New production rule is introduced to deal with if
statement
// stmt = "return" expr ";"
// | "{" compound_stmt
// | expr_stmt
// | "if" "(" expr ")" stmt ("else" stmt)?
static Node* stmt(Token**rest, Token* tok) {
if(equal(tok, "return")) {
Node* node = new_unary(ND_RETURN, expr(&tok, tok->next));
*rest = skip(tok, ";");
return node;
}
if(equal(tok, "{")) {
return compound_stmt(rest, tok->next);
}
if(equal(tok, "if")) {
tok = skip(tok->next, "(");
Node* node = new_node(ND_IF);
node->cond = expr(&tok, tok);
tok = skip(tok, ")");
node->then = stmt(&tok, tok);
if(equal(tok, "else")) {
node->els = stmt(&tok, tok->next);
}
*rest = tok;
return node;
}
return expr_stmt(rest, tok);
}
For code generator, assembly code generation for if
condition is introduced in gen_stmt
. First we generate assembly code for cond
node, and then we generate je $0, %rax
to check condtion of cond
node, and call jump .L.else.%d
to do them instruction jump, %d
is used to uniquly identify each else
block. Because multiple if
statement can be nested at the same time.
Enjoy Reading This Article?
Here are some more articles you might like to read next: