Пример #1
0
/* Releases the memory allocated for the AST and its subnodes */
void free_ast(ast_st* a) {

  switch(a->en) {

  case Plus:
  case Minus:
  case Mult:
  case Div:
  case Eq:
  case Ne:
  case Lt:
  case Le:
  case Gt:
  case Ge:
    free_ast(a->childs.left);
    free_ast(a->childs.right);
    free(a);
    break;

  case Integer:
  case Real:
    free(a);
    break;

  default: break;
  }

}
Пример #2
0
Файл: ast.c Проект: orieken/bool
void free_ast(Node* node) {
    switch (node->type) {
    case eVAR:
    {
        Var* var = (Var*) node;
        free(var->value);
        free(var);
        break;
    }
    case eAND:
    {
        And* and = (And*) node;
        free_ast(and->left);
        free_ast(and->right);
        free(and);
        break;
    }
    case eOR:
    {
        Or* or = (Or*) node;
        free_ast(or->left);
        free_ast(or->right);
        free(or);
        break;
    }
    case eNOT:
    {
        Not* not = (Not*) node;
        free_ast(not->other);
        free(not);
        break;
    }
    }
}
Пример #3
0
static void free_ast(ReAst *ast)
{
    if (!ast) {
        return;
    }

    free_ast(ast->lhs);
    free_ast(ast->rhs);
    free(ast);
}
Пример #4
0
struct ast_object* ast_remove_attribute(struct ast_object* ast, char* name)
{
    struct ast_object** attr = &ast->u.on.attrs;

    for (; *attr != NULL; attr = &(*attr)->u.an.next) {

        assert((*attr)->type == nodeType_Attribute);
        struct ast_object* pair = (*attr)->u.an.attr;
        struct ast_object* left = pair->u.pn.left;

        if (strcmp(left->u.in.str, name) == 0) {
            struct ast_object* current_attr = *attr;

            *attr = current_attr->u.an.next;

            current_attr->u.an.next = NULL;
            current_attr->u.an.attr = NULL;
            free_ast(current_attr);

            return pair;
        }

    }

