void t_setup(){ parser_init(&fix.parser); //TODO: Move to _test_build_symbol_table? symbol_table_add(&fix.parser.table, "__tdown", 7); symbol_table_add(&fix.parser.table, "__tup", 5); _test_identity_init_lexer_fsm(&fix.parser.lexer_fsm); fix.parser.build_context = _test_build_parser_context; }
void lisp_context_declare_function(LispContext *ctx, char *symbol, LispNativeFunction function) { LispExpression *fun = make_lisp_function_native(function); LISP_REF(fun); LispExpression *previous = symbol_table_add(ctx->symbols, symbol, fun); LISP_UNREF(previous); }
LispExpression *lisp_context_set(LispContext *ctx, LispExpression *symbol, LispExpression *value) { LISP_ASSERT_TYPE(symbol, LISP_SYMBOL); LISP_REF(value); LispExpression *previous = symbol_table_add(ctx->symbols, symbol->value.symbol, value); LISP_UNREF(previous); return value; }
void expr_lambda_resolve(SyntaxNode* expr, SymbolTable* table) { lambda_t* lambda = (lambda_t*) expr; SymbolTable* new_table = symbol_table_create(table); param* prm = lambda->params->head; param* next; symbol_table_add(new_table, " this pointer "); while (prm != NULL) { next = prm->next; symbol_table_add(new_table, prm->name); prm = next; } NODE_RESOLVE(lambda->body, new_table); lambda->frameSize = new_table->size; symbol_table_destroy(new_table); }
void TTR_set_ident_data_type( Symbol_Table *table, TTR_Node *identifier, int type) { TTR_Node *sym_node; assert(table != NULL); assert(identifier != NULL); assert(N_TYPE(identifier) == N_IDENTIFIER || N_TYPE(identifier) == N_FUNCDEF); sym_node = symbol_table_lookup(table, N_STR(identifier)); if (sym_node == NULL) { N_DTYPE(identifier) = type; symbol_table_add(table, N_STR(identifier), identifier); } else { if (N_DTYPE(sym_node) == UNDEFINED_T) { N_DTYPE(identifier) = type; N_DTYPE(sym_node) = type; } else { N_DTYPE(identifier) = N_DTYPE(sym_node); } } }
// delit to bez tech mezer int parametrizer::tokens_get(DATA_FILE_SECTION *p_line, array<PARAM_NODE> &nodes) { assert(p_line); char *p_start = p_line->line_raw_string_get(); char *p_current = p_line->line_raw_string_get(); TOKEN_STATE state = STATE_TOKEN_START; do { switch(state) { case STATE_TOKEN_START: { assert(p_start == p_current); char c = *p_start; if(c == '\0') { state = STATE_STRING_END; } else if(isspace(c)) { p_start++; } else if(is_token_delim(c)) { state = STATE_TOKEN_END; } else { state = STATE_TOKEN_IN; } p_current++; break; } case STATE_TOKEN_IN: { char c = *p_current; if(c == '\0' || is_token_delim(c) || isspace(c)) { state = STATE_TOKEN_END; } else { p_current++; } break; } case STATE_TOKEN_END: { PARAM_NODE token; memset(&token,0,sizeof(token)); char c = *p_start; int length = p_current - p_start; assert(c != '\0' && !isspace(c)); assert(length != 0); if(is_token(p_start, length, token) || is_number(p_start, length, token)) { // It's a number or token nodes.append(token); } else { if(!is_token_delim(p_start[0])) { // We have a variable here if(p_start[length-2] == '.') { // it's a part of color variable (.r .g .b .a) // or a vector variable (.x .y .z) switch(p_start[length-1]) { case 'r': token.content_type = NODE_VAR_VARIABLE_R; length -= 2; break; case 'g': token.content_type = NODE_VAR_VARIABLE_G; length -= 2; break; case 'b': token.content_type = NODE_VAR_VARIABLE_B; length -= 2; break; case 'a': token.content_type = NODE_VAR_VARIABLE_A; length -= 2; break; case 'x': token.content_type = NODE_VAR_VARIABLE_X; length -= 2; break; case 'y': token.content_type = NODE_VAR_VARIABLE_Y; length -= 2; break; case 'z': token.content_type = NODE_VAR_VARIABLE_Z; length -= 2; break; default: p_line->ppline(); pperror(TRUE, "wrong tail .%c",p_start[length-1]); break; } } else { token.content_type = NODE_VAR_VARIABLE; } SYMBOL_TABLE_NODE *p_variable = symbol_table_get(symbol_table_get_active(), p_start, length); if(!p_variable) { p_variable = symbol_table_add(symbol_table_get_active(), p_start, length); } if(token.content_type == NODE_VAR_VARIABLE_R || token.content_type == NODE_VAR_VARIABLE_G || token.content_type == NODE_VAR_VARIABLE_B || token.content_type == NODE_VAR_VARIABLE_A) { if(p_variable->value.type == VARIABLE_UNSET) { p_variable->value.type = VARIABLE_RGBAF; } if(p_variable->value.type != VARIABLE_RGBAF) { p_line->ppline(); pperror(TRUE, "variable %s has to be a color type! (is %s)", p_variable->name, variable_type_translate(p_variable->value.type)); } } else if(token.content_type == NODE_VAR_VARIABLE_X || token.content_type == NODE_VAR_VARIABLE_Y || token.content_type == NODE_VAR_VARIABLE_Z) { if(p_variable->value.type == VARIABLE_UNSET) { p_variable->value.type = VARIABLE_VECT3DF; } if(p_variable->value.type != VARIABLE_VECT3DF) { p_line->ppline(); pperror(TRUE, "variable %s has to be a vector type! (is %s)", p_variable->name, variable_type_translate(p_variable->value.type)); } } token.node_type = NODE_VARIABLE; token.p_cvariable = p_variable; // Append it nodes.append(token); } } p_start = p_current; state = STATE_TOKEN_START; break; } default: break; } } while(state != STATE_STRING_END); return(nodes.num_get()); }