Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Вопрос 6. Расширенная форма Бэкуса-Наура и синтаксические графы.
Форма Бэкуса-Наура (БНФ) была впервые применена при описании Алгола-60. БНФ совпадает по сути с нотацией КС-грамматик, отличаясь лишь обозначениями. Предусмотрены следующие метасимволы: < > — служат для выделения нетерминалов — понятий языка. | — «или». Разделяет альтернативные правые части правил. — «есть по определению». Заменяет стрелку, используемую при записи продукций КС-грамматик. Терминальные символы записываются как есть, никаких специальных способов их выделения не предусмотрено. Вот пример определений на БНФ, взятый из спецификации Алгола-60 — «Модифицированного сообщения»: < простое арифметическое выражение> :: = < терм> 1 Окак операции типа сложения> < терм> | < простое арифметическое выражение> < знак операции типа сложения> < терм> < знак операции типа сложения> :: = + | - Как уже говорилось, отсутствие в нотации формальных грамматик (и БНФ) средств явного задания повторений создает ряд трудностей. Во-первых, определения оказываются сложными для понимания, недостаточно наглядными из-за обилия рекурсий. Во-вторых, возникают проблемы с тем, что грамматики, дающие подходя- щие семантические деревья, оказываются леворекурсивными. При описании Модулы-2 и Оберона Н. Вирт использовал расширенную Бэкуса-Наура форму (РБНФ). Главные модификации касаются введения скобок { и} для повторений, а [ и ] — для обозначения необязательного вхождения цепочек терминалов и нетерминалов в правые части правил. Соглашения относительно обозначений терминалов и нетерминалов также изменены, что не столь принципиально. В дальнейшем мы будем пользоваться именно РБНФ. Вот как она определяется в спецификации Оберона-2: Варианты разделяются знаком |. Квадратные скобки [ и ] означают необязательность записанного внутри них выражения, а фигурные скобки { и } означают его повторение (возможно, 0 раз). Нетерминальные символы начинаются с заглавной буквы (например, Оператор). Терминальные символы или начинаются малой буквой (например, идент), или записываются целиком заглавными буквами (например, begin), или заключаются в кавычки (например, ": =" ). К этому следует добавить, что в роли знака «есть по определению» в РБНФ используется «=», а каждое правило заканчивается точкой. Вот так может быть определен синтаксис идентификатора (имени) с помощью РБНФ: Имя = Буква { Буква | Цифра }. Являясь метаязыком, РБНФ должна быть пригодна для описания языков, имеющих практический интерес. В том числе с помощью РБНФ может быть определен и синтаксис самой РБНФ: Синтаксис = { Правило }. Правило = Имя " =" Выражение Выражение = Вариант { " I" Вариант }. Вариант - Элемент { Элемент }. Элемент = Имя | Цепочка | " {" Выражение " }" | " [" Выражение " ]" | " {" Выражение " }". Цепочка = " '" { символ ) " '" | '" '{ символ } '" '.
Синтаксическая диаграмма — это направленный граф с одним входным ребром и одним выходным ребром и помеченными вершинами. Синтаксическая диаграмма задаёт Формальный язык. Цепочка пометок при вершинах на любом пути от входного ребра к выходному — это цепочка языка, задаваемого синтаксической диаграммой. Поэтому можно считать, что синтаксическая диаграмма - это одна из форм порождающей грамматики автоматных языков. Синтаксические диаграммы и конечные автоматы имеют тесную связь: любой автоматный язык задаётся синтаксической диаграммой и обратно, по любой синтаксической диаграмме можно построить конечный автомат(в общем случае недетерминированный), распознающий тот же язык, который задаёт диаграмма. Построив по синтаксической диаграмме соответствующий распознающий конечный автомат, можно затем реализовать этот автомат либо аппаратно, либо программно. Таким образом, синтаксические диаграммы могут служить не только для порождения, но и для распознавания автоматных языков. Диаграммы стали популярны после выхода книги К. Йенсен и Н. Вирта «Паскаль». Они использованы в первой ее части — «Руководстве» — компактном учебнике языка.
Вопрос 7. Статистическая и динамическая семантика. Динамическая семантика языка – это математическое описание, которое любой строке-фразе языка сопоставляет поведение. Программам с разным поведением будут соответствовать разные математические объекты. Объектные коды могут быть разные, а семантики должны быть одинаковыми. Хотя бы по этим соображениям компилятор не может являться описателем семантики. Статическая семантика, определяемая только для синтаксически корректных программ, задает правила вычисления свойств программы, не требующих для своего вычисления ее выполнения. К таким свойствам относятся, в частности, типы переменных и выражений. Помимо правил вычисления задаются также правила проверки статической корректности программы, или контекстные условия, которые накладывают ограничения на возможные комбинации значений статических свойств программы. Вопрос 8. Имена и специальные слова. Имена в программах служат той же цели, что и имена людей, - чтобы обращаться к программным объектам и различать их, то есть идентифицировать. Поэтому имена также называют идентификаторами ( в информатике специальное наименование, имя элементарных данных, массивов данных, программ или других объектов, которые запрашиваются, обрабатываются и выдаются на выход ЭВМ). Имена дает программист, при этом следует соблюдать некоторые правила: · Имя должно начинаться с буквы; · Имя должно содержать только буквы, знак подчеркивания и цифры; · Прописные и строчные буквы не различаются; · Длина имени практически не ограничена (63 символа ). Имена даются элементам программы, к которым требуется обращаться: переменным, константам, процедурам, функциям и т. д.). Ключевые слова – это идентификаторы, имеющие специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Например, для описания переменных определено ключевое слово var. Имена, создаваемые программистом не должны совпадать с ключевыми словами. Вопрос 9. Переменные и области видимости. Динамический обзор данных. Классы содержат методы и поля – переменные класса. Методы имеют параметры, а внутри методов возможно определение локальных переменных. У каждой переменной есть область видимости, т.е. та область программы, в которой возможна работа с этой переменной. Таким образом у переменных с одинаковыми именами не должны пересекаться области видимости. объявление локальных переменных возможно в любом месте метода. При этом областью видимости переменной будет тот блок, в котором она определена. У параметров область видимости – весь метод. У полей область видимости – весь класс, однако возможно создавать локальные переменные с именем, совпадающим с именем поля. В этом случае после определения данное имя будет связано именно с переменной, а не с полем класса. Это крайне не рекомендуется делать, т.к. такое определение будет создавать некоторую двусмысленность восприятия кода и может способствовать появлению ошибок.
Популярное: |
Последнее изменение этой страницы: 2016-05-29; Просмотров: 871; Нарушение авторского права страницы