norma-r (1158383), страница 3
Текст из файла (страница 3)
arithm-expression comp-operation arithm-expression
condition-on-domain :
log-expression
condition-on-index :
name-index rel-except-not-equal-operation
name-index [ { +,- } const-expression-without-sign ]
name-index rel-except-not-equal-operation const-expression-without-sign
Порядок выполнения операций при вычислении logical expression:
(1) вычисление арифметических выражений;
(2) выполнение операций внутри скобок ( и ) ; если таких скобок одного уровня вложенности несколько, то слева направо;
(3) вычисление отношений =,>,<,>=,<=,<>,>< ; если таких операций одного уровня несколько, то слева направо.
(4) выполнение операций логического отрицания NOT ; если таких операций одного уровня несколько, то справа налево;
(5) выполнение операций логического умножения AND , если таких операций одного уровня несколько, то слева направо;
(6) выполнение операций логического сложения OR , если таких операций одного уровня несколько, то слева направо.
Примеры логических выражений:
ABS(MOD-X1+Y1)<=1.0D-20
NOT (II=(2*N+1)*(2*NV+1) AND NU=0)
I=J+1
4. Структура программы
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 .
Программа на Норме состоит из одного или нескольких разделов. Разделы могут быть трех видов - главный раздел, простой раздел и раздел-функция, вид раздела определяется ключевыми словами MAIN PART, PART, FUNCTION соответственно.
Разделы могут вызывать друг друга по имени и передавать данные при помощи механизма формальных и фактических параметров, или через внешние файлы при помощи описаний INPUT и OUTPUT
Для каждого раздела справедливо правило локализации: имена, описанные в разделе, локализованы в этом разделе; понятие глобальных переменных в языке отсутствует.
Главный раздел обязательно должен присутствовать в программе на Норме и быть единственным; формальных параметров он не имеет. Вызовы главного раздела, а также рекурсивные вызовы разделов запрещены.
В заголовке раздела указывается имя раздела и список формальных параметров. Формальные параметры должны быть описаны в теле раздела при помощи declaration-of-scalar-variables, declaration-of-variables-on-domains или declaration-of-external
Параметры-величины, указанные до ключевого слова RESULT в списке формальных параметров, являются исходными данными для вычислений, описываемых в разделе; параметры, перечисленные после - являются результатами вычислений. Один и тот же параметр не может быть одновременно исходным и результатом: это приводит к переприсваиванию значений переменным (повторному присваиванию), что запрещено в Норме. В разделе-функции ключевое слово RESULT не используется: результат вычисления функции связывается с именем и типом функции.
В теле раздела могут быть заданы описания, операторы и итерации (порядок их расположения, вообще говоря, произвольный - возможные ограничения определяются при описании входного языка транслятора). Пример заголовка главного раздела:
MAIN PART Linear . ! Variant of May 25 1998 :
! ======= linear approximation ========
! the case of axial symmetry for M=1 ;
! computation is being done on Beta angle for the point I=0 ;
! further for I=1,2*N values
! are being extended on symmetry for V,FI,DAVL .
BEGIN
body of part
END PART
Пример заголовка простого раздела:
PART IntFKP .
! Computation of integral from FKP function
! with interpolation of integral function
BETA,ALPHA, ! - node points
ALL,ALC,ALR, ! - points for interpolation
STEP, ! - integration step
FKP ! - name of integral function
! - result IntResult
RESULT IntResult
BEGIN
EXTERNAL FUNCTION FKP DOUBLE .
VARIABLE ALPHA,BETA,ALL,ALK,ALR,STEP,IntResult DOUBLE .
body of part
END PART
5. Конструкции языка Норма
Конструкции языка Норма делятся на описания, определяющие объекты программы, например, области, индексы, величины, которые необходимы при решении задачи, и конструкции для спецификации правил вычисления.
5.1. Описания
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
В Норме могут быть описаны следующие объекты: области, скалярные величины (скаляры), величины, определенные на сетке, индексные конструкции, индексы распределения, параметры области, входные и выходные величины, имена внешних функций и разделов.
5.1.1. Описание областей
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
Понятие области введено в языке Норма для представления понятия индексного пространства. Область - это совокупность целочисленных наборов {i1,....,in }, n>0, ij>0, j=1,...,n, каждый из которых задает координаты точки n-мерного индексного пространства. С каждым направлением (осью координат) n-мерного пространства задачи связывается уникальное имя - имя индекса (имя оси координат индексного пространства).
Следует отметить, что область определяет значения координат точек индексного пространства, а не значения расчетных величин в этих точках. Например, если требуется вычислить значения величины Yi,j, i.j =1,...,n на некоторой сетке Xi,j, i,j =1,...n, введенной при решении задачи (например, формулой вида Xi,j =F(h,i,j), F - заданная функция, h - заданный параметр), то следует:
-
описать область, состоящую из точек i,j = 1,...n;
(2) описать на этой области величины X и Y;
(3) задать на этой области правило вычисления значений сетки Xi,j : Xi,j = F(h,i,j) и правило вычисления значений Yi,j : Yi,j = G(Xi,j ) (считается, что F,G,h также некоторым способом заданы).
В языке Норма область может иметь имя, над областями определены операции модификации и произведения. Индексы областей специально не описываются - они вводятся при определении областей. Область может быть условной и безусловной. Условная область состоит из точек индексного пространства, число и координаты которых могут меняться в зависимости от выполнения (или не выполнения) условий на область. Безусловная область состоит из точек индексного пространства, число и координаты которых могут быть определены на этапе трансляции.
В языке различается описание области - это именованная условная или безусловная область, и использование области - синтаксически это имя-области или новая-область-без-имени. Области используются в описаниях величин, определенных на области, при задании области вычисления в операторах ASSUME, в описания входных или выходных величин, при задании областей фактических параметров в вызовах разделов или функций, в функциях редукции.
5.1.1.1. Описание безусловной области
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
Ключевым понятием при описании прямоугольных областей является понятие одномерной области. Одномерная область служит для задания диапазона точек на некоторой оси координат индексного пространства. В простейшем случае при описании одномерной области указывается имя одномерной области, имя индекса и границы изменения значений индекса:
RegionK: (k =1..15) .
Имя-одномерной-области может использоваться для ссылки на эту область.















