2012-01-29 166 views
2

我想寫一個小的代碼分析器來分析嵌套結構並將其翻譯爲有效的CSS。但是,我沒有保留從上層繼承的標識符。解析嵌套的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

如果你不這樣做純粹是作爲一個練習的時候,意識到已經有東西在那裏像[LESS CSS(http://lesscss.org/)這是做什麼的。 – icktoofay 2012-01-29 09:02:40

+0

@icktoofay,我知道'LESS'非常好,我想用C++來做這件事。嵌套規則是唯一需要做的事 – 2012-01-29 09:07:24

+0

您可以將標識符保留在堆棧中。當你沿着層次結構向上/向下時,你推/拉彈出。 – Alexander 2012-01-31 11:58:51

回答

1

如果您使用的是C++,爲什麼不使用OO?

創建一個表示範圍(匹配{}對)的類,它具有指向其子範圍的指針列表以及指向其父範圍的指針:即:從您的示例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; 

};