簡體   English   中英

使用C ++中的Boost Spirit創建解析器,該C ++使用現有類創建AST

[英]Create parser using boost spirit in C++ which creates the AST using existing classes

我正在嘗試使用C ++中的boost spirit編寫解析器。 我希望以類對象的形式輸出此解析器。 我了解了語義動作,但是不確定如何在這些動作中創建類對象。

另外,我讀到“ boost phoenix”是用於語義動作的一個很好的庫。 但是,沒有找到將其與Boost Spirit結合使用的廣泛示例。

任何幫助或指示,將不勝感激。 謝謝。

是。 您可以。 只需從教程開始:

https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/tutorials.html

要記住的重要一點是,語義動作不是創建AST節點的首選方法。 這似乎是來自Flex / Bison樣式工具的重復模式。

相反,更喜歡使用自動屬性合成和傳播 這樣,您將獲得預期的嵌入式DSL精神 這就是減少工作量和手動出錯空間的原因。 另請參見Boost Spirit:“語義行為是邪惡的”?

如果你

  • 需要控制水平, 否則
  • 絕對需要優化解析器階段
  • 或有其他原因(例如,需要進行語義分析以消除令牌掃描的歧義)

那么我建議您使用更傳統的解析器生成器,通常需要更多的工作。

>另外,我讀到“ boost phoenix”是一個用於語義動作的好庫。

好吧,如果您很討厭並且需要快速使事情正常運行的能力,這是“不錯的”,但是請記住,它不是核心語言支持,因此會給您的編譯器帶來沉重的負擔,並且有局限性。

我想說, Spirit X3的語義動作是一種更好的方法,在這種方法中,您可以使用所有C ++ 14語言,而無需庫英雄。 這減少了學習難度,並允許您使用現有代碼,而無需例如包裝成多態可調用對象,使用BOOST_PHOENIX_ADAPT_ *等進行適應。

只是為了好玩,這是一個X3解析器,我在其中在單個頭文件中實現了Phoenix for X3的基本子集: https : //github.com/sehe/expression-parsers/tree/x3-c++17

>但是,沒有找到將其用於促進精神的廣泛示例。

我想,如果您在此站點上搜索(我的)答案,那是自助餐。 當然,您可以隨時發布具體問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM