Выражения языка PL/1

Выражение является представлением значения. Выражения образуются из операндов, знаков операций и круглых скобок. Знаками арифметических операций являются: + (сложить), - (вычесть), * (умножить), / (разделить), ** (возвести в степень). Знаками операций сравнения являются: = (равно), = (не равно), < (меньше), < (не меньше), > (больше), > (не больше), <= (меньше или равно), >= (больше или равно). Логические операции имеют следующие знаки  (НЕТ), & (И), | (ИЛИ). Операция над строками || (сцепление).

Выражение может состоять из одной константы, одной переменной или одного указателя функции. Или же выражение состоит из комбинации констант, переменных, операций, указателей функций и круглых скобок. Выражение, содержащее операции называется операторным выражением. Константы, переменные и операторные выражения называются операндами.

Различают три типа выражений: скалярные выражения, выражения над массивами, выражения над структурами.

Результат вычисления выражения присваивается адресату. Адресатом может быть переменная, псевдопеременная или промежуточный результат. Например, в операторе

A=B;

адресатом является переменная A. Псевдопеременная представляет целевое поле. Например, в указанной ниже последовательности операторов

dcl A character(10),

B character(30);

Substr(A,6,5) = substr(B,20,5);

встроенная функция SUBSTR извлекает подстроку из пяти символов строки B, начиная с 20-го символа. Псевдопеременная Substr указывает место в строке A, куда должна быть вставлена извлеченная подстрока. Начиная с пятого символа, все символы строки A заменятся на символы с 20-го по 24-ый строки B.

При вычислении выражения может возникнуть необходимость в выполнении преобразований типов. Эти преобразования рассматриваются как промежуточные результаты при вычислении выражения.

Скалярное выражение представляет отдельное значение. Выражение может быть представлено в одной из следующих форм:

1) a,
2) t1t2…tna ,
3) e1r1e2r2e3…rn-1en.

Здесь ti (i=1,2,…,n) – знаки одноместных операций; rj (j=1,2,…,n-1) – знаки двуместных операций; a – операнд, ek (k=1,2,…,n) – либо операнд, либо выражение, представленное в форме 2), либо выражение в любой из перечисленных форм, заключённое в круглые скобки. Таким образом, выражение может иметь сложную структуру с большим количеством вложенных друг в друга скобок.

К одинарным операциям относятся:  (логическое отрицание), + и – (одноместные операции «плюс» и «минус»). К двуместным операциям относятся все остальные.

При вычислении значения выражения операции выполняются в строго определённом порядке с учётом общепринятых правил старшинства операций и скобок. Установлен следующий порядок старшинства операций: в первую очередь выполняются операции **, , одноместные операции + и - ; во вторую - *, /; в третью - +, -; в четвёртую - ||, в пятую – операции сравнения; в шестую - &; в седьмую - |.

Операции ** и  и одноместные операции + и - , следующие в выражении непосредственно друг за другом, выполняются в последовательности справа налево. Если операции одного и того же старшинства (за исключением указанных) следуют в выражении друг за другом, то они выполняются в последовательности слева направо.

Различают 5 класса операций: арифметические, операции сравнения, логические, операция сцепления, операции с указателями.

Арифметические операции. К арифметическим операциям относятся +, -, *, /, **. Эти операции непосредственно определены только для арифметических операндов, к которым относятся: числовая константа без знака, переменная арифметического типа, указатель функции арифметического типа. Арифметические операнды двухместных операций могут иметь различные характеристики: тип (real или complex), основание (decimal или binary), форму представления (fload или fixed), точность (p) для чисел с плавающей точкой и (p,q) для чисел с фиксированной точкой, где p – количество цифр, q – масштабный множитель или количество дробных цифр.

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

1. Если операнды отличаются по типу (один вещественного типа, другой – комплексного), то операнд вещественного типа преобразуется к комплексному типу путём присоединения равной нулю мнимой части, у которой основание счисления, форма представления и точность такие же, как и у вещественной части. Однако для возведения в степень, если второй операнд есть целая константа или вещественная переменная со значениями с фиксированной точкой и точностью (p,0), то преобразование этого операнда не производится.

