СПОСОБ И УСТРОЙСТВО ДЛЯ ДОСТОВЕРНОЙ ОЦЕНКИ СЕМАНТИЧЕСКИХ ПРИЗНАКОВ В СИНТАКСИЧЕСКОМ АНАЛИЗЕ ПРИ ПРОХОДЕ ВПЕРЕД СЛЕВА НАПРАВО Российский патент 1998 года по МПК G06F9/455 G06F9/44 

Описание патента на изобретение RU2115158C1

Изобретение относится к компиляторам (трансляторам), а более точно к синтаксическим анализаторам прохода вперед слева направо и семантическим устройствам контроля в компиляторе (трансляторе) для компьютерных программных языков высокого уровня.

Обычно компьютерный программный язык высокого уровня описывается "грамматикой" языка. Грамматика образована посредством ряда "правил вывода". Каждое правило вывода имеет левую часть (ЛЧ), представляющую собой оператор или конструкцию в языке, символ (такой как "_→" ), и правую часть (ПЧ), представляющую собой ряд других операторов или конструкций, которые составляют ЛЧ оператор. Например, первое правило вывода в грамматике для языка программирования паскаль может иметь вид
программа паскаля _→ блок заголовка программы.

Это правило показывает, что программа в паскале состоит из трех частей: заголовок программы, описание переменных и констант и блока, который включает действия, выполняемые программой. Программа в паскале из данного примера заканчивается точкой (".").

Следующее правило вывода в грамматике может быть следующим:
заголовок программы _→ имя ПРОГРАММЫ (список идентификаторов файла).

Таким образом, заголовок программы состоит из трех частей: слова "программа", идентификатора и списка от нуля и более идентификаторов файла, за которыми следует точка с запятой.

Компилятор (транслятор) является компьютерной программой, которая переводит "исходную программу", написанную на компьютерном программном языке высокого уровня, который легко понятен людям, в выходную целевую программу, выполняемую компьютером. Обычно компилятор (транслятор) включает несколько функциональных частей. Например, обычный компилятор (транслятор) может включать лексический анализатор, который просматривает исходную программу и идентифицирует следующие одна за другой лексемы в исходной программе.

Стандартный компилятор (транслятор) также содержит синтаксический анализатор, который оказывает действие на вход грамматики, описанной компилируемым (транслируемым) языком, и на ряд действий, объединенных с соответствующим правилом ввода грамматики. Этот синтаксический анализатор строит "дерево синтаксического анализа" для операторов исходной программы в соответствии с грамматическими правилами вывода и действиями. Для каждого оператора во вводной исходной программе синтаксический анализатор создает дерево синтаксического анализа исходного ввода рекурсивным (восходящим) способом согласно правилам вывода и действия грамматики.

Таким образом, дерево синтаксического анализа образуется из вершин, соответствующих одному или более грамматическим правилам вывода. Формирование дерева синтаксического анализа позволяет синтаксическому анализатору определить, подчиняются ли части исходной программы правилам грамматики. Если нет, то синтаксический анализатор выдает ошибку. Таким образом, синтаксический анализатор выполняет синтаксический контроль (проверку) смысла исходной программы. Примером обычного способа синтаксического анализа является синтаксический анализатор прохода вперед слева направо, который описан в монографии Ахо, Сези и Ульман "Компиляторы (трансляторы): Принципы, Технологии, Вспомогательные программы", глава 4.

В обычных компиляторах после того, как исходная программа подверглась синтаксическому анализу, она вводится в семантический анализатор, который проверяет семантические ошибки, такие как несоответствие типов и т.д. Семантический анализатор оценивает, например, "семантические признаки" узлов дерева синтаксического анализа. Признаки, которые оцениваются посредством просмотра признаков их порождаемых узлов, называются "синтезируемыми атрибутами". После синтаксического и семантического анализов компилятор (транслятор) генерирует промежуточный код и генерирует программу на выходном языке.

Важно, чтобы компиляторы (трансляторы) работали быстро и эффективно. В обычных компиляторах разработка семантического анализатора ведется неэффективно. Специально в обычных компиляторах семантические признаки оцениваются во время обходов дерева при отдельном синтаксическом анализе во время семантического анализа дерева синтаксического анализа, после того как дерево синтаксического анализа полностью построено. Использование отдельного обхода дерева для каждого семантического признака вызывает экспоненциальное увеличение промежутка времени, требуемого для компиляции (трансляции). Использование отдельного прохода для каждого семантического признака требует, чтобы компилятор (транслятор) выполнял рекурсивное снижение на дереве синтаксического анализа для полного семантического анализа и генерации кода.

Поэтому целью является повышение эффективности семантического анализа в компиляторе (трансляторе), чтобы уменьшить время компилирования.

В настоящем изобретении преодолеваются имеющиеся недостатки предшествующего уровня техники и достигается поставленная цель путем предварительной оценки определенных семантических признаков во время семантического анализатора при одновременном построении дерева синтаксического анализа вместо того, чтобы ждать, чтобы оценить эти признаки во время отдельного прохода по дереву синтаксического анализа в семантическом анализаторе. Изобретение модифицирует формат узлов в дереве синтаксического анализа для включения туда полей для определенных семантических признаков и модифицирует действия, связанные с грамматическими правилами выхода и действиями, так, что они создают узлы дерева синтаксического анализа требуемого формата. Кроме того, настоящее изобретение включает подпрограммы семантических атрибутов, которые вызываются во время построения дерева синтаксического анализа и которые устанавливают, что значения должны храниться в памяти дерева синтаксического анализа для различных семантических признаков.

Согласно цели настоящего изобретения, как описано в настоящем описании, изобретение представляет собой способ синтаксического анализа исходной программы, выполняемой компьютером, имеющим память, указанный способ включает следующие шаги: ввод оператора исходной программы, определение правила вывода, которое относится к оператору исходной программы, правило вывода записано и хранится в памяти и обладает ассоциированным действием, которое также хранится в памяти, создание узла дерева текущего синтаксического анализа в памяти во время синтаксического анализа в соответствии с ассоциированным действием, где узел дерева текущего синтаксического анализа имеет поле семантического признака, и хранение в памяти во время синтаксического анализа в соответствии с ассоциированным действием значения семантического признака в поле семантического признака узла дерева текущего синтаксического анализа.

Преимущества настоящего изобретения будут определены ниже. Цели и преимущества изобретения достигаются и реализуются посредством элементов и их сочетаний, которые заявлены в патентной формуле.

На фиг. 1 изображена блок-схема компьютерной системы согласно изобретению; на фиг.2а - представление грамматики, включая правила вывода, и ассоциированные действия согласно изобретению; на фиг. 2б - представление подпрограмм семантических признаков согласно изобретению; на фиг.3 - блок-схема, на которой показаны шаги, выполняемые компилятором (транслятором), согласно изобретению; на фиг.4 - вариант выполнения дерева синтаксического анализа, которое содержит поле для семантических признаков, согласно изобретению; на фиг. 5а и 5б - последовательность рекурсивного выполнения грамматических правил вывода в компиляторе (трансляторе) для получения дерева синтаксического анализа; на фиг. 6 - грамматическое правило вывода и ассоциированное действие, выполненное согласно фиг.5а; на фиг. 7 - грамматическое правило вывода и ассоциированное действие, выполненное согласно фиг.5б; на фиг. 8 - грамматическое правило вывода и ассоциированное действие, выполненное согласно фиг. 5б; на фиг. 9 - грамматическое правило вывода и ассоциированное действие, выполненное согласно фиг.5б; на фиг. 10 - подпрограммы семантического признака в соответствии с шагами, показанными фиг.5б; на фиг. 11 - грамматическое правило вывода и ассоциированное действие, выполненное согласно фиг.5б.

Компьютерная система 100 (фиг. 1) согласно изобретению содержит центральный процессор 102, память 104 и входные-выходные линии связи 106. Для специалистов в этой области техники очевидно, что компьютерная система может также включать множество элементов, не показанных на фиг.1, для упрощения, таких как дисководы, клавиатура, дисплей, сетевая связь, магистрали дополнительной памяти, дополнительные центральные процессоры и т.д.

Память 104 содержит исходную программу 110, компилятор (транслятор) 111 и программу на выходном языке 124. Компилятор (транслятор) 111 включает лексический анализатор 112, синтаксический анализатор 114, семантический анализатор 116, кодовый оптимизатор 120 (необязательно) и генератор кода 122. Компилятор (транслятор) 111 вводит исходную программу 110 и выполняет исходную программу для вывода программы на целевом языке 124. Элементы транслятора 112-116 работают для каждого оператора в исходной программе 110 для генерирования промежуточного кода. Для простого специалиста в этой области техники очевидно, что все элементы транслятора 111 выполнены как команды, хранящиеся в памяти 104 и выполняемые центральным процессором. Синтаксический анализатор 114 обращается к стеку синтаксического анализатора 134. Синтаксический анализатор 114 использует грамматику 130, которая включает правила вывода и ассоциированные действия, соответствующие правилам вывода, как указано ниже. Грамматические действия обращаются к дереву синтаксического анализа 133 посредством использования множества функций обращения к дереву синтаксического анализа, ассоциированных с деревом синтаксического анализа. Некоторые действия грамматики также обращаются к подпрограммам 132 семантических признаков для определения значений семантических признаков, которые хранятся в памяти в дереве синтаксического анализа.

