norma-r (1158383), страница 8
Текст из файла (страница 8)
FOR Oi ASSUME X = X0.
END INITIAL
FOR Oi ASSUME X = 1/A[j=i]*(F-SUM( (O1)A*X[I=J,N-1]).
EXIT WHEN MAX( (Oi) ABS(X[N] - X[N-1] ) ) < Epsilon.
END ITERATION N.
Собственно итерация представлена последними 8-ю строками примера. В заголовке итерации указывается индекс итерации - в данном случае N, и перечисляются величины, участвующие в итеративных вычислениях и представляющие результат этих вычислений - в данном случае это X (значение с последнего шага итерации) и Xpred (значение с предпоследнего шага итерации). Величина Xpred не требует дополнительного описания: считается, что она описана так же, как и X. Значения X, как и Xpred могут использоваться для вычислений вне итерации; в данном примере эти значения просто объявлены выходными.
При описании итерации можно использовать возможность задания граничных значений итерируемых величин (вообще говоря, необязательных). Граничные значения итерируемой переменной задаются при помощи обычных операторов языка Норма внутри блока BOUNDARY ... END BOUNDARY. Эти значения считаются неизменными на протяжении всей итерации и определены на каждом шаге итерации.
Начальные значения для итерируемых величин задаются при помощи блока INITIAL...END INITIAL.
Тело итерации представляет собой часть программы, написанной на языке Норма. В частности, внутри итерации можно определить новую итерацию по другому направлению. В примере тело итерации состоит из единственного оператора ASSUME .
Индекс итерации может использоваться в списке индексов, указываемом для итерируемой величины, т.е. фактически можно считать, что итерируемая величина в пределах итерации имеет дополнительный итерационный индекс (по фиктивному направлению). Индекс итерации без смещения можно не указывать.
Индекс итерации может быть указан только у итерируемых величин.
В теле конструкции ITERATION могут вычисляться значения величин, не указанных в списке итерируемых величин. Такие величины могут потребоваться, например, для представления промежуточных результатов, вычисляемых на каждом из витков итерации. Использование таких величин не приводит к нарушению правила об однократном присваивании - считается, что на каждом витке итерации используется новая копия величины.
Итерационный процесс завершается, если логическое выражение, заданное в условии выхода, принимает значение “истина”.
Приложение 1. Представление исходной программы
Исходная программа представляется в исходном файле по следующим правилам.
1. Текст каждого из разделов Норма-программы записывается в бесформатном представлении. При переносе описания или оператора на следующую строку запрещается разрывать ключевые слова, идентификаторы, константы, в остальном правила переноса произвольные - специальный знак переноса отсутствует.
2. Ключевые слова, идентификаторы, константы отделяются пробелами, специальными символами, символом конца строки. Пробелы являются незначащими символами: группа пробелов трактуется как один пробел.
3. Строка, начинающаяся со знака “ ! ”, или часть строки, следующая за знаком “ ! ”, является комментарием.
4. Информация, расположенная в интервале от знака “ ? ”, стоящего в первой позиции, до знака “?”, стоящего также в первой позиции, транслятором не обрабатывается. Эта возможность позволяет выбирать из исходного файла те разделы (части разделов), которые необходимо транслировать.
Приложение 2. Синтаксические правила
program :
{ part }+
part :
main-part
simple-part
part-function
main-part :
MAIN PART name-part . declaration-of-part
simple-part :
PART name-simple-part . declaration-of-part
part-function :
FUNCTION name-function [type-function] . declaration-of-function
declaration-of-part :
formal-parameters-of-part BEGIN body-of-part END PART
formal-parameters-of-part :
[ list-name ] [RESULT list-name]
declaration-of-function :
formal-parameters-of-function BEGIN body-of-part END PART
formal-parameters-of-function :
list-name
body-of-part :
{ element-of-part }*
element-of-part :
declaration .
operator .
iteration .
declaration :
declaration-of-domain
declaration-of-domain-indexes
declaration-of-scalar-variables
declaration-of-variables-on-domains
declaration-of-distribution-indexes
declaration-of-domain-parameters
declaration-of-input
declaration-of-output
declaration-of-external
declaration-of-domain :
declaration-of-unconditional-domain
declaration-of-conditional-domain
declaration-of-unconditional-domain
declaration-of-rectangular-domain
declaration-of-diagonal-domain
domain :
new-domain-without-name
name-domain
unconditional-domain :
new-domain-without-name
name-unconditional-domain
name-domain :
name-unconditional-domain
name-conditional-domain
name-unconditional-domain :
name-rectangular-domain
name-diagonal-domain
declaration-of-rectangular-domain :
multidimensional-domain
new-domain
multidimensional-domain :
onedimensional-domain
[ name-multidimensional-domain : ] ( domain-product )
domain-product :
component-domain { ; component-domain }+
component-domain :
multidimensional-domain
name-unconditional-domain
onedimensional-domain :
[ name-onedimensional-domain : ] ( name-index = value )
value :
range
const-expression
range :
const-expression .. const-expression
new-domain :
[ name-new-domain : ] new-domain-without-name
new-domain-without-name :
name-unconditional-domain / list-modification
modification :
name-index = value
name-onedimensional-domain { { +,- } boundary-function }+
boundary-function :
LEFT( const-expression )
RIGHT( const-expression )
name-rectangular-domain :
name-onedimensional-domain
name-multidimensional-domain
name-new-domain
declaration-of-diagonal-domain :
name-diagonal-domain : name-unconditional-domain / list-condition-on-index
declaration-of-conditional-domain :
name-conditional domain , name-conditional-domain : name-domain / condition-on-domain
declaration-of-domain-indexes :
INDEX list-name-index
declaration-of-scalar-variables :
VARIABLE list-name-scalar [ type ]
declaration-of-variables-on-domains :
VARIABLE list-name-variable-on-domain DEFINED ON name-unconditional-domain [ type ]
type :
{ REAL, INTEGER, DOUBLE }
declaration-of-domain-parameters :
DOMAIN PARAMETERS list-prescription
prescription :
name-domain-parameter = int-const
declaration-of-input :
INPUT list-input-scalar
INPUT input-on-domain
input-scalar :
name-scalar [ attributes ]
input-on-domain :
list input-output-variable ON unconditional domain
input-output-variable :
name-variable-on-domain [ attributes ]
declaration-of-output :
OUTPUT list-output-scalar
OUTPUT output-on-domain
output-scalar :
name-scalar [ attributes ]
output-on-domain :
list- input-output-variable ON domain
attributes :
( list-attribute )
attribute :
STR( int-constant )
string
ORDER( list-name-index )
FILE = ' file-name '
ALL
format
format :
I int-constant
{ F,E,D } int-constant . int-constant
file :
input-element { input-element }*
input-element :
name-scalar = arithm-constant;
name-variable-on-domain ( list-index-range ) = data ;
index-range :
name-index = int-constant .. int-constant
data :
list-data-element
data-element :
int-constant
body
int-constant ( data )
declaration-of-external-names :
declaration-of-external-functions
declaration-of-external-parts
declaration-of-external-functions :
EXTERNAL FUNCTION list-name-external-function [ type ]
declaration-of-external-parts :
EXTERNAL PART list-name-external-simple-part
declaration-of-distribution-indexes :
DISTRIBUTION INDEX name-index = simple-range , name-index = simple-range
simple-range :
int-constant .. int-constant
operator :
scalar-operator
operator-ASSUME
call-part
scalar-operator :
name-scalar = scalar-arithm-expression
scalar-arithm-expression :
arithm-expression
operator-ASSUME
FOR domain ASSUME relation { ; relation }*
relation :
name-variable-on-domain = arithm-expression
call-part
call-function :
call-reduction-function
call-standard-function
call-external-function
call-reduction-function :
name-reduction-function ( ( name-domain )arithm-expression )
call-standard-function :
name-standard-function ( arithm-expression )
name-m-standard-function ( {arithm-expression}+ )
name-reduction-function :
{ SUM,MULT,MAX,MIN }
call-external-function :
name-external-function [ ( list-in-parameter ) ]
in-parameter :
arithm-expression
name-variable-on-domain ON domain-of -parameter
iterated-variable-on-domain ON domain-of-parameter
name-external-simple-part















