我想编写一个小代码分析器,它解析嵌套结构并转换为有效的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;
}
那么,如何保留从上一级继承的标识符?
答案 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;
};