libparsing的python包装器,一个用c编写的基于peg的解析库
libparsing的Python项目详细描述
libparsing是用c编写的解析元素语法(peg)库 使用python绑定。它提供了良好的性能,同时允许 很多灵活性。它主要是用来创造 编程语言和软件工程工具。
与更传统的解析技术相反,语法不是 使用允许动态更新的api编译但构造 语法的问题。
解析器不做任何标记化,相反,输入流是 使用的和解析的元素被动态地要求匹配下一个 它的元素。一旦解析元素匹配,得到的匹配输入 处理并触发操作。
libparsing支持以下功能:
- backtracking,即如果不匹配则返回输入流 找到
- cherry picking,即跳过无法识别的输入
- 上下文规则,即将匹配或不依赖于 外部变量
解析元素通常比编译的或基于fsm的解析器慢 因为他们交易表现灵活性。可能不太好 如果解析必须以 可能(即协议实现),但它是 编程语言,因为它打开了动态语法的大门 插件和多语言嵌入。
如果你对佩格感兴趣,你可以开始读布莱恩·福特的原著 文章。项目,如Ian Piumarta的PEG/LEG http://piumarta.com/software/peg/,亚历山德罗·沃思的《奥梅塔》 http://www.tinlizzie.org/ometa/或haskell的parsec库 https://www.haskell.org/haskellwiki/Parsec对 田野。
下面是一个创建简单语法的简短示例 Python:
g = Grammar() s = g.symbols g.token("WS", "\s+") g.token("NUMBER", "\d+(\.\d+)?") g.token("VARIABLE", "\w+") g.token("OPERATOR", "[\/\+\-\*]") g.group("Value", s.NUMBER, s.VARIABLE) g.rule("Suffix", s.OPERATOR._as("operator"), s.Value._as("value")) g.rule("Expression", s.Value, s.Suffix.zeroOrMore()) g.axiom(s.Expression) g.skip(s.WS) match = g.parseString("10 + 20 / 5")
以及c
中的等价代码Grammar* g = Grammar_new() SYMBOL(WS, TOKEN("\\s+")) SYMBOL(NUMBER, TOKEN("\\d+(\\.\\d+)?")) SYMBOL(VARIABLE, TOKEN("\\w+")) SYMBOL(OPERATOR, GROUP("[\\/\\+\\-\\*]")) SYMBOL(Value, GOUP(_S(NUMBER), _S(VARIABLE))) SYMBOL(Suffix, RULE(_AS(_S(OPERATOR), "operator"), _AS(_S(Value), "value"))) SYMBOL(Expression, RULE(_S(Value), _MO(Suffix)) g->axiom = s_Expression; g->skip(s_WS); Grammar_prepare(g); Match* match = Grammar_parseString(g, "10 + 20 / 5")