可爱的 Python: 使用 Spark 模块解析
2007-03-29 12:07:02 来源:WEB开发网理解树结构很直观,但我们真正要寻找的修改过的标记怎么办呢?幸运的是,只需要几行代码就可以遍历树并生成它:
清单 8. 从 AST(prettyprint.py)输出标记 def emitHTML(node):
from typo_html import codes
if hasattr(node, 'attr'):
beg, end = codes[node.type]
sys.stdout.write(beg+node.attr+end)
else: map(emitHTML, node._kids)
typo_html.py 文件与 SimpleParse 那篇文章中的一样 — 它只是包含一个将名称映射到开始标记/结束标记对的字典。显然,我们可以为标记使用除 HTML 之外的相同方法。如果您不清楚,下面是我们的示例将生成的内容:
清单 9. 整个过程的 HTML 输出Text with <strong>bold</strong>, and <em>itals phrase</em>,
and <em><code>module</code></em>--this should be a good
<code>practice run</code>.
结束语
很多 Python 程序员都向我推荐 Spark。虽然 Spark 使用的少见的协定让人不太容易习惯,而且文档从某些角度来看可能比较含混不清,但 Spark 的力量还是非常令人惊奇。Spark 实现的编程风格使最终程序员能够在扫描/解析过程中在任何地方插入代码块 — 这对最终用户来说通常是“黑箱”。
比起它的所有优点来说,我发现 Spark 真正的缺点是它的速度。Spark 是我使用过的第一个 Python 程序,而我在使用中发现,解释语言的速度损失是其主要问题。Spark 的速度的确 很慢;慢的程度不止是“我希望能快一点点”,而是“吃了一顿长时间的午餐还希望它能快点结束”的程度。在我的实验中,记号赋予器还比较快,但解析过程就很慢了,即便用很小的测试案例也很慢。公平地讲,John Aycock 已经向我指出,Spark 使用的 Earley 解析算法比更简单的 LR 算法全面得多,这是它速度慢的主要原因。还有可能的是,由于我经验不足,可能设计出低效的语法;不过就算是这样,大部分用户也很可能会象我一样。
更多精彩
赞助商链接