
143
последовательно.
Вставьте новую процедуру:
{ Skip Over an End-of-Line }
procedure NewLine;
begin
while Look = CR do begin
GetChar;
if Look = LF then GetChar;
SkipWhite;
end;
end;
Заметьте, что мы видели эту процедуру раньше в виде процедуры Fin. Я изменил имя,
так как новое кажется более соответствующим фактическому назначению. Я также
изменил код чтобы учесть множественные переносы и строки только с пробелами.
Следующим шагом будет вставка вызовов NewLine везде, где мы посчитаем перенос
допустимым. Как я подчеркивал ранее, этот момент может очень различаться для разных
языков. В TINY я решил разрешить их практически в любом месте. Это означает, что нам
нужно вызывать NewLine в начале (не в конце как с SkipWhite) процедур GetName,
GetNum и Match.
Для процедур, которые имеют циклы While, таких как TopDecl, нам нужен вызов
NewLine в начале процедуры и в конце каждого цикла. Таким способом мы можем быть
уверены, что NewLine вызывается в начале каждого прохода через цикл.
Если вы все это сделали, испытайте программу и проверьте, что она действительно
обрабатывает пробелы и переносы.
Если это так, тогда мы готовы работать с многосимвольными токенами и ключевыми
словами. Для начала, добавьте дополнительные объявления (скопированные почти
дословно из главы 7):
{ Type Declarations }
type Symbol = string[8];
SymTab = array[1..1000] of Symbol;
TabPtr = ^SymTab;
{ Variable Declarations }
var Look : char; { Lookahead Character }
Token: char; { Encoded Token }
Value: string[16]; { Unencoded Token }
ST: Array['A'..'Z'] of char;
{ Definition of Keywords and Token Types }
const NKW = 9;
NKW1 = 10;
const KWlist: array[1..NKW] of Symbol =
('IF', 'ELSE', 'ENDIF', 'WHILE', 'ENDWHILE',
'VAR', 'BEGIN', 'END', 'PROGRAM');
const KWcode: string[NKW1] = 'xilewevbep';