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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Что такое семафоры? http://www.cyberforum.ru/cpp-beginners/thread437394.html
сразу хочу показать ссылку http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D1%84%D0%BE%D1%80_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0) ниче не ясно... можете помочь...
C++ Не могу написать программу перемножения матриц #include <iostream> #include <conio.h> using namespace std; int i,j; void vvod(int X) { for(i=0;i<=4;i++) for(j=0;j<=4;j++) X=rand() % 10; } http://www.cyberforum.ru/cpp-beginners/thread437386.html
C++ ООР множественное определение конструктора
Доброго времени, народ! Учился по книге Дейтела, и наткнулся на такой пример. Перепечатал, два раза проверил, ещё раз перепечатал. Прочитал ошибку, перевел, получалось что произошло множественное...
Подключение заголовочных файлов. C++
У меня есть заголовочный файл: ...\1\2\file.h. в папке "1" есть file2.h. Как подключить к "file.h" "file2.h"?
C++ создать класс http://www.cyberforum.ru/cpp-beginners/thread437303.html
создать класс строк и реализовать какие захочешь функции в нем. ребят можете помочь,знаю что примитивно но я вообще в этом ноль
C++ Переписать в другой массив 20 максимальных элементов из исходного Создать массив из случайных 100 четырехзначных элементов. Переписать в массив из 20 элементов 20 самых больших чисел из первого массива. Нельзя создавать временный массив, сортировать 100-элементный)... подробнее

Показать сообщение отдельно
monolithed
Сообщений: n/a

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

29.01.2012, 15:18. Просмотров 388. Ответов 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;
}
Возможно я не так начал разбор, но идея была такая: сперва получить идентификаторы, которых мне не хватает, а затем объеденить с тем что есть. Осталось собрать имена селекторов.

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