
5.1. Структура данных
text1 Одномерный массив символьных строк, содержащий исходный текст конвертируемой программы
text2 Одномерный массив символьных строк, содержащий выходной текст программы, полученной в результате конвертации
kstr число строк исходного текста
kstr2 число строк выходного текста
nstr номер текущей строки исходного текста
nstr2 номер текущей строки выходного текста
kerr число ошибочных операторов
kwarray массив из ключевых слов
npos текущая позиция в строке в исходном тексте
Fname1,Fname2имена файлов с путями
f1,f2 файловые переменные
TypeComment тип коментария
Ae строка для ae и le
Pf позиция для ae и le
Flag,def,v_open,mainflg,InclFlg,print,un всякие флаги
ostr выходная строка для le
qwe,l временная позиция для le и длина строки
fl флаг для le
perem массив переменных (для проверки дубликатов)
KolPer кол-во переменных
i счетчик для циклов
NUnStr номер строки, в которой начинается union
nfl:char номер переменной в union
MaxStr максимальное количество строк
azbuki мн-во из букв и «_»
oo мн-во из '<','>','=','!'
signs мн-во из ‘+’,’-‘,’/’,'*'];
zif мн-во из цифр
var_symb мн-во из символов, допустимых в именах переменных
5.2. Алгоритм главной программы
нач
если количество откр. фиг. ск. не соответствует кол-ву закрывающихся то
обработка ошибки с кодом 2 все
цикл пока не конец массива
пропуск пробелов
если не конец строки то
если коментарий то обработка коментария иначе
если ключевое слово то вызов процедуры обработки этого ключевого
слова иначе
если не присваивание то
если уже открыт union то
копирование в строку NUnStr всех символов до ';'
добавление в строку NUnStr ':record'
добавление в строку NUnStr+1 ' case integer of'
увеличение на 1 nstr2 и kstr2
вывод в текущую строку 'end;'
флаг открытия union = ложь
иначе обработка неизвестного ключевого слова
все все все все все
увеличение номера тек. строки
кц
если не обнаружен main то выдача сообщения
кон
5.3. Алгоритм подпрограммы обработки комментария(fcomment)
нач
если коментарий первого типа (//) то
вывод в вых поток '{'
вывод в вых поток всей строки, не включая ';'
вывод в вых поток '}'
иначе
вывод в вых поток '{'
вывод в вых поток всех символов, заключенных между '/*' и '*/'
вывод в вых поток '}'
все
если ошибка синтаксиса то вызов процедуры обработки ошибок с кодом 3
кон
5.4 Алгоритм выделения ключевого слова - kw
нач
если позиция какого либо из ключевых слов в строке равна текищей позиции и за этим словом идет пробел или ‘(‘ или ничего то возвращаем тип ключевого слова
иначе возвращаем никакой тип (kWNothing)
кон
5.5 Алгоритм обработки оператора присваивания – fprisv
нач
если позиция ‘=’ в текущей строке больше нуля то fprisv=правда иначе fprisv=ложь
выход
все
увеличиваем на 1 nstr2 и kstr2
проверяем все до ‘=’ на допустимость имнени переменной
проверяем все после ‘=’ на ae2
проверяем на ‘;’ в конце
если ошибка то обработка ошибки с кодом 13 иначе
выводим в вых поток все до ‘=’
выводим в вых поток ‘:=’
выводим в вых поток все после ‘=’
выводим в вых поток ‘;’
кон
5.6 Алгоритм обработки ошибки – ferror
нач
в соответствии с кодом ошибки выводим в коментариях соответствующее сообщение и ошибочную строку
увеличиваем на 1 кол-во ошибок
кон
5.7 Алгоритм обработки ключевого слова float
нач
увеличиваем на 1 nstr2 и kstr2
пропускаем 5 символов
если не v_open то
выводим в вых поток ‘var’
увеличиваем на 1 nstr2 и kstr2
все
проверяем все, что между ‘float’ и ‘;’ на допустимоть имен переменных
если ошибка то обработка ошибки с кодом 12 все выход
заносим переменную в массив перемненых
если не массив то выводим в вых поток имя переменной и ‘:real;’
иначе выводим в вых поток имя переменной
выводим в вых поток ‘:array[1..’
выводим в вых поток число, которое заключено в ‘[]’
выводим в вых поток ‘] of real;
v_open = правда
если ошибка то обработка ошибки с кодом 12 все выход
кон