09.04.2016 Views

Priemioop

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Паттерн Facade<br />

Однако комитет по стандартизации C++ добавил к языку пространства имен<br />

[Str94], и это позволило разрешать доступ только к открытым классам подсистемы.<br />

Пример кода<br />

Рассмотрим более подробно, как возвести фасад вокруг подсистемы компиляции.<br />

В подсистеме компиляции определен класс BytecodeStream, который реализует<br />

поток объектов Bytecode. Объект Bytecode инкапсулирует байтовый<br />

код, с помощью которого описываются машинные команды. В этой же подсистеме<br />

определен еще класс Token для объектов, инкапсулирующих лексемы языка<br />

программирования.<br />

Класс Scanner принимает на входе поток символов и генерирует поток лексем,<br />

по одной каждый раз:<br />

class Scanner {<br />

public:<br />

Scanner(istream&);<br />

virtual -Scanner();<br />

virtual Token& Scan();<br />

private:<br />

istream& _inputStream;<br />

};<br />

Класс Parser использует класс ProgramNodeBuilder для построения дерева<br />

разбора из лексем, возвращенных классом Scanner:<br />

class Parser {<br />

public:<br />

Parser();<br />

virtual -Parser();<br />

, };<br />

virtual void Parse(Scanners, ProgramNodeBuilder&);<br />

Parser вызывает ProgramNodeBuilder для инкрементного построения дерева.<br />

Взаимодействие этих классов описывается паттерном строитель:<br />

class ProgramNodeBuilder {<br />

public:<br />

ProgramNodeBuilder();<br />

virtual ProgramNode* NewVariable(<br />

const char* variableName<br />

) const;<br />

virtual ProgramNode* NewAssignment(<br />

ProgramNode* variable, ProgramNode* expression<br />

) const;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!