python的分析器组合器库。

parsita的Python项目详细描述


动机

parsita是一个用python编写的解析器组合库。解析器组合器提供了一种使用代码定义语法的简单方法,以便语法本身能够有效地解析源代码。它们不是最快的解析,但却是最容易编写的。解析器组合器的科学最好留给其他人来研究,所以我只演示parsita的语法。

像所有好的解析器组合器库一样,这个库滥用操作符来提供一个干净的语法类语法。定义了 u或_uu 方法,以便在两个备选方案之间进行 测试。定义了 \u和 方法,以便 &; 按顺序测试两个解析器。也可以使用其他运算符。

在我认为对python来说是新的技术中,parsita使用元类魔术来允许值的前向声明。这对解析器组合器很重要,因为语法通常是递归的或相互递归的,这意味着在定义其他组件之前,必须在定义其他组件时使用这些组件。

激励示例

下面是一个完整的json解析器。如果我选择用python的eval来作弊,它可能会更短,但我想展示parsita的全部功能:

fromparsitaimport*json_whitespace=r'[ \t\n\r]*'classJsonStringParsers(TextParsers,whitespace=None):quote=lit(r'\"')>constant('"')reverse_solidus=lit(r'\\')>constant('\\')solidus=lit(r'\/')>constant('/')backspace=lit(r'\b')>constant('\b')form_feed=lit(r'\f')>constant('\f')line_feed=lit(r'\n')>constant('\n')carriage_return=lit(r'\r')>constant('\r')tab=lit(r'\t')>constant('\t')uni=reg(r'\\u([0-9a-fA-F]{4})')>(lambdax:chr(int(x.group(1),16)))escaped=(quote|reverse_solidus|solidus|backspace|form_feed|line_feed|carriage_return|tab|uni)unescaped=reg(r'[\u0020-\u0021\u0023-\u005B\u005D-\U0010FFFF]+')string='"'>>rep(escaped|unescaped)<<'"'>''.joinclassJsonParsers(TextParsers,whitespace=json_whitespace):number=reg(r'-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][-+]?[0-9]+)?')>floatfalse=lit('false')>constant(False)true=lit('true')>constant(True)null=lit('null')>constant(None)string=JsonStringParsers.stringarray='['>>repsep(value,',')<<']'entry=string<<':'&valueobj='{'>>repsep(entry,',')<<'}'>dictvalue=number|false|true|null|string|array|objif__name__=='__main__':strings=['"name"','-12.40e2','[false, true, null]','{"__class__" : "Point", "x" : 2.3, "y" : -1.6}','{"__class__" : "Rectangle", "location" : {"x":-1.3,"y":-4.5}, "height" : 2.0, "width" : 4.0}',]forstringinstrings:print('source: {}\nvalue: {}'.format(string,JsonParsers.value.parse(string)))

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

推荐PyPI第三方库


热门话题
相对于框架java窗口的鼠标位置错误   Java 8流peek api   java将数据附加到文件中   java使用ExoPlayer 2.8播放播放列表中的特定文件   JavaSpring国际化:如何动态设置语言环境值   java如何在mysql中实现两个表之间的两个关联   java在gradle可执行jar文件中包含运行时参数   surefire插件中的java maven多套测试套件   java试图理解堆分析以确定内存泄漏或所需的大量内存   java识别字符串有数字   数组如何解决错误“java.lang.ArrayIndexOutOfBoundsException:5”   java Swt文件对话框选择的文件太多?   java此登录代码易受SQL注入攻击吗?   Java[3]中的文件<identifier>预期编译错误   java如何在spring webflux中发送列表   jar中未找到java文件异常   如何在java中合并2D数组?   java如何评测本机JNI库