コード例 #1
0
ファイル: parser_test.c プロジェクト: jbmikk/pars
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;
}
コード例 #2
0
ファイル: context.c プロジェクト: recursive-madman/lisp
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);
}
コード例 #3
0
ファイル: context.c プロジェクト: recursive-madman/lisp
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;
}
コード例 #4
0
ファイル: lambda.c プロジェクト: k-okubo/ekul-prototype
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);
}
コード例 #5
0
ファイル: symbol_table.c プロジェクト: Alfandorachk/Tetra
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);
        }
    }
}
コード例 #6
0
// 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());
}