Лекции по построению компилятора на Pascal



              

МОДУЛЬ OUTPUT


Конечно, каждая приличная программа должна выводить результат и наша не исключение. Наши подпрограммы вывода включают функции Emit. Код для соответствующего модуля показан дальше:

{--------------------------------------------------------------}

unit Output;

{--------------------------------------------------------------}

interface

procedure Emit(s: string);   { Emit an instruction  }

procedure EmitLn(s: string);  { Emit an instruction line }

{--------------------------------------------------------------}

implementation

const TAB = ^I;

{--------------------------------------------------------------}

{ Emit an Instruction }

procedure Emit(s: string);

begin

 Write(TAB, s);

end;

{--------------------------------------------------------------}

{ Emit an Instruction, Followed By a Newline }

procedure EmitLn(s: string);

begin

 Emit(s);

 WriteLn;

end;

end.

{--------------------------------------------------------------}

(Заметьте, что этот модуль не имеет раздела инициализации, так что он не требует блока begin.)

Проверьте этот модуль с помощью следующей основной программы:

{--------------------------------------------------------------}

program Test;

uses WinCRT, Input, Output, Scanner, Parser;

begin

 WriteLn('MAIN:");

 EmitLn('Hello, world!');

end.

{--------------------------------------------------------------}

Увидели ли вы что-либо, что удивило вас? Вы возможно были удивлены видеть, что вам было необходимо что-то набрать даже хотя основная программа не требует никакого ввода. Дело в разделе инициализации модуля Input, который все еще требует поместить что-либо в предсказывающий символ. Жаль, нет никакого способа выйти из этого, или скорее, мы не хотим выходить. За исключением простых тестовых случаев, как этот, нам всегда будет необходим допустимый предсказывающий символ, так что самое лучшее, что мы можем сделать с этой "проблемой" это... ничего.

Возможно более удивительно то что символ TAB не имеет никакого эффекта; наша строка "инструкций" начинается с первой колонки, так же как и фальшивая метка... Правильно: WinCRT не поддерживает табуляцию. У нас проблема.




Содержание  Назад  Вперед