Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО Билеты.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.24 Mб
Скачать

Билет 9(Построить таблицу идентификаторов)

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

Построение таблицы с переполнением идентификаторов используется для борьбы с коллизией в хеш-таблицах. Данный метод называется методом цепочек и заключается он в том, что мы создаем М связных списков, по одному на каждое значение хеш-функций. В списке хранятся ключи, дающие одинаковое значение хеш-кодов. Тогда если мы имеем N-ключей и М списков, то средний размер хеш-таблицы будет (N-1)xM, что приведет к уменьшению времени поиска, по сравнению с последовательным списком в М раз.

Пусть у нас имеется следующий список идентификаторов:

a1,a2,cc,c1,c2,b8

Так как ключом таблицы является первый символ идентификатора, то получим следующую хеш-таблицу.

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

УСТРАНЕНИЕ КОЛЛИЗИЙ МЕТОДОМ ЦЕПОЧЕК ПЕРЕПОЛНЕНИЯ

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

( В лекции) Для хранения записей, вызывающих коллизию заводят специальную таблицу. В основной таблице, которую можно назвать входной, дополнительно каждой записи отводится поле указателей. В это поле при возникновении коллизии записывается адрес цепочки продолжения дополнительной таблицы. Цепочка продолжения(переполнения) состоит из списка записей, находящихся в дополнительной таблице для записей с одинаковыми ключами.

В этом случае таблица будет иметь вид: а,с1,а3,b1,a4,h,h1.

Используется также метод перемешивания с внутренними цепочками, при этом заполнение позиций отображающего вектора состоит из двух этапов: используется внутренняя таблица переполнения, а затем после формирования основной дополнительной таблицы производится перенесение записи из дополнительной таблицы в основную.

(В лекции) Таблица с внутренними цепочками переполнения. В этом случае деление таблиц делается на промежуточном этапе. На определенном этапе информация из дополнительной таблицы переносится в основную(динамическое изменение размеров таблицы).

Билет 10 (ка для сканера лексем)

Построить конечный автомат для сканера лексем.

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

Лексема - конструкция, составляемая из символов алфавита. Может иметь бесконечную длину. Лексемы формируются по заранее определенным правилам.

Примерами лексем могут служить: идентификаторы, ключевые слова, константы, разделители.

Пример КА для идентификаторов:

Пример КА для следующих лексем: XEX, XOX, fox, fex:

Билет 11(грамматика для чисел)

Построить грамматику для чисел (целые, вещественные, вещественные с порядком)

Грамматика – правила построений конструкций (лексем) из символов алфавита языка.

1. В качестве целых чисел будем понимать числа вида: 10, 20, 0, -5, +100; причем 10е5 (105) не является целым.

2. В качестве вещественных чисел будем понимать числа вида: 1.5, 2.5, -5.0, .23

3. В качестве вещественных чисел с порядком будем понимать числа вида: 1.5е10, 2е2, 2.2е-3, 5е-2

Тогда грамматика примет вид:

1) <целое> :: = < целое >|+ < целое >| -< целое >

2) < целое число> :: = <цифра>|< целое > <цифра>

3) < цифра > :: = 0|1|2|…|9

4) <вещественное> :: = <целое число>. <целое>|< целое число > <порядок>|< целое число >.<целое> <порядок>|.<целое>|.<целое> <порядок>

5) <порядок> :: е+<целое>|e< целое >|e-< целое >

Билет 12 (стек для выражения a+b*(c+d))

Построить заключительное состояние стека для предложения языка а+b*(с+d)

Предложение языка – сентенциальная форма, состоящая только из терминальных символов.

L(G(z)) = {x|z => xx^xэ (VTT)}

Сентенциальная форма: для грамматики G[z] x – сентенциальная форма, если она выводима из z

z => *x

Пусть дана грамматика G[z]

1) z :: = E#

2) E :: = T+E|T

3) T :: = F*T|F

4) F :: = id| (E)

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

Пронумеруем вершины дерева по порядку их разбора. Каждый элемент семантического стека состоит из 4 компонент:

GOAL – цель, символ для разбора

FAT – номер родителя в стеке

BRO – брат в дереве разбора (самый левый символ)

SUN – сын в дереве разбора (самый правый символ)

Получаем следующие состояния синтаксического стека в конце разбора

GOAL

FAT

SUN

BRO

1

z

-

25

-

2

E

1

7

-

3

T

2

4

-

4

F

3

5

-

5

id(a)

4

-

-

6

+

2

-

3

7

E

2

8

6

8

T

7

12

-

9

F

8

10

-

10

id(b)

9

-

-

11

*

8

-

9

12

T

8

13

11

13

F

12

24

-

14

(

13

-

-

15

E

13

20

14

16

T

15

17

-

17

F

16

18

-

18

id(c)

17

-

-

19

+

15

-

16

20

E

15

21

19

21

T

20

22

-

22

F

21

23

-

23

id(d)

22

-

-

24

)

13

-

15

25

#

1

-

2