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第三方库


热门话题
如何在java中模拟按键?   尽管元素存在,但HtmlUnit中的java ElementNotFoundException   在Java中,长双精度并发写入不是原子的吗?   java如何在另一个对象数组中打印对象的int值?   java在显示或更改视图后执行一些代码   java JFR:读取时发生OutOfMemoryError。jfr文件   java Android助手检查是否购买   java这种设计模式的好处是什么?   Weblogic 10.3中针对托管服务器的java部署问题   java如何获取字符串。在编译时投诉的格式   声明字符串数组时发生java错误   java JPA在多个并行线程中从表中删除时发生死锁   java Android:在按钮动画之后启动活动   java并发与JMS主题在春季   使用Lucene spatial search/DateRangePrefixTree进行java日期范围查询?   java可选接口问题   JavaDbUnit没有在每个方法之后清洗和插入数据库,所以测试不是独立的   java在IAIK PKCS11包装器中一对私钥和证书如何匹配?