Compare commits
No commits in common. "dfe1ac90e89cb83254eeb14c5ebb3b64d83bc679" and "cf93109f1efff73e01c8a743172d9636657ba8f5" have entirely different histories.
dfe1ac90e8
...
cf93109f1e
@ -1,22 +0,0 @@
|
|||||||
put("Enter an operation (+, -, *, /): ")
|
|
||||||
op := getln()
|
|
||||||
if (!(op == "+" || op == "-" || op == "*" || op == "/")) {
|
|
||||||
put("Unknown operation: ")
|
|
||||||
putln(op)
|
|
||||||
} else {
|
|
||||||
put("1st number: ")
|
|
||||||
n1 := float(getln())
|
|
||||||
put("2nd number: ")
|
|
||||||
n2 := float(getln())
|
|
||||||
|
|
||||||
put("Result: ")
|
|
||||||
if (op == "+") {
|
|
||||||
putln(n1 + n2)
|
|
||||||
} else if (op == "-") {
|
|
||||||
putln(n1 - n2)
|
|
||||||
} else if (op == "*") {
|
|
||||||
putln(n1 * n2)
|
|
||||||
} else if (op == "/") {
|
|
||||||
putln(n1 / n2)
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,6 +7,6 @@ while i {
|
|||||||
z := x + y
|
z := x + y
|
||||||
y = x
|
y = x
|
||||||
x = z
|
x = z
|
||||||
putln(z)
|
print(z)
|
||||||
i = i - 1
|
i = i - 1
|
||||||
}
|
}
|
||||||
|
@ -14,4 +14,4 @@ while k < iterations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
put("π ≈ ")
|
put("π ≈ ")
|
||||||
putln(sum)
|
print(sum)
|
||||||
|
57
main.c
57
main.c
@ -38,7 +38,7 @@ static Value fn_put(Value *args) {
|
|||||||
return (Value){0};
|
return (Value){0};
|
||||||
}
|
}
|
||||||
|
|
||||||
static Value fn_putln(Value *args) {
|
static Value fn_print(Value *args) {
|
||||||
fn_put(args);
|
fn_put(args);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
return (Value){0};
|
return (Value){0};
|
||||||
@ -53,18 +53,6 @@ static Value fn_int(Value *args) {
|
|||||||
case TypeVoid: break;
|
case TypeVoid: break;
|
||||||
case TypeFloat: ret.Int = (ssize_t)args[0].Float; break;
|
case TypeFloat: ret.Int = (ssize_t)args[0].Float; break;
|
||||||
case TypeInt: ret.Int = args[0].Int; break;
|
case TypeInt: ret.Int = args[0].Int; break;
|
||||||
case TypeBool: ret.Int = (ssize_t)args[0].Bool; break;
|
|
||||||
case TypeArr:
|
|
||||||
if (args[0].Arr.is_string && args[0].Arr.type.kind == TypeChar) {
|
|
||||||
ssize_t endpos;
|
|
||||||
ret.Int = stoimax((char*)args[0].Arr.vals, args[0].Arr.len, 10, &endpos);
|
|
||||||
if (endpos != -1) {
|
|
||||||
set_err("Error converting from string to int");
|
|
||||||
return (Value){0};
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ASSERT_UNREACHED();
|
|
||||||
break;
|
|
||||||
default: ASSERT_UNREACHED();
|
default: ASSERT_UNREACHED();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -79,18 +67,6 @@ static Value fn_float(Value *args) {
|
|||||||
case TypeVoid: break;
|
case TypeVoid: break;
|
||||||
case TypeFloat: ret.Float = args[0].Float; break;
|
case TypeFloat: ret.Float = args[0].Float; break;
|
||||||
case TypeInt: ret.Float = (double)args[0].Int; break;
|
case TypeInt: ret.Float = (double)args[0].Int; break;
|
||||||
case TypeBool: ret.Float = (double)args[0].Bool; break;
|
|
||||||
case TypeArr:
|
|
||||||
if (args[0].Arr.is_string && args[0].Arr.type.kind == TypeChar) {
|
|
||||||
ssize_t endpos;
|
|
||||||
ret.Float = stod((char*)args[0].Arr.vals, args[0].Arr.len, &endpos);
|
|
||||||
if (endpos != -1) {
|
|
||||||
set_err("Error converting from string to float");
|
|
||||||
return (Value){0};
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ASSERT_UNREACHED();
|
|
||||||
break;
|
|
||||||
default: ASSERT_UNREACHED();
|
default: ASSERT_UNREACHED();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -116,34 +92,6 @@ static Value fn_sleep(Value *args) {
|
|||||||
return (Value){0};
|
return (Value){0};
|
||||||
}
|
}
|
||||||
|
|
||||||
static Value fn_getln(Value *args) {
|
|
||||||
(void)args;
|
|
||||||
|
|
||||||
char *line = xmalloc(64);
|
|
||||||
size_t len = 0, cap = 64;
|
|
||||||
for (;;) {
|
|
||||||
int c = fgetc(stdin);
|
|
||||||
if (c == EOF)
|
|
||||||
break;
|
|
||||||
else if (c == '\n')
|
|
||||||
break;
|
|
||||||
if (len+1 > cap)
|
|
||||||
line = xrealloc(line, (cap *= 2));
|
|
||||||
line[len++] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Value){
|
|
||||||
.type.kind = TypeArr,
|
|
||||||
.Arr = {
|
|
||||||
.is_string = true,
|
|
||||||
.type.kind = TypeChar,
|
|
||||||
.vals = line,
|
|
||||||
.len = len,
|
|
||||||
.cap = cap,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
/* parse arguments */
|
/* parse arguments */
|
||||||
size_t nargs = argc - 1;
|
size_t nargs = argc - 1;
|
||||||
@ -204,12 +152,11 @@ int main(int argc, const char **argv) {
|
|||||||
/* parse tokens into IR code */
|
/* parse tokens into IR code */
|
||||||
BuiltinFunc funcs[] = {
|
BuiltinFunc funcs[] = {
|
||||||
{ .name = "put", .side_effects = true, .n_args = 1, .func = fn_put, },
|
{ .name = "put", .side_effects = true, .n_args = 1, .func = fn_put, },
|
||||||
{ .name = "putln", .side_effects = true, .n_args = 1, .func = fn_putln, },
|
{ .name = "print", .side_effects = true, .n_args = 1, .func = fn_print, },
|
||||||
{ .name = "int", .side_effects = false, .n_args = 1, .func = fn_int, },
|
{ .name = "int", .side_effects = false, .n_args = 1, .func = fn_int, },
|
||||||
{ .name = "float", .side_effects = false, .n_args = 1, .func = fn_float, },
|
{ .name = "float", .side_effects = false, .n_args = 1, .func = fn_float, },
|
||||||
{ .name = "pow", .side_effects = false, .n_args = 2, .func = fn_pow, },
|
{ .name = "pow", .side_effects = false, .n_args = 2, .func = fn_pow, },
|
||||||
{ .name = "sleep", .side_effects = true, .n_args = 1, .func = fn_sleep, },
|
{ .name = "sleep", .side_effects = true, .n_args = 1, .func = fn_sleep, },
|
||||||
{ .name = "getln", .side_effects = true, .n_args = 0, .func = fn_getln, },
|
|
||||||
};
|
};
|
||||||
IRToks ir = parse(&tokens, funcs, sizeof(funcs) / sizeof(funcs[0]));
|
IRToks ir = parse(&tokens, funcs, sizeof(funcs) / sizeof(funcs[0]));
|
||||||
if (err) {
|
if (err) {
|
||||||
|
10
runtime.c
10
runtime.c
@ -57,16 +57,6 @@ Value eval_binary(IRInstr instr, const Value *lhs, const Value *rhs) {
|
|||||||
case IRLe: res = lhs->Float <= rhs->Float; break;
|
case IRLe: res = lhs->Float <= rhs->Float; break;
|
||||||
default: ASSERT_UNREACHED();
|
default: ASSERT_UNREACHED();
|
||||||
};
|
};
|
||||||
} else if (lhs->type.kind == TypeArr && lhs->Arr.type.kind == TypeChar && lhs->Arr.is_string &&
|
|
||||||
rhs->type.kind == TypeArr && rhs->Arr.type.kind == TypeChar && rhs->Arr.is_string) {
|
|
||||||
switch (instr) {
|
|
||||||
case IREq:
|
|
||||||
res = lhs->Arr.len == rhs->Arr.len ? strncmp(lhs->Arr.vals, rhs->Arr.vals, lhs->Arr.len) == 0 : false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
set_err("String operation '%s' not supported", irinstr_str[instr]);
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
set_err("Unsupported types for operation '%s': %s and %s", irinstr_str[instr], type_str[lhs->type.kind], type_str[rhs->type.kind]);
|
set_err("Unsupported types for operation '%s': %s and %s", irinstr_str[instr], type_str[lhs->type.kind], type_str[rhs->type.kind]);
|
||||||
return (Value){0};
|
return (Value){0};
|
||||||
|
Loading…
Reference in New Issue
Block a user