2. Если форма представления операндов различна, то операнд с фиксированной точкой преобразуется в форму с плавающей точкой за исключением случая возведения в степень, когда второй операнд есть целая константа или же вещественная переменная со значениями с фиксированной точкой и точностью (p,0). В этом случае второй операнд не преобразуется. Точность (количество цифр) результата преобразования из формы с фиксированной точкой в форму с плавающей точкой совпадает с точностью (количеством цифр) исходного числа.

3. Если основание системы счисления операндов разные, то операнд, представленный в десятичной системе счисления, преобразуется в операнд с двоичным основанием счисления.

При преобразовании от десятичного к двоичному основанию числа с плавающей точкой и точностью p точность результата будет равна (3.32p); при преобразовании операнда с фиксированной точкой и точностью (p,q) точность двоичного результата будет равна (1+3.32p, 3.32q). В общем случае дробные числа 3.32P или 3.32q округляются до ближайшего целого числа, превосходящего по абсолютной величине исходное дробное число. Если числа 3.32p или 3.32q превосходят допустимый реализацией максимум, то используется максимальное допустимое число.

4. При возведении в степень первый операнд всегда преобразуется к форме с плавающей точкой, с единственным исключением: это преобразование не выполняется, если второй операнд есть целая беззнаковая константа в форме с фиксированной точкой и точность результата возведения в степень не будет превышать допустимый данной реализацией максимум (15 десятичных или 31 двоичных цифр).

Арифметическая операция выполняется, как только выполнены указанные преобразования. Причём тип, основание счисления, форма представления и точность результата одноместной операции совпадают соответственно с типом, основанием счисления, формой представления и точностью операнда. В случае двухместной операции тип, основание счисления, форма представления результата совпадают соответственно с типом, основание счисления и формой представления операндов. Точность результата двухместной операции совпадает с наибольшей точностью операндов, если операнды представлены в форме с плавающей точкой. Если же операнды представлены в форме с фиксированной точкой, то точность результата выбирается в соответствии с приведенными ниже правилами.

1. В случае операции сложения и вычитания

m=min(N, max(p1-q1, p2-q2) + max(q1,q2)+1);

n=max(q1,q2).

Здесь и дальше m – количество цифр результата, n – масштабный множитель результата, p1 и p2 – количество цифр соответственно в первом и втором операнде, q1 и q2 – масштабный множитель соответственно первого и второго операнда, N – наибольшая допустимая длина числа для данной реализации языка (15 десятичных и 31 двоичных цифр).

2. В случае операции умножения

m=min(N, p1+p2+1); n=q1+q2.

3. В случае операции деления

m=N; n=N-((p1-q1)+q2).

4. В случае операции возведения в степень

m=(p1+1)y-1; n=q1y,

где y – второй операнд (y0), вещественная целая константа без знака с фиксированной точкой. Если же первый операнд в форме с плавающей точкой, а второй – с фиксированной, то точность результата совпадает с точностью первого операнда.

Смысл знаков арифметических операций в PL/1 соответствует общепринятому смыслу, за исключением следующих случаев.

1. Операция возведения в степень x1**x2 с вещественными числами x1 и x2 недопустима, если x1=0 и x20, а также, если x1<0, а x2 не является целой константой либо переменной со значениями с фиксированной точкой и точностью (p,0). В этих случаях создаётся ситуация прерывания.

2. При выполнении операции возведения в степень с комплексными числами z1 и z2, то есть при выполнении операции z1**z2: a) результат равен нулю, если z1=0, а вещественная часть z2 больше нуля и мнимая часть равна нулю; b) операция недопустима, если z1=0, а вещественная часть z2 не больше нуля или мнимая часть z2 не равна нулю. В этом случае создаётся ситуация прерывания.

Если один или оба операнда арифметической операции не относятся к арифметическому типу, то такие операнды предварительно преобразуются по следующим правилам. Символьная строка вначале преобразуется в число, изображаемое этой строкой ( в данном случае строка должна представлять собой допустимую числовую константу, возможно, обрамлённую любым числом пробелов). Затем полученное число приводится к такому виду, к которому была бы преобразована произвольная целая десятичная константа из 16 цифр, если бы она находилась на месте исходной символьной строки; если для подобной константы преобразования не потребовалось бы, то полученное число приводится к целому десятичному числу из 15 цифр. Битовая строка вначале преобразуется в целое положительное двоичное число, изображаемое этой строкой (бит 1 соответствует цифре 1, бит 0 – цифре 0). При этом если строка содержит более 56 битов, то излишние левые биты игнорируются. Затем полученное число приводится к такому виду, к которому была бы преобразована произвольная целая двоичная константа из 56 цифр, если бы она находилась на месте исходной битовой строки; причём, если для подобной константы преобразования не потребовалось бы, то полученное число приводится к целому двоичному числу из 31 цифры. Пустые символьные и битовые строки преобразуются в число 0.

Операция сцепления. Операция сцепления x||y порождает новую строку, тело которой получается присоединением тела строки y к телу строки x справа. Длина результата равна сумме длин операндов x и y. Например, если А – символьная строка ‘AX+Y’, а B – символьная строка ‘76AB’, то в результате выполнения операции сцепления A||B будет получена строка ‘AX+Y76AB’. Операция сцепления непосредственно определена для операндов строкового типа, к которым относятся: строковые константы, переменные строкового типа, указатели функций строкового типа. Если операнды операции сцепления относятся к разному типу строковых данных (один битовый, а другой символьный), то перед выполнением операции сцепления битовая строка преобразуется в символьную строку по правилу: бит 1 становится символом 1, бит 0 становится символом 0. Длина строки не меняется. Пустая битовая строка становится пустой символьной строкой.

Если один или оба операнда операции сцепления относятся к арифметическому типу, то такие операнды предварительно преобразуются в строку символов. При этом вещественные десятичные числа с фиксированной точкой и точностью (p,q) преобразуются в строку символов по следующим правилам.

1. Если q=0, то получаемая в результате преобразования строка имеет вид

‘ sd1d2…dm’

к пробелов

где s – либо пробел, либо минус; d1, d2, …, dm – цифры числа, причём d1 может быть равно нулю, только если m=1. Длина строки равна p+3, следовательно k=p-m+2.

2. Если p=q>0, то полученная строка будет иметь вид

‘s0.d1d2…dq’,

где s – либо пробел, либо минус; d1d2…dq – дробные цифры исходного числа.

3. Если p>q>0, то полученная строка будет иметь вид

‘ sd1d2…dmdm+1dm+2…dm+q’,

k пробелов

где s – либо пробел, либо минус; d1d2…dm – цифры целой части числа, причём d1 может быть равно нулю, только если m=1; dm+1dm+2…dm+q – цифры дробной части числа. Длина строки равна p+3 символа, следовательно,

k=p-q-m+1.

4. Если q>p или q<0, то полученная после преобразования символьная строка будет иметь вид

‘ s0d1d2…dmFs1t1t2…tn’,

k пробелов

где s0 – либо пробел, либо минус; d1d2…dm, - цифры числа (d1 может быть равно нулю, только если m – единица); s1t1t2…tn – десятичное представление числа q, где s1 – либо плюс, либо минус; t1t2…tn – цифры числа q, причём n не больше 3, а t1 не равно нулю. Длина строки равна p+n+3, следовательно, k=p-m.

Вещественные десятичные числа с плавающей точкой, состоящие из p цифр преобразуются в символьную строку длиной p+6 символов, имеющую вид:

‘s0d1d2…dpEs1t1t2’,

где s0 – либо пробел, либо минус, d1d2…dp – цифры числа; s1 –либо плюс, либо минус; t1t2 – десятичные числа. Порядок подбирается таким образом, чтобы d1 было бы не равно нулю (исключая случай, когда само число равно нулю; в этом случае порядок равен нулю).

Вещественные двоичные числа перед преобразованием в символьную строку предварительно преобразуются к десятичному основанию. Если исходное число имеет точность (p) (плавающая точка), или (p,q) (фиксированная точка), то результат будет иметь, соответственно, точность (p/3.32) или (1+p/3.32, q/3.32).

Строка, получаемая при преобразовании комплексных чисел, имеет вид

‘a1a2…amsb1b2…bnI ‘

k пробелов

где символы a1a2…am представляют преобразованный по обычным правилам коэффициент при действительной части, символы sb1b2…bn – преобразованный коэффициент при мнимой части со знаком и без предшествующих пробелов. Длина строки равна 2m+1, следовательно, k=m-n-1.

Примеры.

1. Числовая константа +25 преобразуется в строку ‘ 25’.

2. Константа –.05 преобразуется в строку ‘ 0.05’.

3. Константа 21,6 преобразуется в строку ‘ 21.6’.

4. Пусть числовая переменная с вещественными десятичными значениями с фиксированной точкой и точностью (5,6) имеет значение 0.01. Тогда оно будет преобразовано в строку вида ‘ 10000F+6’.

5. Пусть числовая переменная с вещественными десятичными значениями с фиксированной точкой и точностью (3,-1) имеет значение 250. Тогда оно будет преобразовано в строку вида ‘ 25F-1’.

6. Числовая константа –25E10 преобразуется в строку ‘ 2.5E+11’.

7. Числовая константа +.15E-3 преобразуется в строку ‘ 1.5E-4’.

8. Мнимая константа +7I преобразуется в строку ‘ 0+7I ‘.

Логические операции. К логическим операциям относятся:  (логическое отрицание), | (логическое сложение), & (логическое умножение). Логические операции непосредственно определены для операндов битово-строчного типа: битово-строчные константы, переменные битово-строчного типа, указатели функций битово-строчного типа.

Выполнение этих операций над строками длиной больше 1 бита сводится к их выполнению над соответствующими битами операндов. Например, результат выполнения операции ‘01’B&’10’B равен строке ‘00’B. Если операнды двухместных логических операций имеют различную длину, то битовая строка меньшей длины дополняется справа нулевыми битами так, чтобы длины обоих операндов совпадали.
Если один или оба операнда логической операции относятся к арифметическому или символьно-строчному типу, то такие операнды предварительно преобразуются в битовые строки. Символьные строки преобразуются по следующему правилу: символ 0 преобразуется в бит 0, символ 1 – в бит 1, никакие другие символы в исходной строке не допустимы. Число битов в полученной строке равно числу символов в исходной строке, пустая строка символов преобразуется в пустую строку битов.
Преобразование вещественных двоичных чисел с фиксированной точкой в строку битов заключается в отбрасывании знака числа и его дробной части. Например, число +101B преобразуется в строку ‘101’B, число –1B в строку ‘1’B, число 11.01B в строку ‘11’B. Числа другого вида до преобразования их в стоку битов предварительно преобразуются в вещественное двоичное число с фиксированной точкой. Преобразование комплексных чисел в вещественные заключается в отбрасывании мнимой части. Двоичное число с плавающей точкой и точностью (p1), десятичные числа с плавающей точкой и точностью (p2) и десятичные числа с фиксированной точкой и точностью (p3,q3) преобразуются в двоичные числа с фиксированной точкой и точностью соответственно (p1, 0), (3.32p2, 0), 3.32(p3-q3), 0).

Отправить комментарий

  • Доступны HTML теги: <b> <i> <u> <br> <hr> <div> <span> <code> <pre>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <pli>.

Подробнее о форматировании

  _  _      ___  
| || | / _ \
| || |_ | (_) |
|__ _| \__, |
|_| /_/
Enter the code depicted in ASCII art style.