способ и устройство для проверки использования полей записей во время компиляции
Классы МПК: | G06F9/455 эмуляция; моделирование программного обеспечения |
Патентообладатель(и): | Сафонов Владимир Олегович |
Приоритеты: |
подача заявки:
1995-10-24 публикация патента:
10.07.1998 |
Способ и устройство для проверки для части переменных записей, к которым обращаются до присвоения им значения. Эта проверка происходит в семантической проверочной части компилятора для языка программирования высокого уровня. Настоящее изобретение создает определенные вхождения в таблицу списка имен (символьную таблицу), которая указывает на два дополнительных списка: п-список (список полей) и с-список (список составляющих). Семантический анализатор обращается к таблице списка имен и к с-списку и п-списку для определения того, присвоено ли значение части переменной записей. Если части переменной записей не присвоено значение, компилятор печатает сообщение об ошибке. Технический результат заключается в обнаружении определенных видов семантических ошибок в компьютерных программах. 2 с. и 18 з.п. ф-лы, 20 ил.
Рисунок 1, Рисунок 2, Рисунок 3, Рисунок 4, Рисунок 5, Рисунок 6, Рисунок 7, Рисунок 8, Рисунок 9, Рисунок 10, Рисунок 11, Рисунок 12, Рисунок 13, Рисунок 14, Рисунок 15, Рисунок 16, Рисунок 17, Рисунок 18, Рисунок 19, Рисунок 20
Формула изобретения
1. Способ обнаружения в исходной компьютерной программе случая, когда переменные записей используются до того, как им присвоены значения, заключающиеся в том, что вводят исходную программу, включающую по меньшей мере первую исходную строку, отличающийся тем, что представляют структуру данных, запомненных в памяти для индикации того, какие переменные записей имеют присвоенные им значения, определяют согласно структуре данных, содержит ли первая исходная строка использование переменной записей, называемой используемой переменной записей, проверяют в случае, когда первая исходная строка содержит используемую переменную записей, указывает ли структура данных, что используемой переменной записей присвоено значение, и печатают сообщение об ошибке, когда используемой переменной записей не присвоено значение. 2. Способ по п.1, в котором исходная программа содержит вторую исходную строку перед первой исходной строкой, отличающийся тем, что при выполнении операции представления структуры данных определяют, содержит ли вторая исходная строка присвоение значения переменной записей, называемой присваиваемой переменной записей, и вводят информацию в структуру данных, запомненных в памяти, показывающую, что присваиваемой переменной записей присвоено значение. 3. Способ по п.1, отличающийся тем, что используют структуру данных, которая включает таблицу списка имен (СИ) с именами и атрибутами символов, используемых в исходной программе. 4. Способ по п.1, отличающийся в том, что используют структуру данных, которая включает список полей (n-список), который содержит имена переменных записей и список составляющих (С-список), который содержит имена записываемых компонентов. 5. Способ по п.3, отличающийся тем, что таблица списка имен включает поле "Присвоено", которое указывает, когда символ имеет присвоенное значение. 6. Способ по п.1, отличающийся тем, что переменную записей размещают в операторе "С" Паскаля, при этом используют структуру данных, которая включает таблицу списка имен (СИ), имеющую оператор "С" для каждого поля в переменной записей определенной в операторе. 7. Способ по п. 1, отличающийся тем, что переменная записей является указателем для переменной записей. 8. Способ по п.1, отличающийся тем, что переменная записей представляет собой файл переменных записей. 9. Способ по п.1, отличающийся тем, что переменная записей представляет собой элемент в массиве переменных записей. 10. Способ по п.1, отличающийся тем, что переменная записей представляет собой часть элемента в массиве переменных записей. 11. Компилятор для обнаружения в исходной компьютерной программе случая, когда переменные записей используются до того, как им присвоены значения, содержащий память, предназначенную для запоминания структуры данных, которая указывает, какие переменные записей имеют присвоенные им значения, причем исходная программа имеет первую исходную строку, отличающийся тем, что содержит определяющую схему, подключенную к памяти и предназначенную для определения согласно структуре данных, содержит ли первая исходная строка использование переменной записей, называемой используемой переменной записей, блок контроля, подключенный к определяющей схеме и предназначенный для определения, указывает ли структура данных на то, что используемой переменной записей присвоено значение, в случае, когда первая исходная строка содержит переменную записей, печатающую схему, подключенную к блоку контроля и предназначенную для печати сообщения об ошибке, когда используемой переменной записей не присвоено значения. 12. Компилятор по п.11, отличающийся тем, что исходная программа включает вторую исходную строку перед первой исходной строкой, а компилятор дополнительно содержит определитель, подключенный к памяти и предназначенный для определения, содержит ли вторая исходная строка присвоение значения переменной записей, называемой присваеваемой переменной записей, и схему запоминания данных, подключенную к определителю и предназначенную для введения информации в структуру данных, запомненную в памяти, для указания, что присваиваемой переменной записей присвоено значение. 13. Компилятор по п.11, отличающийся тем, что структура данных включает таблицу списка имен (СИ), которая предназначена для хранения имен и атрибутов символов, используемых в исходной программе. 14. Компилятор по п.11, отличающийся тем, что структура данных включает список полей (n-список), который содержит имена переменных записей и список составляющих (С-список), который содержит имена записываемых компонентов. 15. Компилятор по п.13, отличающийся тем, что таблица списка имен (СИ) включает поле "Присвоено", которое указывает, когда символ имеет присвоенное значение. 16. Компилятор по п.11, отличающийся тем, что переменная записей размещена в операторе "С" Паскаля, а структура данных включает таблицу списка имен (СИ), имеющую оператор "С" для каждого поля в переменной записей, определенной в операторе. 17. Компилятор по п.11, отличающийся тем, что переменная записей является указателем для переменной записей. 18. Компилятор по п. 11, отличающийся тем, что переменная записей представляет собой файл переменных записей. 19. Компилятор по п. 11, отличающийся тем, что переменная записей представляет собой элемент в массиве переменных записей. 20. Компилятор по п. 11, отличающийся тем, что переменная записей представляет собой часть элемента в массиве переменных записей.Описание изобретения к патенту
Данная заявка относится к компилятору, а конкретнее - к разработке компилятора, который выполняет семантическую проверку для компьютерного языка программирования высокого уровня. Компилятор представляет собой компьютерную программу, которая переводит "исходную программу", записываемую на компьютерном языке программирования высокого уровня, легко понимаемом людьми, в "объектную программу", исполняемую компьютером. Как правило, компилятор включает в себя несколько функциональных частей. Например, обычный компилятор может включать в себя лексический анализатор, который просматривает исходную программу и распознает в ней следующие друг за другом "лексемы". Обычный компилятор включает в себя также программу грамматического разбора - синтаксический анализатор, который использует в качестве входных данных грамматику, определяющую транслируемый язык, и ряд действий, связанных с соответствующим порождением грамматики. Синтаксический анализатор строит "дерево синтаксического анализа" для операторов в исходной программе согласно порождению и действиям грамматики. Для каждого оператора во входной исходной программе синтаксический анализатор генерирует дерево синтаксического анализа исходной программы, введенной в обратном порядке, "вверх ногами", согласно соответствующим порождениям и действиям. Таким образом, дерево синтаксического анализа образуется из узлов, соответствующих одному или более порождениям грамматики. Генерирование дерева синтаксического анализа позволяет синтаксическому анализатору определять, подчиняется ли исходная программа грамматике. Если нет, синтаксический анализатор генерирует ошибку. Таким образом, синтаксический анализатор выполняет синтаксическую проверку, но обычно не проверяет содержание ("семантику") исходной программы. Одним примером обычного метода синтаксического анализа является синтаксический анализатор LALR (ПВЛП - просмотр вперед, влево, вправо), который описан в главе 4 книги "Compilers: Principles, Techniques and Tools" авторов Aho, Sethi и Ullman, которая полностью включена сюда посредством ссылки. В обычных компиляторах после того, как исходная программа подвергнута синтаксическому анализу, она вводится в семантический анализатор, который проверяет семантические ошибки, такие как несовпадение типов и т.п. Семантический анализатор оценивает, к примеру, "семантические свойства" узлов дерева синтаксического анализа. После синтаксического и семантического анализа компилятор генерирует промежуточный код, оптимизирует этот промежуточный код и генерирует объектную программу. Обычные компиляторы не обнаруживают определенные виды семантических ошибок в компьютерных программах, которые они компилируют. Пример таких ошибок происходит в компьютерных программах, которые указывают части переменных записей до того, как этой части переменной записей присвоено значение. Такие семантические ошибки, конечно, обнаруживаются при исполнении оттранслированной программы (например, при "прогоне"), потому что оттранслированная программа исполняется неправильно. Однако ошибки прогона отнимают нежелательное время для их обнаружения. Поэтому желательно обнаруживать такие ошибки до прогона. Настоящее изобретение преодолевает сложности и недостатки уровня техники путем проверки частей переменных записей, которые указываются до того, как им присвоено значение. Эта проверка предпочтительно осуществляется в семантическом анализаторе компилятора. Настоящее изобретение создает определенные вхождения в таблицу списка имен (символьную таблицу), которая указывает два дополнительных списка: п-список (список полей) и с-список (список составляющих). Семантический анализатор обращается к таблице списка имен и к с-списку и п-списку для определения того, присвоено ли значение части переменной записей до обращения к ней. Если части переменной записей не присвоено никакого значения, компилятором распечатывается предупредительное сообщение. Цели и преимущества изобретения будут частично изложены в нижеследующем описании, а частично будут очевидны из описания или могут быть изучены при использовании изобретения. Цели и преимущества изобретения осуществляются и достигаются посредством элементов и комбинаций, конкретно указанных в приложенной формуле изобретения. Сопровождающие чертежи, которые включены в описание и составляют его часть, иллюстрируют несколько выполнений изобретения и служат совместно с описанием для объяснения принципов изобретения. Фиг. 1 является блок-схемой вычислительной системы согласно предпочтительному выполнению настоящего изобретения;фиг.2 показывает формат таблицы списка имен по фиг.1 и формат соответствующих вхождений в структуре данных п-списка и в структуре данных с-списка по фиг.1;
фиг.3 показывает первый пример значений, которые будут запомнены в переменных записей, если будет исполняться компьютерная программа, содержащая неприсвоенные переменные записей;
фиг.4 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1 для обнаружения присвоения значения переменной записей;
фиг.5 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1 для обнаружения использования переменных записей до того, как им присвоено значение;
фиг. 6 показывает значения в таблице списка имен и в структурах данных п-списка и с-списка согласно первому примеру;
фиг. 7 показывает второй пример значений, которые будут запомнены в переменных записей, если будет исполняться компьютерная программа, содержащая неприсвоенные переменные записей в операторе "with". фиг.8 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1, когда он обнаруживает оператор "with;
фиг. 9 показывает значения в таблице списка имен и в структурах данных п-списка и с-списка согласно второму примеру;
фиг. 10 показывает первый пример значений, которые будут запомнены в переменных записей, если будет исполняться компьютерная программа, содержащая неявное присвоение переменных записей;
фиг.11 - 16 являются блок-схемами алгоритмов, показывающих операции, выполняемые семантическим анализатором по фиг.1 для обнаружения, использующего неявные присвоения переменным записи. фиг. 17 показывает значения в таблице списка имен и в структурах данных п-списка и с-списка согласно третьему примеру;
фиг.18, 19 и 20 показывают примеры сообщений об ошибках, выводимых компилятором для языка программирования Паскаль согласно настоящему изобретению. Перейдем теперь к подробному рассмотрению предпочтительных выполнений изобретения, примеры которых представлены в сопровождающих чертежах. Везде, где это возможно, одни и те же ссылочные позиции будут использоваться на всех чертежах для обозначения тех же самых или сходных частей. Фиг. 1 является блок-схемой вычислительной системы 100 согласно настоящему изобретению. Вычислительная система 100 включает в себя центральный процессор (ЦП) 102, память 104 и шины 106 ввода-вывода. Специалистам понятно, что вычислительная система 100 может также включать в себя различные элементы, не показанные на чертеже ради ясности, такие как дисководы, клавиатуры, дисплейные устройства, сетевые подключения, шины дополнительной памяти, дополнительные ЦП и т.д. Память 104 включает в себя исходную программу 110, компилятор 111 и объектную программу 124. Компилятор 111 включает в себя лексический анализатор 114, семантический анализатор 116, оптимизатор 120 кода (необязательный) и генератор 122 кода. Компилятор 111 вводит исходную программу 110 и преобразует исходную программу в выходную объектную программу 124. Элементы 112-116 компилятора действуют для каждого оператора в исходной программе 110 так, чтобы получить промежуточный код. Память 104 включает в себя также таблицу 136 списка имен СИ (NL) (называемую также "символьной таблицей"), по меньшей мере один с-список (список составляющих) 137 и по меньшей мере один п-список (список полей) 138. Элементы компилятора 111 воплощены в виде команд, хранимых в памяти 104 и выполняемых ЦП 102. Синтаксический анализатор 114 использует грамматику, которая включает в себя порождения и связанные с ними соответствующие действия. Семантический анализатор 116 прослеживает дерево синтаксического анализа, созданное синтаксическим анализатором 114, вызывая подходящие подпрограммы семантического анализа. Семантический анализатор 116 печатает сообщения об ошибках и/или останавливает исполнение, если найдены семантические ошибки. Если семантические ошибки не найдены, то семантический анализатор 116 выдает деревья РСС (ПСК - программно- совместимых команд) известным для специалистов образом. Генератор 116 промежуточного кода переводит деревья РСС в интерфейсное представление известным для специалистов образом (например, Aho et al., "Compilers: Principles, Techniques and Tools", стр. 735-737). Оптимизатор 120 кода (необязательный) оптимизирует это представление и выдает интерфейсное представление в оптимизированном виде (например, неиспользуемые кодовые фрагменты могут удаляться). Генератор 122 кода предпочтительно переводит интерфейсное представление в объектную программу 124 известным для специалистов образом. Предпочтительным выполнением настоящего изобретения является компилятор в процессоре с наращиваемыми возможностями (SPARC) для языка программирования Паскаль. Сам компилятор предпочтительно записан на языке программирования Си и работает в операционной системе Solaris которая поставляется фирмой Sun Microsystems и которая относится к операционной системе Unix. Solaris является товарным знаком фирмы Sun Microsystems. Товарные знаки SPARC являются товарными знаками фирмы SPARC Iternational, Inc. Unix является товарным знаком, зарегистрированным в США и других странах, лицензируемым через компанию X/Open Company, Ltd. Переменные записей известны знатокам различных видов языков программирования высокого уровня, таких как Паскаль, Си и последние версии Фортрана, такие как Фортран 77 и Фортран 90. Переменные записей описаны, к примеру, в руководстве SPARCcompiler Pascal Reference Manual, версия 3.0, 1994, стр. 26-33, которую поставляет фирма Sun Microsystems и которая специально включена сюда посредством ссылки. Хотя изобретение и описано применительно к языку программирования Паскаль, следует иметь в виду, что настоящее изобретение не ограничено компиляторами для языка программирования Паскаль и может использоваться с компиляторами для других подходящих языков программирования высокого уровня. В предпочтительном выполнении настоящего изобретения компилятор позволяет пользователю отмечать, должен или нет компилятор проверять присвоения неопределенным переменным записей. В этом выполнении, если присутствует ключ "Rw" (Record Warning - предупреждение записи) командной строки, компилятор будет выполнять такую проверку согласно нижеследующему описанию. Если ключ не присутствует, проверка не выполняется. Настоящее изобретение выполняет проверку только для локально описанных переменных записей. В общем случае, в процессе компиляции невозможно определить, присвоены или нет значения глобально описанной переменной записей, потому что значение может быть присвоено ей в отдельно компилируемом модуле. Как понятно специалистам, лексический анализатор 112 и синтаксический анализатор 114 помещают символы в таблицу 136 СИ в ходе синтаксического анализа. В настоящем изобретении семантический анализатор 116 добавляет дополнительную информацию в таблицу 136 СИ и добавляет вхождения в с-список 137 и п-список 138. Как описано ниже, эти структуры дополнительных данных позволяют семантическому анализатору 116 определить, когда компьютерная программа использует переменные записей до того, как им присвоено значение. Фиг. 2 показывает формат таблицы 136 СИ и формат соответствующих вхождений в п-списке 137 и с-списке 138. После рассмотрения формата этих структур данных будут даны несколько примеров, в которых семантический анализатор запоминает данные в структурах данных и использует эти данные для определения того, используются ли переменные записей до присвоения им значений. На фиг. 2 вхождение 202 списка имен включает в себя класс 210 символа (например, "VAR" - переменная, LABEL - метка и т.п.), наименование 212 символа, указатель 214 вхождения 204 с-списка и указатель 216 вхождения 206 п-списка. Флаг (не показанный) ASSIGNED (ПРИСВОЕНО), также включенный во вхождение таблицы СИ, рассматривается ниже. Вхождение 204 с-списка включает в себя CHAME (С-ИМЯ), которое является полным именем выборки составляющей записи, и указатель CCHAIN (С-ЦЕПb), который указывает на следующее вхождение в с-список 137. Вхождение 206 п-списка включает в себя FNAME (П-ИМЯ), которое является полным именем выборки переменной записей; поле FNL (ПСИ), которое содержит указатель вхождения таблицы СИ для поля; поле FSET (П-УСТ), которое является флагом, указывающим, присвоено ли значение переменной записей; поле FUSED (П-ИСП), которое является флагом, указывающим, была ли выбрана или использована переменная записей; и указатель FCHAIN (П-ЦЕПb), который указывает на следующее вхождение в п-список 138. Следующие абзацы описывают первый пример согласно настоящему изобретению. Пример относится к нижеследующей компьютерной программе, которая записана на языке программирования Паскаль:
program p;
procedure q;
type R = record a, b: integer end;
RR = record c: R; d: integer end;
var V: R;
VV: RR;
begin
V.a := 0; {*}
writeln(V.a); {1}
writeln(V.b); {2}
VV.c = V; {**}
writeln(VV.c.a); {3}
writeln(VV.d); {4}
end;
begin
q;
end. Здесь использования (1) и (3) правильны. Использование (3) правильно, потому что значение VV.c присвоено заранее, следовательно, значение VV.c.a. также рассматривается как присвоенное. Использования (2) и (4) ошибочны, потому что значения V.b и VV.d не определены. Фиг.3 показывает первый пример значений, которые были бы запомнены, если бы компьютерная программа p, содержащая неприсвоенные переменные записей, исполнялась бы. Отметим, что переменные записей V.b и VV.d были бы неприсвоенными. Поэтому операторы (2) и (4) должны генерировать предупреждение в компиляторе согласно настоящему изобретению. Фиг.4 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1 для обнаружения исходного кода, который присваивает значение переменной записей. Операции фиг.4 кроме того создают и заполняют таблицу СИ и структуры данных п-списка и с-списка. В операции 402 семантический анализатор определяет, натолкнулся ли он на программный оператор, в котором переменной записей присваивается значение. Если да, то в операции 404 семантический анализатор создает вхождение в п-список для переменной записей (например, вхождение 502 на фиг.6) (в предположении, что вхождение еще не существует). Флаговые поля FSET и FUSED устанавливаются как FALSE (ЛОЖНЫЙ), когда создается вхождение. Поле FSET устанавливается как TRUE (ИСТИННЫЙ) в операции 406. Поле FNL устанавливается на вхождение СИ для имени. В операции 408 создается вхождение в с-список и добавляется к с-списку для переменной записей (в предположении, что вхождение еще не существует) (например, вхождение 504). Фиг.5 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1 для обнаружения использования переменных записей до того, как им присвоено значение. В операции 450 семантический анализатор определяет, натолкнулся ли он на программный оператор, в котором используется переменная записей (в противоположность присвоению значения). Если да, то в операции 452 семантический анализатор создает вхождение в п-список для переменной записей (например, вхождение 506 на фиг.6) (в предположении, что вхождение еще не существует). Флаговые поля FSET и FUSED устанавливаются как FALSE (ЛОЖНЫЙ), когда создается вхождение. Поле FSET устанавливается как TRUE (ИСТИННЫЙ) в операции 454. Поле FNL устанавливается на вхождение СИ для наименования. Вхождения в с-список не создается. Операции 456-462 определяют, должно ли использование переменной записей привести к предупреждающему флагу. Если в операции 456 флаг FSET установлен как FALSE, то управление переходит к операции 458. Если в операции 458 нет соответствующего вхождения в с-список (и любой соответствующий флаг "ASSIGNED" в таблице 138 СИ установлен как FALSE, как рассмотрено ниже), то управление переходит к операции 459. Если в операции 459 нет изменений хода управления в текущей процедуре (т.е. нет операторов GOTO или вызовов процедуры) вплоть до точки этого использования переменной записей, то управление переходит к операции 460. Если управление достигает этой точки, это означает, что переменной записей не присвоено значение. Если в операции 460 флаг FUSED устанавливается как TRUE (каким он будет всегда в этой блок- схеме алгоритма), это означает, что переменная записей использована без присвоения, и семантический анализатор печатает предупреждающее сообщение. Отметим, что операция 459 необходима для того, чтобы убедиться, что компилятор выдает предупреждение, только когда нет возможных изменений хода управления (т.е. нет операторов GOTO или вызовов процедуры) от начала текущей программы до текущей точки использования поля записей. В противном случае, присвоение может в действительности исполняться до использования и предупреждение может устареть. Например, исходный код может содержать следующее:
goto M;
K:
writeln(V.a); {1}
M:
V.a:= l; {2}
goto K;
Отметим, что (l) имеет место до (2), но исполняется после [2). Чтобы избежать таких случаев, компилятор сохраняет след того, имели ли место в текущей программе операторы GOTO или вызовы процедуры. Если да, то предупреждения сразу не генерируются. Если необходимо (т.е. если не было присвоения соответствующим полям записей во всем теле программы), они генерируются в конце программы. Идея состоит в том, чтобы сообщать предупреждения как можно быстрее, но только тогда, когда имеет смысл это делать. Фиг. 5 показывает значения в таблице 136 списка имен и в п-списке 137 и с-списке 138 согласно первому примеру. Семантический анализатор 116 помещает эти значения в таблицу 136 СИ по мере того, как он прослеживает дерево синтаксического анализа и контролирует значения в структурах 136, 137 и 138 данных, как описано ниже, всякий раз, когда он наталкивается на использование переменной записей, для определения того, было ли до этого в программе присвоено значение переменной записей. На фиг.6 определяются две локальных переменных V и VV. В каждой из точек (1)-(4) программы p компилятор создает новые вхождения п-списка для используемых полей. Точнее, вхождение 502 п-списка V.a создается в точке {*}, а в точке (1) оно обнаруживается в п-списке (V) и помечается как "использовано". В точке (**) также создается новое вхождение 508 (VV) п-списка для VV.c. Таким образом, в точках (*) и (**) создаются вхождения (V) с-списка и (VV) с-списка для V.a и VV.c. При создании-обновлении вхождений п-списка в (1)-(4) компилятор определяет, уместно ли каждое использование. (1) V.a отмечено как "установлено" и "использовано". Это правильно. (2) V.b отмечено как "использовано", но не как "установлено"; его префикс не найден в с-списке (V), поэтому выдается предупреждение. Поле V.b использовано, но не было установлено. (**) VV.c отмечено как "установлено". Это правильно (не имеет значения, что оно не отмечено как "использовано"). (З) VV.c.a отмечено как "использовано", но не как "установлено". Тем не менее его префикс VV.c (определенный из поля FNAME) найден в с-списке (VV). Следовательно, ошибки нет. (4) VV.d отмечено как "использовано", но не отмечено как "установлено". Поэтому выдается предупреждение. Поле VV.d использовано, но не было установлено. Следующие абзацы описывают второй пример согласно настоящему изобретению. Этот пример относится к следующей компьютерной программе, которая записана на языке программирования Паскаль:
program p2;
procedure q;
type complex = record re, im: real end;
var Z: complex;
begin
with Z do {1}
begin
re := 0.0; {2}
writeln(im); {3}
end;
writein (Z.re); {4}
end; {q}
begin
q
end. Фиг.7 показывает второй пример значений, которые были бы запомнены, если бы компьютерная программа, содержащая неприсвоенные переменные записей с оператором "with", исполнялась бы. Отметим, что переменная записей Z.im была бы неприсвоенной и должна генерировать предупреждение в компиляторе согласно настоящему изобретению. Фиг.8 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг. 1, когда он наталкивается на оператор "with". Операции фиг.4 также выполняются, когда бы ни встретилась переменная записи. Операции фиг. 8 создают дополнительные вхождения в таблицу СИ. В операции 702 семантический анализатор определяет, натолкнулся ли он на программный оператор "with". Если да, то в операции 704 семантический анализатор создает вхождение таблицы СИ (например, вхождения 802 и 804 на фиг.9) для каждого поля вида записей (в предположении, что такие вхождения еще не существуют). Вхождение WITHFLD (ПОЛЕ-WITH) имеет поле "VNAME" ("П- ИМЯ"), в котором запоминается полное имя выборки поля. Как показано на фиг.9, поле VNAME содержит полное имя выборки поля (например, поле 804 VNAME). Операции фиг.5 выполняются каждый раз, когда обнаруживается, что использована переменная записей, и, если необходимо, печатается предупреждение. Фиг. 8 показывает значения в таблице списка имен и в структурах данных п-списка и с-списка согласно второму примеру. Два новых вхождения W1 и W2 создаются для полей оператора "with" (WITHFLD re и WITHFLD im). B точках (2) и (3) создаются новые вхождения п-списка для использования переменных "re" и "im". Их полные имена выборки "Z.re" и "Z.im" взяты из поля "VNAME" их вхождений СИ. В точке (3) выдается предупреждение на Z.im, потому что она отмечена как "использовано", но не отмечена как "установлено", и не имеет присвоенного префикса в с- списке (Z). В точке (4) обновляется вхождение п-списка для Z.re для того, чтобы отметить это поле как "использовано". Предупреждения нет, потому что оно отмечено также как "установлено". Следующие абзацы описывают третий пример согласно настоящему изобретению. Этот пример относится к следующей компьютерной программе, которая записана на языке программирования Паскаль:
program p3;
procedure q;
type R = record a, b: integer end;
AR = array [1..2] of R;
PAR - ^AR;
FR = file of R;
var V: R;
A: AR;
P: PAR;
F: FR;
begin new (P); {1}
reset (F); {2}
V := F^; {3}
A[1] :=V; {4}
writeln(V.a); {5}
writeln(A[1].b); {6}
writeln(F^.a); {7}
writeln(P^[2].b); {8}
close(F);
end; {q}
begin
q;
end. Фиг. 10 показывает третий пример значений, которые были бы запомнены, если бы вышеприведенная компьютерная программа, содержащая неявные присвоения переменных записей, исполнялась бы. Отметим, что каждая использованная переменная записей предварительно была присвоена, так что ошибки не будут генерироваться. Фиг. 11 является блок-схемой алгоритма, показывающей операции, выполняемые семантическим анализатором по фиг.1, когда он наталкивается на оператор "new", инициирующий указатель к переменной записей. Операции фиг. 11 - 16 устанавливают флаг "ASSIGNED" в различных вхождениях таблицы СИ как TRUE, когда, например, присвоены полные переменные записей. В операциях 1002 и 1004, когда семантический анализатор определяет, что он натолкнулся на инициацию нового указателя к переменной записей, он устанавливает флаг 1102 "ASSIGNED" поля вхождения таблицы СИ переменных, отмеченных указателем, как TRUE для индикации того, что указателю присвоено значение. В операциях 1006 и 1008, когда семантический анализатор определяет, что он натолкнулся на "переустановку" файла переменных записей, он устанавливает флаг 1104 "ASSIGNED" в поле вхождения таблицы СИ как TRUE для индикации того, что файловому буферу присвоено значение. В операциях 1010 и 1012 фиг. 13, когда семантический анализатор определяет, что он натолкнулся на неявное присвоение всей переменной записей, он устанавливает флаг 1106 "ASSIGNED" в поле вхождения таблицы СИ как TRUE для индикации того, что всей переменной записей присвоено значение. В операциях 1014 и 1016 фиг. 14, когда семантический анализатор определяет, что он натолкнулся на присвоение элементу в массиве переменных записей, он создает вхождение с-списка (например, вхождение 1108) для индикации того, что всему элементу массива присвоено значение. В операциях 1018 и 1020 фиг. 15, когда семантический анализатор определяет, что он натолкнулся на присвоение части элемента в массиве переменных записей, он создает вхождение п-списка (например, вхождение 1110) для индикации того, что части элемента массива присвоено значение. В операциях 1022 и 1024 фиг. 16, когда семантический анализатор определяет, что он натолкнулся на непрямое присвоение переменной записей, он создает вхождение п-списка (например, вхождение 1112) для индикации того, что переменной записей присвоено значение. Каждый раз, когда семантический анализатор обнаруживает, что используется переменная записей, выполняются операции фиг. 5 и печатается предупреждение, если это необходимо. Фиг. 17 показывает значения в таблице списка имен и в структурах данных п-списка и с-списка согласно третьему примеру. (1) P неявно инициализируется стандартной процедурой "new", которая распределяет динамическую переменную и присваивает ее указатель Р. Вся переменная P отмечается как "присвоено" в ее вхождении СИ посредством флага 1106 "ASSIGNED". Следовательно, любое из его полей составляющих будет рассматриваться присвоенным. Предупреждение не печатается. (2) Переустановка (F) стандартной процедуры неявно присваивает буферной переменной F^ файла F. Следовательно, F также отмечена как "присвоено" во флаге 1104 "ASSIGNED" с тем же результатом, как и Р. Предупреждение не выдается. (3) Переменная V записей присваивается неявно. Она отмечается как "присвоено" во флаге 1106 "ASSIGNED". Предупреждение не выдается. (Отметим, что в предпочтительном выполнении целые переменные не записываются в с-список, а п-список создается только для полей записей). (4) Присваивается селектор А[1] массива. Его полное имя выборки преобразуется в "обобщенный" вид А[...], и создается соответствующий с-список (А). Предупреждение не выдается. (5) Использование V. a не является ошибкой, потому что V отмечено как "присвоено". Предупреждение не выдается. (6) Использование А[1].b не является ошибкой. Его имя выборки преобразуется в "обобщенный" вид а[...].b и добавляется к п-списку (А). По добавлении компилятор проверяет, есть ли префикс этой выборки поля в с-списке (А). А[...] обнаруживается в с-списке (А). Предупреждение не выдается. (7) Использование F^ .a не является ошибкой, потому что F отмечено как "присвоено" во флаге 1104 "ASSIGNED". Предупреждение не выдается. (8) Использование P^[2].b (преобразованного в P^[...].b) не является ошибкой, потому что P отмечено как "присвоено" во флаге 1102 "ASSIGNED". Предупреждение не выдается. Фиг. 18, 19 и 20 показывают примеры сообщений об ошибке, выводимых компилятором для языка программирования Паскаль согласно настоящему изобретению. Они согласуются с данными выше примерами и подробно здесь не описываются. Вкратце, во время компиляции компьютерной программы настоящее изобретение сохраняет след того, каким записям и частям записей присвоены значения. Когда используется переменная записей, если ей предварительно не присвоено значение (явно или неявно), настоящее изобретение печатает предупреждающее сообщение. Другие выполнения настоящего изобретения будут ясны специалистам из рассмотрения описания и применения представленного здесь изобретения. К примеру, механизм проверки использования полей записей настоящего изобретения может использоваться в любом компиляторе для языка, который имеет структуру, подобную записям (например, КОБОЛ, Си, С++, Фортран 77 и т.п.). Подразумевается, что описание и примеры рассмотрены только в качестве иллюстраций, а реальный объем изобретения указан в нижеследующей формуле изобретения.
Класс G06F9/455 эмуляция; моделирование программного обеспечения