Паскаль (бесплатно или турбо) читать - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь понять какое-то волшебное поведение, наблюдаемое в Free Pascal, скомпилированном в режиме Turbo (в частности, fpc -Mtp -vw) под Linux.Код взят из части «Давайте построим компилятор» Джека Креншоу, часть IV, в частности, последняя версия с процедурами Input и Output, найденная на http://www.pp4s.co.uk/main/tu-trans-comp-jc-04.html. То, что я нахожу «волшебным», это Read(Table[GetName]); строка в процедуре Input.Согласно документации FP, «Read считывает одно или несколько значений из файла F и сохраняет результат в V1, V2 и т. Д .; если файл F не указан, то считывается стандартный ввод».В Read, который находится в процедуре GetChar, похоже, что он ведет себя очень похоже на C getchar(), то есть извлекает следующий символ из буфера stdin.В вызове Input он, похоже, ведет себя как сложный scanf(), который автоматически пропускает пробелы и преобразует многозначные числа в целые числа, и устраняет необходимость в функции GetNum, которая не вызывается, есливы используете, например, ?i 345, но вызывается, если вы пытаетесь i=345, и если вы оставляете пробел по обе стороны от =, это приводит к ошибке разбора.Есть ли какая-либо другая документация, которая подтверждает очевидную универсальность Free, Turbo или даже универсального Паскаля Read?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Паскаль Чтение, запись процедуры волшебны.IOW, это не настоящая функция, которая существует в некоторой библиотеке, но компилятор генерирует серию вызовов во время выполнения.Семейство состоит из read, readln, write и writeln, а также расширенного Pascal readstr и writestr , которые являются «строковыми» версиями чтения и записи.

Вызовы различаются в зависимости от типа аргументов и от того, имеют ли они дополнительные параметры (например, запись требует: x значения форматирования для целых чисел и: x: y для вещественных чисел):

writeln(x:10:5); 

в свободном доступеPascal, в отличие от Turbo Pascal и Delphi, также доступны некоторые функции, подобные RTTI, например, writeln () переменная типа enum, напечатает значение перечисления в качестве идентификатора (строки).

Обработка ошибок и форматирование несколько ограниченыпоэтому их использование зависит от сложности проблемы.

Что касается ваших наблюдений, ваш вызов типа getchar, вероятно, читает переменную типа char, а тип ввода для другой функции отличается.

0 голосов
/ 23 октября 2018

Я нашел небольшую информацию о процедуре чтения Паскаля , которая указывает, что в отличие от C getchar(), он будет автоматически заполнять различные типы должным образом.Но это не тот интересный вопрос, о котором вы спрашиваете.

Компилятор Джека имеет процедуру GetChar(), которая заполняет переменную Look;это односимвольный просмотр, который довольно часто используется в синтаксических анализаторах, хотя в наши дни обычно скрыты под многими слоями упаковочной бумаги.Но все методы Джека узнают об этой переменной, поэтому они сначала проверяют ее, а затем вызывают GetChar(), когда заканчивают, например:

{ Get a number }
function GetNum : integer;
begin
  if not IsDigit(Look) then
    Expected('Integer');
  GetNum := Ord(Look) - Ord('0');
  GetChar;
end;

Помните, что в Паскале, присваивая функцииname - это то, как вы возвращаете значение, поэтому он говорит: «Является ли мой заглядывающий символ цифрой? Если это так, расшифруйте его и верните, а затем прочитайте новый заглядывающий символ, иначе прервите».Позже в этой главе он собирается расширить это определение для обработки нескольких цифр.Джек фактически обрабатывал пробелы в предыдущей главе, поищите там SkipWhite .

...