Семантический анализатор 116 просматривает дерево синтаксического анализа для всей исходной программы (или для значительной части исходной программы), создаваемой синтаксическим анализатором 114, и рекурсивно просматривает дерево, вызываемое соответствующими программами семантического анализа.

Семантический анализатор 116 печатает сообщение об ошибке и/или останавливает выполнение команды, если найдены семантические ошибки. Если семантические ошибки не найдены, семантический анализатор 116 выводит деревья счетчика команд способом, который известен специалистам в этой области техники. Промежуточный генератор кода 116 преобразовывает деревья счетчика команд во внешние (интерфейсное) представление известным способом (например, Ако и др. "Компиляторы...", с. 735-737). Оптимизатор кода 120 оптимизирует это представление и выводит внешне представление в оптимизированном виде (например, использованные фрагменты кода могут быть стерты). Генератор кода 122 преобразовывает внешнее представление в программу на выходном языке 124 известным способом.

Несоответствие типов является примером семантической ошибки. В языке программирования "паскаль", например, удаление целого числа посредством знака не допускается и является примером семантической ошибки. В стандартных семантических анализаторах семантическая оценка посредством семантического анализатора 116 выражения " 1 + 2 * а" повлечет за собой обход дерева синтаксического анализа для проверки знаков "1", "2" и "а", а также знака результирующего выражения "2 * а". Согласно настоящему изобретению знаки "1", "2", "а" вместе с выражениями "2 * а" и "1 + 2 * а" ранее оценены синтаксическим анализатором 114 и хранятся в дереве синтаксического анализатора 133. Таким образом, семантический анализатор 116 не выполняет обходов дерева во время семантического анализа для определения наличия несоответствия типов (чтобы определить, произошло ли несоответствие типов) и оценки знака выражения.

На фиг. 2а показано представление грамматики 200 для выражения, включая правила вывода 202 и ассоциированные действия 204 согласно настоящему изобретению. В предпочтительном варианте, когда создан компилятор (транслятор) 111, грамматика 202 и действия 204 являются входными (выходными) к стандартному компилятору систем построения трансляторов, такому как УАСС, которые генерирует синтаксический анализатор 114 на фиг. 1. Так как синтаксический анализатор 114 создает дерево синтаксического анализа, действие 204 выполняется для каждого правила вывода, применяемого к оператору исходной программы.

Формат правила вывода 202 для языка программирования "паскаль" описан выше. Действие 204 создает t(E) 210, которое является узлом дерева синтаксического анализа для конструкции E. Узел t(E) строится с использованием специальной функции обращения дерева синтаксического анализа 133 "дерево E", которая создает и частично инициирует узел дерева синтаксического анализа для конструкции категории "E". В предпочтительном варианте выполнения изобретения дерево синтаксического анализа строится в рекурсивной восходящей форме, таким образом вызов функции дерева E использует параметры нижних узлов дерева синтаксического анализа, которое уже было построено подобными функциями для подвыражений E1...En.

Действие 204 может также обращаться к подпрограммам f1...fk семантического признака для оценки семантических признаков. Эти подпрограммы присваивают значения семантическим признакам от attr 1(n(E)) 212 до attr k (n(E)) 214 во вновь созданном узле n(E) дерева синтаксического анализа.

На фиг. 2б показано представление подпрограмм семантического признака 250, 252 согласно изобретению. Дополнительный пример показан на фиг. 10. Подпрограммы семантического признака включают f1 212 и fk 214, каждый из которых был вызван посредством действий 204 грамматики 200 либо во время, либо после создания узла дерева синтаксического анализа.

На фиг. 3 показана блок-схема 300 шагов, выполняемых согласно изобретению компилятором (транслятором) для создания дерева синтаксического анализа, содержащего семантические признаки. На фиг. 4 показано дерево синтаксического анализа 400, созданное в соответствии с шагами, показанными на фиг. 3. Некоторые из узлов дерева синтаксического анализа 400 включают семантические признаки TYPE и CONST EXPR. В описываемом варианте TYPE является семантическим признаком, представляющим тип выражения (например, действительное, целое и т.д.). CONST EXPR представляет собой разделительный/ограничительный признак, показывающий, является ли выражение постоянным выражением ("2", "3" и т.д.). Следует отметить, что CONST EXPR не показывает, представляет ли переменная константу. Входом блок-схемы на фиг. 3 является исходная программа 110 на фиг. 1, и шаги на фиг. 3 соответствуют шагам 112 и 114 на фиг. 1. В качестве примера допустим, что входным оператором исходной программы является "x : = 2 * 3", где x был предварительно описан как REAL. Таким образом, E в данном примере является "x: = 2 * 3". Как показано на шаге 302, шаги на фиг. 3 выполняются до тех пор, пока не выполнится каждый оператор исходной программы 110. Шаг 304 вводит следующий оператор из исходной программы 110. Для оператора исходной программы "x: = 2 * 3" шаг 306 рекурсивно создает варианты под-дерева в порядке, показанном на фиг. 5, используя действия (так называемые "семантическими правилами"), ассоциированные с каждым использованным правилом вывода. Таким образом, как показано на фиг. 5б, узел 406 создается первым, узел 410 создается вторым, узел 412 - третьим и узел 408 - четвертым. По мере того, как создается каждый узел, и если созданный узел обладает семантическими признаками, семантическим признакам присваиваются значения TYPE и CONST EXPR с использованием подпрограммы семантических признаков.

В шаге 308 следующим создается узел 404 дерева синтаксического анализа для установления правила вывода. В примере узлы, соответствующие атрибуту, не включают семантического признака поля (TYPE или CONST EXPR) и поэтому не осуществляется семантический контроль во время формирования узла 404.

Дополнительный семантический контроль осуществляется во время шага 116 на фиг. 1. Дополнительный семантический контроль будет выполнен на шаге 116 (посредством семантической подпрограммы присвоения), которая проверяет тип совместимости узлов 406 и 408 и генерирует промежуточный код для присвоения. Так как семантические признаки заранее оценены и хранятся в памяти дерева синтаксического анализа, шаг 116 может выполнять семантический контроль очень эффективно путем отделения признака TYPE от узла T MUL 408, когда это необходимо, вместо того, чтобы пройти дерево выражения только для оценки его типа.

Следует отметить, что в предпочтительном варианте выполнения изобретения формат узлов дерева синтаксического анализа определен так, что значения семантических признаков TYPE и CONST EXPR хранятся в той же ячейке памяти всех узлов дерева синтаксического анализа, которые включают семантические признаки. Таким образом, семантический анализатор 116 может легко обращаться к значениям семантического признака от дерева синтаксического анализа. В другом варианте выполнения изобретения может использоваться другой формат для узлов дерева синтаксического анализа.

На фиг. 6 - 11 показан дополнительный файл создания и оценки узлов на фиг. 4 и использование семантических признаков для выполнения простых семантических проверок во время синтаксического анализа при построении дерева синтаксического анализа 400. Шаги на фиг. 6 - 11 выполнены синтаксическим анализатором 114 во время формирования дерева синтаксического анализа 400 для операторов исходной программы "переменная x : действительная" ("var x : real") и "x: = 2 * 3".

На фиг. 6 показано грамматическое правило вывода 602 и асоциированные действия, выполняемые согласно фиг. 5а для создания узла в дереве синтаксического анализа для определения "x" (узел не показан на фиг. 4). Как показано на шаге 602, относящееся к делу правило вывода - это "decl _→ VAR varIF: type"/ Шаг 604 выполняет первое действие, ассоциированное с этим правилом вывода. Таким образом, шаг 604 вызывает функцию 133 обращения к дереву синтаксического анализа для создания нового узла дерева синтаксического анализа для переменной "x". Шаг 606 вызывает подпрограмму семантического признака в подпрограмме 132, которая проверяет семантические задачи, например, является ли описание идентификатора (имени) "x" единственным или дубликатом в текущем блоке. Шаг 606 также создает элемент в таблице "списка имен" (СИ), записанных в память 104, который сохраняет дорожку переменных и их виды известным способом. Шаг 608 возвращает указатель к новому узлу дерева синтаксического анализа.

На фиг. 7 показано грамматическое правило вывода и ассоциированное действие, выполненное в соответствии с фиг. 5б для создания узла 406. Как показано на шаге 702, относящееся к делу правило вывода - это "var _→ x". На шагах 704 и 706 выполняются действия, ассоциированные с правилами вывода. Таким образом, шаг 704 образуется к функции 133 обращения к дереву синтаксического анализа для создания нового узла дерева синтаксического анализа для переменной. Шаг 704 передает имя переменной "x" функции создания узла дерева синтаксического анализа, которая создает узел 406. Шаг 706 вызывает подпрограмму 132 семантического признака, которая устанавливает значения семантических признаков TYRE и CONST EXPR для переменной "x" и записывает в память значения в соответствующих полях узла 406. Следует отметить, что функция создания узла для переменных содержит значение TYPE в соответствии с видом "x" в списке имен (СИ) и хранить в памяти значение CONST EXPR - ложь, т.к. переменная "x" не является константой. Шаг 705 возвращает указатель к новому узлу 406 дерева синтаксического анализа.

