The Compiler, in Its Own Language
self-c-factor

c_factor -- numbers, variables, parentheses, string literals, character literals, function calls:

fn c_factor() i64 {
    if (cur() == '(') {
        src_pos += 1; skip();
        c_expression();
        if (cur() == ')') { src_pos += 1; skip(); }
        return 0;
    }
    if (cur() == '\'') {
        src_pos += 1;
        var ch: i64 = cur();
        src_pos += 1;
        if (cur() == '\'') { src_pos += 1; skip(); }
        emit_s("  i64.const "); emit_num(ch); emit_byte('\n');
        return 0;
    }
    if (cur() == '"') {
        src_pos += 1;
        var sstart: i64 = src_pos;
        while (cur() != '"') { src_pos += 1; }
        var slen: i64 = src_pos - sstart;
        src_pos += 1; skip();
        emit_s("  i64.const ");
        emit_num(sstart * 65536 + slen);
        emit_byte('\n');
        add_str(sstart, slen);
        return 0;
    }
    if (is_digit(cur()) == 1) {
        emit_s("  i64.const "); emit_num(number()); emit_byte('\n');
        return 0;
    }
    if (is_letter(cur()) == 1) {
        var name: i64 = read_name();
        if (streq_mem(name, "true") == 1) { emit_s("  i64.const 1\n"); return 0; }
        if (streq_mem(name, "false") == 1) { emit_s("  i64.const 0\n"); return 0; }
        if (cur() == '(') {
            c_call(name);
            return 0;
        }
        if (is_global(name) == 1) { emit_s("  global.get $"); }
        else { emit_s("  local.get $"); }
        emit_s(name); emit_byte('\n');
        return 0;
    }
    return 0;
}

Character literals ('(' instead of 40), true/false keywords, += on src_pos. The function handles every kind of atomic expression.