#include <ecoli_malloc.h>
#include <ecoli_strvec.h>
#include <ecoli_test.h>
+#include <ecoli_node.h>
+#include <ecoli_parsed.h>
#include <ecoli_node_int.h>
#include <ecoli_node_str.h>
#include <ecoli_node_re_lex.h>
#include <ecoli_node_expr.h>
+EC_LOG_TYPE_REGISTER(node_expr);
+
struct my_eval_result {
int val;
};
const struct ec_parsed *var)
{
const struct ec_strvec *vec;
- struct my_eval_result *eval;
+ const struct ec_node *node;
+ struct my_eval_result *eval = NULL;
+ int64_t val;
(void)userctx;
if (ec_strvec_len(vec) != 1)
return -EINVAL;
+ node = ec_parsed_get_node(var);
+ if (ec_node_int_getval(node, ec_strvec_val(vec, 0), &val) < 0)
+ return -EINVAL;
+
eval = ec_malloc(sizeof(*eval));
if (eval == NULL)
return -ENOMEM;
- eval->val = atoi(ec_strvec_val(vec, 0)); // XXX use strtol
+ eval->val = val;
printf("eval var %d\n", eval->val);
*result = eval;
struct my_eval_result *eval;
int ret;
- /* XXX check node type (again and again) */
-
p = ec_node_parse(lex_node, str);
if (p == NULL)
return -1;
return ret;
}
+/* LCOV_EXCL_START */
static int ec_node_expr_testcase(void)
{
struct ec_node *node = NULL, *lex_node = NULL;
int ret = 0;
- node = ec_node_new("expr", "my_expr");
+ node = ec_node("expr", "my_expr");
if (node == NULL)
return -1;
- ec_node_expr_set_val_node(node, ec_node_int(NULL, 0, UCHAR_MAX, 0));
- ec_node_expr_add_bin_op(node, ec_node_str(NULL, "+"));
- ec_node_expr_add_bin_op(node, ec_node_str(NULL, "*"));
- ec_node_expr_add_pre_op(node, ec_node_str(NULL, "!")); /* not */
- ec_node_expr_add_post_op(node, ec_node_str(NULL, "^")); /* square */
- ec_node_expr_add_parenthesis(node, ec_node_str(NULL, "("),
- ec_node_str(NULL, ")"));
+ ec_node_expr_set_val_node(node, ec_node_int(EC_NO_ID, 0, UCHAR_MAX, 0));
+ ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "+"));
+ ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "*"));
+ ec_node_expr_add_pre_op(node, ec_node_str(EC_NO_ID, "!")); /* not */
+ ec_node_expr_add_post_op(node, ec_node_str(EC_NO_ID, "^")); /* square */
+ ec_node_expr_add_parenthesis(node, ec_node_str(EC_NO_ID, "("),
+ ec_node_str(EC_NO_ID, ")"));
ret |= EC_TEST_CHECK_PARSE(node, 1, "1");
ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "1");
ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "*");
ret |= EC_TEST_CHECK_PARSE(node, 5, "1", "+", "!", "1", "^");
/* prepend a lexer to the expression node */
- lex_node = ec_node_re_lex(NULL, ec_node_clone(node));
+ lex_node = ec_node_re_lex(EC_NO_ID, ec_node_clone(node));
if (lex_node == NULL)
goto fail;
ret |= ec_node_expr_test_eval(lex_node, node, "!0", 1);
ret |= ec_node_expr_test_eval(lex_node, node, "1+1", 2);
+ ret |= ec_node_expr_test_eval(lex_node, node, "1+2+3", 6);
ret |= ec_node_expr_test_eval(lex_node, node, "1+1*2", 4);
ret |= ec_node_expr_test_eval(lex_node, node, "2 * 2^", 8);
ret |= ec_node_expr_test_eval(lex_node, node, "(1 + !0)^ * !0^", 4);
ec_node_free(node);
return -1;
}
+/* LCOV_EXCL_STOP */
static struct ec_test ec_node_expr_test = {
.name = "expr",