На фиг. 8 изображено грамматическое правило вывода и ассоциированные действия, выполненные в соответствии с фиг. 5, которое вызвано дважды для создания соответствующих узлов 410 и 412. Как показано на шаге 802, правилом вывода является "expr _→ integer constant". На шаге 804 выполняются действия, ассоциированные с этим правилом вывода. Таким образом, шаг 804 вызывает функцию доступа 133 к дереву синтаксического анализа для создания нового узла 410 или 412 дерева синтаксического анализа. Например, шаг 804 передает значение семантического признака в функцию, которая создает узел дерева синтаксического анализа. Следует отметить, что целая константа будет всегда иметь TYPE "целое" и будет всегда иметь значение признака CONST EXPR "истина", т. к. целая константа является постоянным выражением. Поэтому нет причин для передачи этих значений функции доступа дерева синтаксического анализа. Шаг 806 возвращает указатель к новому узлу 410 (или 412) дерева синтаксического анализа.

На фиг. 9 показано грамматическое правило вывода и ассоциированное действие, выполненное в соответствии с фиг. 5б для создания узла 408. Как показано на шаге 902, соответствующим правилом вывода является "expr _→ expr * expr". Шаг 904 выполняет действия, ассоциированные с правилом вывода. Таким образом, шаг 904 вызывает функцию доступа 133 дерева синтаксического анализа для создания нового узла 408 дерева синтаксического анализа. Шаг 904 передает значение семантического признака в функцию, которая создает узел дерева синтаксического анализа. Таким образом, шаг 804 передает функции создания узла: 1) значение "*"; 2) значение CONST EXPR, созданное логическим умножением значений CONST EXPR порождаемых узлов 410 и 412 (здесь истина и истина дают истину); 3) значение признака TYPE, которое является результатом обращения функции к функции семантического признака, описанного в связи с фиг. 10 (здесь целое * целое = целое); 4) указатель к первому поражаемому узлу 410 - результат шагов на фиг. 8; 5) указатель ко второму порождаемому узлу 412 - результат шагов на фиг. 8. Функция создания узла создает узел 408, как показано на фиг. 4. Шаг 906 возвращает указатель к новому узлу 408 дерева синтаксического анализа.

На фиг. 10 показана блок-схема 1000 подпрограммы семантического признака, которая вызвана на шаге 904 на фиг. 9 для возврата/выдачи значения TYPE текущего узла 408. Семантическая подпрограмма просматривает TYPE порожденных узлов для текущего дерева синтаксического анализа и определяет значение признака TYPE, являющееся результатом операции умножения, выполненной с выражениями, соответствующими порожденным узлам. Например, здесь умножаемыми выражениями являются "2" (целая константа) и "3" (целая константа). Если на шаге 1002 выявлено, что операция умножения для двух выражений не допускается, тогда значение NIL возвращается на шаг 1004. Такой результат может получиться, например, если делается попытка умножить символ на целое, что не допускается в языке программирования паскаль.

В противном случае, если умножение разрешается, шаг 1006 определяет, является ли первое выражение целым, функцией с плавающей запятой, удвоенным или аналогичным цифровым. Если так, то шаг 1008 возвращает значение TYPE, генерированное при умножении двух выражений. Это определение производится в соответствии с ранее установленными правилами языка программирования, который подвергается трансляции (компиляции), или компилированного языка программирования.

Следует отметить, что это значение может быть правильным TYPE или NIL в зависимости от типа второго выражения. Например, в паскале целое, умноженное на целое, дает целое.

Для следующего примера целое, умноженное на действительное, дает действительное. В противном случае на шаге 1010, если первым выражением является "множество" и вторым выражением также является "множество", то значение TYPE "множества" возвращается на шаг 1016. В противном случае величина TYPE от NIL возвращается на шаг 1014. Для специалиста в данной области техники очевидно, что блок-схема на фиг. 10 приведена только в качестве примера и что множество других последовательностей шагов могло бы быть выполнено для определения значения семантического признака TYPE в соответствии с порожденным узлом текущей вершины.

Следует принять во внимание, что подпрограмма семантического признака на фиг. 10 не печатает сообщение об ошибке, если исходный код 110 содержит ложное умножение. Вместо этого шаги на фиг. 10 просто возвращают значение NIL, которое размещается в поле TYPE вновь созданного узла 408 дерева текущего синтаксического анализа. Когда семантический анализатор 116 наталкивается на TYPE признаком NIL во время семантического анализа, устанавливается, что произошло несоответствие TYPE, и печатается соответствующее сообщение об ошибке.

