诊断Java代码: 设计可扩展的应用程序,第4部分 - 编程入门网
arenthesis.");
}
else {
// The next S-expression is an atom.
return new Atom(next);
}
}
}
}
abstract class SList extends SExp {
abstract SList reverse();
}
class SEmpty extends SList {
public String toString() {
return ''( )";
}
SList reverse() {
return this;
}
}
class SCons extends SList {
public SExp first;
public SList rest;
public SCons(SExp _first, SList _rest) {
this.first = _first;
this.rest = _rest;
}
SList reverse() {
SList result = new SEmpty();
SList elements = this;
while (! (elements instanceof SEmpty)) {
result = new SCons(((SCons)elements).first, result);
elements = ((SCons)elements).rest;
}
return result;
}
}
class Atom extends SExp {
public Object value;
public Atom(Object _value) {
this.value = _value;
}
}
诊断Java代码: 设计可扩展的应用程序,第4部分(4)时间:2011-02-11 IBM Eric E. Allen定义用于解析语法树的类 现在,与解析原始标记流相比,将 S-expression 解析为语法树就是小事一桩。但为了这么做,我们将需要为语法中每个语法结构定义一个单独的类: 清单 5. 为每个语法结构定义单独的类
一系列的定义过程。对于语法中每个非终端符号,我们需要一个抽象类,对那个非终端符号的每种格式,我们需要一个具体类。我们还将希望定义这个类层次结构的访问者(visitor)。 为了给您启发,我仅提供了一些必要的代码。扩展它非常简单。类似这样的代码非常适合于自动代码生成。 诊断Java代码: 设计可扩展的应用程序,第4部分(5)时间:2011-02-11 IBM Eric E. Allen递归定义解析方法 在定义完所有这些类之后,我们可以递归地为每个语法结构定义解析方法:例如 parseStatement 、 parseExpression 。 每个方法将接受一个 S-expression。它的主体将由一个大的 if-then-else 语句组成,这个语句检查 SExp 的第一个元素,然后确定它符合哪个语法结构。在这一点上,我们简单地检查一下 SExp 的格式是否符合那个结构的有效格式(例如, if 语句由三个部分组成:一个表达式和两个语句),然后调用适当的构造器,递归解析子部分。 例如,清单 6 显示我们将如何解析 if 语句: 清单 6. 解 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |