Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С. П. КОРОЛЕВА
УЧЕБНО-ИССЛЕДОВАТЕЛЬСКАЯ СИСТЕМА
КОНСТРУИРОВАНИЯ ФОРМАЛЬНЫХ ЯЗЫКОВ
"ГРАММАТИКА"
Методические указания к выполнению лабораторных и самостоятельных работ
САМАРА 1997
Составители М.А. Кораблин, Е.В. Симонова, М.А. Шамашов, Л.Г. Мажаров
УДК 519.682:681.142
Учебно-исследовательская система конструирования формальных языков "Грамматика": Метод указания к выполнению лабораторных и самостоятельных работ/ Самар. госуд. аэрокосм. ун-т;
Сост. М.А. Кораблин, Е.В. Симонова, М.А. Шамашов, Л.Г. Мажаров. Самара. 1997. 31с.
Методические указания содержат сведения об основных функциях учебно - исследовательской системы конструирования формальных языков "Грамматика", а также варианты заданий для выполнения самостоятельных и лабораторных работ по проектированию таких языков.
Предназначены для использования в учебном процессе специальностей "Прикладная математика и компьютерные науки", "Автоматизированные системы обработки информации и управления", "Автоматизированные информационные системы", "Программное обеспечение вычислительных и автоматизированных систем".
Печатаются по решению редакционно-издательского совета Самарского государственного аэрокосмического университета имени академика С.П.Королева
Рецензент: Калентьев А.А.
1. ОБЩАЯ ХАРАКТЕРИСТИКА СИСТЕМЫ
Учебно-исследовательская система конструирования формальных языков (ФЯ) "Грамматика" предназначена для автоматизированной разработки предметно-ориентированных языков. Система предлагает методологию и набор программных средств, позволяющих существенно сократить объем работ по программированию при создании трансляторов. В учебном процессе система может быть полезна при изучении теории формальных языков и грамматик, теории компиляции, а также в приобретении практических навыков разработки языков. Данные методические указания содержат описание компонент системы "Грамматика" и принципов ее использования. Основы теории формальных языков и грамматик и теории компиляции изложены в [1,2,3,4,5,6].
Разработанная система основана на использовании синтаксически-управляемых процессов редактирования текстов, оформленных на ФЯ. В основе таких процессов лежит принцип сопоставления фразовых структур (строк текста) с образцом (см. рис. 1).
"Образцом" является грамматика ФЯ, полностью описывающая множество разнообразных фразовых структур, которые могут быть использованы в "Описании".
Анализатор в этой схеме является универсальной программой, функционирующей с использованием любого Образца. Смена Образца формально приводит к определению нового ФЯ.
Результаты анализа оформляются в виде некоторой абстрактной структуры - "Плана" на рис. 1. План формируется только при условии полного соответствия Описания Образцу и в общем случае представляет собой последовательность определенных семантических действий, реализующую содержащиеся в Описании инструкции.
Если рассматривать Описание как программу на ФЯ, то План будет определять результат трансляции этой программы.
Описание, Образец и План определяют структуры соответствующих файлов.
Описанная упрощенная схема реализуется в системе "Грамматика" следующими компонентами:
• подсистемой спецификации ФЯ,
• подсистемой анализа описаний на ФЯ и формирования результатов такого анализа.
Подсистема спецификации ФЯ включает в себя:
• метаязык, позволяющий специфицировать формальные языки на уровне лексики, синтаксиса, а также связывать с синтаксисом внешние семантические процедуры,
анализатор корректности спецификации формального языка. Подсистема анализа описаний на ФЯ включает в себя:
лексический анализатор предложения,
синтаксический анализатор предложения.
2. СПЕЦИФИКАЦИЯ ФОРМАЛЬНОГО ЯЗЫКА
Спецификация ФЯ, именуемая грамматикой, представляет собой текст, содержащийся в некотором файле; файл может иметь любое имя и расширение, по умолчанию используется расширение "grm". Спецификация выполняется на метаязыке, в основе которого лежит расширенный формализм Бэкуса-Наура.
Грамматика образуется конечным множеством продукций, каждая из которых состоит из имени и тела и представляется в следующем виде:
имя_продукции ::= тело_продукции **
Здесь имя_продукции - идентификатор, определяющий уточняемое понятие (нетерминал),
::= - метасимвол, разделяющий имя и тело продукции, тело_продукции - описание (уточнение) нетерминала. Тело продукции определяет синтаксическую структуру множества фраз конструируемого языка (сентенциальную форму), ** - метасимвол, означающий конец продукции.
Тело продукции образуется последовательностью из ключевых слов конструируемого языка, разделителей, метасимволов, терминалов и нетерминалов.
Каждый нетерминал в теле продукции должен быть заключен в скобки нетерминала (см. ниже). Кроме того, любой нетерминал, упомянутый в теле продукции, должен быть определен отдельной продукцией, имя которой идентично этому нетерминалу. Например,
А::= ...<_ В _>...**
В ::=....**
Могут быть два исключения из этого правила:
В качестве ключевого слова языка может выступать любой идентификатор, принадлежащий конструируемому языку. Он определяется последовательностью букв латинского и/или русского алфавита, арабских цифр, символа пробела, начинающейся с буквы, например procedure, begin, end. Идентификатор может иметь любую длину, однако отметим, что описываемая система анализирует только первые 32 символа, прописные буквы равнозначны строчным.
Разделителем является последовательность символов, не являющихся буквами латинского или русского алфавитов, цифрами, символами пробела, табуляции, конца строки. К разделителям относятся, например, : ; , >= <> =! @. Система различает разделители по первым 8 символам.
Метасимволы - это символы, имеющие строго определенное значение в данной нотации, использование их в каком-либо ином смысле недопустимо. К метасимволам относятся:
<_ и _> - скобки нетерминала. Любой текст, используемый внутри скобок нетерминала, интерпретируется системой как имя продукции, например, <_Список_параметров_>.
[_ и _] - скобки факультативного элемента грамматики. Такой элемент определяет синтаксическую структуру, которая может отсутствовать в описаниях на ФЯ. Например, элемент [_ (ABC) _] означает, что образец (ABC) может быть использован для анализа текущего фрагмента описания, а может быть, и нет.
{_ и _} - скобки итеративного элемента, т.е. элемента, который может повторяться в описании на ФЯ 0,1 или более раз. Например, элемент {_ <_АВС _> _} означает, что образец (ABC) может последовательно использоваться для анализа фрагмента описания 0, 1, 2, ... раз. Другими словами, этот элемент допускает следующие строки фрагмента описания:
пустая строка
(ABC)
(ABC) (ABC)
(ABC) (ABC) (ABC)
?_ и _|_ и _? - скобки и разделитель списка альтернатив. Данная конструкция используется при анализе строки описания на соответствие одному из указанных вариантов. Например, конструкция ?_ + _|_ - _|_ * _|_ / _? означает символ + или - или * или /.
(_ и _) - скобки семантики. Между скобками должно быть указано целое число в диапазоне 0..65535, означающее номер семантической процедуры, например, (_15_). Сведения, необходимые для разработки набора этих процедур, реализующего семантический анализ текста на ФЯ, изложены в разделе "Анализ текста на формальном языке".
(* и *) - скобки комментария. Текст, заключенный между этими скобками в грамматике ФЯ, при анализе игнорируется.
Терминалы, или терминальные символы грамматики, - это любые символьные строки ФЯ, которые не требуют определения в продукциях грамматики ФЯ. Ключевые слова и разделители являются разновидностями терминалов.
Система содержит три предопределенных нетерминала: Name, Numb, Real, порождающих соответственно множество идентификаторов произвольной длины с 32 первыми значащими символами, множество целых чисел без знака в диапазоне от 0 до 65535, множество вещественных чисел без знака в диапазоне от 2.9е-39 до 1.7е38.
Оформление грамматики должно учитывать специфику используемых в системе алгоритмов сопоставления с образцом. Алгоритмы нисходящего рекурсивного анализа (рекурсивного спуска), реализованные в системе, накладывают два дополнительных ограничения на грамматику ФЯ.
Продукции видов
А::=<_А_>... **,
А::=[_<_А_> ... и т.п.
приводят к бесконечному рекурсивному спуску. Поэтому они должны быть преобразованы к виду, устраняющему "левую" рекурсию. Подобные преобразования могут быть выполнены различными способами. Например, продукция вида
А ::= ?_ <_ А_> а _|_ а_? **
может быть заменена эквивалентной продукцией, свободной от "левой" рекурсии:
А::=а{_а_}** Возможны и другие эквивалентные преобразования.
Рассмотрим грамматику:
А ::= [_<_B_> _] <_С_> **
В ::= abc **
С ::= abc **
Если применить ее к анализу строки "abc", то результатом будет FALSE - "строка не соответствует грамматике". Это обусловлено тем, что факультатив [_ <_ В _> _] эквивалентен альтернативе с пустой второй частью: ?_ <_ В _> _|_ _?. Использование такой грамматики при анализе строки "abc" приводит к заключению:
( <_ В _>"abc" = TRUE) AND ( <_ С _>" " = FALSE) = FALSE; (здесь "" - пустая строка). Если же заменить продукцию
A ::=[_<_B_>_] <_C_> ** на эквивалентную (только для этого примера!)
А::=<_С_>[_<_В_>_]** то результатом сопоставления строки "abc" с образцом А будет
( <_ С _>"abc" = TRUE) AND ( <_ В _>" " = TRUE) = TRUE. Такие коллизии возникают при использовании альтернатив с идентичными начальными частями вариантов. Например,
А ::= ?_ ab _|_ abc _|_ abce _? d **
Анализ входной строки "abcd" по этой продукции приведет к результату FALSE, поскольку первый вариант альтернативы (ab) дает результат TRUE, а оставшаяся подстрока "cd" дает результат FALSE при сопоставлении с образцом d. Переупорядочение вариантов по принципу "длинные вперед" приведет к правильному результату.
Любая правильно оформленная грамматика должна быть проверена на корректность. Анализ грамматики на корректность связан с выявлением ошибок в спецификации языка. Простейшие из них:
1) неопределенные нетерминалы (нетерминалы, не принадлежащие к предопределенным и не имеющие эквивалентов среди имен продукций);
Контроль грамматики по желанию пользователя может сопровождаться демонстрацией грамматики в отдельном окне, указанием текущего обрабатываемого символа, а также протоколированием - фиксированием в отдельном файле и окне последовательности решений анализатора. Файл протокола имеет имя, совпадающее с именем грамматики, и расширение "gap".
По результатам анализа грамматики система выдает следующие сообщения:
Ниже приводится пример грамматики, определяющей простой паскалеподобный язык.
Программа ::= program <_Name_>;
[_ <_ Константы _> _]
[_ <_ Переменные _> _] begin
{_ <_ Операция _> _} end. **
Константы ::= const {_ <_Name_> = <_Число_>; _} **
Переменные ::= var {_ <_Name_> {_ ,<_Name_>_} : .
<_Стандартный_тип_>; _} **
Число ::= ?_ <_Numb_> _|_ <_Real_> _? **
Стандартный_тип ::= ?_ word _|_ byte _|_ char _|_ real _? **
Операция ::= <_Name_> := <_ Выражение_> **
Выражение ::= <_Операнд_> {_ <_Знак_Операции _> <_Операнд_> _} ; **
Операнд ::= ?_ <_Name_> _|_ <_Numb_> _|_ <_Real_> _? **
Знак_Операции ::=?_ + _|_-_|_ *_|_/_? **
Данная грамматика определяет язык, допускающий предложения типа
program Example;
const pi=3.14; r=2.0;
var len, r: real; begin
len:=2*pi*r; end.
3. АНАЛИЗ ТЕКСТА НА ФОРМАЛЬНОМ ЯЗЫКЕ
Описание (текст) на ФЯ, подлежащее анализу, должно находиться в файле стандартного текстового формата DOS; файл может иметь любое имя и расширение, по умолчанию предлагается расширение "snt". Анализ реализуется в три прохода (фазы): лексический, синтаксический и семантический анализ.
Лексический анализ осуществляется путем посимвольного сканирования описания слева направо, в ходе которого пропускаются комментарии и символы типа пробела, табуляции, конца строки, а также выделяются лексемы следующих пяти видов:
ключевые слова языка, " •
разделители языка,
идентификаторы, не являющиеся ключевыми словами языка,
целые числа без знака (в диапазоне 0..65535),
вещественные числа без знака (в диапазоне 2.9е-39 .. 1.7е38).
Появление прочих символьных конструкций, например, незакрытых комментариев, выходящих из допустимого диапазона чисел, отсутствующих в языке разделителей, считается лексической ошибкой. В этом случае символы предложения пропускаются до ближайшего пробела, табуляции, конца строки, а далее анализ продолжается.
Лексический анализатор имеет несколько режимов работы. Так, анализируемое предложение может отображаться или не отображаться на экране дисплея во время анализа, предусмотрен также пошаговый анализ.
Лексический анализ может сопровождаться протоколированием -фиксированием в отдельном файле последовательности принимаемых анализатором решений; файл протокола имеет имя, совпадающее с именем описания, и расширение "lap". Пользователь системы управляет созданием и отображением на экран дисплея протокола.
Синтаксический анализ предложения проводится левосторонним нисходящим методом с ограниченными возвратами (бектрекинг).
Пользователю системы предоставлена возможность управления состоянием грамматики и описания на ФЯ во время анализа. Синтаксический анализ может сопровождаться построением дерева разбора предложения, представляемого в скобочной форме. Особенности такого представления проиллюстрируем на примере.
Грамматика арифметических выражений:
врж::=?_<_терм_>+<_врж_>_|_<_терм_>-<_врж_>_|_<_терм_>_?**
терм::=?_<_мнж_>*<_терм_>_|_<_мнж_>/<_терм_>_|_<_мнж_>_? *
мнж ::= ?_ ( <_врж_> ) _|_ <_Numb_> _? **
Предложение, соответствующее этой грамматике:
6-4/2
Две различные графические формы дерева разбора приведены на рис. 2. В случае а) имена продукций не указаны, в случае б) имена продукций указаны.
Дерево разбора этого предложения в скобочной форме имеет вид: (врж (терм (мнж 6 мнж) терм)-(терм (мнж 4 мнж) / (мнж 2 мнж) терм) врж)
Файл, содержащий дерево разбора, имеет расширение "t". Пользователю предоставлена возможность управления созданием, отображением и составом дерева.
Семантический анализ предложения производится специальными семантическими процедурами (СП), разрабатываемыми и описываемыми пользователем на произвольном языке программирования во внешнем по отношению к данной системе исполняемом файле.
Система "Грамматика" регламентирует связь СП с синтаксисом ФЯ следующим образом. СП нумеруются целыми числами из диапазона 0..65535. В описании грамматики указываются точки вызова и номера СП записью вида (_ N _), где "(_" , "_)" - метасимволы языка описания грамматик, N - номер СП.
Просматривая в процессе синтаксического анализа продукции и встречая в них точки вызова СП, система формирует план семантических действий - последовательность записей, содержащих номер СП и параметр СП, которым является последнее на данный момент встреченное в анализируемом описании ключевое слово или разделитель языка, идентификатор, целое или вещественное число. В случае успешного завершения синтаксического анализа полученная последовательность записывается в отдельный файл. План семантических действий может быть сформирован в двоичном или символьном представлении в зависимости от цели, преследуемой пользователем: план в двоичном представлении эффективно обрабатывается компьютером, тогда как план в символьном представлении более удобен для изучения, контроля, понимания принципов его формирования и использования. Файл с планом в двоичном представлении имеет расширение "smb", план в символьном представлении - расширение "sms"; имена обоих файлов совпадают с именем файла, содержащего разбираемое предложение.
Семантический анализ является синтаксически управляемым в том смысле, что последовательность семантических действий полностью определяется синтаксической структурой предложения. В приложении 1 приведена грамматика с вызовами СП, эквивалентная в синтаксическом отношении рассмотренной выше грамматике паскалеподобного языка. Точки вызова расставлены так, что обеспечивают получение всей необходимой для проведения семантического анализа информации: имен, чисел, операций и т.д.
Подчеркнем, что интерпретация плана семантических действий системой не осуществляется, а возлагается на семантический анализатор, разрабатываемый пользователем.
Система "Грамматика" предлагает несложный программный интерфейс для программ семантического анализа, создаваемых на языке Turbo Pascal. Исчерпывающее описание интерфейса приведено в приложении 2. Пример программы на языке Pascal, осуществляющей простейший семантический анализ - вывод на экран дисплея плана семантических действий, приведен в приложении 3.
4. ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС СИСТЕМЫ
Пользовательский интерфейс системы "Грамматика" содержит следующие элементы:
• иерархическое меню, открывающее доступ ко всем функциям системы,
• "горячие клавиши", обеспечивающие быстрый вызов наиболее употребимых функций,
контекстную и общую помощь,
строку статуса, информирующую о текущем состоянии интерфейса,
многооконный текстовый редактор, предназначенный для создания и редактирования грамматик и предложений.
Пользовательский интерфейс системы "Грамматика" предусматривает использование следующих стандартных клавиш: <Alt+X> - при нахождении в редакторе - выход из системы; <F1> - контекстная помощь;
<F10> - при нахождении в редакторе - выход в меню; <Alt> + <выделенный цветом символ пункта главного меню> - при нахождении в редакторе - быстрый вход в пункт меню; <←>,<→> - при нахождении в главном меню - перемещение по пунктам главного меню;
<↑>, <↓> - при нахождении в подменю - перемещение по пунктам подменю;
<Tab>, <Shift_Tab> - при нахождении в диалоговых окнах - перемещение по полям диалоговых панелей;
<Alt> + <выделенный цветом символ текущего меню или панели> - при нахождении в подменю или в диалоговом окне • исполнение указанной команды; <Enter> - исполнение команды.
Главное меню системы содержит пункты: , Грамматики, Предложения, Файлы, Редактор, Окна, Помощь.
Пункт объединяет команды управления интерактивной средой системы и выполнения вспомогательных функций: вызов интерпретатора MS DOS, выполнение команды MS DOS, настройка цветовой гаммы и мыши, вызов калькулятора, выход из системы и т.п.
Грамматики
Пункт Грамматики главного меню содержит команды работы с грамматиками:
Грамматика, которая будет обрабатываться при следующем исполнении команды Грамматики => Анализ грамматики (или использоваться при анализе предложений, см. следующий пункт), называется текущей грамматикой. По умолчанию, текущей является последняя созданная или открытая грамматика; команда Грамматики => Установить текущую грамматику позволяет явно и однозначно указать обрабатываемую грамматику, не загружая ее при этом в редактор.
Анализ грамматики проводится в одном из нескольких режимов, определяемых состоянием грамматики и состоянием протокола анализа грамматики во время анализа. Режим задается посредством заполнения анкеты, вызываемой командой Грамматики => Настроить анализатора грамматики, состоящей из двух следующих пунктов:
состояние грамматики во время анализа,
состояние протокола анализа грамматики.
Параметр "Состояние грамматики во время анализа" имеет значения:
не отображать грамматику - она будет не видима во время анализа,
отображать грамматику на экране дисплея и указывать анализируемое слово, •
отображать грамматику на экране дисплея и анализировать ее в шаговом режиме.
Параметр "Состояние протокола анализа грамматики" имеет значения:
не создавать протокол анализа;
создать протокол на диске и не отображать его на экране дисплея во время анализа;
создать протокол на диске и отображать его на экране дисплея во время анализа;
• создать, отображать на экране дисплея и заполнять в шаговом режиме.
Предложения
Пункт Предложения главного меню содержит команды работы с предложениями:
создать новое предложение,
открыть существующее предложение,
установить текущее предложение,
провести лексический анализ предложения,
настроить лексический анализатор предложений,
провести синтаксический анализ предложения,
настроить синтаксический анализатор предложений.
Предложение, которое будет обрабатываться при следующем исполнении команд Предложение => Лексический анализ или Предложение => Синтаксический анализ, называется текущим предложением. По умолчанию, текущим является последнее созданное или открытое предложение; команда Предложение => Установить текущее предложение позволяет явно и однозначно указать обрабатываемое предложение, не загружая его при этом в редактор.
Лексический анализатор предложений имеет несколько режимов работы, различающихся состоянием предложения и состоянием протокола анализа во время проведения анализа. Требуемый режим задается командой Предложения => Настроить лексический анализатор, открывающей диалоговое окно с двумя следующими основными пунктами:
состояние предложения во время анализа
состояние протокола лексического анализа грамматики.
Параметр "Состояние предложения во время анализа" имеет значения:
не отображать предложение - оно будет не видимо во время анализа,
отображать предложение на экране дисплея и указывать анализируемое слово,
отображать предложение на экране дисплея и анализировать в шаговом режиме.
Параметр "Состояние протокола лексического анализа" имеет значения:
не создавать протокол,
создать на диске и не отображать на экране дисплея,
создать на диске и отображать на экране дисплея,
создать на диске, отображать на экране дисплея и заполнять в шаговом режиме.
Настройка синтаксического анализатора предложений, также имеющего несколько режимов работы, осуществляется при помощи специального диалогового окна, вызываемого командой Предложения =>
Настроить синтаксический анализатор. Шесть параметров анализатора таковы.
Параметр "Состояние грамматики во время анализа" имеет значения:
не отображать грамматику,
отображать грамматику на экране дисплея и указывать анализируемое слово,
отображать на экране дисплея и анализировать в шаговом режиме (шаг - формирование очередного символа грамматики).
Параметр "Состояние предложения во время анализа" имеет значения:
не отображать предложение,
отображать предложение на экране дисплея и указывать анализируемое слово,
отображать на экране дисплея и анализировать в шаговом режиме (шаг - формирование очередной лексемы).
Параметр "Состояние дерева разбора предложения" имеет значения:
• не создавать дерево разбора,
» создать дерево на диске и не отображать его на экране дисплея,
создать дерево на диске и отображать его на экране дисплея,
создать на диске и отображать процесс построения дерева в шаговом режиме.
Параметр "Состав дерева разбора предложения" имеет значения:
включить в состав дерева нетерминальные символы,
включить в состав дерева терминальные символы,
• включить в состав дерева номера семантических процедур.
Параметр "Состояние плана семантических действий в символьной форме" имеет значения:
не создавать план,
создать на диске и не отображать на экране дисплея,
создать на диске и отображать в отдельном окне на экране дисплея,
создать на диске, отображать на экране дисплея и заполнять в шаговом режиме (шаг - занесение очередной записи в план).
Параметр "Состояние плана семантических действий в двоичной форме" имеет значения:
не создавать план,
создать план на диске.
Данный раздел меню обеспечивает открытие файлов, содержащих протоколы анализов грамматик и предложений, деревья разбора, программы семантического анализа, а также сохранение в долговременной памяти грамматик и предложений:
создать новый файл,
открыть существующий файл,
сохранить файл, связанный с текущим окном редактора, в долговременной памяти,
сохранить как - сохранить файл, связанный с текущим окном редактора, в долговременной памяти под новым именем,
сохранить все открытые файлы в долговременной памяти.
Редактор
Данный пункт главного меню содержит набор стандартных команд редактирования текста: отмена последнего редакционного действия, манипулирование блоками текста (вырезать, копировать, вставить, удалить), поиск, замена, переход на заданную строку, вывод содержимого буфера редактора.
Окна
Пункт главного меню Окна содержит традиционные команды управления окнами редактора.
Помощь
Пункт главного меню Помощь позволяет получить информацию о правилах использования системы "Грамматика", правилах оформления грамматик и предложений, режимах анализа грамматик и предложений, пользовательском интерфейсе.
5. ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ
Лабораторная работа выполняется в несколько этапов:
6. ЗАДАНИЯ К ЛАБОРАТОРНОМУ ПРАКТИКУМУ
1. Определите грамматику языка описания констант, переменных и арифметических выражений, использующих
бинарные арифметические операции (+, -, *, /),
целые числа.
унарный минус,
переменные и константы,
круглые скобки, определяющие приоритеты выполнения операций
Определите также синтаксические структуры для описания операторов присваивания целых значений односимвольным переменным и семантические процедуры вычисления значений арифметических выражений. Предусмотрите выдачу сообщений об ошибках в случае несовместимости типов операндов в выражениях, а также в случае несоответствия количества открывающих и закрывающих скобок.
2. Определите грамматику языка описания констант, логических переменных и логических выражений, использующих
бинарные операции конъюнкции, дизъюнкции, импликации (&, OR, ->),
логические константы (TRUE, FALSE),
унарную операцию, отрицания (NOT).
переменные,
- круглые скобки, определяющие приоритеты выполнения операций Определите также синтаксические структуры для описания операторов присваивания значений односимвольным логическим переменным
и средства для вычисления значений логических выражений. Предусмотрите выдачу сообщений об ошибках в случае несоответствия количества открывающих и закрывающих скобок в выражениях.
3. Определите грамматику языка описания теоретико-множественных выражений, использующих
бинарные операции пересечения, объединения и разности множеств (*, +, -),
символы пустого и универсального множеств (О и I),
унарную операцию дополнения множества (@),
переменные множественного типа,
круглые скобки, определяющие приоритеты выполнения операций.
Определите также синтаксические структуры для описания операторов присваивания значений односимвольным переменным множественного типа и средства для вычисления значений теоретико-множественных выражений. Предусмотрите выдачу сообщений об ошибках в случае несоответствия количества открывающих и закрывающих скобок в выражениях.
4. Определите грамматику языка описания полиномов вида Рn = anxn + an-1xn-1 + ... + a1x + а0 с целыми коэффициентами (х может принимать целые или вещественные значения).
Любой полином степени n определяется выражением, которое представляет собой сумму слагаемых вида аiхi, упорядоченных по убыванию степени х. Слагаемые вида 0*хi могут быть опущены в определении полинома.
Язык должен содержать операторы, выполняющие следующие действия над полиномами:
сложение двух полиномов Рn(х) и Рm(х);
перемножение двух полиномов;
вычисление значения полинома Рn(х) по заданному значению х (х - вещественное).
Результатом первой операции должен быть полином Рmax(n,m) (х), второй -полином Р(n+m) (х), третьей - вещественное число.
Напишите семантические процедуры, реализующие действия над полиномами.
5. Определите грамматику языка описания структуры "фазового портрета". Такая структура представляет собой декартову систему координат, размещаемую на графическом экране монитора (в определенном окне) и предназначенную для вывода значений двух переменных в виде точки в этой системе.
Описание "фазового портрета" должно определять следующие основные параметры:
параметры окна наблюдения,
точку начала координат, "привязанную" к возможным значениям отображаемых переменных,
- диапазоны значений переменных, связанных с окном.
Предложите синтаксическую структуру оператора, который осуществляет вывод текущих значений двух переменных в структуру "фазового портрета" с целью анализа их динамических взаимосвязей и напишите семантические процедуры, реализующие этот оператор.
6. Определите грамматику языка описания размеченных графов. Любая вершина такого графа специфицируется именем, может иметь несколько исходящих и входящих дуг, каждая дуга помечается весом, представляющим собой целое число. Описание графа должно определяться последовательностью операторов связей между вершинами. Например, описание вида
А - (4) -> В;
В - (3) -> С;
С -(1)-> А;
определяет граф с тремя вершинами А, В, С, образующими замкнутый контур. В круглых скобках указаны веса дуг. Этот же граф может быть определен описанием, использующим не три, а только один оператор связи:
Возможно использование в одном операторе нескольких дуг, выходящих из одной вершины. Например,
А - (4) -> В, (3) -> С;
С -(1)-> А;
В - (2) -> А;
Здесь описан двухконтурный граф с разветвлением в вершине А. Его же можно описать оператором, определяющим несколько путей, ведущих из одной вершины:
А - [ (4) -> В - (2) -> А; (3) -> С - (1) -> А ];
Реализуйте семантическую процедуру преобразования графа, заданного его описанием, в структуру квадратной матрицы связей между вершинами (матрицы смежности).
7. Определите грамматику для описания интерполированных функций (И-функций). Любая И-функция является функцией одного аргумента и задается узлами интерполяции (точками в декартовой системе координат) и видом интерполяции (линейной или кусочно-постоянной). Определение функции должно включать в себя спецификацию следующих элементов:
имя функции,
имя аргумента,
вид интерполяции,
набор узлов интерполяции.
Предложите синтаксическую структуру оператора, вычисляющего значение функции по заданному значению аргумента и реализуйте его семантическими методами.
& Некоторые языки программирования разрешают использование в выражениях нескольких операторов присваивания, например,
a:=b+(c:=3)*(b:=d:=(h+4))-6+r:=e.
Определите грамматику языка описания арифметических выражений со множественным присваиванием, использующих
односимвольные переменные,
целые числа,
бинарные арифметические операции (+, -, *, /),
оператор присваивания (:=),
круглые скобки, определяющие приоритеты выполнения операций.
Реализуйте вычисление значения арифметического выражения со множественным присваиванием. Предусмотрите выдачу сообщения об ошибке в случае, если какая-либо переменная, входящая в арифметическое выражение, не определена значением.
9. Определите грамматику квалидентов. учитывающую все возможные методы доступа к данным (именование, индексацию, ссылки). В качестве индексов могут использоваться целые числа и односимвольные целочисленные переменные.
Примеры правильных квалидентов:
А[1,7]^.С[20]
А^.В^.С^[1] и т.д.
Определите также синтаксические структуры для описания операторов присваивания целых значений односимвольным переменным и реализуйте соответствующие семантические процедуры. Предусмотрите выдачу сообщения об ошибке, если в качестве какого-либо индекса используется переменная, не определенная значением.
10. Определите грамматику квалидентов, использующих именование и индексацию как методы доступа к данным. В качестве индексов могут использоваться арифметические выражения. Арифметические выражения используют
бинарные арифметические операции (+, -),
целые числа,
односимвольные целочисленные переменные.
Примеры правильных квалидентов:
А[1+2 - B+5),7].C[F+3-20], A.B.C [I] и т.д.
Определите также синтаксические структуры для описания операторов присваивания целых значений односимвольным переменным. Реализуйте семантику упрощения арифметических выражений, используемых в качестве индексов. Предусмотрите выдачу сообщения об ошибке, если какая-либо переменная, входящая в арифметическое выражение, не определена значением.
11. Определите грамматику языка описания геометрических фигур: окружностей, прямоугольников, квадратов, треугольников. Обеспечьте проверку корректности описания геометрических фигур.
Треугольник корректен, если длины его сторон положительны, а сумма длин двух различных его сторон больше длины третьей стороны.
Окружность корректна, если ее радиус больше 0.
Квадрат корректен, если существуют два таких числа а и b (a>b), что для любой вершины расстояние от нее до одной из трех других равно а, а до каждой из двух оставшихся равно b.
Прямоугольник корректен, если существуют три таких числа а,b и с (а, b, с>0), что для любой вершины расстояние от нее до одной из оставшихся вершин равно а, до другой - b и до третьей - с, причем а2 + b2 = с2.
12. Определите грамматику разделов описания модулей языка Мо-дула-2. Примеры правильных цепочек языка приведены ниже.
DEFINITION MODULE NameMod1; (* Раздел определений *)
EXPORT Т1 ,Т2,V3; (* Список экспорта *)
TYPE T1;T2 = REAL; VAR V3: INTEGER;
END NameMod1.
IPLEMENTATIOM MODULE NameMod1; (* Раздел реализаций *)
FROM NameMod2 IMPORT V4; (* Список импорта *)
TYPE T1 = CARDINAL; VAR V5:TI;
BEGIN V3:=5; V5:=V4; (* Тело модуля *)
END NameMod1.
DEFINITION MODULE NameMod2;
FROM NameMod3 IMPORT ABC; (* Список импорта *)
VAR V4: CARDINAL;
END NameMod2.
IMPLEMENTATION MODULE NameMod2;
BEGIN
END NameMod2.
DEFINITION MODULE NameMod3;
EXPORT ABC; (* Список экспорта*)
VAR ABC: CARDINAL;
END NameMod3.
IMPLEMENTATION MODULE NameMod3;
BEGIN
END NameMod3.
MODULE NameMod[l];
(* Главный модуль: в прямоугольных скобках указан приоритет, который не
является обязательным *) FROM NameMod1 IMPORT T2,V3,T1; VAR V6: T2; V7: T1; V8: INTEGER; V9: CHAR; BEGIN V6:=-20; V8:=V3; V7:=65535; V9:='A'; END NameMod.
Составьте бесповторную упорядоченную таблицу, содержащую имена модулей, имена типов и идентификаторы переменных в соответствующих разделах. Проверьте, чтобы все идентификаторы, встретившиеся в списке экспорта какого-либо модуля, были описаны в разделе определений этого модуля. Проверьте, чтобы все объекты, встретившиеся в списке импорта какого-либо модуля, были экспортированы из соответствующего модуля.
13. Определите грамматику разделов описания констант, типов (диапазон, перечисление, массив и множество), а также переменных языка Модула-2. Один или несколько разделов описаний могут отсутствовать. Примеры правильных цепочек языка приведены ниже.
MODULE Abc;
CONST С1=99; С2=-3; С3=5;
TYPE T1 = CARDINAL; (* Стандартный тип *)
Т2 = [1..10]; (* Тип диапазон *)
ТЗ = (красный, зеленый, синий); (* Тип перечисление *)
T4 = ARRAY[1..10] OF CHAR; (* Тип массив *)
Т5 = ARRAY T2 OF CARDINAL;
Т6 = ARRAY [0..5] OF Array[0..99] OF CHAR;
T7 = ARRAY[O..C1],[O..C3] OF Char;
T9 = ARRAY CHAR OF BOOLEAN; T1O = T7;
T10 = SET OF T3; (* Тип множество *)
T11 = ARRAY T2 OF T10;
VAR V1:T1; V2,V3: T3; V4: SET OF (красный.зеленый, синий); V5: REAL; BEGIN END Abc.
Составьте бесповторную упорядоченную таблицу, содержащую имена констант, имена типов и идентификаторы переменных в соответствующих разделах. Предусмотрите выдачу сообщений об ошибках в случае дублирования имен объектов в одном разделе, в случае совпадения имен объектов из различных разделов описания, а также, если при определении типа или переменной встретился тип, не определенный по тексту программы.
14. Определите грамматику разделов описаний типизированных констант (типа массив, запись и множество) языка Модула-2. Один или несколько разделов описаний могут отсутствовать. Примеры правильных цепочек языка приведены ниже.
MODULE Abc: TYPE
Arr = ARRAY[1..3] OF REAL;
M = ARRAY[1..2] OF INTEGER;
Matrix = ARRAY[I..3] OF M;
Data = RECORD
Year: CARDINAL; Month: [1..12]; Day:[1..31];
END;
A = ARRAY[1..3] OF CHAR; В = ARRAY[1..4] OF A;
Charset = SET OF CHAR;
Colour = (красный, зеленый, синий);
ТЗ = SET OF Colour; CONST
Ml =Arr(l.,2.,3.):
Matr = Matrix ( M(l,2), M(3,4), M(5,6));
SS = B( A('asd'), A('bcd'), A('dfg'), A('bmv'));
Birthday = Data( 1971, 12, 9);
С = Charset{'A'..'Z','0'..'9'};
Т = ТЗ{синий);
Составьте бесповторную упорядоченную таблицу типов, содержащую имя типа, имена и размерность атрибутов типа. Составьте также бесповторную упорядоченную таблицу констант. Предусмотрите выдачу сообщений об ошибках, если не все атрибуты типизированных констант определены или в случае несовместимости типов атрибутов в константе и в типе константы.
15. Определите грамматику разделов описания типа запись и запись с вариантами, а также переменных соответствующего типа языка Моду-ла-2. Примеры правильных цепочек языка приведены ниже.
TYPE
Rec = RECORD A: INTEGER; В: CARDINAL;
CASE Т: CHAR OF (* именованная вариантная часть *)
'А': C,D: REAL |
'В': Е: CARDINAL |
'С': F: REAL |
ELSE G,H,M : CHAR; (* необязательная часть *)
END; Z: REAL; END;
location = RECORD Value: CARDINAL;
CASE : BOOLEAN OF (* неименованная вариантная часть *)
TRUE: A: CARDINAL | FALSE: B: INTEGER END; END;
Составьте упорядоченную таблицу типов с указанием имени типа, имен и типов атрибутов и объема памяти, требуемого для размещения переменных типа. Составьте также бесповторную упорядоченную таблицу переменных.
16. Постройте грамматику языка, определяющего
операторы присваивания значений переменным стандартных типов, встроенных в язык;
условный оператор.
Составьте бесповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности условных операторов. Предусмотрите выдачу сообщения об ошибке, если встретится условный оператор, не закрытый операторными скобками.
17. Постройте грамматику языка, содержащего
операторы присваивания значений переменным стандартных типов, встроенных в язык;
оператор выбора.
Составьте бесповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности операторов выбора. Предусмотрите выдачу сообщения об ошибке, если встретится оператор выбора, не закрытый операторными скобками.
18, Постройте грамматику языка, определяющего
раздел описания переменных стандартных типов языка;
операторы присваивания значений переменным стандартных типов, встроенных в язык;
арифметические выражения, использующие
бинарные арифметические операции (+, -, *, /, DIV),
натуральные, целые и вещественные числа,
переменные и константы;
• операторы цикла с шагом.
Составьте бесповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения. Проверьте совместимость типов операндов в выражениях и вычислите значения выражений.
Определите уровень вложенности операторов цикла с шагом. Предусмотрите выдачу сообщения об ошибке, если встретится оператор цикла с шагом, не закрытый операторными скобками.
19. Постройте грамматику языка, определяющего
раздел описания типов массив и запись;
операторы присваивания значений переменным стандартных типов, встроенных в язык;
• арифметические выражения, использующие
бинарные арифметические операции (+, -),
целые числа,
односимвольные целочисленные переменные;
• операторы присоединения, использующие квалиденты с индексацией.
Составьте бесповторную упорядоченную таблицу типов с указанием имени типа, имен и типов атрибутов, бесповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности операторов присоединения. Предусмотрите выдачу сообщений об ошибках, если встретится оператор присоединения, не закрытый операторными скобками, в случае изменения значения присоединяемой переменной внутри оператора присоединения, а также в случае несоответствия типа присоединяемой переменной и атрибутов внутри оператора присоединения.
20. Постройте грамматику языка, определяющего
оператор присваивания значений переменным стандартных типов, встроенных в язык;
выражения, использующие
бинарные арифметические операции (*, /),
операции отношения (=,<>,<,>),
целые числа,
односимвольные целочисленные переменные;
• операторы цикла с постусловием.
Составьте бесповторную упорядоченную таблицу типов с указанием имени типа, безповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности операторов цикла. Сообщайте об ошибках, если встретится оператор цикла с постусловием, не закрытый операторными скобками.
21. Постройте грамматику языка, определяющего
раздел описания типов запись и ссылка;
операторы присваивания значений переменным стандартных типов, встроенных в язык, и переменным ссылочных типов;
выражения, использующие
квалиденты со ссылкой,
целые числа,
односимвольные переменные;
• операторы присоединения, использующие квалиденты со ссылкой.
Составьте бесповторную упорядоченную таблицу типов с указанием имени типа, имен и типов атрибутов, бесповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности операторов присоединения. Предусмотрите выдачу сообщений об ошибках, если встретится оператор, не закрытый операторными скобками, в случае изменения значения присоединяемой переменной внутри оператора присоединения, а также в случае несоответствия типа присоединяемой переменной и атрибутов внутри оператора присоединения.
22. Постройте грамматику языка, определяющего
операторы присваивания значений переменным стандартных типов, встроенных в язык;
выражения, использующие
бинарные арифметические операции (+,-),
операции отношения (=,<>,<,>),
целые числа,
односимвольные целочисленные переменные;
• операторы цикла с предусловием.
Составьте бесповторную упорядоченную таблицу типов с указанием имени типа, безповторную упорядоченную таблицу переменных с указанием имени, признака типа и объема памяти, отводимого для элемента хранения.
Определите уровень вложенности операторов цикла. Сообщайте об ошибках, если встретится оператор цикла с предусловием, не закрытый операторными скобками.
23. Определите грамматику описания "пустых" процедур (заглушек) и операторов вызова процедур языка МОДУЛА-2 с использованием формальных и фактических параметров стандартных типов. Примеры правильных цепочек языка приведены ниже.
MODULE Mod1;
VAR x: CARDINAL; q,w,v: REAL; b: BOOLEAN; i,j: CARDINAL;
PROCEDURE proc1(): CARDINAL;
(* Процедура-функция без параметров *)
BEGIN
END proc1;
PROCEDURE Sum(a,b: REAL): REAL; (* Процедура-функция с параметрами *) BEGIN END Sum;
PROCEDURE proc2(a,b: CARDINAL; VAR b: REAL; VAR s: BOOLEAN); (* Процедура-подпрограмма *) BEGIN END proc2;
BEGIN
i:=proc1(); q:=Sum(w,v); proc2(i,j,w,b); END Mod1.
Составьте таблицу с указанием имен процедур, списка формальных параметров и объема памяти, отводимой под каждый параметр. При вызове процедур проверяйте соответствие типа и порядка следования формальных и фактических параметров. Предусмотрите выдачу соответствующих сообщений об ошибках.
СПИСОК ЛИТЕРАТУРЫ
4. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. -М.: Мир, 1975.
ПРИЛОЖЕНИЕ 1
Программа ::=
program <_Name_> (_0_);
[_ <_ Константы _> _] [_ <_ Переменные _> _] begin
{_ <_ Операция _> _} end. (_10_)**
Константы = const {_ <_Name_> (_1_) = <_Число_> (_2_); _} **
Число = ?_ <_Numb_> _|_ <_Real_> _? **
Переменные = var {_ <_Name_>(_3_) {_ ,<_Name_>(_4_)_} : <_Стандартный_тип_> ;_} **..
Стандартный_тип ::=?_ word _|_ byte _|_ char _|_ real _?(_5_) **
Операция ::= <_Name_> (_6_) := <_ Выражение_> (_ 9 _)**
Выражение ::= <_Операнд_> {_ <_Знак_Операции _> <_Операнд_> _} ; **
Операнд ::= ?_ <_Name_> _|_ <_Numb_> _|_ <_Real_> _? (_7_) **
Знак_Операции ::=?_ + _|_-_|_ *_|_/_|(_8_) **
ПРИЛОЖЕНИЕ 2
ИНТЕРФЕЙС ПРОГРАММ СЕМАНТИЧЕСКОГО АНАЛИЗА С ПЛАНОМ СЕМАНТИЧЕСКИХ ДЕЙСТВИЙ
Для создания Turbo Pascal-программы, осуществляющей семантический анализ предложений на ФЯ, необходимо иметь в наличии и указать компилятору Turbo Pascal 7 модулей: GBase1.tpu, GBase2.tpu, GBase3.tpu, tpcrt.tpu, tpinline.tpu, tpmemchk.tpu, tpstring.tpu. Последние 4 из них принадлежат пакету Turbo Professional фирмы TurboPower, с использованием которого написан ряд функций системы "Грамматика". Модуль, осуществляющий семантический анализ, должен импортировать Gbase3, который содержит:
класс SemPointer, обеспечивающий работу с планом семантических действий,
тип SemWordT, определяющий структуру одной строки плана (записи файла).
Класс SemPointer SemUserT = object (...)
constructor Init;
function SFOpen( file_name: string): boolean;
function GetWord( var sr: word; var sw: SemWordT): boolean;
procedure SFWrite( sw: SemWordT );
function SFReset( t: word ): boolean;
destructor Done;
end;
SemPointer=^SemUserT;
constructor Init;
Вызов конструктора Init необходим для корректной работы прочих процедур.
function SFOpen( file_name: string): boolean;
Функция SFOpen имеет единственный параметр - имя файла, содержащего план семантических действий в двоичной форме. Функция возвращает значение True, если файл найден и инициированы все необходимые данные. Значение False свидельствует о невозможности выполнения дальнейших действий с данным планом.
function GetWord( var sr: word; var sw: SemWordT): boolean;
Функция GetWord предназначена для получения следующей записи плана. Функция возвращает значение True в случае корректного получения очередной записи. False - в противном случае. Через параметр sr передается код ошибки:
0: ошибок нет;
1: файл семантических данных не открыт;
2: ошибки при получении семантического слова;
3: чтение файла после исчерпания данных;
4: повторное сообщение об ошибке.
Procedure SFWrite( sw: SemWordT);
Процедура выводит на экран дисплея значение полей параметра sw.
Procedure SFReset( t: word ): boolean;
Процедура, в зависимости от значения параметра t, удаляет файл с планом (t=1) или закрывает его (t=2). Обращение к ней обязательно после завершения семантического анализа.
Destructor Done;
Процедура завершает цикл работ с планом и связанной с ним динамической переменной типа SemUserT.
Тип SemWordT Туре
SWType = ( Snoth, Seof, Ssw, Sss, Sname, Snumb, Sreal); SemWordT = Record
sa : Word; { номер семантической процедуры }
swp: TextPosition; { позиция слова в анализируемом предложении }
Case swt: SWType of
Snoth: ( ); { ничего }
Seof: ( ); { конец файла }
Ssw : ( swsw: string ); { ключевое слово языка)
Sss : ( swss: string); { разделитель языка}
Sname: ( swn : string ); { идентификатор }
Snumb: ( sww: word ); { число целое без знака }
Sreal: ( swr: real ) { число вещественное без знака }
end;
TextPosition = Record { позиция точки в тексте )
lp: word1; { файловая позиция начала строки }
sh: word; { смешение по строке к точке, т.е. файловая позиция точки есть (lp+sh)}
ln: word { номер данной строки, считая с 0 }
end;
ПРИЛОЖЕНИЕ 3
ПРИМЕР ПРОГРАММНОЙ РЕАЛИЗАЦИИ СЕМАНТИЧЕСКОГО АНАЛИЗАТОРА
program Sem_Example;
{
Данная программа осуществляет семантический анализ текста на ФЯ.
Исходными данными для анализа является план семантических действий (ПСД) в двоичной форме, формируемый системой Грамматика для корректных в синтаксическом отношении текстов.
Результат семантического анализа - файл с перечнем номеров и параметров семантических процедур, содержащихся в ПСД.
Имена и расширения имен исходного и порождаемого файлов задаются константами. }
uses Dos, TPCrt, GBase3;
const
SemFileName = 'sem_exam'; { имя файла, содержащего описание на ФЯ}
SernFileExt = 'smb'; { расширение имени файла, содержащего план }
{семантических действий}
ResFileExt = 'res'; { расширение имени формируемого файла }
var
Sem: SemPlanPointer; { переменная - план семантических действий }
sw: SemWordT; { очередная одна строка ПСД (запись файла)}
gr: word; { код результата чтения очередной строки ПСД }
tf: text; { файл, в который записывается результат семантического, анализа }
i: word; { рабочая переменная, используемая при создании файла }
procedure SemAction( sw: SemWordT); { процедура интерпретации строки ПСД}
{ интерпретация состоит в записи в файл, определяемый глобальной переменной tf, номера и параметра семантического действия }
begin
WriteLn( tf); WriteLn( tf,' Сем. действие:', sw.sa ); with sw do begin
WriteLn( tf,' Позиция в тексте (строка,столбец):', swp.ln+1,',', swp.sh+1 ); case swt of
Snoth : WriteLn( tf,' Параметр отсутствует'); Ssw : WriteLn( tf,' Ключевое слово:', swsw ); Sss : WriteLn( tf,' Разделитель:', swss); Sname : WriteLn( tf,' Имя :', swn); Snumb : WriteLn( tf,' Целое число:', sww); Sreal : WriteLn( tf,' Вещественное число :', swr); Seof : WriteLn( tf,' Конец файла');
else WriteLn( tf, 'не обрабатываемый тип семантического слова') end; end; end;
begin
{ оформление экран } ClrScr; Gotoxy( 1,3);
WriteLnC Семантический анализ предложения "', SemFileName,'" (по плану "',
SemFileName, '.', SemFileExt,'") .' );
{ открытие файл с ПСД }
New( Sem, Init);
if not Sem^.SFOpen( SemFileName+'.'+SemFileExt) then begin
WriteLn(' Ошибки при открытии файла семантических данных.');
exit; end;
{ создание файла, в который будет записан результат семантического анализа } Assign( tf, SemFileName+'.'+ResFileExt); {$I-} Rewrite (tf); {$I+} i := lOResult; if i <> 0 then begin
WriteLn(' Ошибки при создании файла результатов семантических действий.');
exit; end;
{ цикл чтения строки ПСД и ее интерпретации } { выход из цикла по ошибке или при достижении конца файла } while Sem^.GetWord( gr.sw) and (sw.swt<>Seof) do SemAction( sw); { анализ причины завершения цикла } if (gr<>0) then begin { причина 1: GetWord=false }
case gr of
0: { все нормально};
1: WriteLn(' Файл семантических данных не открыт.'); 2: WriteLn(' Ошибки при получении семантического слова.') ; 3: WriteLn(' Чтение файла после исчерпания данных.'); 4: WriteLn(' Повторное сообщение об ошибке.');
end; end else if sw.swt=Seof then begin { причина 2: считаны все записи ПСД }
{ закрытие файла результата }
WriteLn(tf); :
WriteLn( tf,' Конец файла'); Close( tf );
WriteLn(' Семантический анализ благополучно завершен.');
WriteLn(' Сформирован файл "',SemFileName,'.',ResFileExt,'" - интерпретация плана
сем. действий.'); end
( закрытие файла с ПСД } Sem^.SFReset( 1 ); Dispose( Sem, Done ); end.