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.