Разбор вложенной структуры CSS - PullRequest
2 голосов
/ 29 января 2012

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

Вложенная структура:

#foo {
    border: 1px;
    a {
        border: 2px;
    }
    b {
        border: 3px;
        c {
            border: 4px; /* comment */
        }
    }
}

Я хочу перевести структуру в:

#foo {
    border: 1px;
}

#foo a {
    border: 2px;
}

#foo b {
    border: 3px;
}

#foo b c {
    border: 4px; /* comment */
}

Код разбора:

#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:

c {
    border: 4px; /* comment */
}

b {
    border: 3px;
}

a {
    border: 2px;
}

#foo {
    border: 1px;
}

Итак, как сохранить идентификаторы, унаследованные от верхнего уровня?

1 Ответ

1 голос
/ 28 марта 2012

Если вы используете c ++, почему бы не использовать OO?

Создайте класс, представляющий область видимости (пару {}), у которой есть список указателей на дочерние области и указатель на родительскую область видимости: т.е. содержит с.

При распечатке рекурсивно войдите в каждую конечную область видимости, затем заставьте ее напечатать «полное» имя, добавив имена всех своих «предков» в начало собственного.

Начальная точка скелета:

class Element
{
public:
    Element()
    : m_pParent( 0 )
    {
    }


private:

    std::string m_Name;
    std::string m_Contents;

    Element* m_pParent;
    std::list<Element*> m_Children;

};
...