解析嵌套的CSS结构

时间:2012-01-29 09:00:52

标签: c++ parsing data-structures stl tree

我想编写一个小代码分析器,它解析嵌套结构并转换为有效的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;
}

输出:

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

b {
    border: 3px;
}

a {
    border: 2px;
}

#foo {
    border: 1px;
}

那么,如何保留从上一级继承的标识符?

1 个答案:

答案 0 :(得分:1)

如果你正在使用c ++,为什么不使用OO?

创建一个表示范围(匹配的{}对)的类,其中包含指向其子范围的指针列表和指向其父范围的指针:ie:从您的示例中foo的列表包含a和b,b的列表包含c。

打印出来时,递归进入每个叶子范围,然后通过将其所有“祖先”的名称添加到自己的开头来让它打印出它的“完整”名称。

骨架起点:

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


private:

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

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

};