На фиг. 11 показано грамматическое правило вывода и ассоциированные действия, выполненные в соответствии с фиг. 5б для создания узла 404. Как показано на шаге 1102, соответствующим правилом вывода является "statement var:= exper". На шаге 1104 выполняются действия, ассоциированные с этим правилом вывода. Таким образом, шаг 1104 вызывает функцию доступа 133 дерева синтаксического анализа для создания нового узла 404 дерева синтаксического анализа. Шаг 1104 передает функции создания узла: 1) значение "T-ASGN"; 2) указатель на первый порожденный узел 406-результат шагов на фиг.7; 3) указатель на второй порожденный узел 408 - результат шагов на фиг. 9 и 10. Следует отметить, что узлы дерева синтаксического анализа для оператора присваивания предпочтительно не обладают полями семантических признаков. Шаг 1106 возвращает указатель к новому узлу 404 дерева синтаксического анализа.

Шаги на фиг.3 повторяются до тех пор, пока не будет создано дерево синтаксического анализа для всей исходной программы 110. Все узлы дерева синтаксического анализа, соответствующие выражениям, содержат ранее оцененные семантические признаки TYPE и CONST EXPR.

В предпочтительном варианте выполнения подпрограммы семантических признаков f1. . . fk вызываются по-разному, т.к. вызывает функция или вызывает процедура. Результат вызова функции выражения "2 * 3" передается в дерево функции доступа дерева синтаксического анализа, которое создает новый узел дерева синтаксического анализа со значением семантического признака, являющегося результатом обращения к функции (см.фиг.9). Например,
t(E) = дерево E(..., f1(...), ...),
где f1 является функцией, которая возвращает значение семантического признака.

Напротив, вызов отдельной процедуры семантического признака обрабатывает узел всего дерева синтаксического анализа и заранее оценивает все его синтезированные признаки (см. фиг.7). Например,
создание узла (t(E));
fk (T(E));
где t(E) является вновь созданным узлом дерева синтаксического анализа, и fk определяет, устанавливает, выявляет и записывает в память все нужные значения признака в узле.

Программы паскаля включают определения, операторы и выражения. Грамматика и действия на фиг. 2a относятся к выражениям паскаля. В описанном варианте выполнения изобретения простые операторы исходного кода паскаля заканчиваются созданием узла дерева синтаксического анализа, но эти вершины дерева синтаксического анализа не содержат семантических признаков (см. узел 404 на фиг. 4). Другие варианты выполнения изобретения могут создать узлы дерева синтаксического анализа для операторов, где узлы дерева синтаксического анализа включают семантические признаки и другие признаки, используемые позднее в процессе компиляции (трансляции).

Для описания и определения операторов в описываемом варианте осуществления изобретения создают узел дерева синтаксического анализа, вызывают подпрограмму семантического признака, которая выполняет семантический контроль (проверку), например, является ли определение идентификатора удвоенным в текущем блоке, и создают вход в таблице "списка имен", которая содержит дорожку переменных и их типов, как показано на фиг.6.

В целом компилятор (транслятор) согласно изобретению заранее оценивает синтезированные признаки TYPE и CONST EXPR для выражений и хранит в памяти в дереве синтаксического анализа, создаваемого во время шага синтаксического анализа. Последующий шаг семантического анализа используют ранее оцененные семантические признаки и, таким образом, избегают необходимости просматривать дерево синтаксического анализа для генерирования семантических признаков. Использование ранее оцененных семантических признаков повышает эффективность семантического анализатора и уменьшает время выполнения программы компилятора (транслятора). В предпочтительном варианте выполнения изобретения, который выполнен в сочетании с операционной системой SOLARIS 2,5 фирмы SUN MICROSYSTEMS, была поставлена цель разработать семантический анализатор 116 для предварительной оценки семантических признаков, скрытых по отношению к остальному компилятору (транслятору). Таким образом, в то время как предварительно оцененные признаки в дереве синтаксического анализатора использовались, где возможно внутри семантического анализатора для избежания необходимости просмотра дерева синтаксического анализа, их использование не изменило промежуточный код, генерируемый семантическим анализатором.

Другие варианты выполнения настоящего изобретения будут очевидны специалистам в этой области техники при ознакомлении с описанием изобретения. Например, настоящее изобретение может использовать семантический признак, такой как HAS PTR (V) для составной части переменной паскаля вида:
VS1 ... SN
где S1. .. SN являются составляющими селекторов. В этом примере HAS PTR является истиной тогда и только тогда, когда существует селектор справочного указателя "∧" среди SN ... SN. Такой семантический признак будет избегать просмотра дерева синтаксического анализа во время семантического анализа для определения, имеет ли переменная составляющий селектор.

Более того, для специалиста в этой области техники очевидно, что настоящее изобретение может быть использовано совместно с компилятором (транслятором) для любого языка высокого уровня, который использует синтезированные семантические признаки.

Похожие патенты RU2115158C1

название год авторы номер документа
СПОСОБ ПРЕОБРАЗОВАНИЯ ВХОДНОГО КОДА ТРАНСЛЯТОРА В ОБЪЕКТНЫЙ КОД И УСТРОЙСТВО ДЛЯ ЕГО ОСУЩЕСТВЛЕНИЯ 1995
  • Сафонов Владимир Олегович
RU2103727C1
СПОСОБ ПРЕОБРАЗОВАНИЯ ВХОДНОЙ ПРОГРАММЫ ТРАНСЛЯТОРА И УСТРОЙСТВО ДЛЯ ЕГО ОСУЩЕСТВЛЕНИЯ 1995
  • Сафонов Владимир Олегович
RU2103728C1
СПОСОБ И УСТРОЙСТВО ДЛЯ ПРОВЕРКИ ИСПОЛЬЗОВАНИЯ ПОЛЕЙ ЗАПИСЕЙ ВО ВРЕМЯ КОМПИЛЯЦИИ 1995
  • Сафонов Владимир Олегович
RU2115159C1
Способ верификации программного обеспечения по естественной семантике идентификаторов исходного кода программы при статическом анализе 2018
  • Жидков Роман Евгеньевич
RU2672786C1
СПОСОБ СИНТАКСИЧЕСКОГО АНАЛИЗА ЯЗЫКА ПРОГРАММИРОВАНИЯ С РАСШИРЯЕМОЙ ГРАММАТИКОЙ 2013
  • Бочарников Дмитрий Николаевич
RU2515684C1
СЕНТИМЕНТНЫЙ АНАЛИЗ НА УРОВНЕ АСПЕКТОВ С ИСПОЛЬЗОВАНИЕМ МЕТОДОВ МАШИННОГО ОБУЧЕНИЯ 2016
  • Мацкевич Степан Евгеньевич
  • Кузнецова Екатерина Сергеевна
  • Гусев Илья Олегович
RU2657173C2
СПОСОБ И СИСТЕМА ДЛЯ МАШИННОГО ИЗВЛЕЧЕНИЯ И ИНТЕРПРЕТАЦИИ ТЕКСТОВОЙ ИНФОРМАЦИИ 2015
  • Старостин Анатолий Сергеевич
  • Смуров Иван Михайлович
  • Степанова Мария Евгеньевна
RU2592396C1
Устройство для синтаксического анализа программ 1980
  • Степанов Алексей Николаевич
SU918950A1
ИСПОЛЬЗОВАНИЕ ВЕРИФИЦИРОВАННЫХ ПОЛЬЗОВАТЕЛЕМ ДАННЫХ ДЛЯ ОБУЧЕНИЯ МОДЕЛЕЙ УВЕРЕННОСТИ 2016
  • Мацкевич Степан Евгеньевич
  • Белов Андрей Александрович
RU2646380C1
ИЗВЛЕЧЕНИЕ ИНФОРМАЦИОННЫХ ОБЪЕКТОВ С ИСПОЛЬЗОВАНИЕМ КОМБИНАЦИИ КЛАССИФИКАТОРОВ, АНАЛИЗИРУЮЩИХ ЛОКАЛЬНЫЕ И НЕЛОКАЛЬНЫЕ ПРИЗНАКИ 2018
  • Инденбом Евгений Михайлович
RU2686000C1

Иллюстрации к изобретению RU 2 115 158 C1

Реферат патента 1998 года СПОСОБ И УСТРОЙСТВО ДЛЯ ДОСТОВЕРНОЙ ОЦЕНКИ СЕМАНТИЧЕСКИХ ПРИЗНАКОВ В СИНТАКСИЧЕСКОМ АНАЛИЗЕ ПРИ ПРОХОДЕ ВПЕРЕД СЛЕВА НАПРАВО

Способ и устройство для компилирования (транслирования) исходного кода, которое заранее оценивает некоторые семантические признаки во время синтаксического анализа. Изобретение осуществляет определенный вид семантического анализа, такой как проверку семантических признаков во время работы синтаксического анализатора, при этом осуществляется построение дерева синтаксического анализа вместо того, чтобы ждать выполнения этого контроля за отдельный проход по дереву синтаксического анализа во время семантического анализа. Настоящее изобретение модифицирует формат узлов в дереве синтаксического анализа для включения полей семантических признаков и модифицирует действия, связанные с грамматическими правилами вывода так, что они формируют узлы дерева синтаксического анализа правильного формата. Кроме того, настоящее изобретение включает подпрограммы семантического признака, которые определяют значения признака для хранения в дереве синтаксического анализа для различных семантических признаков. 2 с. и 12 з.п. ф-лы, 11 ил.