    return NULL;
}
Пример #5
0
void cycle_to_point(ast root , ast first_param , ast parent)
{
     parent-> left = first_param;
     free_ast(root);
     return;
     
}
Пример #6
0
int main(int argc, char *argv[]) {
    num_tokens = 0;
    num_vars = 0;

    // set yyin to file if passed by user
    if(argc > 1) {
        yyin = fopen(argv[1], "r");
        if(yyin == NULL) {
            printf("error: invalid file\n");
            exit(1);
        }
    }
    else {
        printf("> "); // prompt
    }

    yyparse();
    fclose(yyin);
    generate_pla(root);

    and_or_not(root);
    freopen ("/dev/tty", "a", stdout); // make sure stdout is restored

    free_ast(root);
    empty_tokens();
    reformat_output();

    // print output
    char *fname = (char *)"out.pla";
    print_file(&fname);

    return 0;
}
Пример #7
0
/* Does the action for the -test command */
int do_test (int argc, const char ** argv) {

  int i, val, size = 0;
  char * buffer;
  
  for (i=0; i<argc; i++) size += strlen(argv[i]) + 1;
  buffer = (char*) malloc(sizeof(char) * size);

  strcpy(buffer, argv[0]);
  for (i=1; i<argc; i++) {
    strcat(buffer, " ");
    strcat(buffer, argv[i]);
  }
  
  yy_scan_string(buffer);
  yylex();


  yyparse ();

  if (result == NULL) return;

  val = eval(result);

  /* printf("%d\n", val); */

  free_ast(result);
  free(buffer);
  yylex_destroy();

  return val;
}
Пример #8
0
void exec_statements(env_t* env, ast_t* ast) {
  size_t i;
  for(i = 0; i < ast->data.statements.count; i++) {
    switch(ast->data.statements.statements[i]->type) {
      case at_assignment:
        exec_assignment(env, ast->data.statements.statements[i]);
        break;
      case at_call: {
        ast_t* tmp = eval_call(env, ast->data.statements.statements[i]);
        if(tmp != NULL) {
          if(tmp->ref_count == 0) {
            free_ast(tmp);
          }
        }
        break;
      }
      case at_conditional:
        exec_conditional(env, ast->data.statements.statements[i]);
        break;
      case at_while:
        exec_while(env, ast->data.statements.statements[i]);
        break;
      case at_dowhile:
        exec_dowhile(env, ast->data.statements.statements[i]);
        break;
      default:
        error_unexpected(NULL,get_ast_type_name(ast->data.statements.statements[i]->type));
        break;
    }
  }
}
Пример #9
0
errval_t del_record(struct ast_object* ast, struct oct_query_state* sqs)
{
    assert(ast != NULL);
    assert(sqs != NULL);

    for (size_t i = 0; i < MAX_RECORDS; i++) {
        struct record* entry = &record_storage[i];
        if (entry->name == NULL) {
            continue;
        }

        if (strcmp(RECORD_NAME(ast), entry->name) == 0) {
            assert(entry->record != NULL);

            free(entry->name);
            entry->name = NULL;
            free_ast(entry->record);
            entry->record = NULL;

            // Free the waiting list, this should be NULL anyways I guess
            struct wait_queue* cur = entry->waiting_parties;
            while (cur != NULL) {
                struct wait_queue* next = cur->next;
                free(cur);
                cur = next;
            }
            entry->waiting_parties = NULL;

            return SYS_ERR_OK;
        }
    }

    return OCT_ERR_NO_RECORD;
}
Пример #10
0
int ne_parse(const char *formula)
{
	int err;
	struct symbol_table *sym;

	ne.buf = yy_scan_string(formula, ne.scanner);

	yyset_lineno(1, ne.scanner);
	yyset_column(1, ne.scanner);
	__ne_clear_error(&ne);

	err = yyparse(&ne);

	if (!err) {
		__ne_put_result(&ne, eval(&ne, ne.root));

		sym = get_sym(&ne, "y");
		if (sym && sym->dirty) {
			__ne_put_result(&ne, __ne_get_y(&ne));
			clean_output_sym(&ne);
		}
	}

	if (ne.error != 0)
		err = ne.error;
	else if (ne.warrning != 0)
		err = ne.warrning;

	free_ast(ne.root);
	ne.root = NULL;
	ne.stop = 0;
	yy_delete_buffer(ne.buf, ne.scanner);

	return err;
}
Пример #11
0
/* Creates an ast node from the given operation and the two child nodes */
ast_st* create_node(kind_en op, ast_st* left, ast_st* right) {

  ast_st *a;

  if ((a = (ast_st*) malloc(sizeof(ast_st))) == NULL) {
    free_ast(left);
    free_ast(right);
    exit(1);
  }
  

  a->childs.left = left;
  a->childs.right = right;
  a->en = op;

  return a;
}
Пример #12
0
static void _delete_ast(ast *t){
	for(size_t i = 0; i < t->size; ++i){
		_delete_ast(t->children[i]);
	}
	free((char*)t->text);//discard const qualifier
	free(t->children);
	free_ast(t);
}
Пример #13
0
void re_free(Re *re)
{
    free(re->tpool[0].threads);
    free(re->tpool[1].threads);
    free(re->insts);
    free_ast(re->ast);
    free(re);
}
Пример #14
0
void free_ast_lst(AST_lst *ptr) {
    if (ptr == NULL) {
        return;
    } else {
        free_ast(ptr->val);
        free_ast_lst(ptr->next);
        free(ptr);
    }
}
Пример #15
0
ast *flatten_ast(ast *t){
	ast *ret = t;
	for(size_t i = 0; i < t->size; ++i){
		t->children[i] = flatten_ast(t->children[i]);
	}
	if(t->size == 1){
		if(t->children[0]->name){
			ret = t->children[0];
			free_ast(t);
		}else{
			t->text = t->children[0]->text;
			t->length = t->children[0]->length;
			free_ast(t->children[0]);
			free(t->children);
			t->size = 0;
		}
	}
	return ret;
}
Пример #16
0
void binary_expr_to_number(ast root , ast parent)
{
     int val = eval_binary_ast(root);
     ast node = create_number_node(val);
     if (root == parent-> left)
	  parent-> left = node;
     else
	  parent-> right = node;
     free_ast(root);
     //   return;
}
Пример #17
0
void free_ast (astree* root) {
   while (not root->children.empty()) {
      astree* child = root->children.back();
      root->children.pop_back();
      free_ast (child);
   }
   DEBUGF ('f', "free [%p]-> %d:%d.%d: %s: \"%s\")\n",
           root, root->filenr, root->linenr, root->offset,
           get_yytname (root->symbol), root->lexinfo->c_str());
   delete root;
}
Пример #18
0
void	remove_right(t_ast **ast)
{
  t_ast	*tmp;
  t_ast	*prev;

  tmp = *ast;
  prev = tmp;
  while (tmp != NULL && tmp->right != NULL && tmp->right->oper != -1)
    {
      prev = tmp;
      tmp = tmp->right;
    }
  if (tmp == prev && tmp != NULL)
    {
      free_ast(tmp->right);
      *ast = (*ast)->left;
    }
  else if (tmp != NULL)
    {
      prev->right = tmp->left;
      free_ast(tmp->right);
    }
}
Пример #19
0
/* Takes a "${<calculus>}" and render the value associated */
int parseArithToValue (const char * arith) {

  int val = 0;

  yy_scan_string(arith);
  yylex();

  yyparse ();
  
  val = eval(result);
  free_ast(result);
  yylex_destroy();
  

  return val;
}
Пример #20
0
void free_ast(struct ast_object* p)
{
    if (p == NULL) {
        return;
    }

    switch (p->type) {
    case nodeType_Object:
        free_ast(p->u.on.name);
        free_ast(p->u.on.attrs);
        break;

    case nodeType_Attribute:
        free_ast(p->u.an.attr);
        free_ast(p->u.an.next);
        break;

    case nodeType_String:
        free(p->u.sn.str);
        p->u.sn.str = NULL;
        break;

    case nodeType_Ident:
        free(p->u.in.str);
        p->u.in.str = NULL;
        break;

    case nodeType_Constraint:
        free_ast(p->u.cnsn.value);
        break;

    case nodeType_Pair:
        free_ast(p->u.pn.left);
        free_ast(p->u.pn.right);
        break;

    case nodeType_Unset:
        assert(!"nodeType_Unset encountered in free_ast!");
        abort();
        break;

    default:
        // Nothing special to do for value nodes
        break;
    }

    free(p);
}
Пример #21
0
Файл: ext.c Проект: sebrose/bool
static VALUE Bool_parse(VALUE klass, VALUE r_expr) {
    Node* ast;
    char* expr;

    if(NIL_P(klass)) {
        rb_raise(rb_eRuntimeError, "Bool klass was nil");
    }

    // TODO: Verify that r_expr is a String
    expr = RSTRING_PTR(r_expr);
    ast = parse_ast(expr);
    if(ast != NULL) {
        VALUE result = transform(ast);
        free_ast(ast);
        return result;
    } else {
        rb_raise(rb_eParseError, "%s", last_error_msg);
    }
}
Пример #22
0
int main(int argc, char *argv[])
{
    if (argc <= 1) {
        return 1;
    }

    // ./cc src.cmm out.s
    FILE *file;
    file     = fopen(argv[1], "r");
    asm_file = fopen(argv[2], "w");

    if (!file) {
        perror(argv[1]);
        return 1;
    }
    else if (!asm_file) {
        perror(argv[2]);
        return 1;
    }

    init_strtab();

    yyrestart(file);

    yyparse();

    if (!is_syn_error) {
        semantic_analysis();

        if (!semantic_error) {
            translate();
        }
    }

    free_ast();
    return 0;
}
Пример #23
0
void merge_ast(ast *t, ast *c){
	if(!t){
		delete_ast(c);
		return;
	}
	if(t->size){
		size_t size = t->size + c->size;
		void *tmp = realloc(t->children, size*sizeof(ast*));
		if(!tmp){
			//TODO: Handle error
			return;
		}
		t->children = tmp;
		memcpy(t->children + t->size, c->children, c->size*sizeof(ast*));
		t->size = size;
		free(c->children);
	}else{
		t->children = c->children;
		t->size = c->size;
	}
	if(t->length){
		size_t length = t->length + c->length;
		void *tmp = realloc((void*)t->text, length*sizeof(char));
		if(!tmp){
			t->children = realloc(t->children, t->size*sizeof(ast*));
			return;
		}
		t->text = tmp;
		memcpy((void*)t->text + t->length, c->text, c->length*sizeof(char));
		t->length = length;
		free((char*)c->text);//discard const qualifier
	}else{
		t->text = c->text;
		t->length = c->length;
	}
	free_ast(c);
}
Пример #24
0
void free_ast3 (astree* tree1, astree* tree2, astree* tree3) {
   free_ast (tree1);
   free_ast (tree2);
   free_ast (tree3);
}
Пример #25
0
void free_ast2 (astree* tree1, astree* tree2) {
   free_ast (tree1);
   free_ast (tree2);
}