快速业务通道

诊断Java代码: 设计可扩展的应用程序,第4部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
而无须修改甚至查看原始源代码。

示例:确定脚本编制语言

为实现这一脚本编制语言,首先必须确切地说明这个语言到底是什么。这意味着明确语法和语义。

我们可以使用 BNF 符号来说明语法,如下:

清单 3. 明确说明脚本编制语言的语法

<script> ::= (<definitions> <expression>) <definitions> ::= <empty>          | <definition> <definitions> <definition> ::= (define (<var> <args>) <statement>) <args> ::= <empty>      | <var> args <statement>  | (cut <name>)         | (paste <name>)         | (move-to <name>)         | (sequence <statements>)         | (if <expression> <statement> <statement>)         | (while <expression> <statement> <statement>)         | (return <expression>)         | (<var> <args>) <statements> ::= <empty>         | <statement> <statements> <name> ::= <var>      | <constant> <expression> ::= <name>         | (not <expression>)         | (or <expression> <expression>)         | (and <expression> <expression>)         | (equals <name> <name>)         | (<var> <args>) <var> ::= any word consisting of only letters and numbers       (but starting with a letter). <constant> ::= BEGINNING_OF_DOCUMENT        | END_OF_DOCUMENT        | AT_END        | CLIPBOARD

诊断Java代码: 设计可扩展的应用程序,第4部分(3)

时间:2011-02-11 IBM Eric E. Allen

深入研究

请注意这种语言包含过程定义。这些过程定义允许用户抽象出经常使用的操作序列,然后在多处应用此抽象,作为值传递给不同参数(类似 Java 语言中的方法定义)。我正在定义一个脚本,这个脚本包含后跟一个表达式的这些定义的序列。

在这个简单语言中遗漏了几件事:

Let表达式,用来绑定过程中的变量;可以用额外的过程定义来模拟 let 表达式,但将它们作为语言的一部分会更方便。

赋值语句

静态类型系统

尤其是,添加静态类型系统将允许解释器在脚本运行之前捕捉到许多错误。

另一方面,静态类型系统也会使语言更冗长,而且不可避免地,它们不仅拒绝真正有错误的程序,还拒绝一些本来运行得很好的程序。出于这些原因,您通常会看到在程序趋于较短时会从脚本语言中省去静态类型。在该示例中我们将省去它们,但如果想添加的话,当然没有问题。

精心编写三阶段解析器

一旦我们对这个语言的语法满意,我们就可以着手写它的语法解析器。这就是使用 S-expression 的优势所在。与编写常规二阶段语法解析器(标记化和解析)不同,我们通过增加额外的阶段来大大简化整个过程。

这个额外的阶段发生在标记化与解析成语法树之间。它包括将输入分割为 S-expression 内部的表达式。这个分割过程基本上等同于圆括号匹配,但这样做使得解析过程更加简单。

从流中抽取表示

假设我们已经使用标记程序(比如,象用于较小规模输入的 java.util.StreamTokenizer 或 StringTokenizer )将数据转换成标记流,其中每个标记要么是左圆括号,右圆括号,要么是词。

操作这个流最方便的办法是堆栈。在清单 5,我定义了接口 StackI 它可以用

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号