解析表達式語法模板庫(PEGTL)是零依賴性C ++標頭僅解析器組合庫庫,用於根據解析表達語法(PEG)創建解析器。
在開發新的主要版本期間,主要分支可以進行不兼容的更改。要獲得穩定的體驗,請下載最新版本,而不是使用主分支。
有關PEGTL,成功或失敗的故事以及任何其他類型的反饋的問題和建議,請隨時打開討論,問題或拉動請求,或與taocpp(at)icemx.net的作者聯繫。
語法寫為常規的C ++代碼,使用模板編程(不是模板元編程)創建,即自然對應PEG的歸納定義(以及其他解析器 - 組合方法),即嵌套的模板實例化。
包括用戶可以組合和擴展的一組綜合解析器規則,以及調試語法的機制,以及將用戶定義的操作附加到語法規則。這是如何用PEGTL實現解析表達式語法規則的示例。
// PEG rule for integers consisting of a non-empty
// sequence of digits with an optional sign:
// sign ::= '+' / '-'
// integer ::= sign? digit+
// The same parsing rule implemented with the PEGTL:
using namespace tao ::pegtl ;
struct sign : one< ' + ' , ' - ' > {};
struct integer : seq< opt< sign >, plus< digit > > {};PEG在表面上與無上下文的語法(CFG)相似,但是PEG的更確定性的性質會導致一些非常重要的差異。隨附的語法分析發現了釘子中的幾個典型錯誤,包括左遞歸。
PEGTL設計為“精益且均值”,核心庫由大約6000行代碼組成。重點是簡單性和效率,更喜歡一種良好的簡單方法而不是複雜的優化。
PEGTL主要與解析組合和語法規則有關,並賦予庫的用戶(可能性)完全控制解析運行的所有其他方面。是否/是否採取哪些操作,以及在解析過程中是否創建/哪些數據結構完全取決於用戶。
其中包括一些典型情況的例子,例如在字符串中解開逃生序列,建立通用的JSON數據結構以及對算術表達式的即時評估。
通過使用模板編程和模板專業知識,可以寫一次語法,並以多種方式使用不同(語義)操作的不同(或相同)解析的動作。
借助釘子的形式主義,通常會刪除分為lexer和parser階段的分離 - 一切都以單語法完成。這些規則以C ++表示為模板實例,這是編譯器優化PEGTL語法的任務。
每個提交都會使用多個架構,操作系統,編譯器及其版本自動測試。
與GCC和Clang Sanistizer,Clang的靜態分析儀和clang-tidy一起檢查每個提交。此外,我們使用CodeQL來掃描(安全)問題。
代碼覆蓋範圍會自動測量,單位測試涵蓋了核心庫代碼的100%(用於發行版)。
版本是根據語義版本來完成的。僅允許在主要版本之間發生不兼容的API變化。
為了欣賞所有貢獻,這裡的人直接為PEGTL和/或其發展做出了貢獻。
PEGTL是C ++藝術的一部分。
版權(C)2007-2023 Daniel Frey和Colin Hirsch博士
PEGTL是經過認證的開源軟件。它是根據Boost軟件許可證的條款獲得許可的,此處重現了1.0版。
Boost軟件許可證 - 版本1.0- 2003年8月17日
特此免費獲得許可,授予任何人或組織獲取軟件副本以及本許可涵蓋的隨附的文檔(“軟件”),以使用,複製,顯示,顯示,分發,分發,執行和傳輸軟件的衍生作品,並允許向誰提供有關軟件的第三方,並為此提供所有主題,以下是以下主題:
該軟件中的版權通知和整個聲明,包括上述許可證授予,此限制和以下免責聲明,必須全部或部分包含在軟件的所有副本中,除非該軟件的所有衍生工程,除非這些副本或衍生工程完全以源語言流程者生成的機器 - 發射對象代碼的形式。
該軟件是“原樣”提供的,沒有任何形式的明示或暗示保證,包括但不限於適銷性,特定目的的適用性,標題和不侵權的保證。在任何情況下,版權持有人或分發軟件的任何人都不應對任何損害或其他責任(無論是合同,侵權還是其他責任)責任,無論是由軟件,與軟件的使用或使用或其他軟件中的其他交易有關的責任。