CodeGenerator:一个访问者(访问者模式),有两个子类StackMachineCodeGenerator和RISCCodeGenerator,分别为不同的硬件体系结构生成机器代码。
class CodeGenerator {
public:
virtual void Visit(StatementNode*);
virtual void Visit(ExpressionNode*);
protected:
CodeGenerator(BytecodeStream&);
protected:
BytecodeStream& _output;
}; ExpressionNode:ProgramNode的每个子类在实现Traverse时,对它的ProgramNode子对象调用Traverse。每个子类一次对它的子节点做同样的动作。这样递归下去。 void ExpressionNode::Traverse (CodeGenerator& cg)
{
cg.Visit(this);
ListIterator
i(_children);
for (i.First(); !i.IsDone(); i.Next())
{
i.CurrentItem()->Traverse(cg);
}
}
上面这些类构成了编译子系统。 引用Compiler类,将所有的部件集成在一起。Compiler提供了一个简单的接口为特定的机器编译源代码并生成可执行代码。 class Compiler
{
public:
Compiler();
virtual void Compile(istream&, BytecodeStream);
};
void Compiler::Compile(istream& input, BytecodeStream& output)
{
Scanner scanner(input);
ProgramNodeBuilder builder;
Parser parser;
parser.Parse(scanner, builder);
RISCCodeGenerator generator(builder);
ProgramNode* parseTree = builder.GetRootNode();
parserTree->Traverse(generator);
}
相关模式: 抽象工厂模式可以与Facade模式一起使用提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。抽象工厂模式也可以代替Facade模式隐藏那些与平台相关的类。 Mediator模式,通常集中不属于任何单个对象的功能。Facade模式不定义新功能,子系统也不知道facade的存在 通常仅需要一个Facade对象,因此Facade对象通常属于Singleton模式。