Целочисленная переменная toktype будет содержать
toktype := gettok(@tptr);
Целочисленная переменная toktype будет содержать значение, обозначающее тип лексемы. Диапазон возможных значений берется из файла smallsh.inc и включает символы EOL (конец строки),
SEMICOLON и так далее. Переменная tptr является символьным указателем, который будет указывать на саму лексему после вызова gettok. Так как процедура gettok сама выделяет пространство под строки лексем, нужно передать адрес переменной tptr, а не ее значение.
Исходный код процедуры gettok приведен ниже. Обратите внимание, что поскольку она ссылается на символьные указатели tok и ptr, то должна быть включена в тот же исходный файл, что и userin. (Теперь должно быть понятно, зачем была нужна инициализация переменных tok и ptr в начале функции userin.)
(* Получить лексему и поместить ее в буфер tokbuf *)
function gettok (outptr:ppchar):integer;
var
_type:integer;
begin
(* Присвоить указателю на строку outptr значение tok *)
outptr^ := tok;
(* Удалить пробелы из буфера, содержащего лексемы *)
while (ptr^ = ' ') or (ptr^ = #9) do
inc(ptr);
(* Установить указатель на первую лексему в буфере *)
tok^ := ptr^;
inc(tok);
(* Установить значение переменной type в соответствии
* с типом лексемы в буфере *)
case ptr^ of
#$a:
begin
_type := EOL;
inc(ptr);
end;
'&':
begin
_type := AMPERSAND;
inc(ptr);
end;
';':
begin
_type := SEMICOLON;
inc(ptr);
end;
else
begin
_type := ARG;
inc(ptr);
(* Продолжить чтение обычных символов *)
while inarg (ptr^) do
begin
tok^ := ptr^;
inc(tok);
inc(ptr);
end;
end;
end;
tok^ := #0;
inc(tok);
gettok:=_type;
end;
Функция inarg используется для определения того, может ли символ быть частью «обычного» аргумента. Пока можно просто проверять, является ли символ особым для командного интерпретатора команд smallsh или нет:
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий