Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения трансляторов(лекции).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
2.79 Mб
Скачать

Контрольные вопросы

  1. Какое место занимают трансляторы в структуре системного программного обеспечения? Что такое трансляция, компиляция, транслятор, компилятор, интерпретатор?

  2. Что понимается под синтаксисом, семантикой, лексикой языка программирования? Поясните суть этих понятий на примере языка С.

  3. Из каких процессов состоит компиляция? Расскажите об общей структуре компилятора.

  4. В чем состоит сущность, назначение и взаимосвязь этапов лексического и синтаксического анализа?

  5. Почему в большинстве современных компиляторов лексический анализ выделяется в отдельную фазу?

  6. Постройте самостоятельно общую схему работы интерпретатора. В чем ее отличие от общей схемы работы компилятора, приведенной на рис.1.1?

  7. Постройте самостоятельно общую схему работы компилятора с языка Ассемблера. Какие особенности присущи данному компилятору? Какие фазы компиляции в нем могут объединяться или отсутствовать?

  8. Назовите основные факторы, влияющие на количество проходов компилятора в процессе трансляции исходного текста программы. В чем заключается это влияние?

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

  10. Чем обусловлено построение компиляторов с языка Ассемблера по двухпроходной схеме?

  11. В чем заключается суть метода синтаксически-ориентированной трансляции?

2. Базовые понятия теории формальных языков и грамматик

В этой главе изложены некоторые аспекты теории формальных языков, существенные с точки зрения трансляции. Здесь введены базовые понятия и даны определения, связанные с одним из основных механизмов определения языков - грамматиками, приведена наиболее распространенная классификация грамматик (по Хомскому). Особое внимание уделяется контекстно-свободным грамматикам и, в частности, их важному подклассу - регулярным грамматикам. Грамматики этих классов широко используются при трансляции языков программирования.

2.1. Алфавиты, цепочки и языки. Основные понятия и определения

Алфавит (или словарь) - это конечное множество символов.

Предполагается, что термин "символ" имеет достаточно ясный интуитивный смысл и не нуждается в дальнейшем уточнении.

Цепочкой символов в алфавите V называется любая конечная последовательность символов этого алфавита. Синонимы цепочки – предложение, строка или слово.

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

Более формально цепочка символов в алфавите V определяется следующим образом:

  1.  - цепочка в алфавите V;

  2. если  - цепочка в алфавите V и a - символ этого алфавита,

то a - цепочка в алфавите V;

  1.  - цепочка в алфавите V тогда и только тогда, когда она является таковой в силу (1) и (2).

Если  и  - цепочки, то цепочка  называется конкатенацией (или сцеплением) цепочек  и .

Например, если  = ab и  = cd, то  = abcd.

Для любой цепочки  всегда  =  = .

Обращением (или реверсом) цепочки  называется цепочка, символы которой записаны в обратном порядке.

Обращение цепочки  будем обозначать R.

Например, если  = abcdef, то R = fedcba.

Для пустой цепочки:   R.

Длина цепочки - это число составляющих ее символов.

Например, если  = abcdefg, то длина  равна 7.

Длину цепочки  будем обозначать |  |. Длина  равна 0.

n-ой степенью цепочки будем обозначать n) называется конкатенация n цепочек 

0 = ; n = n-1 = n-1.

Язык в алфавите V - это подмножество цепочек конечной длины в этом алфавите.

Пример 2.1

Пусть дан алфавит V = {a, b}. Вот некоторые языки в алфавите V:

1) L1 =  – пустой язык;

2) L2 = {} – язык, содержащий только пустую цепочку

(заметим, что L1 и L2 – различные языки);

3) L3 = {, a, b, aa, ab, ba, bb} – язык, содержащий цепочки из a и b, длина которых не превосходит 2;

4) L4 = {an2 | n > 0} – язык цепочек из a, длины которых представляют собой квадраты натуральных чисел. Данный язык содержит бесконечное число цепочек.

Обозначим через V* множество, содержащее все цепочки в алфавите V, включая пустую цепочку .

Обозначим через V+ множество, содержащее все цепочки в алфавите V, исключая пустую цепочку .

Следовательно, V* = V+  {.

Ясно, что каждый язык в алфавите V является подмножеством множества V*.

Пример 2.2

Пусть V={0,1}, тогда

V* = {, 0, 1, 00, 11, 01, 10, 000, 001, 011, ...},

V+ = {0, 1, 00, 11, 01, 10, 000, 001, 011, ...}.