2014-02-13 60 views
1

我需要創建通過升壓精神的規則應符合像提振精神以及相關零部件

return foo; 

return (foo); 

我試圖水木清華這樣的情況:

start %= "return" >> -boost::spirit::qi::char_('(') >> identifier >> -boost::spirit::qi::char_(')') >> ';'; 

但即使在如

return (foo; 

return foo); 

我該如何解決呢?

+0

'statement =(「return」>> identifier >>';')| (「return」>>'('>> identifier >>')'>>';')'? – 2014-02-13 15:09:19

+0

@faranwath是的,我已經想過了,但它看起來很可怕,特別是當我有很多規則與相似的結構 – FrozenHeart

+0

可怕?我想我們在生產規則看起來不錯的方面有所不同,但這是您的工作,非常公平。 – 2014-02-13 15:23:43

回答

4

你的例子只看起來有病態,因爲你正在使用一個過於具體的例子。

實際中,您不需要"return" >> identifier;。通常,返回的東西只是一個表達式。所以,你會說

expr = literal | variable | function_call; 

現在以迎合上一舉括號表達式的一般方法就是:

expr = literal | variable | function_call 
    | ('(' >> expr >> ')') 
    ; 

巴姆。完成。它處理平衡。它處理嵌套的括號。它甚至處理(((foo)))。不是哨子是當天給的。

我認爲根本不存在/任何/錯誤。我已經發布了大概20多個遞歸的不同表達式語法在這個網站上的答案。他們應該提供激勵性的例子(顯示運營商的優先級並用這些括號來覆蓋它們)。

+0

您能否告訴我爲什麼下面的代碼會因「堆棧溢出」錯誤而崩潰? http://pastie.org/8732392輸入數據 - http://pastie.org/8732447我想這是在我的規則中添加遞歸的結果。我對嗎?我該如何解決它? – FrozenHeart

+0

左遞歸和PEG語法:)他們不混合 – sehe

+0

你能改說嗎?如果有提升精神,我該怎麼辦? – FrozenHeart