1
0
Fork 0
This commit is contained in:
Alex Kotov 2023-05-04 01:25:40 +04:00
parent d35acd96af
commit 2213a40c02
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08

68
main.c
View file

@ -71,6 +71,14 @@ static struct Object *expr();
static struct Object *parens(); static struct Object *parens();
static struct Object *parens_part(); static struct Object *parens_part();
/********
* Eval *
********/
static struct Object *eval(struct Object *program);
static struct Object *func_sum(struct Object *numbers);
/******************* /*******************
* Implementations * * Implementations *
*******************/ *******************/
@ -89,6 +97,7 @@ int main()
} }
struct Object *const program = parse(); struct Object *const program = parse();
struct Object *const result = eval(program);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
@ -357,7 +366,7 @@ struct Object *expr()
case STATE_NUM: case STATE_NUM:
{ {
struct Object *const object = prepare_object(TYPE_NUMBER); struct Object *const object = prepare_object(TYPE_NUMBER);
object->s = tokens->val; object->i = atoll(tokens->val);
shift_token(); shift_token();
return object; return object;
} }
@ -391,3 +400,60 @@ struct Object *parens_part()
return object; return object;
} }
/********
* Eval *
********/
struct Object *eval(struct Object *const program)
{
if (program->type != TYPE_PAIR) {
error("eval expects pair");
return NULL;
}
if (!program->a || program->a->type != TYPE_ATOM) {
error("eval expects atom");
return NULL;
}
if (strcmp(program->a->s, "sum") != 0) {
error("unknown func");
return NULL;
}
return func_sum(program->b);
}
struct Object *func_sum(struct Object *const numbers)
{
struct Object *const object = prepare_object(TYPE_NUMBER);
object->i = 0;
if (numbers) {
if (numbers->type == TYPE_NUMBER) {
object->i = numbers->i;
} else if (numbers->type == TYPE_PAIR) {
if (numbers->a->type != TYPE_NUMBER) {
error("type error");
return NULL;
}
object->i = numbers->a->i;
struct Object *b = eval(numbers->b);
if (numbers->b->type != TYPE_NUMBER) {
error("type error");
return NULL;
}
object->i += b->i;
} else {
error("type error");
return NULL;
}
}
return object;
}