在这章中,你将会继续完善第6章的工作,为第7章解析的Pascal控制语句开发对应的后端执行器

==>> 本章中文版源代码下载:svn co http://wci.googlecode.com/svn/branches/ch8/ 源代码使用了UTF-8编码,下载到本地请修改!

目标和方法

本章有一个主要目标:

  • 开发后端的语言无关的执行器(executors),可用来解释中间码,执行控制语句逻辑。

这章使用的方法是开发更多的Executor子类。为验证你的代码,你将继续沿用第6章做好的简单解释程序。

程序 8:简单解释器II

第6,7章编写的主程序Pascal类本章还是不需要做任何改动,当它是个解释器再次运行这个类。程序解释能力的完整性要求我们得为控制语句增加更多新的执行器子类。你将针对不同Pascal控制语句把这个程序运行好几次,以便验证这些新子类是否能正确执行这些控制语句。

解释控制语句

下面的UML类图8-1是图6-1的一个补充。比较图7-2,看看新增执行器的关系。

(基于Java)编写编译器和解释器-第8章:解释Pascal控制语句(连载)

执行器子类StatementExecutor依赖它的子类,而它的每个子类同样也依赖StatementExecutor(因为控制语句是语句,但是每个控制语句除了条件之外还有要控制的语句)。子类LoopExecutor,IfExecutor以及SelectExector还依赖ExpressionExecutor。

清单8-1 展示了StatementExecutor中更新过的execute()方法,它现在能够处理LOOP,IF以及 SELECT节点。(留意15到27行)

public Object execute(ICodeNode node)
   2:  {
   3:      ICodeNodeTypeImpl nodeType = (ICodeNodeTypeImpl) node.getType();
   4:      sendSourceLineMessage(node);
switch (nodeType) {
case COMPOUND: {
this);
return compoundExecutor.execute(node);
   9:          }
case ASSIGN: {
  11:              AssignmentExecutor assignmentExecutor =
this);
return assignmentExecutor.execute(node);
  14:          }
case LOOP: {
this);
return loopExecutor.execute(node);
  18:          }
  19:  
case IF: {
this);
return ifExecutor.execute(node);
  23:          }
  24:  
case SELECT: {
this);
return selectExecutor.execute(node);
  28:          }
return null;
default: {
this);
return null;
  33:          }
  34:      }
  35:  }

相关文章: