/* * primitive.h * * Created on: Feb 11, 2010 * Author: petergoodman * Version: $Id$ */ #ifndef PRIMITIVE_H_ #define PRIMITIVE_H_ #include #include #include #include #include #include #include "Token.h" #include "DerivedFunction.h" #include "TokenStackConstraint.h" namespace primitive { using namespace std; using namespace TS; void exit(deque &stack, deque &tokens, map &symbols); void clear(deque &stack, deque &tokens, map &symbols); void print(deque &stack, deque &tokens, map &symbols); void exec(deque &stack, deque &tokens, map &symbols); void pop(deque &stack, deque &tokens, map &symbols); void dump(deque &stack, deque &tokens, map &symbols); void load(deque &stack, deque &tokens, map &symbols); void store(deque &stack, deque &tokens, map &symbols); void cond(deque &stack, deque &tokens, map &symbols); typedef Token *(op2_func_t)(Token *, Token *); pair take2(deque &stack); Token *op_add(Token *a, Token *b); Token *op_sub(Token *a, Token *b); Token *op_mul(Token *a, Token *b); Token *op_div(Token *a, Token *b); Token *op_eq(Token *a, Token *b); Token *op_gt(Token *a, Token *b); Token *op_lt(Token *a, Token *b); /* fix template linkage problems; a bit of bloat here means a bit less * elsewhere :D */ /** * Create an operator on two integers from a simple function that * performs the operation. */ template void op2(deque &stack, deque &tokens, map &symbols) { (void) tokens; (void) symbols; And, // type check And, Type > > constraint(stack); (void) constraint; pair both = take2(stack); stack.push_back(op(both.first, both.second)); delete both.first; delete both.second; } } #endif /* PRIMITIVE_H_ */