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


热门话题
在IE10中重新加载另一个帧时,internet explorer Java小程序失败/消失   ThreadLocal变量的java性能   java系统。出来println不是打印输出   java从JAXB类获取元素属性   java组织。天啊。科尔巴。包裹。InvalidName:IDL:omg。org/CORBA/ORB/InvalidName:1.0   java有没有办法让非事务连接抛出异常?   java是否有任何方法可以使用JdbcTemplate和查询/条件Fluent API   javajpa级联类型。刷新不工作?   未考虑java Maven依赖关系管理   java MySQL MBR包含抛出MySQLExceptionError的语句   java验证整数并将其设为5位数   java发现了循环依赖的问题   java Hibernate left join fetch到使用@ManyToMany关联映射的softdeleted实体生成无效查询?   JavaH:commandButton多个操作:下载文件并呈现ajax表   Google Contacts API在Java、C#、Python或Ruby中是否有一个Hello World示例?