normDDr (1158429), страница 15
Текст из файла (страница 15)
Функция serial-head, используя дополнительные структуры: список параметров раздела (part parameters list) и запись-тип раздела (part type record), строит операторы PROGRAM или SUBROUTINE или FUNCTION в формате Промежуточного представления Fortran-DVM программы (Intermediate representation of Fortran DVM program, List FORT).
Функция makedimension, используя Таблицу имен (Symbol table), строит описания массивов в формате Промежуточного представления Fortran-DVM программы (Intermediate representation of Fortran DVM program, List FORT).
Функция description, используя Таблицу имен (Symbol table), строит описания простых переменных и внешних имен в формате Промежуточного представления Fortran-DVM программы (Intermediate representation of Fortran DVM program, List FORT).
Функция dvm-declaration, используя Таблицу распределенных переменных (Table of distributed variables) и Таблицу индексов распределения (Table of distribution indexes), строит описания PROCESSORS, ALIGN, DISTRIBUTE в формате спецкомментариев HPF и DVM Промежуточного представления Fortran-DVM программы (Intermediate representation of Fortran DVM program, List FORT).
Функция fp обрабатывает полученные предыдущими функциями операторы и описания, а также List FORT, созданный в процессе работы блока Fortran DVM intermediate representation generator. Обработка сводится к перекодировке <fortran-statements>, представленных как <sequence of token codes>, в <sequence of symbols>, разбиению <sequence of symbols> на строки по правилам представления Fortran программы и передаче этих строк функции info (блок Listing generator) для вывода в выходной файл <target-file>.
5.8Анализ файлов ввода данных (Input files analyser).
Входная точка блока Input files analyser - функция isiofile. Файлы ввода данных в языке Норма помимо собственно вводимых данных содержат и имена переменных, которые должны получить в качестве значений эти данные. Это объясняется тем, что компилятор сам определяет порядок выполнения операторов ввода, и в соответствии с этим порядком должен переупорядочить файлы ввода данных.
Синтаксис файлов ввода в языке Норма:
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 )
Исходной информацией для блока Input files analyser являются Input variables queue и Table of input-output formats.
Общая структура управления функции isiofile приведена на следующей схеме.
i
siofile trees files t1 prefmt gather
fls2 checktree shaketree in-fno
sntx
Функция trees выбирает из Input variables queue очередной элемент и передает его функции files.
Функция files вызывает функцию fls2 с аргументом <file-number> для обработки файла ввода, после чего вызывает функцию t1 для обработки элемента ввода.
Функция fls2 читает в массив строк data файл данных file с номером <file-number> (определяя его имя по таблице имен входных файлов fti) и вызывает функцию sntx для проверки синтаксической правильности содержимого этого файла.
Функция фиксирует ошибки:
error code 271 ' file'<error context>’ is not found’
Функция sntx осуществляет синтаксический анализ массив строк data, (содержимого файла данных file) и в случае отсутствия ошибок строит структуру данных heap, предназначенную для хранения вводных данных в том порядке, в котором они были заданы в файле данных file (этот порядок, вообще говоря, не соответствует порядку, определяемому очередью Input variables queue).
Элемент структуры данных heap имеет вид:
| name-variable | name-index | range | … | name-index | range | data |
<name-variable>::=<identifier>
<name-index>::=<identifier>
<range>::=<integer><integer>
<data>::=<Norma language notion data>
Эта информация означает, что для переменной с именем <name-variable> и индексами <name-index>=<range>, … , <name-index>=<range> в файле ввода заданы значения <data> (для scalar variable поля <name-index><range> отсутствуют).
Функция фиксирует ошибки:
error code 249 'incorrect data file: in line'<error context>’missed = or ('
error code 250 'incorrect data file: in line'<error context>’missed =’
error code 251 'incorrect data file: in line'<error context>’missed , or ; or (’
error code 252 'incorrect data file: in line'<error context>’missed , or )’
error code 253 'incorrect data file: in line'<error context>’missed identifier’
error code 254 'incorrect data file: in line'<error context>’missed number’
error code 255 'incorrect data file: in line'<error context>’missed integer’
Функция t1 получает в качестве аргумента очередной элемент Input variables queue. Поле <format> этого элемента передается функции prefmt, после чего создается структура tree, предназначенная для хранения вводных данных в порядке, определяемом очередью Input variables queue. Структура tree определяется следующим образом:
<tree>::= (<vector>) OR <tree><tree>
<vector>::=<n>’undefined’
<n>::=<integer>
Количество элементов структуры tree равно числу элементов вводимой переменной. В начальный момент все значения элементов структуры tree есть значения ’undefined’. Дальнейшая обработка будет сводиться к перенесению значений из структуры heap в структуру tree вместо соответствующих ’undefined’.
Пример. Для элемента очереди
|
| format | I | 1 | 10 | J | 1 | 15 | K | 1 | 2 |
будет создана структура tree
((10 ’undefined’)(15 ’undefined’)) ((10 ’undefined’)(15 ’undefined’))
Функция prefmt обрабатывает поле <format> и заносит в счетчики type, count, len соответственно тип переменной, количество чисел в строке и количество позиций на число (эти счетчики будут использоваться в процессе создания строк вводного файла в функции shaketree).
Функция gather осуществляет согласование структур heap и tree для очередного элемента очереди Input variables queue: значения, соответствующие элементу очереди и находящиеся в heap, переносятся на соответствующие позиции в tree. При этом проводится анализ соответствия элемента очереди и структур heap и tree. При этом
функция фиксирует ошибки:
error code 257 'incorrect data file: missed data for variable'<error context>
error code 258 'incorrect data file: repeatedly defined data for variable’<error context>
error code 259 'incorrect data file:there are less data for'<error context>’than defined in indexes’
error code 260 'incorrect data file: too much indexes for'<error context>
error code 261 'incorrect data file: not enough indexes for '<error context>
error code 274 'disaccordance of indexes'<error context>'and'<error context>'in variable declaration and in data file’'
error code 275 'disaccordance of indexes values of variable '<error context>' in INPUT and in data file'
Функция checktree осуществляет проверку структуры tree, построенной ранее, на определенность: в tree не должно остаться элементов со значением ’undefined’. Если это не так,
функция фиксирует ошибку:
error code 262 'incorrect data file: there are undefined data for'<error context>
Функция shaketree создает строки итогового переупорядоченного вводного файла на основании информации из структуры tree и счетчиков type, count, len. При этом функция проверяет соответствие данных для ввода и формата ввода, представленного значениями этих счетчиков.
Функция фиксирует ошибки:
error code 264 'incorrect data file:input'<error context>’for integer variable’
error code 265 'incorrect data file:'<error context>’is longer than attribute format'
Функция in-fno получает в качестве параметра текстовую строку и заносит ее в итоговый вводной файл. Имя этого файла есть normain.in, если компилируется главный раздел Норма программы, иначе <part-name>.in.
5.9Генерация листинга (Listing generator).
Блок Listing generator содержит ряд функций, предназначенных для:
-
вывода исходных текстов Норма-программы, Fortran DVM-программы, сообщений компилятора в файл <listing-file>,
-
вывода Fortran DVM-программы в файл <target-file>,
-
вывода исходных текстов Норма-программы, Fortran DVM-программы, сообщений компилятора на экран,
-
генерации текстов сообщений об ошибках и предупреждений для соответствующих строк файла <listing-file> или экрана.
Входные точки блока Listing generator - функции listing, erroutall, errpart, errprogr, info.
Функция listing выводит текст Норма-программы и сообщений периода компиляции. Общая структура управления функции listing приведена на следующей схеме.
l
isting outrgm list-out outlstn errlst texterr
outrgm erroutall errpart
texterr
Функция listing анализирует режим вывода lst (lst=1 - в листинге текст Норма-программы и сообщений транслятора, lst=2 - в листинге текст Fortran DVM-программы и сообщений транслятора, lst=3 - в листинге текст Норма-программы, Fortran DVM-программы и сообщений транслятора), выводит сообщение об опциях компиляции (вызывая функцию outrgm) и для lst=1,3 вызывает функцию вывода текста Норма-программы, а для lst=2 - функцию erroutall вывода сообщений об ошибках.
Функция list-out читает исходный файл, начиная со строки с номером beginline и заканчивая строкой eline (при завершении работы функция устанавливает beginline=eline+1 - новое значение счетчика строк исходного файла, обработанных при создании листинга трансляции). Очередная строка передается функции outlstn.















