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")

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Windows 7 64位上运行Jive Dev Enrivoment的java   Java/C/C++/C#/PHP到Pascal的转换器?   java将字符串列表转换为单个对象   java SimpleAdapter,spinner中的文本和图像   java当客户端返回时,有状态会话bean如何恢复状态?   JavaWebLogic。jdbc。包装纸。无法将数组\u oracle\u sql\u数组强制转换为oracle。sql。大堆   java MySQL/Hibernate检索列映射为LocalTime的错误数据   java如何检测页面中是否包含句子(模糊)?   java如何在springboot框架中验证wsdl   JTextPane中的java双列表项插入   java根据窗口大小调整JScrollPane的大小   sql如何在java中映射VARCHAR2(5)的类型表?   用于生成Cron表达式的java类型转换   如何将基于spring注释的Hibernate代码迁移到JavaEE   java对象作为参数?   JavaSeleniumWebDriver:在许多输入中设置值的更快方法