Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / вар1 / OPYZK.DOC
Скачиваний:
14
Добавлен:
17.04.2013
Размер:
173.06 Кб
Скачать

ГЕНЕРАТОР ЯЗЫКОВЫХ ПРОЦЕССОРОВ

(GLP)

Описание языка

Листов 41

Москва 1994

.

- 2 -

Комитет по высшей школе министерства науки РФ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

" Утверждаю "

Проректор МИЭТ

____________ Чаплыгин Ю.А.

"___"________ 1994г.

ГЕНЕРАТОР ЯЗЫКОВЫХ ПРОЦЕССОРОВ

(GLP)

Описание языка

Листов 41

Авторы:

1. __________ Шаньгин В.Ф.

"___"________1994 г.

2. __________ Тимофеев П.А.

"___"________1994 г.

Москва 1994

.

- 3 -

АННОТАЦИЯ

Предлагаемый язык предназначен для описания языковых процессоров

(трансляторов, компиляторов, интерпретаторов и др.). С его помощью

можно описать как синтаксис, так и семантику языкового процессора. Для

описания синтаксиса введена дополненная запись формы Бэкуса-Наура. Се-

мантика языка описывается предложениями языка программирования СИ++.

В процессе изложения конструкций метаязыка используются многочис-

ленные примеры. Приведены способы приведения грамматики к однозначному

виду. В целом рассмотрен весь процесс создания языкового процессора от

формальной грамматики до программы на метаязыке.

.

- 4 -

СОДЕРЖАНИЕ

1. ОБЩИЕ СВЕДЕНИЯ 5

2. ЭЛЕМЕНТЫ МЕТАЯЗЫКА 6

2.1. Базовый набор инструкций метаязыка 6

2.2. Управляющие последовательности 9

2.3. Нетерминальные символы 10

 12.3.1 Сокращенная запись альтернатив. 0 10

 12.3.2. Повторение элементов конструкций. 0 11

 12.3.3. Отсутствие элементов конструкций. 0 12

2.4. Терминальные символы 12

 12.4.1. Символ из множества. 0 14

 12.4.2. Символ, не принадлежащий множеству 0 15

 12.4.3. Строка символов из множества. 0 15

 12.4.4. Строка из одинаковых символов. 0 16

 12.4.5. Операция конкатенации строк 0 18

2.5. Круглые скобки 19

2.6. Семантика языка 20

3. ПРИМЕР ПРОГРАММЫ РАЗБОРА 25

4. ОДНОЗНАЧНОСТЬ ГРАММАТИКИ 29

 14.1. Вывод исходного предложения 0 29

 14.2. Преобразование грамматики 0 30

 14.3. Примеры преобразования грамматик на метаязыке 0 32

ПРИЛОЖЕНИЕ 1. Синтаксис метаязыка, записанный на метаязыке 37

.

- 5 -

1. ОБЩИЕ СВЕДЕНИЯ

Метаязыком называют язык, предназначенный для описания других

языков. Например, на метаязыке можно описать языки программирования

(С, PASCAL, ADA, ...) языки САПР (EDIF, VERILOG, VHDL,...) и многие

другие.

В качестве исходной формы записи языкового процессора будем ис-

пользовать контекстно-свободные формальные грамматики. С их помощью

можно описать только синтаксис языка. В принципе эта форма вполне под-

ходит в качестве исходной для генератора языковых процессоров, где

последние выполняют лишь синтакисческий анализ. Однако синтаксический

анализ интересен постольку, поскольку параллельно с ним можно произво-

дить обработку предложений языка в соотоветствии с заложенным в них

смыслом. Поэтому необходима исходная форма, которая позволяла бы с од-

ной стороны задавать синтаксис языка также кратко как формальные грам-

матики, а с другой имела бы средства отображения смысла предложений

или выполняемых действий.

Данный набор инструкций предназначен для описания синтаксиса язы-

ка пользователя и представляет собой модифицированный вариант формы

Бэкуса. Под словами язык, язык пользователя будем понимать язык, для

которого разрабатывается транслятор. Алфавит языка включает терминаль-

ные и нетерминальные символы. Из терминальных символов строится исход-

ный текст программы. К ним относятся ключевые слова, знаки операций,

разделители и другие символы из которых строится исходный текст прог-

раммы. Нетерминальные символы представляют собой названия синтаксичес-

ких конструкций и явно в исходный текст не входят. Нетерминальные сим-

волы в тексте будем выделять угловыми скобками < и > . Например,

<оператор>, <выражение>, <десятичное число> и так далее. Терминальные

же символы в тексте представляют сами себя. Пустой символ будем обоз-

начать *. Пустой символ обозначает отсутствие символа.

.

- 6 -

2. ЭЛЕМЕНТЫ МЕТАЯЗЫКА

2.1. Базовый набор инструкций метаязыка

Любая синтаксическая конструкция, название которой обозначено не-

терминальным символом, может быть представлена в виде различных строк,

состоящих из терминальных и нетерминальных символов. Описание синтак-

сической конструкции начинается с её названия за которым следует пер-

вая строка её представления, отделенная от названия символами ::= .

Следующие строки для представления синтаксической конструкции начина-

ются с новой строки с символов ||= . Например,

<оператор присваивания> ::= <идентификатор переменной>

= <выражение>

/* Нетерминальный символ <целое> описывает целые числа, состоящие

из любого числа цифр от 0 до 9 */

<целое> ::= <цифра>

||= <целое><цифра>

<цифра> ::= 0

||= 1

||= 2

||= 3

||= 4

||= 5

||= 6

||= 7

||= 8

||= 9

- 7 -

В примере использованы нетерминальные символы: <оператор присваи-

вания>, <идентификатор переменной>, <выражение>, <целое>, <цифра> и

терминальные символы: =, 0,1,2,3,4,5,6,7,8,9.

В теории формальных грамматик каждое представление нетерминально-

го символа называют продукцией или правилом. В представленном выше

примере для нетерминального символа <оператор присваивания> есть толь-

ко одна продукция

<оператор присваивания> ::= <идентификатор переменной>

= <выражение>

для нетерминала <целое> две продукции

<целое> ::= <цифра> /* первая продукция */

||= <целое><цифра> /* вторая продукция */

для нетерминала <цифра> - десять продукций.

Каким же образом строится предложение языка по приведенным выше

синтаксическим конструкциям. Построение начинается с того нетерминаль-

ного символа, который описывает необходимую вам конструкцию. Например,

надо построить целое число. Оно описывается нетерминальным символом

<целое>. Далее применяется только одно правило, на место нетерминаль-

ного символа подставляется одна из строк его представления (одна из

продукций). Для нетерминала <целое> это или <цифра>, или <целое><циф-

ра>. Построим число 2374.

Строка Подстановка

<целое> <целое> ::= <целое><цифра>

<целое><цифра> <целое> ::= <целое><цифра>

<целое><цифра><цифра> <целое> ::= <целое><цифра>

<целое><цифра><цифра><цифра> <целое> ||= <цифра>

- 8 -

<цифра><цифра><цифра><цифра> <цифра> ::= 2

2<цифра><цифра><цифра> <цифра> ::= 3

23<цифра><цифра> <цифра> ::= 7

237<цифра> <цифра> ::= 4

2374

Отметим, что пока никаких ограничений на порядок подстановок не накла-

дывалось. То есть в строке можно заменять любой нетерминальный символ

на одно из его представлений. Главное, чтобы в результате подстановок

получилось то число, которое мы строим.

Конструкцию целого числа можно описать также и с использованием

пустого символа в виде следующей конструкции.

<целое> ::= <целое><цифра>

||= *

Тогда построение (вывод) строки 2374 будет выглядеть следующим

образом.

Строка Подстановка

<целое> <целое> ::= <целое><цифра>

<целое><цифра> <целое> ::= <целое><цифра>

<целое><цифра><цифра> <целое> ::= <целое><цифра>

<целое><цифра><цифра><цифра> <целое> ::= <целое><цифра>

<целое><цифра><цифра><цифра><цифра> <целое> ::= *

