WEB开发网
开发学院软件开发Python 可爱的 Python: 使用 Spark 模块解析 阅读

可爱的 Python: 使用 Spark 模块解析

 2007-03-29 12:07:02 来源:WEB开发网   
核心提示: 清单 5. 用 WordPlusScanner 向“智能 ASCII”赋予记号>>> from wordscanner import WordPlusScanner>>> tokens = WordPlusScanner().to

清单 5. 用 WordPlusScanner 向“智能 ASCII”赋予记号>>> from wordscanner import WordPlusScanner
>>> tokens = WordPlusScanner().tokenize(open('p.txt').read())
>>> filter(lambda s: s<>'whitespace', tokens)
[Text, with, *, bold, *, ,, and, -, itals, phrase, -, ,, and, [,
module, ], --, this, should, be, a, good, ', practice, run, ', .]

值得注意的是尽管 .t_alphanums() 之类的方法会被 Spark 内省根据其前缀“t_”识别,它们还是正则方法。只要碰到相应的记号,方法内的任何额外代码都将执行。 .t_alphanums() 方法包含一个关于此点的很小的示例,其中包含一条 print 语句。

生成抽象语法树

查找记号的确有一点意思,但真正有意思的是如何向记号列表应用语法。解析阶段在记号列表的基础上创建任意的树结构。它只是指定了表达式语法而已。

Spark 有好几种创建 AST 的方法。“手工”的方法是特化 GenericParser 类。在这种情况下,具体子解析器会提供很多方法,方法名的形式为 p_foobar(self, args) 。每个这样的方法的文档字符串都包含一个或多个模式到名称的分配。只要语法表达式匹配,每种方法就可以包含任何要执行的代码。

然而,Spark 还提供一种“自动”生成 AST 的方式。这种风格从 GenericASTBuilder 类继承而来。所有语法表达式都在一个最高级的方法中列出,而 .terminal() 和 .nonterminal() 方法可以被特化为在生成期间操作子树(如果需要,也可以执行任何其它操作)。结果还是 AST,但父类会为您执行大部分工作。我的语法类和如下所示的差不多:

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:可爱 Python 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接