Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2012, 16:03   #1
masha kasha
Новичок
Джуниор
 
Регистрация: 06.11.2012
Сообщений: 1
Смущение оптимизация дерева разбора

Здравствуйте!
Дали задание - сделать оптимизацию синтаксического дерева и дерева разбора. Мне досталась оптимизация "распространением копий" (позволяет избавится от лишних (промежуточных) присваиваний переменных, подменяя в выражениях промежуточные переменные)

Синтаксическое дерево я одолела, но с деревом разбора никак не могу справиться. Прилагаю документацию по моему примеру и написанную оптимизацию по синтаксическому дереву. Буду очень рада любой помощи! Спасибо большое всем откликнувшимся)

http://www.programmersforum.ru/attac...1&d=1352203142


Код:
#include <iostream>
#include <cassert>
#include <stdlib.h>
#include <sstream>
using namespace std;

typedef struct tree {
    char data[25];
    char node_type[25];
    struct tree* left, *right;
} TREE;

TREE* root = NULL;
typedef enum tag_type {RIGHT, LEFT} TYPE;

TREE* add_node(TREE* node,char* data,char* node_type, TYPE type = LEFT)
{
    TREE* new_node = (TREE *)malloc(sizeof(TREE));
    if(type == LEFT && node != NULL) node->left = new_node;
    else if(node != NULL) node->right = new_node;
    strcpy(new_node->data,data);
    strcpy(new_node->node_type,node_type);
    new_node->left = NULL;
    new_node->right = NULL;
    return new_node;
}

void print (TREE* node,  int level = 0 )
{
    TREE *tn = node;
    if(tn) print(tn->right, level+1);
    for (int n=0; n<level;++n)
        cout << "   ";
    if(tn)
        cout << tn->data  << endl;
    else
        cout << "" << endl;
    if(tn) print(tn->left, level+1);
}

void del_next(TREE* node)
{
    if(node != NULL)
    {
        del_next(node->left);
        del_next(node->right);
        printf("node %s - deleted\n",node->data);
        free(node);
    }
}

void del_tree()
{
    if(root != NULL)
    {
        del_next(root->left);
        del_next(root->right);
        printf("node %s - deleted\n",root->data);
        free(root);
    }
}

TREE* find(TREE* node)
{
    TREE* new_node = (TREE *)malloc(sizeof(TREE));
    new_node = NULL;
    
    if ((node != NULL )&&(node->left!=NULL)&&(node->right != NULL))
    {
        if ((!strcmp(node->left->node_type,node->right->node_type))&&(!strcmp(node->data, ":=")))
            
        {
            new_node = node;
            return new_node;
            
        } else {
            new_node = find(node->left);
            if (new_node == NULL) new_node = find(node->right);
            
        }
    }
    return new_node;
}

void opt(TREE* node){
    strcpy(node->node_type,node->right->node_type);
    strcpy(node->data,node->right->data);
    del_next(node->right);
    del_next(node->left);
    node->left=NULL;
    node->right=NULL;    
}

void optimisation()
{
    TREE* tmp = find(root);
    while(tmp != NULL) {
        opt(tmp);
        tmp = find(root);}
}


int main()
{
    root = add_node(NULL,":=","operation");
    add_node(root,"+","operation",RIGHT);
    add_node(root,"c","type",LEFT);
    add_node(root->right,":=","operation",RIGHT);
    add_node(root->right,":=","operation",LEFT);
    add_node(root->right->left,"a","type",LEFT);
    add_node(root->right->left,"x","type",RIGHT);
    add_node(root->right->right,"b","type",LEFT);
    add_node(root->right->right,"y","type",RIGHT);

    print(root,0);
    optimisation();
    print(root,0);

    root = NULL;
    return 0;
}
Вложения
Тип файла: doc m kalinichenko.doc (34.5 Кб, 13 просмотров)
masha kasha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка регулярного выражения для разбора строки с разделителями Meta2 PHP 1 26.10.2012 19:31
Библиотечка для разбора формул kir_rik Общие вопросы C/C++ 2 29.11.2011 22:25
Поиск и методы разбора Heather Помощь студентам 4 07.04.2011 00:52
Ошибка разбора XML DoDGeR Помощь студентам 0 02.10.2010 16:25
Нужна программа для грамматического разбора конструкции гипотетического языка программирования loshara_de_kontara Помощь студентам 0 10.12.2008 23:20