Sunday, September 04, 2005
Made to SCALE
上周,我开始实现SCALE,即Syntax for Configuration And Language Extension(配置和语言扩展语法)。实际上我仍没有足够时间去实现它,但今晚我快速实现了它的低级解析器(low-level parser)。一经推出,该低级解析器就表现得惊人的好用。比如,当前的解析器文档包含一个Python源码格式重定义(reformatter)的例子,其用来删除首tab符并统一所有行首缩进字符数。那个重定义的例子仅有7行,但它能区分语句的起始行和中间行,在多行字符串处理方面也很智能。
该SCALE低级解析器支持基本的“类Python”语法,可以处理任何应用Python规则的语言,包括字符串引用、注释、行延续(line continuations)、缩进符、标识符和数字常量。(对了,还有PEP 263风格的源码编码声明。)这就意味着你可以使用Python构建较高层次语言以表达其一部分语义。如果想要实现一个解析器生成器(parser generator),其支持嵌入Python块的语法文件,那么你只需检查分析块并提取语法规则,然后使用SCALE中的dsl.detokenize()函数将内嵌Python块转换为字符串—在任意一个你所需生成输出的缩进级别。
这其实并不是我本来设想的目标。开始时我只是打算构造一个简易的基于Python表达式的配置语言,即SCALE。然而,为了实现SCALE,我发现如果它们能完全地独立于我计划构建的语言,测试低级解析工具会更容易一些。于是我没有使用SAX一类的方法,而是最终决定去创建简单抽象语法树。这样做的一个好处是只要整个词汇结构没错,你实际上可以偷懒仅去作语句解析,如果你想这么做的话。(因为低级解析器处理语句和块时无需“理解”其中的任何内容。)
在完成SCALE解析器之前我仍需实现更多一些类似eval_stmt()和exec_block()的低级工具。我也该确定下来基于WSGI用例的一个SCALE块的默认语义是什么样子。这很有可能会重新掀起早期Web-SIG在部署配置格式方面的争论,特别是位置vs关键字(positional vs. keyword arguments)方面的争论,是否默认支持管道(pipeline)等等。
不管怎样,低级解析器现在可用在Subversion试验上面了。
2005-09-04 更新:现在,我也实现了对SCALE声明语句的解析功能,因而你也可以作一些创建和分析基于SCALE的配置格式的试验,尽管仍不提供语义支持(比如eval/exec和范围查找等)。换句话说,你可以解析SCALE文件并判断它们整个的语法有效性(syntactical validity),但还不能执行一个SCALE文件。我大约到下个周末会搞定这个,此外我可能同时还要完成为定义Chandler的UI组件而创建一个SCALE专用语的工作。