Давайте создадим компилятор! :: Креншоу Джек
Страница:
344 из 382
В нашем оригинальном Cradle мы имели две процедуры обработки ошибок: Error, которая не останавливалась, и Abort, которая останавливалась. Но я не думаю, что мы когда-либо найдем применение процедуре, которая не останавливается, так что в новом, тощем и скромном модуле Errors, показанном ниже, процедура Error занимает место Abort.
{–}
unit Errors;
{–}
interface
procedure Error(s: string);
procedure Expected(s: string);
{–}
implementation
{–}
{ Write error Message and Halt }
procedure Error(s: string);
begin
WriteLn;
WriteLn(^G, 'Error: ', s, '.');
Halt;
end;
{–}
{ Write « Expected» }
procedure Expected(s: string);
begin
Error(s + ' Expected');
end;
end.
{–}
Как обычно, вот программа для проверки:
{–}
program Test;
uses WinCRT, Input, Output, Errors;
begin
Expected('Integer');
end.
{–}
Вы заметили, что строка «uses» в нашей основной программе становится длиннее? Это нормально. В конечной версии основная программа будет вызывать процедуры только из нашего синтаксического анализатора, так что раздел uses будет иметь только пару записей. Но сейчас возможно самое лучшее включить все модули, чтобы мы могли протестировать процедуры в них.
ЛЕКСИЧЕСКИЙ И СИНТАКСИЧЕСКИЙ АНАЛИЗ
Классическая архитектура компилятора основана на отдельных модулях для лексического анализатора, который предоставляет лексемы языка, и синтаксического анализатора, который пытается определить смысл токенов как синтаксических элементов.
|< Пред. 342 343 344 345 346 След. >|