可爱的 Python: 使用 Spark 模块解析
2007-03-29 12:07:02 来源:WEB开发网在“Compiling Little Languages in Python”(请参阅 参考资料)中,Spark 的创始人 John Aycock 将编译器分成了四个阶段。本文讨论的问题只涉及到前面两个半阶段,这归咎于两方面原因,一是由于文章长度的限制,二是因为我们将只讨论前一篇文章提出的同样的相对来说比较简单的“文本标记”问题。Spark 还可以进一步用作完整周期的代码编译器/解释器,而不是只用于我所描述的“解析并处理”的任务。让我们来看看 Aycock 所说的四个阶段(引用时有所删节):
扫描,也称词法分析。将输入流分成一列记号。
解析,也称语法分析。确保记号列表在语法上是有效的。
语义分析。遍历抽象语法树(abstract syntax tree,AST)一次或多次,收集信息并检查输入程序 makes sense。
生成代码。再次遍历 AST,这个阶段可能用 C 或汇编直接解释程序或输出代码。
对每个阶段,Spark 都提供了一个或多个抽象类以执行相应步骤,还提供了一个少见的协议,从而特化这些类。Spark 具体类并不象大多数继承模式中的类那样仅仅重新定义或添加特定的方法,而是具有两种特性(一般的模式与各阶段和各种父模式都一样)。首先,具体类所完成的大部分工作都在方法的文档字符串(docstring)中指定。第二个特殊的协议是,描述模式的方法集将被赋予表明其角色的独特名称。父类反过来包含查找实例的功能以进行操作的内省(introspective)方法。我们在参看示例的时侯会更清楚地认识到这一点。
识别文本标记
我已经用几种其它的方法解决了这里的问题。我将一种我称之为“智能 ASCII”的格式用于各种目的。这种格式看起来很象为电子邮件和新闻组通信开发的那些协定。出于各种目的,我将这种格式自动地转换为其它格式,如 HTML、XML 和 LaTeX。我在这里还要再这样做一次。为了让您直观地理解我的意思,我将在本文中使用下面这个简短的样本:
更多精彩
赞助商链接