2017-05-08 47 views
1

我使用Boost.Spirit解析類似結構在Boost.Spirit節點之間的雙向關係

namespace Foo { class Bar { ... } } 

這只是正常:我得到namespace_declaration類型的對象,它有變體列表它包含的東西,如class_declaration s。

我的問題是:我怎樣才能確保在解析階段class_declaration可以引用其包含namespace_declaration?換句話說,我怎樣才能引用這個對象,這個對象就是我剛剛解析過的內容?

回答

3

你不行。至少不舒服。

事實上,你希望這可能是一個跡象,你正在分析和處理代碼混淆。

如果您只需要進行語義檢查,則可以嘗試在上下文的子規則中注入必要的詳細信息,例如,使用繼承的屬性。

這不能合理地「雙向關係,」如果只爲一個事實,即封閉結構是(明顯)甚至還沒有全部完成:

  • namespace X { class Y { }; }的情況下,邏輯上你可以期待命名"X"已經被解析 - 但有沒有保證,它已經被分配到暴露的屬性值
  • 同上中的while (condition) { statement; }
  • 但是,如果條件表達式考慮do { statement; } while (condition);,你可以看到爲什麼你不能實驗值ect statement瞭解封閉控制流程說明。

所以,一切的一切,我會建議關注

  1. 分離:解析第一,語義檢查,轉換,處理後
  2. 如果必須在飛行語義信息(例如,由於的上下文語法)明確地通過上下文
相關問題