2010-10-26 119 views
4

我正在使用Spirit 2.4,我想解析這樣的結構:解析帶有助推精神的逃脫字符串

Text {text_field};

問題是,text_field是一個帶符號'{','}'和'\'的轉義字符串。 我想創建一個使用qi的解析器。我一直在試試這個:

using boost::spirit::standard::char_; 
using boost::spirit::standard::string; 
using qi::lexeme; 
using qi::lit; 

qi::rule< IteratorT, std::string(), ascii::space_type > text; 
qi::rule< IteratorT, std::string(), ascii::space_type > content; 
qi::rule< IteratorT, std::string(), ascii::space_type > escChar; 


text %= 
    lit("Text") >> '{' >> 
    content >> 
    "};" 
    ; 

content %= lexeme[ +(+(char_ - (lit('\\') | '}')) >> escChar) ]; 

escChar %= string("\\\\") 
    | string("\\{") 
    | string("\\}"); 

但是甚至沒有編譯。任何想法?

+0

編譯器錯誤(和它所在的行)將有所幫助。 – 2010-10-26 21:31:08

回答

7

你的語法可以寫成:

qi::rule< IteratorT, std::string(), ascii::space_type > text; 
qi::rule< IteratorT, std::string() > content; 
qi::rule< IteratorT, char() > escChar; 

text = "Text{" >> content >> "};"; 
content = +(~char_('}') | escChar); 
escChar = '\\' >> char_("\\{}"); 

  • 文本之後Text{的內容,然後}

  • 內容至少一個實例 或者是字符(但沒有})或 的escChar

  • escChar是一個逃脫\\{,或}

注意,escChar規則現在返回單個字符並丟棄逃跑\\。我不確定這是否是您需要的。此外,我刪除了船長的內容escChar規則,該規則允許從lexeme[](沒有船長的行爲就像一個隱含的詞位一樣)的規則。

+1

嗨,hkaiser,謝謝你的幫助。我已經嘗試了您的解決方案,但未能解析此文本{\}};我認爲這是因爲解析器〜char_('}')匹配反斜槓,但我嘗試了以下沒有成功:content = +(〜char_(「\\\\}」)| escChar);.任何想法? – Bruno 2010-10-27 17:19:47

+1

是的,沒錯。 〜char_('}')確實匹配反斜槓。我很抱歉這個疏忽。如果您將其更改爲〜char _(「\\}」),則不應該這樣做。 – hkaiser 2010-10-28 01:37:21