mirror of https://github.com/rui314/chibicc.git
Add ! operator
This commit is contained in:
parent
7df934d2b6
commit
6b88bcb306
|
@ -105,6 +105,7 @@ typedef enum {
|
|||
ND_MEMBER, // . (struct member access)
|
||||
ND_ADDR, // unary &
|
||||
ND_DEREF, // unary *
|
||||
ND_NOT, // !
|
||||
ND_RETURN, // "return"
|
||||
ND_IF, // "if"
|
||||
ND_FOR, // "for" or "while"
|
||||
|
|
|
@ -210,6 +210,12 @@ static void gen_expr(Node *node) {
|
|||
gen_expr(node->lhs);
|
||||
cast(node->lhs->ty, node->ty);
|
||||
return;
|
||||
case ND_NOT:
|
||||
gen_expr(node->lhs);
|
||||
println(" cmp $0, %%rax");
|
||||
println(" sete %%al");
|
||||
println(" movzx %%al, %%rax");
|
||||
return;
|
||||
case ND_FUNCALL: {
|
||||
int nargs = 0;
|
||||
for (Node *arg = node->args; arg; arg = arg->next) {
|
||||
|
|
5
parse.c
5
parse.c
|
@ -888,7 +888,7 @@ static Node *cast(Token **rest, Token *tok) {
|
|||
return unary(rest, tok);
|
||||
}
|
||||
|
||||
// unary = ("+" | "-" | "*" | "&") cast
|
||||
// unary = ("+" | "-" | "*" | "&" | "!") cast
|
||||
// | ("++" | "--") unary
|
||||
// | postfix
|
||||
static Node *unary(Token **rest, Token *tok) {
|
||||
|
@ -904,6 +904,9 @@ static Node *unary(Token **rest, Token *tok) {
|
|||
if (equal(tok, "*"))
|
||||
return new_unary(ND_DEREF, cast(rest, tok->next), tok);
|
||||
|
||||
if (equal(tok, "!"))
|
||||
return new_unary(ND_NOT, cast(rest, tok->next), tok);
|
||||
|
||||
// Read ++i as i+=1
|
||||
if (equal(tok, "++"))
|
||||
return to_assign(new_add(unary(rest, tok->next), new_num(1, tok), tok));
|
||||
|
|
|
@ -63,6 +63,14 @@ int main() {
|
|||
ASSERT(2, ({ int a[3]; a[0]=0; a[1]=1; a[2]=2; int *p=a+1; (*p++)--; a[2]; }));
|
||||
ASSERT(2, ({ int a[3]; a[0]=0; a[1]=1; a[2]=2; int *p=a+1; (*p++)--; *p; }));
|
||||
|
||||
ASSERT(0, !1);
|
||||
ASSERT(0, !2);
|
||||
ASSERT(1, !0);
|
||||
ASSERT(1, !(char)0);
|
||||
ASSERT(0, !(long)3);
|
||||
ASSERT(4, sizeof(!(char)0));
|
||||
ASSERT(4, sizeof(!(long)0));
|
||||
|
||||
printf("OK\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue