解析表达式语法模板库(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日
特此免费获得许可,授予任何人或组织获取软件副本以及本许可涵盖的随附的文档(“软件”),以使用,复制,显示,显示,分发,分发,执行和传输软件的衍生作品,并允许向谁提供有关软件的第三方,并为此提供所有主题,以下是以下主题:
该软件中的版权通知和整个声明,包括上述许可证授予,此限制和以下免责声明,必须全部或部分包含在软件的所有副本中,除非该软件的所有衍生工程,除非这些副本或衍生工程完全以源语言流程者生成的机器 - 发射对象代码的形式。
该软件是“原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,特定目的的适用性,标题和不侵权的保证。在任何情况下,版权持有人或分发软件的任何人都不应对任何损害或其他责任(无论是合同,侵权还是其他责任)责任,无论是由软件,与软件的使用或使用或其他软件中的其他交易有关的责任。