#include "reader.h" #include #include static int parse_number( memory_pool_t *pool, const char *input, int len, expression_t **out) { (void)pool; int value = 0, used = 0; while (used < len && isdigit(input[used])) { value *= 10; value += input[used] - '0'; ++used; } if (0 == used) return 0; expression_t *number = allocate_expression(pool); number->is_number = true; number->number = value; *out = number; return used; } static int parse_expression( memory_pool_t *pool, const char *input, int len, expression_t **out) { int result, used = 0; expression_t *number; result = parse_number(pool, input, len, &number); if (0 >= result) return 0; used += result; if (used >= len) { *out = number; return used; } operator_t operator; switch (input[used]) { case '+': operator= OPERATOR_ADD; break; case '-': operator= OPERATOR_SUBTRACT; break; default: return 0; } ++used; expression_t *subexpr; result = parse_expression(pool, input + used, len - used, &subexpr); if (0 >= result) return 0; used += result; expression_t *expr = allocate_expression(pool); expr->is_number = false; expr->application.operator= operator; expr->application.operands[0] = number; expr->application.operands[1] = subexpr; *out = expr; return used; } const expression_t * read_expression(memory_pool_t *pool, const char *input, int len) { expression_t *expression; parse_expression(pool, input, len, &expression); return expression; }