mirror of https://github.com/rui314/chibicc
Add ! operator
This commit is contained in:
parent
f78c409856
commit
5ec5e38289
1
chibi.h
1
chibi.h
|
@ -109,6 +109,7 @@ typedef enum {
|
||||||
ND_MEMBER, // . (struct member access)
|
ND_MEMBER, // . (struct member access)
|
||||||
ND_ADDR, // unary &
|
ND_ADDR, // unary &
|
||||||
ND_DEREF, // unary *
|
ND_DEREF, // unary *
|
||||||
|
ND_NOT, // !
|
||||||
ND_RETURN, // "return"
|
ND_RETURN, // "return"
|
||||||
ND_IF, // "if"
|
ND_IF, // "if"
|
||||||
ND_WHILE, // "while"
|
ND_WHILE, // "while"
|
||||||
|
|
|
@ -260,6 +260,14 @@ static void gen(Node *node) {
|
||||||
if (node->ty->kind != TY_ARRAY)
|
if (node->ty->kind != TY_ARRAY)
|
||||||
load(node->ty);
|
load(node->ty);
|
||||||
return;
|
return;
|
||||||
|
case ND_NOT:
|
||||||
|
gen(node->lhs);
|
||||||
|
printf(" pop rax\n");
|
||||||
|
printf(" cmp rax, 0\n");
|
||||||
|
printf(" sete al\n");
|
||||||
|
printf(" movzb rax, al\n");
|
||||||
|
printf(" push rax\n");
|
||||||
|
return;
|
||||||
case ND_IF: {
|
case ND_IF: {
|
||||||
int seq = labelseq++;
|
int seq = labelseq++;
|
||||||
if (node->els) {
|
if (node->els) {
|
||||||
|
|
|
@ -38,8 +38,7 @@ int solve(int (*board)[10], int row) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
if (conflict(board, row, i)) {
|
if (!conflict(board, row, i)) {
|
||||||
} else {
|
|
||||||
board[row][i] = 1;
|
board[row][i] = 1;
|
||||||
solve(board, row + 1);
|
solve(board, row + 1);
|
||||||
board[row][i] = 0;
|
board[row][i] = 0;
|
||||||
|
|
4
parse.c
4
parse.c
|
@ -885,7 +885,7 @@ static Node *cast(void) {
|
||||||
return unary();
|
return unary();
|
||||||
}
|
}
|
||||||
|
|
||||||
// unary = ("+" | "-" | "*" | "&")? cast
|
// unary = ("+" | "-" | "*" | "&" | "!")? cast
|
||||||
// | ("++" | "--") unary
|
// | ("++" | "--") unary
|
||||||
// | postfix
|
// | postfix
|
||||||
static Node *unary(void) {
|
static Node *unary(void) {
|
||||||
|
@ -898,6 +898,8 @@ static Node *unary(void) {
|
||||||
return new_unary(ND_ADDR, cast(), tok);
|
return new_unary(ND_ADDR, cast(), tok);
|
||||||
if (tok = consume("*"))
|
if (tok = consume("*"))
|
||||||
return new_unary(ND_DEREF, cast(), tok);
|
return new_unary(ND_DEREF, cast(), tok);
|
||||||
|
if (tok = consume("!"))
|
||||||
|
return new_unary(ND_NOT, cast(), tok);
|
||||||
if (tok = consume("++"))
|
if (tok = consume("++"))
|
||||||
return new_unary(ND_PRE_INC, unary(), tok);
|
return new_unary(ND_PRE_INC, unary(), tok);
|
||||||
if (tok = consume("--"))
|
if (tok = consume("--"))
|
||||||
|
|
4
tests
4
tests
|
@ -390,6 +390,10 @@ int main() {
|
||||||
assert(47, 0b101111, "0b101111");
|
assert(47, 0b101111, "0b101111");
|
||||||
assert(47, 0B101111, "0B101111");
|
assert(47, 0B101111, "0B101111");
|
||||||
|
|
||||||
|
assert(0, !1, "!1");
|
||||||
|
assert(0, !2, "!2");
|
||||||
|
assert(1, !0, "!0");
|
||||||
|
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue