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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
monolithed
Сообщений: n/a
#1

Разбор вложенных структур (парсинг CSS) - C++

29.01.2012, 15:18. Просмотров 383. Ответов 0
Метки нет (Все метки)

Задача не совсем типичная, хочу написать небольшой анализатор кода для разбора вложенных структур, которые должны транслироваться в валидный CSS.
Однако не получается захватить идентификаторы родительских селекторов.

Пример вложенной структуры:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
#foo {
    border: 1px;
    a {
        border: 2px;
    }
    b {
        border: 3px;
        c {
            border: 4px; /* comment */
        }
    }
}
То, что я хочу получить в итоге:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#foo {
    border: 1px;
}
 
#foo a {
    border: 2px;
}
 
#foo b {
    border: 3px;
}
 
#foo b c {
    border: 4px; /* comment */
}
Мой код:

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
#include <iostream>
#include <iterator>
#include <string>
 
using namespace std;
 
int main() {
 
    string str = "\
    #foo {\
        border: 1px;\
        a {\
            border: 2px;\
        }\
        b {\
            border: 3px;\
            c {\
                border: 4px; /* comment */\
            }\
        }\
    }";
 
    string::const_iterator i = str.end(),
    begin = str.begin(), end;
 
    while (i != begin) {
        if (*i == ';' || (*i == '/' && *(i-1) == '*')) {
            end = i++;
 
            while (*i-- != '{');
 
            while (true) {
                if (*i == ';' || *i == '}' || *i == '{' || i == begin)
                    break;
                i--;
            }
 
            string item(++i, ++end);
            cout << item << "}" << endl;
        }
        i--;
    }
 
    return 0;
}
Out:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
c {
    border: 4px; /* comment */
}
 
b {
    border: 3px;
}
 
a {
    border: 2px;
}
 
#foo {
    border: 1px;
}
Возможно я не так начал разбор, но идея была такая: сперва получить идентификаторы, которых мне не хватает, а затем объеденить с тем что есть. Осталось собрать имена селекторов.

Если есть какие-то идеи с удовольствием выслушаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2012, 15:18     Разбор вложенных структур (парсинг CSS)
Посмотрите здесь:

Объявление вложенных структур - C++
Вот задание: Создать структуру Data, хранящую данные о ноутбуках: номер - number типа int, индекс - index типа char поставщик -...

Названия вложенных структур - C++
Почему поле структуры, содержащее переменные другой структуры, воспринимается компилятором без возражений лишь в том случае, если название...

Разбор указателей и структур - каковы их суть и назначение - C++
Доброго времени суток форумчане. В университете мы изучаем C++ по учебнику Павловской и Щупака. Недавно прошли главы по Указателям и...

Программирование вложенных циклов - C++
Программирование вложенных циклов Постановка задачи: В настоящей лабораторной работе необходимо выполнить вычисления, для...

задачи о вложенных циклах - C++
1)Дана матрица А(m,n). Перемножить элементы с четной суммой индексов I+J. Найти максимальные элементы каждого столбца матрицы. 2)Даны...

Упрощение вложенных циклов - C++
Добрый день. В программе имеется несколько вложенных циклов. Пример: if () { if () { ...

Си, использование вложенных файлов *.c - C++
Всем доброго времени дня! Вопрос: Пишу программу на C под Linux. есть файл main.c, в котором у меня располагается основное тело...

Сотня вложенных циклов - C++
Подскажите, уважаемые, как можно упростить (рекурсивно, или как-то ещё) следующий код: int k=100; for (int i1=1; i1&lt;=k; i1++){ ...

Приоритеты вложенных циклов - C++
Nk=20; for(Ni=0;Ni&lt;Nk;Ni++) { for(i=0;i&lt;size;i++) { for(j=0;j&lt;size;j++) { if(Map==Ni) {

Использование цикла while и вложенных циклов - C++
1. Используя цикл while, напишите программу, вычисляющую сумму цифр заданного целого числа. Например, суммой цифр числа 2155 будет 2 + 1 +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru