Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания (ЛА+СА+СемА).doc
Скачиваний:
1
Добавлен:
08.08.2019
Размер:
93.18 Кб
Скачать

Лексический анализатор 1

Постановка задачи 1

Ограничения на входные данные 1

Общие Требования к ЛА 2

Синтаксический анализатор 2

Семантический анализатор 4

Лексический анализатор

Техническое задание

на выполнение лабораторной работы №1

по курсу «Методы трансляции»

на тему: «Лексический анализатор»

Постановка задачи

Первый шаг в конструировании Вашего компилятора - это разработка лексического анализатора (ЛА) для подмножества языка ПАСКАЛЬ.

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

Ограничения на входные данные

Классы лексем Паскаля:

1. Классы ключевых слов:

AND ARRAY BEGIN FORWARD DIV DO ELSE END FOR FUNCTION IF MOD NOT OF OR PROCEDURE PROGRAM RECORD THEN TO TYPE VAR WHILE

2. Классы предопределенных слов:

CHAR INTEGER

3. Классы специальных символов, имеющих фиксированную семантику:

+ - * = < <= > >= <> . , : ;

:= .. ( ) [ ]

4. Класс остальных символов, не имеющих фиксированной семантики.

5. Класс идентификаторов, определяемый следующим регулярным выражением:

letter ( letter | digit | _ )*

где

letter - латинская буква

digit - цифра.

6. Классы констант :

а) Целые константы задаются регулярным выражением:

digit+

б) Строковые константы, определяемые рег. выражением:

' char* '

где char - любой символ.

Таблица лексем

Каждая лексема заносится в таблицу лексем. При этом для повышения эффективности используем HASH-функцию. В таком случае таблица лексем распадается на 3 части:

1) HASH-таблица, содержащая различные значения HASH-функции и ссылки на таблицу имен.

2) Таблица имен лексем.

3) Таблица атрибутов лексем.

Общие Требования к ла

1. Игнорировать "пустые" символы (знаки пробела, табуляции и признаки конца строки или файла ) и комментарии.

2. Не различать большие и маленькие латинские буквы в ключевых словах и идентификаторах.

3. Выделять слово из текста путем обнаружения его первого и последнего символов. Первый символ слова - это первый символ, отличный от "пустого". Последний символ слова - это символ, расположенный перед символом-ограничителем. Множество символов-ограничителей ПАСКАЛЯ должно быть Вами определено.

4. Определять класс лексемы по ее префиксу.

Синтаксический анализатор

Второй шаг в конструировании Вашего компилятора - это разработка синтаксического анализатора (СА) для подмножества языка ПАСКАЛЬ. СА должен определять правильность порядка правильных слов (лексем) в предложении, формируя при этом диагностику синтаксических ошибок и дерево разбора. Результаты должны быть в наглядном виде предоставлены проверяющему.

Грамматический (синтаксический) разбор предложения (в нашем случае - программы на ПАСКАЛЕ) проводить методом Рекурсивного Спуска.

Грамматика подмножества языка ПАСКАЛЬ задана в виде Расширенных Бэкусо-Науровских Форм (РБНФ) с использованием следующих обозначений:

Обозначение

Смысл

::=

"по определению есть"

|

"или" (задание альтернативы)

[X]

0 или 1 раз появление X

{X}

0 или

более раз появление X

(X|Y)

выбор: или X или Y

xyz

терминальный символ xyz (подчеркнуто жирный)

Определение_типов

нетерминальный символ "Определение_типов" ( курсивом )

программа ::= Program ID ; Блок .

Блок ::= [ Определение_типов ]

[ Определение_констант ]

[ Объявление_переменных ]

[ Объявление_процедур_и_функций ]

Составное_действие

Определение_типов

::=

Type Определение_типа ;

{ Определение_типа ; }

Определение_констант

::=

Const Определение_константы ;

{ Определение_константы ; }

Объявление_переменных

::=

Var Объявление_переменной ;

{ Объявление_переменной ;}

Объявление_процедур_и_функций

::=

{(Объявление_процедуры | Объявление_функции);}

Определение_типа

::=

ID = Тип

Определение_константы

::=

ID = Константа

Объявление_переменной

::=

Список_идентификаторов : Тип

Объявление_процедуры

::=

Procedure ID ( Список_формальных_параметров ) ;

( Блок | Forward )

Объявление_функции

::=

Function ID ( Список_формальных_параметров ) :

Тип_результата ; ( Блок | Forward )

Список_формальных_параметров

::=

[ Список_идентификаторов : ID

{ ; Список_идентификаторов : ID } ]

Составное_действие

::=

begin

Последовательность_действий

end

Последовательность_действий

::=

Действие { ; Действие }

Действие

::=

Простое_действие | Сложное_действие

Простое_действие

::=

[ (Действие_присваивания |

Действие_вызова_процедуры) ]

Действие_присваивания

::=

Переменная := Выражение

Действие_вызова_процедуры

::=

ID ( Список_фактических_параметров )

Сложное_действие

::=

Составное_действие |

IF Выражение THEN Действие [ ELSE Действие ]1 |

WHILE Выражение DO Действие |

FOR ID := Выражение TO Выражение DO Действие

Тип

::=

ID |

ARRAY [ Диапазон_индекса ] OF Тип |

RECORD Список_полей END |

Константа .. Константа

Диапазон_индекса

::=

ID |

Константа .. Константа

Тип_результата

::=

ID

Список_полей

::=

[ Список_идентификаторов : Тип

{ ; Список_идентификаторов : Тип } ]

Константа

::=

[ Знак ] INT | STRCONST

Выражение

::=

Простое_выражение [ Знак_отношения Простое_выражение ]

Знак_отношения

::=

< | <= | > | >= | <> | =

Простое_выражение

::=

[ Знак ] Слагаемое

{ Аддитивная_операция Слагаемое }

Аддитивная_операция

::=

+ | - | or

Слагаемое

::=

Множитель

{ Мультипликативная_операция Множитель }

Мультипликативная_операция

::=

* | div | mod | and

Множитель

::=

INT | STRCONST | Переменная |

Вызов_функции | not Множитель |

( Выражение )

Вызов_функции

::=

ID ( Список_фактических_параметров )

Переменная

::=

ID Выбор_компоненты

Выбор_компоненты

::=

[ ( . ID Выбор_компоненты |

[ Выражение ] Выбор_компоненты ) ]

Список_фактических_параметров

::=

[ Выражение { , Выражение } ]

Список_идентификаторов

::=

ID { , ID }

Знак

::=

+ | -

В приведенной РБНФ почти все терминалы соответствуют реальным словам и знакам исходной программы на ПАСКАЛЕ. Исключение составляют лишь следующие терминалы:

ID - произвольный идентификатор программы

INT - произвольная целая константа программы

STRCONST - произвольная строковая константа программы