Устройство для обработки символьной информации
Реферат
Изобретение относится к автоматике и вычислительной технике и может быть использовано для обработки символьной информации. Целью изобретения является расширение функциональных возможностей за счет анализа на допустимость использования лексем. Цель достигается тем, что устройство содержит регистр, три триггера, два элемента И, три блока кодирования лексем, блок анализа лексем, два преобразователя лексем, блок идентификации лексем, блок памяти, блок постоянной памяти, блок координации лексем, операционный блок и элемент ИЛИ. 8 з. п. ф-лы, 21 табл. +8 программ табличного типа, 16 ил.
Изобретение относится к автоматике и вычислительной технике и может быть использовано для обработки символьной информации.
Известно устройство для лексического анализа программ, содержащее блок преобразования кода литер в код лексем, регистр, группу элементов ИЛИ, две группы элементов И, семь элементов И, пять элементов ИЛИ, четыре элемента задержки, одновибратор, два триггера, счетчик позиций, счетчик литер, дешифратор, элемент ИЛИ-НЕ. Устройство способно осуществлять лексический анализ текста, в результате которого на его выход поступают лексемы. Недостатком устройства являются узкие функциональные возможности, поскольку на текст налагаются существенные ограничения как на структурное представление, так и на представление отдельных элементов. Известно устройство лексического анализа символьного текста, содержащее входной и выходной регистры, шифратор, три коммутатора, блок управления подстановкой, блок сравнения, блок памяти текстов подстановок, шифратор текста подстановок, блок синхронизации, элемент ИЛИ-НЕ, элемент ИЛИ. Данное устройство позволяет осуществить лексический анализ текста с произвольной структурой представления. Это достигается за счет разделения текста на элементы посредством трех специфических символов: разделитель, начало комментария; конец комментария. Символы, входящие в элементы, называются информационными. К недостаткам устройства следует отнести узкие функциональные возможности, связанные с ограничением на представление определенного типа элементов текста. Известно устройство для лексического анализа метамикроассемблера, содержащее входной и выходной регистры, шифратор, коммутатор, генератор синхроимпульсов, блок памяти номера алфавита, дешифратор, триггер, два элемента И, элемент ИЛИ, шифратор типов лексем, буферный регистр, блок сравнения, два элемента НЕ. Устройство кроме функций, выполняемых указанными ранее устройствами, способно осуществлять лексический анализ текста с произвольным структурным представлением, который состоит из символов четырех типов: разделитель, начало комментария, конец комментария, информационный символ. Недостатком данного устройства являются ограниченные функциональные возможности, связанные с необходимостью сопровождения лексем идентификатором типа. Наиболее близким по технической сущности к заявляемому устройству является устройство для лексического анализа метамикроассемблера, содержащее два регистра, инфомрационный вход первого из которых является информационным входом устройства, а выход второго является информационным выходом устройства, шифратор, коммутатор, блок памяти номера алфавита, блок управления, причем выход первого регистра соединен с первыми входами шифратора и коммутатора, выход шифратора соединен с входом блока управления, первый, второй, третий и четвертый выходы которого соединены соответственно с вторым и третьим выходами коммутатора, с первым входом второго регистра и с управляющим входом первого регистра, выход коммутатора соединен с вторым входом второго регистра, выход блока памяти номера алфавита соединен с вторым входом шифратора. Блок управления прототипа содержит три триггера, четыре элемента И, элемент ИЛИ, генератор синхроимпульсов, две группы элементов И, дешифратор, вход которого является входом блока, а первый, второй, третий и четвертый выходы соединены соответственно с первым и вторым входами первого триггера, с первым входом второго триггера и с первым входом первого элемента И, выход которого соединен с вторым входом второго триггера и с первым входом второго элемента И, причем выход второго триггера соединен с первым входом третьего элемента И и с входом третьего триггера, выход которого подключен к второму входу третьего элемента И, выход последнего соединен с вторым входом блока и с первым входом четвертого элемента И, выход которого соединен с первым входом элемента ИЛИ, выход последнего соединен с третьим входом блока, выход генератора синхроимпульсов соединен с четвертым входом блока и с вторыми входами второго и четвертого элементов И, выход второго элемента И соединен с вторым входом элемента ИЛИ, второй вход первого элемента И соединен с выходом первого триггера. В отличии от аналогов прототип позволяет выделять лексемы без определения их типа. К недостаткам прототипа относятся ограниченные функциональные возможности и, как следствие, ограниченная область применения, так как устройство не анализирует допустимость использования конкретных лексем в отдельных элементах текста, а также не способно кодировать лексемы и представлять заданный текст в закодированном виде. Цель изобретения - расширение функциональных возможностей за счет анализа на допустимость использования лексем. На фиг. 1 приведена функциональная схема устройства; на фиг. 2, 3 и 4 - функциональные схемы блока анализа лексем, блока кодирования лексем, преобразователя лексем соответственно; на фиг. 5, 6 - функциональные схемы узла поиска и узла настройки, входящих в состав блока анализа лексем, блока кодирования лексем и преобразователей лексем приведены соответственно; на фиг. 7 представлена схема тактирующего элемента; на фиг. 8 приведена функциональная схема узла формирования цепочки лексем, входящего в состав преобразователей, лексем; на фиг. 9 приведена схема элемент памяти, являющегося составной частью узла формирования цепочки лексем; на фиг. 10 и 11 представлены функциональные схемы блока постоянной памяти и блока координации лексем соответственно; на фиг. 12 и 13 приведены схемы блока идентификации лексем и операционного блока; на фиг. 14-16 приведен алгоритм работы операционного блока. Устройство для обработки символьной информации содержит регистр 1, три триггера 2, 4, 5, два элемента И 3, 6, блок 7 постоянной памяти, блок 8 памяти, блок 9 идентификации лексем, блок 10 координации лексем, операционный блок 11, два преобразователя 12, 13 лексем, блок 14 анализа лексем, три блока 15, 16, 17 кодирования лексем, элемент ИЛИ 18 и имеет входы 19, 20, 25-32, 35-37 и выходы 21-24, 33, 34. Блок 14 анализа лексем (фиг. 2) содержит узел 38 настройки, узел 39 поиска, схему 40 сравнения и имеет информационные входы 41, 42, управляющие входы 43, 44, группу информационных выходов 45 и управляющий выход 46. Блок кодирования лексем (фиг. 3) содержит узел 47 настройки, узел 48 поиска, узел 49 памяти и имеет информационные входы 50, 51, управляющий вход 52, группу информационных выходов 53 и управляющий выход 54. Преобразователь лексем (фиг. 4) содержит узел 55 формирования цепочки лексем, узел 56 настройки, узел 57 поиска и имеет информационные входы 58, 59, 60, управляющие входы 61, 62, информационный 63 и управляющий 64 выходы. Узел поиска (фиг. 5) содержит мультиплексор 65, три элемента ИЛИ 66, 75, 76, элемент 67 памяти, две схемы 68, 71 сравнения, элемент И 69, счетчик 70, два триггера 72, 73, тактирующий элемент 74 и имеет информационные входы 77-80, управляющие входы 81, 82, выходы 83-85. Узел настройки (фиг. 6) содержит элемент 86 памяти, элемент И 87, счетчик 88, элемент 89 задержки, мультиплексор 90 и имеет информационный вход 91, управляющие входы 92-94, настроечный вход 95, информационные выходы 96, 97, управляющий выход 98. Тактирующий элемент (фиг. 7) содержит триггер 99 и элемент 100 и имеет входы 101-103 и выходы 104, 105. Узел формирования цепочки лексем (фиг. 8) содержит элемент 106 памяти, три триггера 107, 108, 116, два тактирующих узла 109, 123, восемь элементов ИЛИ 110, 115, 117, 118, 126, 128, 129, 130, счетчик 111, шесть схем 112, 114, 120, 122, 124, 127 сравнения, элемент 113 постоянной памяти, элемент НЕ 119, два элемента И 121, 125 и имеет входы 131-136 и выходы 137-139. Элемент памяти (фиг. 9) содержит счетчик 106.1, память 106.2, двадцать пять регистров 106.3-106.27 и двадцать пять триггеров 106.28-106.52. Блок постоянной памяти (фиг. 10) содержит элемент 7.1 задержки, группу элементов И 7.2, элемент ИЛИ 7.3, счетчик 7.4, память 7.5 и n (n-7*a+b) байтовых регистров (7.11-7. N, где N = 11+n). Блок координаций лексем (фиг. 11) содержит элемент 10.1 памяти, сумматор 10.2, регистр 10.3, элемент ИЛИ 10.5, схему 10.6 сравнения, элемент 10.7 задержки и элемент И 10.8. Блок идентификации лексем (фиг. 12) содержит пять тактирующих узлов 9.1, 9.8, 9.11, 9.18, 9.20, триггер 9.3, восемь элементов И 9.4, 9.5, 9.9, 9.10, 9.19, 9.27, 9.28, 9.29, восемь элементов ИЛИ 9.2, 9.6, 9.7, 9.12, 9.16, 9.17, 9.21, 9.31, два счетчика 9.13, 9.22, две схемы 9.15, 9.24 сравнения, две памяти 9.14, 9.23, два элемента 9.25, 9.32 задержки и два элемента НЕ 9.26, 9.30. Операционный блок (фиг. 13) содержит четыре элемента 11.21, 11.22, 11.26, 11.27 памяти, два элемента И 11.1, 11.3, три элемента ИЛИ 11.2, 11.4, 11.24, три коммутатора 11.25, 11.28, 11.29, счетчик 11.31, мультивибратор 11.5, сумматор 11.30, три элемента 11.23, 11.32, 11.33 задержки, пятнадцать триггеров 11.6-11.20. Работа устройства основана на рекурсивном принципе обработки символьной информации. Для использования данного принципа необходимо предварительное составление рекурсивного описания функции обработки символьной информации, т. е. разработка рекуррентных выражений, под лежащих реализации с помощью аппаратных блоков устройства. Работа устройства заключается в вычислении по рекуррентным соотношениям последующих значений функций для заданного аргумента при известном предыдущем значении функции. В устройстве предусмотрен режим работы прототипа, а именно выделение последовательности лексем, разделенных внутренним разделителем. Предлагаемое устройство спосоно выполнять кодирование программ, написан -ных на языке типа ассемблера. Рассмотрен пример с ориентацией на аналоговый микропроцессор к1813ве1. Для языка ассемблера к1813ве1 характерны следующие особенности. Исходный текст состоит из операторов, следующих друг за другом, оператор может быть командой микропроцессора, командой транслятора (псевдокомандой ПК) или строкой комментария. Первым оператором исходного текста является оператор, соответствующий заголовку, последним оператором - оператор конца. Операторы, находящиеся между начальным и конечным, объединяются в логические структуры двух типов (сегмент данных и программный сегмент). Каждый сегмент начинается оператором определения базового адреса и заканчивается оператором конца. Текст оператора состоит из базовых элементов языка, разделенных пробелами или другими разделителями. Обработка исходного текста заключается в последовательной обработке операторов. Обработка каждого оператора заключается в преобразовании его в цепочку лексем и дальнейшей параллельной обработке всех лексем цепочки. Структура исходного текста приведена ниже. Заголовок (ПК 'ТITL') Определитель базы сегмента данных (ПК 'ORD') Cегмент данных Определитель конца сегмента данных (ПК 'END') Определитель базы программного сегмента (ПК 'ORG') Программный сегмент Определитель конца программного сегмента (ПК 'END' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Определитель конца программы (ПК 'END') B исходном тексте допустимы следующие два формата операторов формат Лексема 1 формируется из символа ': ' и последовательности информационных символов (является меткой оператора). Лексема 2 формируется из последовательности информационных символов (является мнемоникой цифровой операции микропроцессора для ф1 или мнемоникой псевдокоманды для ф2. Лексема 3 для ф1, формируется из символов, являющихся единицами или нулями (является операндом псевдокоманды). Лексема 3, лексема 4 для ф2 формируются из символов, являющихся единицами и нулями или последовательностью информационных символов (является первым (3) или вторым (4) операндом цифровой операции. Лексема 5, лексема 6 формируются из последовательности информационных символов (являются мнемоникой корректора масштаба (5) и аналоговой операции (6). Если информативная часть лексемы меньше ее фиксированной длины, то оставшаяся справа часть заполняется пробелами. Ниже приведен пример программы на языке ассемблера к1813ве1. Функции обработки исходного текста приведены ниже. Используемые параметры и элементарные функции приведены в табл. 1 и 2 соответственно. Перечень всех функций с их краткой аннотацией приведен в табл. 3. На вход устройства подается исходный текст, состоящий из операторов, представленных в соответствии с языком ассемблера к1813ве1. Далее каждый оператор преобразуется в стандартную структуру ассемблера - цепочку лексем (количество лексем в цепочке определяется форматом оператора). Далее каждая лексема из цепочки кодируется, что приводит к получению закодированной цепочки лексем. Закодированные цепочки лексем объединяются, что позволяет получить закодированный исходный текст. Правила записи функций. Рекурсивная функция определяется в виде рекурсивного процесса, который реализуется по шагам. На кадом шаге процесса происходит приращение аргумента, предварительно разделенного на части и занумерованного в соответсвтвии с выбранной нумерацией, рекурсивный процесс описывается тремя компонентами: k( $) - определяет начальное значение; k(p1, p2, . . . , m N) - определяет значение на каждом шаге рекурсии, где m определяет обработанную часть аргумента; N определяет часть аргумента, соответствующую текущему шагу, значением является номер из выбранной системы нумерации; р1, р2, . . . - параметры, RA(k) - определяет завершение рекурсивного процесса (процесс завершается при единичном значении RA(k), RA проверяется перед выполнением каждого шага рекурсивного процесса Функция обработки исходного текста. S является функцией обработки занумерованного исходного текста и представляет собой совокупность функций, имеющих одинаковые аргументы и выполняемых параллельно. В качестве аргумента выступает исходный текст, представленный в соответствии с языком ассемблера. Нумерация исходного текста заключается в разделении его на операторы языка ассемблера, которые естественным образом нумеруются в их последовательности. На каждом шаге рекурсивного процесса обрабатывается один оператор из последовательности. Результатом каждого шага является код текущего оператора. По завершении рекурсивного процесса закодирован весь исходный текст. Значение начального состояния S определяется совокупностью значений начальных состояний параллельно выполняемых функций. Завершение рекурсивного процесса осуществляется по достижении равенства текста на входе устройства и обработанного текста. S($) = St($)! Ssd($)! Sd($)! Ssk($)! Sk($)! Ssm($)! Smm($)! Sma($)! Sse($)! Se($) S(w FL) = St(w FL)! Ssd(w FL)! Sd(w FL)! Ssk(w FL)! (1) Sk(w FL)! Ssm(w FL)! Smm(w FL)! Sma(w FL)! Sse(w FL)! Se(w FL) RA(S) = Comp(St(w FL), St( $ )), где w - обработанная часть исходного текста; FL - код цепочки лексем оператора исходного текста, соответствующего текущему шагу рекурсивного процесса (определяется через функцию FL); St определяет значение состояния обработки исходного текста. Начальное значение соответствует нулю. Значение St на каждом шаге рекурсивного процесса определяется значением текущего состояния St, которое наращивается на величину, выбранную из табл. 4 (псс), в соответствии со сформированным указателем, который в свою очередь, зависит от результатов работы функции FL и текущего значения St. St( $) = 0 St(w FL) = St(w) + Read(псс, (Comp(FL2p, KTIT)! ! Comp(FL2p, RORD)! ! Comp(FL2p, KORG)! ! (1.1) Comp(FL2p, KEND)! ! Comp(St, KC3)! ! Comp(St, KC2)! ! Comp(St, KC1) ) ), Ssd определяет значение указателя (счетчика) данных. Начальное значение соответствует нулю. Значение Ssd на кадом шаге рекурсивного процесса определяется текущим значением состояния Ssd и смысловым значением текущей части аргумента (оператор исходного текста), которое определяется значением FL2p и может быть одним из следующих: псевдокоманда задания начального адреса (ПК ODR), псевдокоманда определения значения данного (ПК DW), псевдокоманда наращивания указателя (счетчика) данных (ПК DS). При этом произведены следующие действия. Текущее значение указателя (счетчика) устанавливается нулевым и к нулю добавляется значение операнда ПК ORD (FL3f), при этом учитывается возможность некорректности операнда (FL3c), в результате которой значение указателя (счетчика) остается нулевым. Текущее значение указателя (счетчика) инкриментируется. Текущее значение указателя (счетчика) наращивается на величину операнда ПК DS (FL3f), при этом учитывается возможность некорректности операнда (FL3c), в результате которой указатель (счетчик) остается в исходном состоянии. При других значениях FL2p значение указателя (счетчика) не изменяется. Ssd( $ ) = 0 Ssd(w FL) = Ssd(w) + Comp(FL2p, KORD)*(_ Ssd(w) + FL3f* _ FL3c) + Comp(FL2p, KDW) + (1.2) Comp(FL2p, LDS)*FL3f*_ FL3c). Sd формирует таблицу данных. Начальное значение нулевое. Значение Sd на каждом шаге рекурсивного процесса определяется текущим значением состояния таблицы данных, которая дополняется новой строкой. Указателем строки является значение функции Ssd. Значение, . заносимое в строку, определяется значением операнда ПК DW (FL3f). Если текущий операнд не является псевдокомандой DW (FL2p) или операнд ПК DW не корректен (FL3c), то значение соответствующей части строки не изменяется. Sd( $) = 0 Sd(w FL) = Sd(w) # Comp(FL2p, KDW) * Write(FL3f, Ssd)*_ FL3c (1.3) Ssk определяет значение указателя (счетчика) команд. Начальное значение соответствует нулю. Значение Ssk на каждом шаге рекурсивного процесса определяется текущим значением Ssk и смысловым значением текущей части аргумента (оператор исходного текста), которое определяет значение FL2p и может быть одним из следующих: псевдокоманда задания начального адреса, команда микропроцессора. При этом произведены следующие действия. Текущее значение указателя (счетчика) устанавливается нулевым и к нему добавляется значение операнда ПК ORG (FL3f), при этом учитывается возможность некорректности операнда (FL3c), при наличии которой состояние указателя (счетчика) остается нулевым. Текущее значение указателя (счетчика) инкриментируется. При других значениях FL2p содержимое указателя (счетчика) не изменяется. Ssk($ ) = 0 Ssk(w FL) = Ssk(w) + (_ Ssk(w) + FL3f*_ FL3c)* (1.4) Comp(FL2p, KORG) + Comp(FL2p, кмп), Sk формирует таблицу команд. Начальное значение таблицы нулевое. Значение Sk на каждом шаге рекурсивного процесса определяется текущим значением таблицы команд, которое дополняется новой строкой. Указаталем строки является значение функции Ssk(1.4). Значение, заносимое в строку, определяется смысловым значением текущего оператора исходного текста, а именно цифровой операцией (FL2f); значением операндов 1/2 (FL3f/FL4f), если они заданы кодом и корректны, на что указывает совокупность признаков (FL3c/FL4c, FL3p/FL4p), или значением, выбранным из таблицы адресов меток (тма) по указателю, сформированному посредством кодирования операнда (FL3f/FL4f), при условии, что таковая метка имеется (FL3c/FL4c, FL3p/FL4p); корректором масштаба (FL5f), если последний корректен (FL5c); аналоговой операцией (FL6f), если она корректна (FL6c). Вышеуказанные элементы определяют значения частей строки таблицы команд, которые объединяются посредством конкатенации. При некорректности какого-либо элемента значение соответствующей ему части остается нулевым. Если текущий оператор исходного текста не является командой микропроцессора (FL2c), значение строки таблицы не меняется. Sk(w) = 0 Sk(w FL) = Sk(w) # Write({ FL2f! ! (FL3f*FL3c* _ FL3p + FL3c*FL3p*Read(Sma(w), FL3f) )! ! (FL4f*FL4c*_ FL4p _ FL4c*FL4p* (1.5) Read(Sma(w), FL4f) )! ! FL5fFL5c FL6f*FL6c } , Ssk(w) ) * FL2c*comp(FL2p, кмп). Ssm определяет значение указателя (счетчика) меток (для идентификации превышения допустимого колилчества меток). Начальное значение соответствует единице. Значение Ssm на каждом шаге рекурсивного процесса определяется смысловым значением оператора исходного текста. Если он содержит информацию о метке (FL1p), то значение указателя (счетчика) инкриментируется. Ssm(w) = 1 Ssm(w FL) = Ssm(w) + FL1p. (1.6) Smm формирует таблицу мнемоник меток (тмм). Начальное ее состояние следующее: первая строка соответствует значению метки, определяемой только пробелами (что интерпретируется в языке как отсутствие метки), остальные строки имеют нулевое значение. Значение Smm на каждом шаге рекурсивного процесса определяется текущим значением Smm, которое дополняется новой строкой таблицы. Указателем строки является значение функции FL1f(2.1.1). Знаение, заносимое в строку, определяется значением метки G(1, St(w)). Если текущий оператор не имеет метки (FL1p) или метка используется повторно, то значение строки таблицы не меняется. Smm( $ ) = 0 Smm(w FL) = Smm(w) # FL1c*FL1p*Write(G(1, St, FL1f). (1.7) Sma формирует таблицу указателей (адресов) меток (тма). Начальное ее состояние нулевое. Значение Sma на каждом шаге рекурсивного процесса определяется текущим состоянием Sma, которое дополняется новой строкой таблицы. Указателем строки является значение функции FL1f(2.1.1). Значение, заносимое в строку, определяется смысловым значением текущего оператора исходного текста, которое может быть одним из следующих: псевдокоманда DW, псевдокоманда EQU, при этом произведены следующие действия. Строка таблицы принимает значение указателя (счетчика) данных (Ssd). Строка таблицы принимает значение операнда ПК EQU (FL3f) при условии, что последний является корректным кодом (FL3c, FL3p). Если текущий оператор не имеет метки (FL1p) или метка используется повторно (FL1c), то значение строки не меняется. Sma( $ ) = 0 Sma(w FL) = Sma(w) # FL1c*FL1p*Write(Ssd* Comp(FL2p, KDW) + FL3f*_ FL3c*_ FL3p* (1.8) Comp(FL2p, KEQU} , FL1f) Sse определяет значение указателя (счетчика) таблицы признаков. Начальное значение соответствует нулю. Состояние Sse на каждом шаге рекурсивного процесса определяется через инкриментирование текущего состояния. Sse( $ ) = 0 Sse(w FL) = Sse(w) + 1. (1.9) Se является функцией формирования таблицы признаков. Начальное состояние таблицы нулевое. Значение Se на кадом шаге рекурсивного процесса определяется текущим значением таблицы ошибок, которое дополняется новой строкой. Указателем строки является значение функции Sse(1.9). Значение, заносимое в строку, определяется результатом обработки текущего оператора исходного текста и состоит из элементов (FL1c, FL1p, FL2c, FL2p, FL3c, FL3p, FL4c, FL4p, FL5c, FL6c), объединенных посредством конкатенации. Se( $ ) = 0 Se(w FL) = Se(w) # Write( { FL1c! ! FL1p! ! FL2c! ! FL2p! ! FL3c! ! FL3p! ! FL4c! ! (1.10) FL4p! ! FL5c! ! FL6c } , Sse). Функция кодирования цепочки лексем FL(2) представляет собой ряд параллельно выполняемых функций, кадая из которых реализует кодирование конкретной лексемы (FL1-лексемы 1, FL2-лексемы 2, FL3-лексемы 3, FL4-лексемы 4, FL5-лексемы 5, FL6-лексемы 6). Формирование цепочки лексем реализуется функцией L. FL(L) = FL1! FL2! FL3! FL4! FL5! FL6, (2) где L - цепочка лексем оператора исходного текста (определяется через функцию L). FL1 выполняет кодирование лексемы1 (метка) и является совокупностью параллельно выполняемых функций (FL1f, FL1c, FL1p). Перед выполнением FL1 осуществляется вызов функции FND (4), которая осуществляет поиск в таблице мнемоник меток Smm по аргументу, соответствующему лексеме1. В результате поиска в FNDf сформирован указатель на строке Smm, соответствующей либо первой незаполненной строке (искомая лексемF в таблице не найдена и FNDx = 0), либо строке Smm с искомой лексемой (FNDx = 1). FL1(FND(1, St, Smm)) = FL1f! FL1c! FL1p, (2.1) FL1f соответствует указателю строки таблицы мнемоник меток Smm, по которому необходимо занести лексему1. Это действие выполнено функцией Smm(1.7). FL1f = FNDf. (2.1.1) FL1c идентифицирует корректность лексемы. Если в таблице мнемоник меток Smm уже зафиксирована метка, соответствующая лексеме1 (т. е. поиск завершился нахождением искомой мнемоники и FNDx = 1), то лексема1 соответствует повторной метке, что свидетельствует о некорректности. FL1c = _ FNDx. (2.1.2) FL1p идентифицирует наличие лексемы. Это связано с допустимостью (в рамках данного языка) отсутствия лексемы1 в операторе исходного текста. Для определения этой ситуации первая строка таблицы меток всегда содержит нулевые коды, соответствующие пустому значению лексемы1. Таким образом, соответствие полученного указателя (FNDf) первой строке таблицы мнемоник меток свидетельствует о том, что метка в текущем операторе исходного текста отсутствует. FL1p = _ Comp(FL1f, 0). (2.1.3) FL2 выполняет кодирование лексемы2 (мнемоника цифровой операции или псевдокоманды) и является совокупностью параллельно выполняемых функций (FL2f, FL2c, FL2p). Перед выполнением FL2 осуществляется вызов функции FND (4), которая осуществляет поиск в таблице лексемы2 кмл2 (табл. 5) по аргументу, соответствующему мнемонике лексемы 2. В результате поиска в FNDf сформирован указатель строки таблицы кмл2. Единичное значение FNDx свидетельствует о том, что искомая мнемоника в таблице найдена. Нулевое значение FNDx свидетельствует об обратном. FL2(FND(2, St, KMл2) = FL2f! FL2c! FL2p. (2.2) FL2f определяет код лексемы2, если ее мнемоника допустима (FNDx = 1). Код извлекается из таблицы кл2 (табл. 6) из части кл2n по указателю, соответствующему значению FNDf. Если текущий оператор является псевдокомандой, то в FL2f установлен нулевой код. FL2f = Read(кл2, FNDf)*_ FNDx). (2.2.1) FL2c идентифицирует корректность лексемы2. Нулевое значение свидетельствует о том, что мнемоника лексемы не допустима в рамках данного языка. FL2c = FNDx. (2.2.2) FL2p доопределяет содержимое лексемы2, если она корректна (FNDx = 1). Для этого из таблицы кл2 (табл. 6) из части кл2n указателю FNDf извлечено одно из следующих значений: 00000001 - соответствует команде микро- процессора 00000010 - соответствует ПК ЕQV 00000100 - ПК DS 00001000 - ПК DW 00010000 - ПК END 00100000 - ПК ORG 01000000 - ПК ORD 10000000 - ПК TIT FL2p = Read(кл2n, FNDf)*_ FNDx. (2.2.3) FL3/FL4 выполняет кодирование лексемы 3/4 (операнда 1/2) и является совокупностью параллельно выполняемых функций (FL3f/FL4f, FL3c/FL4c, FL3p/FL4p). Перед выполнением FL 3/4 осуществляется вызов функции p(3), которая формирует значение операнда. FL3(P(3, St, G(3, St, L)) = FL3f! FL3c! FL3p; (2.3) FL3f = Pf; (2.3.1) FL3c = Pz; (2.3.2) FL3p = Pd; (2.3.3) FL4(P(4, St, G(4, St, L)) = = FL4f FL4c FL4p; (2.4) FL4f = Pf (2.4.1) FL4c = Pz; (2.4.2) FL4p = Pd. (2.4.3) FL5/FL6 выполняет кодирование лексемы 5/6 (корректор масштаба/аналоговая операция) и является совокупностью параллельно выпоняемых подфункций (FL5f/LF6f, FL5c/FL6c). Перед выполнением FL5/FL6 осуществляется вызов функции FND (4), которая осуществляет поиск в таблице мнемоник лексемы 5/6 кмл5/кмл6 (табл. 7, табл. 9) по аргументу, соответствующему лексеме 5/6. В результате поиска в FNDf сформирован указатель соответствующей строки таблицы кмл5/кмл6. Нулевое значение FNDy свидетельствует о том, что искомая лексема в таблице не найдена, а единичное значение FNDx - об обратном. FL5f/LF6f определяет код лексемы 5/6 в случае, если используемая мнемоника допустима (FNDx = 1). Код извлекается из таблицы кл5/мл6 (табл. 8/10) по указателю, соответствующему значению FNDf. FL5c/FL6c идентифицирует корректность лексемы 5/6. Нулевое значение свидетельствует о том, что в рамках данного языка используемая мнемоника недопустима. FL5(FND(5, St, КМл5) ) = FL5f FL5c (2.5) FL5f = FNDx*Read(Кл5, FNDf); (2.5.1) FL5c = FNDx; (2.5.2) FL6(FND(6, St, КМл6) ) = FL6f FL6c (2.6) FL6f = FNDx*Read(Кл6, FNDf); (2.6.1) FL6c = FNDx (2.6.2) Функция кодирования операнда. Р выпоняет обработку лексемы 3 или 4. В зависимости от значения лексема может восприниматься как метка (первый символ лексемы не соответствует коду нуля или единицы) либо как значение адреса (в противном случае). Для обработки метки инициируется функция FND, с ее помощью устанавливлается ссылка на таблицу адресов меток (Sma), где определена анализируемая метка. FND при этом реализует поиск в таблице мнемоник меток (Smm) по лексеме, определенной по номеру 1 и коду состояния процесса обработки. В этом случае результатом работы р будет соответствующая ссылка на строку таблицы адресов меток (Sma). Обработка значения адреса заключается в преобразовании символьного представления в двоичный код с параллельным анализом каждого символа на корректность. В соответствии с нумерацией обрабатываемая лексема разделена на символы. На каждом шаге рекурсивного процесса осуществляется анализ и кодирование выбранного символа. Результатом каждого шага является двоичный код символа. По завершении рекурсивного процесса закодирован весь операнд. Ps реализует функцию отслеживания размерности операнда (в сегменте данных 25 символов, в программном сегменте 6 символов для первого и второго операндов). Pd идентифицирует вид задания операнда: = 1 - метка; = 0 - код pz определяет признак некорректности операнда; = 0 - корректен; = 1 - не корректен. Завершение процесса определяется установкой в единицу RA(P), что диктуется появлением одной из следующих ситуаций: операнд был задан меткой (FNDx = 1); логический конец лексемы (x = k''), физический конец лексемы (размерность лексемы исчерпана - определяется по табл. 12), в лексеме присутствует недопустимый символ (Pz = 1) лексемы). Синтаксис функции р: p(l, C, F), где l - номер лексемы; С - значение состояния процесса обработки; F - значение лексемы. P(l, C, $ ) = FND(l, C, Smm)! Pf( $ )! Ps( $ )! Pz( $ )! Pd( $ ); P(l, C, f y) = Pf(f y)! Ps(f y)! Pz(f y)! Pd(f y); (3) RA(P) = FNDx + Cmp(Ps, Read (non, C) + Comp(Y, K'') + Pz Pf( $ ) = 0; Pf(f y) = SD(Pf(f) + Z(y)). (3.1) Ps( $ ) = 0; Ps(f y) = Ps(f) + 1. (3.2) Pz( $ ) = 0; (3.3) Pz(f y) = Pz(f) + _ (Comp(y, K1) + Comp(y, KO) + Comp(y, K'')). Pd( $ ) = 1; Pd(f y) = Pd(f)*FNDx. (3.4) Функция поиска. FND выполняет поиск искомой величины в таблице поиска. Искомая велилчина определяется через функцию G, которая из цепочки лексем, сформированной функцией L, выделяет конкретную лексему. Выбор лексемы определяется форматом (St) и номером лексемы в цепочке лексем. FND является совокупностью функций (FNDf, FNDx). В процессе ее работы используется функция G. В соответствии с нумерацией таблица поиска разделена на строки. На каждом шаге рекурсивного процесса осуществляется анализ на равенство содержимого выделенной строки таблицы и выделенной лексемы. Результатом каждого шага является результат вышеописанного сравнения. По завершении рекурсивного процесса установлена ссылка на строку таблицы поиска. Ссылка может задавать строку, соответствующую искомой величине, логический конец таблицы поиска. Синтаксис функции FND: FND(l, C, M), где l - номер лексемы, с которой идет работа; С - значение состояние процесса обработки; М - таблица поиска. Функция FND реализуется следующим образом. Первоначально определяется точка, с которой идет поиск в таблице поиска М (начальное состояние FND). Далее осуществляется поэлементный просмотр таблицы М и сравнение с искомой величиной. Начальное состояние FND определяется исходя из таблицы границ тгп поиска части пнк (табл. 11). Процесс поиска завершается по двум причинам: найдена искомая лексема, вся таблица поиска М просмотрена. Логический конец таблицы определяется исходя из таблицы границ поиска тгп части пкк (табл. 11). FND(l, C, $ ) = G(l, C, L)! FNDf(l, C, $)! FNDx(l, C, $); FND(l, C, M z) = FNDf(l, C, M z)! FNDx(l, C, M z) (4) RA(FND) = FNDx + Comp(G, z). FNDf(l, C, $ ) = Read(пнк(l), C); FNDf(l, C, M z) = FND(l, C, M) + 1 (4.1) FNDx(l, C, $ ) = 0; FNDx(l, C, M z) = FNDx(l, C, M) + Comp(FNDf, Read(пкк(l), C). ) (4.2) Функция формирования цепочки лексем. L обеспечивает формирование цепочки лексем из набора символов т. Количество лексем в цепочке определяется исходя из текущего состояния обработки текста (табл. 12). Посредством функции D определяется наличие лексемы1. Каждая лексема формируется с помощью функции V. L(St, 0) = Lf(St, 0)! Ls(0); L(St, j+1) = Lf(St, j+1)! Ls(j+1); RA(L) = Comp(Ls, Read(тф, St) ); Lf(St, 0) = 0; Lf(St, j+1) = Lf(St, j) + Vf(St, Ls, T); Ls(0) = 0+D(T); Ls(j+1)= Ls(j) + 1. V обеспечивает левостороннее представление лексемы (если длина ее меньше максимально допустимой). Длина определяется из таблицы тл в зависимости от текущего состояния обработки текста (St) и номера лексемы (1). Значение лексемы формируется с помощью функции М. V(St, l, 0) = M(St, l, T)! Vf(0)! Vs(0); V(St, l, k+1) = Vf(k+1)! Vs(k+1); RA(V) = (Comp(Vs, Read(тл, (St! ! l)) ))*_ PR +Comp(k, 1)*PR; Vf(0) = Mf; Vf(k+1) = SD(Vf(k)); Vs(0) = Ms; Vs(k+1) = Vs(k) + 1. M обеспечивает формирование лексемы. Формирование завершается при появлении х, соответствующего управляющему символу (SL), или по достижении физического конца лексемы, который отслеживает функция MS. Длина лексемы определяется из таблицы тл (табл. 13) в зависимости от текущего состояния обработки текста (St) и номера лексемы (l). M(St, l, 0) = Mf(0)! Ms(0); M(St, l, T x) = Mf(T x)! Ms(T x); RA(M) = Copm(f(x), SL) + + (Comp(Ms, Read(тл, (St! ! l)) ))*_ PR; Mf(0) = 0; Mf(T x) = SD(Mf(T)) + x; Ms(0) = 0; Ms(T x) = Ms(T) + 1. D определяет наличие лексемы1 (метки) (D = 0 - есть метка, D = 1 - нет метки). Функция D также обеспечивает игнорирование символов комментария предыдущего оператора. D завершает свою работу при появлении информационного символа или символа ': ', определяющего наличие метки. D(f( $ )) = 0; D(T f(x)) = D(T) + Comp(f(x), l); RA(D) = Copm(f(x), l) + Copm(f(x), U), Примечания: 1 - строки, не указанные в таблицах, имеют нулевые значения; 2 - тгп содержит четыре подтаблицы. Установим соответствие между рекурсивными соотношениями и отдельными структурными элементами устройства. Для реализации функции S используются операционный блок 11 и блок 10 координации лексем. При этом значение функции St определяет состояние регистра 10.3 блока 10, от которого зависит состояние информационного выхода блока 10. Функции Ssk/Ssd определяют значение счетчика 11.31, Функции Sk, Sd определяют состояние линий 16-40, 41-64 второго информационного выхода блока 11. Функция Ssm определяет значения счетчиков 88 в блоках FA, FP1(12), FP2(13). Функция Sma описывает состояние двух элементов 11.26, 11.27 памяти операционного блока. Функция Smm описывает состояние элементов 67 памяти в блоках 14, 12, 13. Функции FL1, FL2, FL3, FL4, FL5 и FL6 реализуются соответственно блокам 14 анализа лексем 14, первым блоком 15 кодирования лексем, первым 12 и вторым 13 преобразователями лексем, вторым 16 и третьим 17 блоками кодирования лексем. Функции FL1p, FL1f и FL1c описывают первую, вторую и третью группы информационного выхода соответствующего блока. Для реализации функции L используются узел формирования цепочки лексем, блок 7 постоянной памяти, регистр 1, блок 8 памяти, три триггера 2, 4, 5 и два элемента И 3, 6. Значение L определяет состояние выхода блока 7. Функция поиска FND реализуется с помощью узлов 39, 48, 57 поиска. Функция FNDf определяет выход А узла поиска, а функция FNDx - выход RA1. Функция формирования операнда р реализуется с помощью узла 55 формирования цепочки лексем. Функция Ps определяет состояние счетчика 111. Функции Pd, Pf, Pz определяют состояние трех групп информационного выхода узла. Устройство работает следующим образом. Запуск устройства осуществляется посредством подачи импульса на вход 19. На информационный вход 20 устройства подается исходный текст, представляющий собой последовательность символов. Из этой последовательности в соответствии с языком ассемблера к1813ве1 формируются операторы, далее каждый оператор преобразуется в стандартную структуру ассемблера - цепочку лексем (количество лексем в цепочке определяется форматом оператора). Далее каждая лексема из цепочки кодируется, что приводит к получению закодированной цепочки лексем. Закодированные лексемы объединяются, что позволяет получить закодированный оператор. Вся совокупность закодированных операторов представляет собой закодированный исходный текст. Основным координирующим блоком устройства является блок 10 координации лексем. Его работа описывается функцией St и обеспечивает запуск устройства (вход 19), прекращение его работы с выдачей соответствующего сигнала (выход 23) и организацию цикличепской работы устройства с помощью сигнала на выходе 22. На каждом цикле устройство обрабатывает один оператор исходного текста, блок координации лексем (фиг. 11) имеет следующие входы: 10.10 - запуск (соответствует входу 19 запуска всего устройства); 10.11 - признак завершения цикла обработки исходного текста (обработки оператора исходного текста); 10.9 - результат выполнения цикла (обработки оператора исходного текста) и следующие выходы: 10.14 - признак окончания обработки исходного текста (соответствует сигналу завершения работы всего устройства 23); 10.13 - запуск очередного цикла обработки; 10.12 - значение текущего состояния процесса обработки исходного текста. Блок координации лексем работает следующим образом. Основным его элементом является регистр 10.3, состояние которого соответствует значению текущего состояния процесса обработки исходного текста. Смена состояния проихсодит при переходе к следующему циклу. Значение текущего состояния и данные на входе 10.9 (определяются результатом работы текущего цикла) объединяются и образуют адрес, по которому из элемента 10.1 памяти (табл. 4) выбрано приращение, обеспечивающее формирование значения следующего состояния. Для этого используется сумматор 10.2. Устройство обработки исходного текста может находиться в следующих состояниях: с0 - ожидание программы; с1 - ожидание сегмента или конца программы; с2 - ожидание конца сегмента данных; с3 - ожидание конца программного сегмента. По значению