1.5 Результаты
Идентификаторы, записанные во входном файле:
h7gqghrzwcwxvv9h
c1dl9g
hwy43zxraxf6o2azkbapqd6
iongd
xtvtb3wgt6p
bind44z176d0omc9sgcoyhu4p3vgnawx
2
01u2x5vo1gpasgczm
8g8h2yd1rc59
le
anwzl6yld
ynvv4d6x1
9p4h9y3gfblg
d9pi
gn
mfqrtvr2wta7ermk14
28d5gusn42fgd4r2ip7t59bgu
i1kak6o48veire8oy5ywirgl9cant
dotb7rnfpt
12suuzydbgg6
smtmwnxmcxc4hxnyhblgkw6
un
xgr7g
5ci1otdogy2ioq36
lfezegl50w110gbm1ca32ukop
g8zsrfnvq3kneeu5t2xu0nt0s5n
gnt2k9gv1sp3955mo3
m9vagyz9tcx4bh5si6rfvoci0
y5h8i481yb
ghop8he
khaup6l
4ug0
8xp5kdzu79bt823douido6
nc0pn5n0ulf1xubtgua3sc6u8
cuodi2gekge
vfuhwe9
srpgig84cgx453qtlg
04
c
p8ac5
aiz
kb0cr2ru1m1czzwpw4hq88bvbee
f8700ns1uq7htb81bd3
v4dsowmbptbnev0e4avyo
7d2icsw820uri25p91sn2cb6304
52gazz4iig6dwns8k
ubk3hu7zl
fx7vg811hdzebh0axeq
5s
kkza9s4x459pevz6ab159q2g5l4t5
w7fzq8kbmfhl31gypicu2qz809n
n6w4kk09w1fpgg0bknui
fk2yfdrbx8wv4yihh
glubdaqo3t5o874lruh
o7qxg
zif6egncgn6hb3uy5ksiq4c
svu84fu07
7ykd5afoe1lkq7dess40yep2i5u2br9b
s0ta0gmu
8w4p
ks7z7ht92e02toursqg
mzpcin5bploosbpxxgo1
q489v
c10r4tyy1c
t55xcl5tzad4n6g433
y0r68r2fhy8xm2g11xc6oi
0hwg1orrxb1
mgotrpd91g69t5n2scg0d534uy
okfce80b
4bfya2mwmmtx82186ig
oxv
q2yi8qdd3usq6y6061o
86sp8mo
92cla4w6ap82aeqm50tnv6i7uwa
k91e7ag3nr8icv0cixz7hmv3p1ndiev
8x8f0ymuwa
rv
opqxr
enw2ctf64slxgsl32u2w
ae6ndxh1qvmxdph4v57v79twpu
n8gopg
5ud7wlbmg4gdp
t74gpgvt9a2xv1wns431yqvtcs9rcad
gynu7lozrsnxwsm
erk8tib68
anf1fssslgqqs87minya8vo
4sn9tb16mfwi6w
2t
6sgi9
ow4bgd48ff1kv2llynav9
k9c1cewy
7ufxwadkfaa
ntadtgongmz1s5s311rg7
ucc53x6ixw
r3l8xwe6gw83eb6todn0
ot7pddpz8d9on5pqhhqmg6n91b
ha7gsb9azpa6pkh5dcnotg9g
ledf
Метод 1 – простое рехэширование:
Всего поиск: 98
Сравнений: 881
Всего сравнений: 881
В среднем сравнений: 8,989796
Метод 2 – рехэширование с использованием псевдослучайных чисел:
Всего поиск: 98
Сравнений: 179
Всего сравнений: 179
В среднем сравнений: 1,826531
Полученные результаты подтверждают то, что поиск элемента в таблице, организованной методом простого рехэширования требует больших затрат, и уступает методу рехэширования с использованием последовательности псевдослучайных чисел.
2 Проектирование лексического анализатора
2.1 Исходные данные
Необходимо разработать лексический анализатор, который выполняет лексический анализ входного текста.
Входной язык содержит операторы цикла типа for (…; …; …) do, разделенные символом ; (точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой (в обычной и логарифмической форме), знак присваивания (:=).
Программа должна допускать наличие комментариев неограниченной длины во входном файле. Тип комментариев – внутри косых черт со звездочкой: /*_*/.
2.2 Принцип работы лексического анализатора
Лексический анализатор (или сканер) - это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического анализа и разбора.
Лексема – это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка.
В основном лексические анализаторы выполняют исключение из текста комментариев и незначащих пробелов, а также выделение лексем.
Результатом работы лексического анализатора является перечень всех найденных в тексте исходной программы лексем. Этот перечень представляется в виде таблицы, называемой таблицей лексем.
Язык описания констант и идентификаторов в большинстве случаев является регулярным, то есть может быть описан с помощью регулярных грамматик. Распознавателями для регулярных языков являются конечные автоматы (КА).
Любой КА может быть задан с помощью пяти параметров: М(Q, Σ,δ,q0,F),
где:
Q – конечное множество состояний автомата;
Σ – конечное множество допустимых входных символов (входной алфавит КА);
δ – заданное отображение множества Q·Σ во множество подмножеств Р(Q) δ: Q·Σ→ Р(Q) (δ – функция переходов автомата).
q0 Q – начальное состояние автомата;
FQ – множество конечных состояний автомата.
Алгоритм работы простейшего сканера:
• просматривается входной поток символов программы на исходном языке до обнаружения очередного символа, ограничивающего лексему;
• для выбранной части входного потока выполнятся функция распознавания лексемы;
• при успешном распознавании информация о выделенной лексеме заносится
в таблицу лексем, и алгоритм возвращается к первому этапу;
• при неуспешном распознавании выдается сообщение об ошибке, а дальнейшие действия зависят от реализации сканера: либо его выполнение прекращается, либо делается попытка распознать следующую лексему (идет возврат к первому этапу алгоритма).
Работа программы-сканера продолжатся до тех пор, пока не будут просмотрены все символы программы на исходном языке из входного потока.