快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
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. 为每个语法结构定义单独的类

import java.util.LinkedList; abstract class SyntaxTree {   public abstract Object accept(SyntaxTreeVisitor that); } class Script extends SyntaxTree {   LinkedList definitions;   Expression body;   public Script(LinkedList _definitions, Expression _body) {   this.definitions = _definitions;   this.body = _body;   }   public Object accept(SyntaxTreeVisitor that) {    return that.forScript(this);   } } abstract class Statement extends SyntaxTree {} class CutStatement extends Statement {   Name name;   public CutStatement(Name _name) {    this.name = _name;   }   public Name getName() {return this.name;}   public Object accept(SyntaxTreeVisitor that) {    return that.forCutStatement(this);   } } ... abstract class Expression extends SyntaxTree {} ... abstract class Name extends SyntaxTree {} ... abstract class SyntaxTreeVisitor {   public abstract Object forScript(Script that);   public abstract Object forCutStatement(CutStatement that);   ... }

一系列的定义过程。对于语法中每个非终端符号,我们需要一个抽象类,对那个非终端符号的每种格式,我们需要一个具体类。我们还将希望定义这个类层次结构的访问者(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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

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号