Форум программистов, компьютерный форум CyberForum.ru

Дерево разбора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ что-то не так http://www.cyberforum.ru/cpp-beginners/thread255764.html
в кои-то веки добился того что компилятор c-free не ругается на мой модуль.но использовать там я его не могу. решил запустить на visual studio. создал новый проект,в него отправил код из основной программы.потом надо было присоединить модуль.перенес файлы spisok.cpp и spisok.h в каталог с проектом. проект - добавить существующий объект - добавил и spisok.cpp и spisok.h.при компиляции выдает...
C++ считывание строки. С++ Строка считывается посимвольно буквами. а надо, чтобы словами.. как это сделать? FILE *fp2 = fopen("V.txt", "rb"); //открываем файл "dictionary.txt" fseek(fp2, 0, SEEK_END); //устанавливаем позицию от конца до нуля, находим размер long long size2 = ftell(fp2); //записываем размер исходного файла fseek(fp2, 0, SEEK_SET); //возвращаемся в начало ... http://www.cyberforum.ru/cpp-beginners/thread255758.html
Какое исключение возникает при невозможности открыть файл? C++
какое исключение отвечает за отсутствие файла?за невозможность открыть файл? FileNotFoundException?
Конструктор класса C++
Имеется: class block{ public: block(int, int); private: int CoordX; int CoordY; }; block::block(int X, int Y){ CoordX = X;
C++ Отсортировать методом выбора элементы тех строк матрицы, которые содержат символ "/" http://www.cyberforum.ru/cpp-beginners/thread255742.html
помогите пожалуйста сделать задачку: разработать приложение выполняющее след. функции:ввести с клавы значение элементов символьного двумерного массива , отсортировать по возростанию методом выбора элементы тех строк,которые содержат символ "/" результат вывести на экран....... или подскажите как отсортировать строки методом выбора или алгоритм метода сортировки...
C++ подскажите криворукому как правильно использовать команду ToolsAPI (библиотека для вызова, процесс, на который она ориентируется и т.д.; с примером, если не затруднит) и какой аналог для команды delay в С++ (опять же с примером желательно) заранее спасибо) подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
12.03.2011, 07:01  [ТС]     Дерево разбора
Всю ночь сидел быдлокодил... Вот, что получилось. Парсит строки на ура, по всем правилам по идее. Осталось разобраться с запилом в дерево...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
struct Prior
{
    enum Priority {one=1, two=2, three=3};
};
 
class Token
{
public:
    Token(char c_='0', int t_=0, Prior::Priority pr_=Prior::one):
      c(c_), t(t_), pr(pr_)
    {
    }
    const char GetKind() const
    {
        return c;
    }
    const int GetNumb() const
    {
        return t;
    }
    const Prior::Priority GetPrior() const
    {
        return pr;
    }
private:
    int t;
    char c;
    Prior::Priority pr;
};
 
class Parser
{
public:
    Parser():sem_tree(Tree<Token>())
    {
    }
    void create_tree(std::string& str);
    Tree<Token> sem_tree;
private:
    bool lays_check(const std::string& str);
    template<class TernaryFunction>
    std::pair<std::string, std::string> create_tree_helper(std::string& str, TernaryFunction foo);
};
 
bool isNumeric(const std::string& some)
{
    int one=0;
    std::stringstream ss(some);
    ss >> one;
    std::stringstream ss2;
    ss2<<one;
    return (one && some.find_first_not_of(ss2.str()) == std::string::npos); 
}
 
std::string::iterator find_first_in_brakes_helper(std::string& some, const char first, const char second)
{
    std::string tmp;
    tmp+=first;
    tmp+=second;
    std::string::iterator iter;
    size_t idx=0;
    if(*some.begin() == '(' && *(some.begin()+1) == '(')
        idx=some.find_last_of(tmp);
    else
        idx=some.find_first_of(tmp);
    if(idx != std::string::npos)
    {
        iter=some.begin()+idx;
        some.erase(std::find(some.begin(), some.end(), '('));
        some.erase(std::find(some.begin(), some.end(), ')'));
        iter-=1;
        return iter;
    }
    return some.end();
}
 
std::pair<std::pair<std::string, std::string>, bool> find_first_in_brakes(std::string& some, const char first, const char second)
{
    if(isNumeric(some))
        return std::make_pair(std::make_pair(some, ""), true);
    std::string::iterator iter=find_first_in_brakes_helper(some, first, second);
    if(iter == some.end())
        return std::make_pair(std::make_pair("",""), false);
    std::string begin;
    begin.assign(some.begin(), ++iter);
    std::string end;
    end.assign(iter, some.end());
    return std::make_pair(std::make_pair(begin, end), true);
}
 
std::string::const_iterator find_first_without_brakes_helper(const std::string& some, const char first, const char second)
{
    std::stack<char> lays;
    for(std::string::const_iterator iter=some.begin(); iter != some.end(); ++iter)
    {
        if(*iter == '(')
            lays.push(*iter);
        else if(*iter == ')')
            lays.pop();
        if(lays.empty() && (*iter == first || *iter == second))
        {
            return iter;
        }
    }
    return some.end();
}
 
std::pair<std::pair<std::string,std::string>, bool> find_first_without_brakes(const std::string& some, const char first, const char second)
{
    if(isNumeric(some))
        return std::make_pair(std::make_pair(some, ""), true);
    std::string::const_iterator iter=find_first_without_brakes_helper(some, first, second);
    if(iter == some.end())
        return std::make_pair(std::make_pair("", ""), false);
    std::string res;
    res.assign(some.begin(), ++iter);
    std::string end;
    end.assign(iter, some.end());
    return std::make_pair(std::make_pair(res, end), true);
}
 
template<class TernaryFunction>
std::pair<std::string, std::string> Parser::create_tree_helper(std::string &str, TernaryFunction foo)
{
    const std::string opers="+-*/";
    bool state=false;
    std::string left;
    std::string right;
    for(std::string::const_iterator iter=opers.begin(); iter != opers.end(); iter+=2)
    {
    std::pair<std::pair<std::string, std::string>, bool> pair;
    pair=foo(str, *iter, *(iter+1));
    if(pair.second == true)
    {
        left=pair.first.first;
        right=pair.first.second;
        char c='\n';
        if(opers.find(left[left.size()-1]) != std::string::npos && !left.empty())
        {
            c=left[left.size()-1];
            left.resize(left.size()-1);
        }
        str.clear();
        std::cout<<left<<'\n'<<c<<'\n'<<right<<'\n';
        std::cout<<'\n';
        if(isNumeric(left))
            left.clear();
        if(isNumeric(right))
            right.clear();
        state=true;
        break;
    }
    else
        continue;
    }
    return std::make_pair(left, right);
}
 
void Parser::create_tree(std::string& str)
{
    if(!lays_check(str))
        throw std::runtime_error("Expression is incorrect");
    std::string left;
    std::string right;
    std::pair<std::string, std::string> left_right=create_tree_helper(str, find_first_without_brakes);
    if(left_right.first.empty() && left_right.second.empty())
        left_right=create_tree_helper(str, find_first_in_brakes);
    left=left_right.first;
    right=left_right.second;
    if(!left.empty())
        create_tree(left);
    if(!right.empty())
        create_tree(right);
}
 
bool Parser::lays_check(const std::string& str)
{
    std::stack<char> stck;
    for(std::string::const_iterator iter=str.begin(); iter != str.end(); ++iter)
    {
        if(*iter == '(')
            stck.push(*iter);
        else if(*iter == ')')
            stck.pop();
    }
    return stck.empty();
}
 
int main()
{
    Parser one;
    one.create_tree(std::string("(10+1)*(5+6*(3+1))+4*(3+1)"));
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru