Функция FLOOR преобразует вещественный параметр в вещественное число, равное целому, не превосходящему параметр. Результатом функции LENGTH является целое число, равное длине цепочки-параметра. Первый параметр функции SUBSTR — цепочка; результатом служит подцепочка, начальная литера которой обозначена вторым целочисленным параметром (счет идет от нуля), а длина задана третьим целочисленным параметром. Функция CHARACTER преобразует целочисленный параметр в цепочку из одной литеры, имеющей в алфавите данный номер. Функция NUMBER выдает в качестве целочисленного результата номер, который имеет в алфавите первая литера цепочки-параметра. Функция FLOAT преобразует целочисленный параметр в вещественный результат, a FIX преобразует вещественный параметр в целочисленный результат. Выполнение функций SUBSTR, FIX и CHARACTER может закончиться ошибкой.
<переменная>::= <идентификатор>
|<переменная>, <идентификатор>
|<переменная> [<выражение>]
<Переменная> — это либо просто <идентификатор>, либо <переменная> с последующим именем поля, либо <переменная> с индексом. Разумеется, все <переменные> должны быть декларированы. <Идентификатор> — терминальный элемент синтаксиса. Он обязан начинаться с большой или малой буквы, за которой может следовать произвольное число букв или десятичных цифр. Резервированные слова нельзя использовать в качестве <идентификаторов>. Как резервированные слова, так и <идентификаторы> должны отделяться от других неоператорных лексем, по крайней мере, одним пробелом, комментарием или литерой перевода строки. Лексемы не могут пересекать границ записей.
<константа> ::= <целая константа>
|<вещественная константа>
|<булева константа>
|<цепочечная константа>
<булева константа>::= TRUE
|FALSE
<Целая константа> — это непрерывная цепочка десятичных цифр. Она должна отделяться от других неоператорных лексем по крайней мере одним пробелом, комментарием или литерой перевода строки. <Вещественная константа> — это непрерывная цепочка десятичных цифр, за которой вплотную следует точка и, возможно, еще одна цепочка десятичных цифр. В остальном <вещественные константы> подчиняются тем же правилам, что и <целые константы>. <Цепочечная константа> начинается и кончается двойной кавычкой "; между ними могут стоять любые литеры, кроме двойной кавычки. Чтобы включить в цепочку двойную кавычку, ее следует записать дважды. Например, """" — цепочка ровно из одной двойной кавычки. В остальном <цепочечная константа> ведет себя аналогично <идентификаторам>. В частности, она не может содержать литер перевода строки.
<вызов функции>::= <идентификатор функции> ( )
|<идентификатор функции> <список фактических параметров>
<идентификатор функции>::= <идентификатор>
<Идентификатор функции> — это обычный <идентификатор>, употребленный в некотором определении функции. При вызове функций без параметров следует пользоваться первой альтернативой в <вызове функции>.
<отношение>::= <
|>
|=
|<=
|>=
|<>
<аддитивный оператор>::=+
|-
<мультипликативный оператор>::=*
|/
|MOD
С точки зрения разделения лексем операторами также считаются :, ;, (, ), , , [,], &, |, II, := и не считаются XOR, NOT и MOD. Комментарии начинаются с сочетания литер /*, продолжаются любой цепочкой, не содержащей */, и заканчиваются литерами */. Комментарии могут располагаться везде, где допускаются разделяющие пробелы. Комментарии выполняют роль разделителей.
Приводимая ниже программа иллюстрирует некоторые черты языка Мини. Чрезвычайно трудно в нескольких строках воспользоваться всеми возможностями, однако программа Эратосфен позволяет ощутить дух Мини. Ее можно использовать и как тест для компиляторов, поскольку выводимая информация очевидна, а вычисления нетривиальны. Пожалуй, единственным трюком (заимствованным из Алгола) является использование управляющих значений цикла для проведения вычислений в функции integersqrt. Вот текст программы. [57]
57
Возможно, читателя заинтересуют следующие вопросы:
1. При какой точности выполнения операций с плавающей точкой можно гарантировать конечность первого цикла в функции integersqrt?
2. Не может ли получиться так, что после завершения этого цикла будет выполнено неравенство ?
3. Нельзя ли избавиться от второго цикла в функции integersqrt, выполнив все операции первого в целочисленной арифметике? Как следует выбрать начальное приближение и условие завершения цикла?
4. Действительно ли нужно прибавлять 1 при вычислении значения limit? 5. Можно ли в заголовке цикла маркировки составных чисел заменить 2*i на i*i?. — Прим. перев.