// picoc: term_moveright(cols); static void pterm_moveright(pstate *p, val *r, val **param, int n) { unsigned delta; delta = param[0]->Val->UnsignedInteger; term_right(delta); }
Expr* APDEvaluator::term_right(const char* string, Expr* expr) { Expr* new_expr; switch(string[G_STRING_ITERATOR]) { case '+': case '-': case '[': case ']': case '<': case '>': case '=': case '&': case '|': if(NULL == (new_expr = (Expr*)malloc(sizeof(Expr)))) { exit(1); } if(NULL == (new_expr->data.expr[1] = (Expr*)malloc(sizeof(Expr)))) { exit(1); } new_expr->op = proc_c(string, string[G_STRING_ITERATOR]); new_expr->data.expr[0] = expr; new_expr->data.expr[1] = term(string, new_expr->data.expr[1]); new_expr = term_right(string, new_expr); return new_expr; case ')': case 's': case 'c': case 0: return expr; default: parse_error(string); } }
// Lua: moveright( cols ) static int luaterm_moveright( lua_State* L ) { unsigned delta; delta = ( unsigned )luaL_checkinteger( L, 1 ); term_right( delta ); return 0; }
// (term-moveright 'num) -> Nil any plisp_term_moveright(any ex) { any x, y; long n; x = cdr(ex), y = EVAL(car(x)); NeedNum(ex, y); n = unBox(y); term_right(n); return Nil; }
// TODO add lookahead for sensor and control expressions Expr* APDEvaluator::expression(const char* string) { Expr* expr; if(string[G_STRING_ITERATOR] == '(' || isdigit(string[G_STRING_ITERATOR])|| string[G_STRING_ITERATOR]=='c'|| string[G_STRING_ITERATOR]=='s') { if(NULL == (expr = (Expr*)malloc(sizeof(Expr)))) { exit(1); // TODO this is not the way to handle this } expr = term(string, expr); expr = term_right(string, expr); return expr; } else { parse_error(string); } }