<цифра><цифра><цифра><цифра> <цифра> ::= 2

2<цифра><цифра><цифра> <цифра> ::= 3

23<цифра><цифра> <цифра> ::= 7

237<цифра> <цифра> ::= 4

2374

- 9 -

Однако при использовании данной конструкции, целое число может не со-

держать ни одной цифры. Однако в первоначальной версии без пустого

символа целое должно состоять хотя бы из одной цифры. Поэтому необхо-

димо быть осторожным при использовании пустого символа и без необходи-

мости стараться им не пользоваться.

Для пояснения смысла синтаксических конструкций можно использо-

вать комментарий, который представляет собой текст, заключенный между

символами /* и */. То есть

<комментарий> ::= '/*' <текст> '*/'

где текст может содержать любые символы, кроме группы символов */.

Текст комментария в метаязыке, как и в языках программирования

используется как разделитель или один пробельный символ. Поэтому ком-

ментарий не может быть помещен внутрь ключевого слова. Сам текст ком-

ментария не используется. Точный синтаксис комментария приведен в при-

ложении.

2.2. Управляющие последовательности

Для того, чтобы не спутать терминальные символы с точно такими же

метасимволами (<,>,',\,_,...), для изображения терминальных символов

используют управляющие последовательности. В метаязыке управляющие

последовательности записываются также, как в языке СИ++.

Управляющие последовательности, также позволяют получить визуаль-

ное представление некоторых не имеющих графического аналога символов.

Они используют символ обратной наклонной черты (\). Например, в ка-

.

- 10 -

Управляющие последовательности

-----------------------------------------------------------------

Последовательность Значение Символы Выполняемая функция

-----------------------------------------------------------------

\a 0x07 BEL Звуковой сигнал

\b 0x08 BS Забой

\f 0x0C FF Перевод бланка

\n 0x0A LF Новая строка (перевод строки)

\r 0x0D CR Возврат каретки

\t 0x09 HT Табуляция (горизонтальная)

\v 0x0B VT Вертикальная табуляция

\\ 0x5c \ Обратная наклонная черта

\' 0x27 ' Одинарная кавычка (апостроф)

\" 0x22 " Двойная кавычка

\? 0x3F ? Вопросительный знак

\string{07} любые символ, определенный восьме-

ричным кодом - строкой до

трех восьмеричных цифр

\char{x,X}string{09,AF} любые символ, определенный шестнад-

цатиричным кодом - строкой

до двух шестнадцатиричных

цифр

-----------------------------------------------------------------

честве одного символа новой строки можно записать константу \n.

2.3. Нетерминальные символы

 12.3.1 Сокращенная запись альтернатив.

Для сокращения записи перечисления представлений (продукций) нетерми-

нала, вместо символов ||= допускается использовать один символ | . Его

рекомендуется применять, когда различные представления записываются в

- 11 -

одну строку. Например, конструкцию

<цифра> ::= 0

||= 1

||= 2

||= 3

||= 4

||= 5

||= 6

||= 7

||= 8

||= 9

можно записать короче следующим образом:

<цифра> ::= 0|1|2|3|4|5|6|7|8|9

 12.3.2. Повторение элементов конструкций.

Любая строка, содержащая терминальные и нетерминальные символы, может

повторяться в конструкции бесконечное число раз. Такую строку (назовем

её сентенцией) заключают в скобки <* и *> :

<*сентенция*>

Пример 1. Эквивалентная запись конструкции

<целое> ::= <цифра>

||= <целое><цифра>

выглядит следующим образом

<целое> ::= <* <цифра> *>

Или список целых чисел, перечисленных через запятую будет выгля-

- 12 -

деть следующим образом.

<список целых чисел> ::= <целое> <* ',' <целое> *>_

Символ _ означает возможность отсутствия синтаксической конструк-

ции <* ',' <целое> *>.

Конечное число повторений конструкции задается целым числом, за-

писанным после символов *> . Например, <*<цифра>*>10 означает десятиз-

начное целое число.

Запрещается указывать число повторений 0.

Соседние файлы в папке вар1