Способ преобразования входной программы транслятора и устройство для его осуществления
Предложены способ и устройство для преобразования входной программы транслятора в программу на его выходном языке. Синтаксический анализатор запоминает указатели таблицы идентификаторов для синтаксического дерева вместо запоминания имен в синтаксическом дереве. Таблица идентификаторов имеет текущее действующее определение для каждого идентификатора, которое изменяется при вводе и выводе отдельных блоков входной программы транслятора. Текущее действующее определение всегда указывает на местоположение в таблице символов, где хранится информация о текущем определении идентификатора. Синтаксический анализатор в трансляторе использует информацию, запомненную в синтаксическом дереве для исключения необходимости поиска в таблице символов. 4 с. и 8 з. п. ф-лы, 7 ил.
Изобретение относится к транслятору для машинного языка программирования высокого уровня, в частности к способу и устройству для реализации таблицы кодировки символов, которая обеспечивает быстрый доступ к идентификаторам таблицы кодировки символов.
Транслятор представляет собой машинную программу, которая преобразует программу на входном языке транслятора, составленную на машинном языке высокого уровня, легко воспринимаемом людьми, в программу на выходном языке транслятора, исполняемую вычислительной машиной. В типовом случае транслятор включает несколько функциональных блоков. Например, обычный транслятор может включать лексический анализатор, который осуществляет просмотр в исходной программе транслятора и идентифицирует последовательные лексемы (минимальные единицы языка, имеющие значения) в исходной программе. Обычный транслятор также включает синтаксический анализатор, который получает в качестве входных данных грамматику, определяющую язык, подлежащий транслированию, и последовательность операций, связанных с грамматикой. Синтаксический анализатор образует "синтаксическое дерево" (дерево грамматического разбора) для операторов исходной программы в соответствии с грамматическими правилами и операциями. Для каждого оператора исходной программы синтаксический анализатор генерирует синтаксическое дерево исходного ввода данных рекурсивным способом "снизу вверх" в соответствии с подходящими грамматическими правилами и операциями. Таким образом, синтаксическое дерево формируется из узлов, соответствующих одному или более грамматическим правилам. Генерация синтаксического дерева позволяет синтаксическому анализатору определять, подчиняются ли части входной программы правилам грамматики. Если нет, то синтаксический анализатор генерирует сообщение об ошибке. Таким образом, синтаксический анализатор выполняет синтаксическую проверку, но обычно не проверяет содержание ("семантику") исходной программы. Примером известных средств синтаксического анализа может служить синтаксический анализатор LALR (lookahead, left right - "с просмотром вперед, слева направо"), который описан в главе 4 монографии Aho, Sethi, Ullman, "Compiliers: Principles, Techniques and Tools". Обычные синтаксические анализаторы также создают "таблицу перечня имен" (NL-таблицу), также называемую таблицей кодировки символов, которая отслеживает информацию, касающуюся каждого идентификатора, определенного в исходной программе. Эта информация включает имя и тип каждого идентификатора, его класс (переменная, постоянная, процедура и т.п.), уровень вложенности блока, где он описан, и другую информацию, более специфическую для класса. В обычных трансляторах после того как исходная программа синтаксически проанализирована, она вводится в семантический анализатор, который осуществляет проверку на наличие семантических ошибок, таких как несоответствие типов и т. п. Семантический анализатор обращается к таблице перечня имен для осуществления семантической проверки с использованием идентификаторов. После семантической проверки транслятор генерирует промежуточный код, оптимизирует промежуточный код и генерирует программу на выходном языке. Важно, чтобы транслятор выполнял свои функции быстро и эффективно. В обычных трансляторах построение семантического анализатора обусловливает недостаточную эффективность его функционирования. В частности, в обычных трансляторах семантический анализатор должен выполнять просмотр таблицы перечня имен всякий раз, когда он осуществляет проверку семантики с использованием идентификатора. Линейный поиск в таблице перечня имен требует в среднем N/2 шагов, где N - общее число идентификаторов в NL-таблице. В других известных трансляторах таблица перечня имен рандомизируется (хэшируется) в H перечней, что дает в результате в среднем N/(2
начало /*2*/
a:= "*";
b:= "истина"
конец; /*3*/
начало a:=0;
b:1.0;
конец. В следующем примере показаны структуры данных в различных точках 1, 2 и 3, как показано в комментариях программы p выше. Фиг. 3,а, 3,б и 4 иллюстрируют операции, выполняемые при создании структур данных, представленных на фиг. 5 и 6. В предпочтительном варианте выполнения операции, показанные на фиг. 3,а, выполняются всякий раз, когда вводится программный блок. Аналогично в предпочтительном варианте выполнения, операции, показанные на фиг. 3(б), выполняются, когда определен идентификатор. В многопроходном трансляторе, соответствующем первому варианту осуществления изобретения, операции выполняются синтаксическим анализатором 114. Во втором предпочтительном варианте операции выполняются семантическим анализатором, как показано ниже. На фиг. 5 и 6 показан дисплейный файл 240. Каждый элемент 250 дисплейного файла 240 соответствует блоку (также называемому "уровнем") входной программы 110 транслятора. В рассматриваемом примере программа p представляет первый уровень, а процедура q - второй уровень. Каждый элемент в дисплейном файле 240 указывает на первый элемент и последний элемент в локальном перечне определений для блока. ПЕРВЫЙ указывает на первый элемент в локальном перечне определений, а ПОСЛЕДНИЙ указывает на последний элемент в локальном перечне определений. Каждый локальный перечень определений сформирован из элементов, связанных полями NL_NXTLOC 228 таблицы 204 перечня имен. Структуры данных по фиг. 5 и 6 первоначально создаются синтаксическим анализатором 114 во время создания им синтаксического дерева 133. На фиг. 3, а, когда синтаксический анализатор 114 вводит новый блок, уровень ("L") получает приращение (например, на "один" "1") на этапе 304 (фиг. 3,а). Когда это создается впервые, то дисплейный файл 240 - пустой. Новый локальный перечень определений добавляется для каждого нового блока, вводимого на этапе 306. Каждый локальный перечень определений сначала не заполнен. Элементы добавляются к локальному перечню определений по мере того, как идентификаторы определяются в соответствующем блоке. На фиг. 4 представлена блок-схема алгоритма, иллюстрирующего дополнительные операции, выполняемые для создания структур данных по фиг. 2. Операции, показанные на фиг. 4, выполняются, когда идентификатор определен. Когда синтаксический анализатор 114 обнаружит новое определение идентификатора (операция 402), синтаксический анализатор выполняет операции согласно фиг. 4 для создания нового элемента таблицы перечня имен для идентификатора. Синтаксический анализатор затем добавляет идентификатор к локальному перечню определений для текущего блока. В следующем примере предполагается, что синтаксический анализатор создает элемент таблицы перечня имен для целочисленной переменной "a" программы р. На этапе 404 синтаксический анализатор создает элемент 230 таблицы перечня имен для "a" и запоминает индикацию того, что "a" есть переменная, в поле 232. Синтаксический анализатор 114 также определяет указатель для "a", который идентифицирует соответствующий элемент в таблице идентификаторов 202. Здесь не имеется элемента в таблице идентификаторов 202 для "a", так что элемент 220 создается на этапе 408. На этапе 410, поскольку не имелось элемента в таблице идентификаторов 202 для "a", поле NLJPREV устанавливается на NIL. Если бы имелся элемент для "a" в таблице идентификаторов 202, то поле NL_PREV устанавливалось бы на элемент таблицы перечня имен для "a" на этапе 414. Переменное имя "a" запоминается в поле 222 на этапе 412. На этапе 416 указатель 224 ID_NL установлен для указания на новый элемент 230 таблицы перечня имен. На этапе 418 поле NL_ID 234 устанавливается для указания на новый элемент 220 таблицы идентификаторов. На этапе 420 элемент 230 таблицы перечня имен добавляется к локальному перечню определений и поля ПЕРВЫЙ и ПОСЛЕДНИЙ текущего элемента дисплейного файла 240 устанавливаются для указания на первый и последний поля в локальном перечне определений. На этапе 422 осуществляется возврат указателя к вновь созданному полю 220 таблицы идентификаторов. Возвращенный указатель запоминается в поле 212 соответствующего узла синтаксического дерева. Когда синтаксический анализатор 114 обнаруживает ранее определенный идентификатор, он запоминает указатель для соответствующего элемента таблицы идентификаторов в поле 212 узла синтаксического дерева (вместо запоминания имени идентификатора). На фиг. 5 показана структура данных в точке /*1*/ программы p после определения целочисленного идентификатора "a" и действительного идентификатора "b". Указатель ПЕРВЫЙ элемента 250 дисплейного файла указывает на элемент 230 таблицы перечня имен для "a". Указатель ПОСЛЕДНИЙ указывает на элемент 251 таблицы перечня имен для "b". На фиг. 6 показаны структуры данных в точке /*2*/ в процедуре q после определения символьного идентификатора "a" и логического идентификатора "b". Как показано на фиг. 6, после ввода процедуры q текущий уровень ("L") становится "2", и новый локальный перечень определений (указанный элементом 251) инициализируется для процедуры q. После того как этапы (фиг. 4) выполнены для определений новых идентификаторов "a" и "b" в процедуре q, элементы 220 и 221 в таблице идентификаторов 202 указывают на новые текущие действующие определения для "a" и "b". Таким образом, например, в точке /*2*/ в процедуре q синтаксический анализ определения идентификатора "a" модифицирует элемент 220 в таблице идентификаторов 202 для указания на элемент 260 в таблице перечня имен 206. Аналогично синтаксический анализ отсылки на идентификатор "b" приведет к модифицированию элемента 221 таблицы идентификаторов 202 для указания на элемент 261 таблицы перечня имен 204. В точке /*2*/ программы p текущий элемент 260 таблицы перечня имен для "a" указывает вновь на элемент 230 более высокого уровня для "a". Аналогично текущий элемент 261 таблицы перечня имен для "b" указывает на элемент 231 более высокого уровня для "b". В точке /*3*/ программы p синтаксический анализатор только что обработал код входной программы, который выходит из блока процедуры q, и выполняются операции по фиг. 3,б. На этапе 354 для каждого элемента локального перечня определений (определен указателями 251 ПЕРВЫЙ и ПОСЛЕДНИЙ) каждое поле lD_NL 224 соответствующей таблицы идентификаторов устанавливается для указания либо на вариант более высокого блока для переменной (как индицируется полем NL_ PREV 236) или на NIL. Этап 356 понижает указатель текущего уровня ("L") для указания на элемент 250. Эти операции обеспечивают возврат структур данных к состоянию, показанному на фиг. 5. Таблица идентификаторов 202, таблица перечня имен 204, дисплейный файл 240 и множество локальных перечней определений создаются синтаксическим анализатором 114. Семантический анализатор 116 использует структуры данных при семантическом анализе для быстрого доступа к таблице перечня имен. При выполнении своих операции семантический анализатор 116 устанавливает указатель уровня L для дисплейного файла 240 и поля ID_NL 224 таблицы идентификаторов 202, когда семантический анализатор 116 осуществляет ввод и вывод блоков данных. Нет необходимости создавать структуры данных повторно в ходе семантического анализа, поскольку данные, созданные синтаксическим анализатором, сохраняются в структурах данных. На фиг. 7 представлена блок-схема алгоритма, иллюстрирующая операции, выполняемые при семантическом анализе, в первом варианте осуществления изобретения. Фиг. 7 иллюстрирует функционирование многопроходного транслятора, в котором семантический анализ выполняется после синтаксического анализа. Когда семантический анализатор 116 вводит новый блок входной программы транслятора на этапе 702, уровень дисплейного файла (L) повышается на этапе 704 для указания на другой локальный перечень определений (как он образован полями NL_NXTLOC) таблицы перечня имен 204. Для каждого элемента локального перечня определений соответствующее поле ID_NL 224 таблицы идентификаторов 202 устанавливается для указания на элемент локального перечня определений на этапе 706. В результате осуществления операций на этапах 702-706 соответствующие поля ID_NL устанавливаются для указания на элементы таблицы перечня имен для идентификаторов, вновь определенных в блоке данных. Когда семантический анализатор 116 обнаруживает идентификатор в синтаксическом дереве 133 (этап 708), он использует поле 212 синтаксического дерева для указания на таблицу идентификаторов 202 для получения элемента таблицы перечня имен для идентификатора (этап 710). Поле ID_NL 224 в таблице идентификаторов 202 указывает на текущее действующее определение в таблице перечня имен 204 для идентификатора. Таким образом, семантический анализатор 116 не должен осуществлять поиск в таблице перечня имен 204 для нахождения имени идентификатора. Более того, использование поля ID_NL 224 в таблице идентификаторов 202 обеспечивает то, что семантический анализатор 11 получает доступ к корректной версии идентификатора, если идентификатор определен несколько раз в различных блоках. Когда семантический анализатор 116 выводит блок входной программы на этапе 714 для каждого элемента в текущем локальном перечне определений, соответствующее поле ID_ NL 224 устанавливается на этапе 716 для указания на элемент более высокого блока (или на NIL), как описано выше со ссылками на фиг. 3, б. Уровень (L) дисплейного файла понижается на этапе 718. В результате осуществления операций на этапах 714-718 соответствующие поля ID_NL уже не указывают на идентификаторы, определенные в выведенном блоке. Во втором предпочтительном варианте осуществления изобретения транслятор не выполняет синтаксической и семантической проверок в отдельных проходах. Вместо этого по меньшей мере часть синтаксического и семантического анализа перемешана и поля CED (текущего действующего определения) устанавливаются или восстанавливаются только один раз на блок исходного кода. В этом варианте, например, обработка идентификатора "a" осуществляется следующим образом. Синтаксический анализатор 114 анализирует синтаксически определение для "a" и создает его узел синтаксического дерева. Семантический анализатор 116 создает новый элемент перечня имен для "a" и вводит этот элемент перечня имен в текущий контекст (т. е. устанавливает поле CED идентификатора id(а) для указания на N и обновляет соответствующее поле NL_PREV для указания на предыдущий контекст "a", если он есть). Семантический анализ затем выполняется над определением "a". Установка поля CED в соответствии с новым контекстом "a" сохраняется неизменной до конца блока или до получения нового определения "a". Когда во втором варианте синтаксический анализатор 114 достигает присвоенного определения "a", контекст для "a" уже установлен посредством семантического анализа определения, как описано выше. Семантический анализатор 116 использует указатель синтаксического дерева и поле CED для того, чтобы избежать необходимости поиска в таблице перечня имен для "a" при семантическом анализе присвоенного определения "a". Во втором варианте в конце процедуры или блока семантический анализатор 116 восстанавливает все старые отсылки CED локальных идентификаторов . Таким образом, во втором варианте этапы 304 и 306 (фиг. 3,а), этапы 354 и 356 (фиг. 3,б) и этапы 404-422 (фиг. 4) выполняются семантическим анализатором 116, работающим во взаимосвязи с синтаксическим анализатором 114. Так как семантический анализатор 116 не образует часть отдельного прохода, этапы, показанные на фиг. 7, которые определяют, когда блок введен и выведен, не требуются во втором варианте. В одном из практических примеров осуществления второго варианта подпрограммы семантического анализа обрабатывающие указатели CED представляют собой часть семантических подпрограмм, включенных в качестве операций в грамматику транслируемого языка. Эта реализация рассмотрена в совместно поданной заявке того же заявителя на "Способ и устройство для эффективной оценки семантических признаков при синтаксическом анализе с просмотром вперед, слева направо."
Другие варианты осуществления изобретения могут быть очевидны для специалистов в данной области техники на основе описания изобретения и примеров его использования. Кроме того, для специалистов в данной области техники должно быть ясно, что настоящее изобретение может быть использовано совместно с транслятором для любого языка высокого уровня, использующего таблицу перечня имен (таблицу кодировки символов). Хотя изобретение было описано в связи с обычным семантическим анализатором, ясно, что оно может быть использовано для транслятора, использующего семантические признаки, как описано в вышеупомянутой совместно поданной заявке. Следует иметь в виду, что описание и приведенные в нем варианты осуществления изобретения должны рассматриваться только как возможные примеры, в то время как действительный объем изобретения должен определяться пунктами формулы изобретения.
Формула изобретения
РИСУНКИ
Рисунок 1, Рисунок 2, Рисунок 3, Рисунок 4, Рисунок 5, Рисунок 6, Рисунок 7