#include "reader.h" #include #include static int parse_number( memory_pool_t *pool, const char *input, int remaining, expression_t *out) { (void)pool; int value = 0, used = 0; while (remaining > 0 && isdigit(*input)) { value *= 10; value += *input - '0'; ++used; --remaining; ++input; } out->is_number = true; out->number = value; return used; } static int parse_application( memory_pool_t *pool, const char *input, int remaining, expression_t *out) { int result, used = 0; expression_t *operand0 = allocate_expression(pool); result = parse_number(pool, input, remaining, operand0); if (0 == result) return 0; used += result; remaining -= result; input += result; if (remaining <= 0 || *input != '+') return 0; ++used; --remaining; ++input; expression_t *operand1 = allocate_expression(pool); result = parse_number(pool, input, remaining, operand1); if (0 == result) return 0; used += result; remaining -= result; input += result; out->is_number = false; out->application.operator = OPERATOR_ADD; out->application.operands[0] = operand0; out->application.operands[1] = operand1; return used; } static int parse_expression( memory_pool_t *pool, const char *input, int remaining, expression_t *out) { int result = parse_application(pool, input, remaining, out); if (0 != result) return result; else return parse_number(pool, input, remaining, out); } const expression_t * read_expression(memory_pool_t *pool, const char *input, int len) { expression_t *expression = allocate_expression(pool); if (NULL == expression) return NULL; parse_expression(pool, input, len, expression); return expression; }