我想在Boost.Spirit中編寫一個shell語言分析器。但是,我不清楚關於rule
的語義的一些基本問題。boost :: spirit's rule <>的複製或引用語義?
查看文檔,有和r.copy()
的rule
的成員。 IIUC,這些成員應該分別返回提及規則和規則內容的副本。但是,我沒有明確說明當我在另一個規則的定義中使用規則時會發生什麼。從我的實驗,我發現相互遞歸規則可以定義爲:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
這表明該規則採取解析表達式中引用。問題是,當變量超出作用域它有什麼作用,如:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
在相同的音符,將分配給從包含類型的規則工作的右值(r.copy()
將是一個解析表達式規則rule
類型的右值也是,是不是)?例如。
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
有人可以告訴我關於rule
的副本,並引用了詳細的語義,並可能糾正這個職位的任何誤解?
感謝您的回答。我只是有一個後續問題:是否有可能在分析器表達式中使用某種類型的分析器表達式的rvalues(臨時值)以允許像'r1 = r1 |字符串(「abc」)或在函數中生成規則? – jpalecek 2010-08-13 21:09:58
雖然表達式'r1 = r1 |字符串(「abc」)在理論上是可能的,它是一個左遞歸,當Spirit產生遞歸下降解析器時,這將導致無限遞歸。但是表達式'r1 = string(「abc」)| r1'將按預期工作。如果您確定它沒有引用任何超出範圍的其他規則,則可以在函數中生成規則。另外,在Spirit.Classic中,你需要從函數返回r.copy()。 – hkaiser 2010-08-13 23:30:58
'r1 = string(「abc」)| r1'也是左遞歸:)但是我想要做的是讓r1匹配先前匹配的r1和「abc」。順便說一句如何在函數中生成規則?這對我不起作用:http://pastebin.org/482764 – jpalecek 2010-08-14 13:02:32