Формула изобретения RU 2 115 158 C1

1. Способ синтаксического анализа исходной программы, выполняемой компьютером, заключающийся в том, что вводят исходную программу, вводят оператор исходного кода исходной программы, определяют правило вывода, которое относится к оператору исходного кода, записано в блоке памяти и имеет ассоциированное действие, которое также хранится в блоке памяти, и проводят синтаксический анализ, отличающийся тем, что создают узел дерева текущего синтаксического анализа в блоке памяти во время процедуры синтаксического анализа в соответствии с ассоциированным действием, при этом узел дерева текущего синтаксического анализа имеет поле семантического признака, и запоминают во время процедуры синтаксического анализа в соответствии с ассоциированным действием значение семантического признака узла дерева текущего синтаксического анализа. 2. Способ по п.1, отличающийся тем, что осуществляют логический анализ между введением оператора исходного кода и определением правила вывода и получают лексемы элементарных значений, определение правила вывода осуществляют в соответствии с полученными лексемами. 3. Способ по п.1, отличающийся тем, что запоминание значений семантического признака осуществляют следующим образом, определяют значения семантического признака по меньшей мере одного порожденного узла для узла дерева текущего синтаксического анализа и определяют значение семантического признака узла дерева текущего синтаксического анализа в соответствии со значениями определенного семантического признака по меньшей мере одного порожденного узла. 4. Способ по п.1, отличающийся тем, что при запоминании значения семантического признака в поле семантического признака узла дерева текущего синтаксического анализа осуществляют запоминание значения семантического признака, определенного подпрограммой семантического признака. 5. Способ по п. 4, отличающийся тем, что подпрограмму семантического признака вызывают вызовом функции. 6. Способ по п. 4, отличающийся тем, что подпрограмму семантического признака вызывают вызовом процедуры. 7. Способ по п. 1, отличающийся тем, что осуществляют семантический анализ, при котором используют запомненное значение семантического признака в дереве синтаксического анализа. 8. Устройство для синтаксического анализа, содержащее блок памяти, обеспечивающий хранение по меньшей мере одного оператора исходного кода в исходной программе и хранение множества правил вывода, причем каждое правило имеет ассоциированное действие, которое также хранится в блоке памяти, определитель правила вывода, подключенный к блоку памяти и предназначенный для определения правила вывода из множества правил вывода, которые относятся к оператору исходного кода, отличающееся тем, что содержит синтаксический анализатор, подключенный к первому блоку семантического анализа, обеспечивающий создание в блоке памяти узла дерева текущего синтаксического анализа, имеющего поле семантического признака, во время синтаксического анализа в соответствии с ассоциированным действием, и второй блок семантического анализа, подключенный к первому блоку семантического анализа и обеспечивающий хранение в блоке памяти во время синтаксического анализа в соответствии с ассоциированным действием значения семантического признака в поле семантического признака узла дерева текущего синтаксического анализа. 9. Устройство по п.8, отличающееся тем, что содержит лексический анализатор для выдачи лексем оператора исходного кода, связанный с исходной программой, в котором определитель правила вывода получает лексемы в качестве сигнала входа. 10. Устройство по п.8, отличающееся тем, что второй блок синтаксического анализатора дополнительно содержит блок для определения значений семантического признака y по меньшей мере одного порожденного узла для узла дерева текущего синтаксического анализа и блок для определения значения семантического признака узла дерева текущего синтаксического анализа в соответствии с определенными значениями семантического признака для по меньшей мере одного порожденного узла. 11. Устройство по п.8, отличающееся тем, что блок памяти предназначен для хранения значения семантического признака, определенного подпрограммой семантического признака. 12. Устройство по п. 11, отличающееся тем, что вызов подпрограммы семантического признака осуществляется посредством вызова функции. 13. Устройство по п. 11, отличающееся тем, что вызов подпрограммы семантического признака осуществляется посредством вызова процедуры. 14. Устройство по п.11, отличающееся тем, что дополнительно содержит семантический анализатор, связанный с синтаксическим анализатором и предназначенный для выполнения семантического анализа оператора исходного кода в соответствии с запомненным значением семантического признака в дереве синтаксического анализа.

Документы, цитированные в отчете о поиске Патент 1998 года RU2115158C1

EP, патент, 0372834, кл
Приспособление для точного наложения листов бумаги при снятии оттисков 1922
  • Асафов Н.И.
SU6A1

RU 2 115 158 C1

Авторы

Сафонов Владимир Олегович

Даты

1998-07-10Публикация

1995-10-24Подача