normDDr (1158429), страница 6
Текст из файла (страница 6)
1) задает значения переменных, используемых при чтении и записи файлов в процессе трансляции:
filein=<name>.hop - имя исходного файла, содержащего Норма-программу,
fileft=<name>.for - имя выходного файла, содержащего текст Fortran DVM-программу,
filelst=<name>.lst - имя файла листинга трансляции Норма-программы.
2) задает значение переменной, хранящей значение текущей директории:
dir=<directory-name>
3) обрабатывает опции трансляции
Возможные опции трансляции:
f-77 - трансляция в последовательный Fortran-77,
dvm - трансляция в Fortran DVM,
length=<integer> - число значащих символов идентификатора,
lst=1 - в листинге текст Норма-программы и сообщений транслятора,
lst=2 - в листинге текст Fortran DVM-программы и сообщений транслятора,
lst=3 - в листинге текст Норма-программы, Fortran DVM-программы и сообщений транслятора.
Обработка опций трансляции сводится к установке значений переменных для хранения режимов трансляции по умолчанию и переопределению этих значений, если были заданы опции трансляции.
Переменные режимов трансляции и их значения по умолчанию:
f-out =3 - трансляция в Fortran DVM
lenid=6 - 6 значащих символов в идентификаторе
lstng= 3 - режим lst=3.
4) открывает файлы fileft, filelst, filein,
5) вызывает функцию face блока Listing generator для вывода сообщений о дате, времени, версии компилятора, опциях трансляции,
6) если при выполнении пунктов 1)-5) были обнаружены ошибки, то вызывается функция erroutall блока Listing generator, иначе функция count блока Local initialization.
При анализе опций трансляции фиксируются ошибки:
error code 408 'incorrect name of source file '<error context>
error code 271 'file '<error context>' is not found'
error code 413 'incorrect compilation option '<error context>
5.Компилятор Норма-раздела (Norma part unit compilation).
Основной блок компилятора. Состоит из блоков a)-j), перечисленных в п. 1. Описание этих блоков приведено ниже.
5.1Локальная инициализация (Local initialization).
Осуществляется инициализация локальных счетчиков транслятора, используемых при трансляции раздела Норам-программы, а также Таблица имен (Symbol table), Таблица констант (Constant table). После этого вызывается входная функция beginlex блока Part unit scanner.
Общая структура управления блока Local initialization приведена на следующей схеме.
c
ount tableid tablecon beginlex
5.1.1Инициализация локальных счетчиков (функция count)
osh=0 - счетчик ошибок в текущем разделе Норма-программы,
osh1=0 - счетчик предупреждений в текущем разделе Норма-программы,
met=1 - счетчик для генерации меток в Fortran-программе,
mett=8000 - счетчик для генерации меток в Fortran-программе при реализации МССГ (MSCS),
formet=40000 - счетчик для генерации меток операторов FORMAT в Fortran-программе,
err_kw=0 - счетчик числа ошибок внутри Норма-предложения,
err_kwit=0 - счетчик числа ошибок внутри конструкции ITERATION Норма-раздела,
kba=0 - счетчик номеров предложений <statement number> Норма-раздела,
itn=600 - счетчик номеров итераций <iteration number> Норма-раздела,
i=700 - счетчик для генерации имен итерируемых переменных (first result variable name, second result variable name),
rabm=0 - - счетчик для генерации имен рабочих массивов при генерации Fortran-программы,
seq=1 - признак отсутствия режима последовательных вычислений.
5.1.2Инициализация Таблицы имен(Функция tableid)
В Таблицу имен (Symbol table) заносятся строки
| TAN | F | 185 |
| DTAN | F | 186 |
| DSIGN | F | 187 |
| SIGN | F | 188 |
| DATAN | F | 189 |
| DASIN | F | 190 |
| DCOS | F | 191 |
| DSIN | F | 192 |
| DEXP | F | 193 |
| DLOG10 | F | 194 |
| DLOG | F | 195 |
| DABS | F | 196 |
| DMIN1 | F | 197 |
| DMAX1 | F | 198 |
| DSQRT | F | 199 |
| EXP | F | 200 |
| SIN | F | 201 |
| COS | F | 202 |
| SQRT | F | 203 |
| ABS | F | 204 |
| ALOG | F | 205 |
| ALOG10 | F | 206 |
| ASIN | F | 207 |
| ATAN | F | 208 |
| SUM | F | 209 |
| MULT | F | 210 |
| MIN | F | 211 |
| MAX | F | 212 |
| LEFT | F | 213 |
| RIGHT | F | 214 |
| ENTIER | F | 215 |
| AMIN1 | F | 216 |
| AMAX1 | F | 217 |
5.1.3Инициализация Таблицы констант (функция tablecon).
В Таблицу констант (Constant table) заносятся строки
| 0 | I | 10000 |
| 1 | I | 10001 |
5.2Лексический анализ Норма-раздела (Part unit scanner).
Общая структура управления блока Part unit scanner приведена на следующей схеме.
b
eginlex
n
extline
EndLex StopCompile
head_of_part
b
egin_part
line pkd statement lexitex
kbaht
nextline EndLex count
StopCompile
5.2.1Начало агализа (Функция beginlex)
Входная точка блока Part unit scanner.
Увеличивает счетчик bline=bline+1.
5.2.2Чтение исходного файла(Функция nextline)
1) Читает очередную строку исходного файла с Норма-программой,
Увеличивает счетчик eline=eline+1.
2) Если эта строка начинается символом ?, осуществляет чтение строк исходного файла до строки, содержащей символ ? в первой позиции (выполняя операцию eline=eline+1), после чего читает следующую строку исходного файла (bline=eline),
3) Если строка содержит комментарий, то комментарий уничтожается,
4) Если обнаружен конец файла, eof=1,
5) Иначе заменяет группы пробелов на один пробел.
5.2.3Анализ заголовка Норма-раздела(Функция begin_part)
-
Если eof=1, вызывает StopCompile,
-
Если строка начинается с ключевых слов MAIN PART, PART, FUNCTION, передает ее функции line,
-
Иначе фиксирует ошибку и вызывает beginlex.
Функция фиксирует ошибку:
error code 304 'incorrect head of part'
5.2.4Выделение Норма-предложения(Функция line)
-
Если eof=1, последовательно вызывает EndLex и StopCompile,
-
Если предложение начинается символом # (признак режима последовательных вычислений), то seq= -seq; если seq>0, заводится очередная строка Таблицы последовательных групп (Table of ordered groups),
-
Если в строке обнаружен ограничитель '.', анализируется контекст этого ограничителя (функция point) и в случае, если это конец Норма-предложения, это Норма-предложение исключается из строки и передается функции pkd,
-
Иначе вызывает функцию nextline, строку-результат ее работы объединяет с текущей строкой и рекурсивно вызывает line.
Функция фиксирует ошибки:
error code 305 'missed END PART.'
error code 111 'incorrect using #...#''
error code 402 'declaration or operator is not ended with .'
5.2.5Перевод в токены(Функция pkd)
Осуществляет перевод исходного Норма-предложения в последовательность лексем, формируя Таблицу имен (Symbol table) и Таблицу констант (Constant table). Ключевые слова и ограничители распознаются явным выделением из текста.
Норма-предложение в виде последовательности лексем передается функции statement.
Функция фиксирует ошибку:















