#ifndef WEBDICE_EXPRESSION #define WEBDICE_EXPRESSION #include enum expression_type{ WEBDICE_CONST, WEBDICE_ROLL, WEBDICE_BINARY }; enum binary_type{ WEBDICE_MUL, WEBDICE_DIV, WEBDICE_ADD, WEBDICE_SUB }; struct expression_id{ enum expression_type id; }; struct expression_const{ enum expression_type id; int64_t value; }; struct expression_roll{ enum expression_type id; int64_t count; int64_t type; }; struct expression_binary{ enum expression_type id; enum binary_type operation; union expression* left; union expression* right; }; union expression{ struct expression_id id; struct expression_const constant; struct expression_roll roll; struct expression_binary binary; }; struct expression_result{ char* text; long double min; long double max; long double expected; long double actual; }; union expression* webdice_const(int64_t value); union expression* webdice_roll(int64_t count, int64_t roll); union expression* webdice_mul(union expression* left, union expression* right); union expression* webdice_div(union expression* left, union expression* right); union expression* webdice_add(union expression* left, union expression* right); union expression* webdice_sub(union expression* left, union expression* right); union expression* webdice_binary(enum binary_type type, union expression* left, union expression* right); struct expression_result resolve(union expression* root); void free_expression(union expression* root); #endif