- •Содержание
- •1. Организация таблицы идентификаторов
- •1.1. Исходные данные
- •1.2. Назначение таблиц идентификаторов
- •1.3. Метод простого рехэширования
- •1.4. Метод цепочек
- •1.5. Результаты
- •Принципы работы лексического анализатора
- •2. Проектирование лексического анализатора
- •2.1. Исходные данные
- •Результаты
- •3. Проектирование синтаксического анализатора
- •3.1. Исходные данные
- •3.2. Построение синтаксического анализатора
- •3.3. Результаты
- •Список использованной литературы
- •Приложение а Исходный текст программы
- •Приложение б Граф состояний лексического анализатора
Результаты
На основе сравнения методов организации таблиц идентификаторов, проведенного в первой части курсовой работы, выбран метод цепочек. На основе таблицы идентификаторов, заполненной по методу цепочек, организована таблица лексем. На рис. 5 и рис. 6 представлены таблица идентификаторов и таблица лексем, построенные при обработке следующего текстового файла:
prog ttt;
Begin
for j:=p7p downto 1001b do begin
if(t<f)and t then {rt rrrr}
c:=c*111111111b
else 5jhg;
End.
Содержимое
файла:
Рис. 5. Результат работы лексического анализатора таблица идентификаторов.
Содержимое файла: Неизвестные лексемы:
Рис.
6. Результат работы лексического
анализатора таблица
лексем.
3. Проектирование синтаксического анализатора
3.1. Исходные данные
Для программной реализации процесса построения дерева вывода требуется написать программу, которая выполняет синтаксический разбор текста по заданной КС-грамматике с построением дерева разбора. Текст на входном языке задан в виде текстового файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок.
3.2. Построение синтаксического анализатора
Исходная КС-грамматика:
G ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ),{, }, -, +, *, /, a, c, ;, :=}, {S, L, O, B, C, K, D, H, E, T, M},P, S)
P:
S → prog L end.
L → O | L ; O | L ;
O → if B then O else O endif | if B then O endif | begin L end
| for M to E do O| for M downto E do O| M
M→ a:=E
B → B or C | C
C → C and D | D
D →not D | H
H → E < E | E > E | E = E | (B)
E → E – T | E + T | E * T | E / T| T
T → (E) | a | c
Смысл нетерминальных символов грамматики:
S – вся программа,
L – последовательность операторов(может состоять из одного оператора),
O – оператор,
B, C, D – логическое выражение и его элементы,
H – операции сравнения или логические выражения в скобках,
E,T – арифметические выражения и его элементы,
a – переменная,
с – константа.
КС-языки
делятся на классы в соответствии со
структурой правил их грамматик. Одним
из таких классов является класс грамматик
предшествования. Они используются для
синтаксического разбора цепочек с
помощью алгоритма “сдвиг-свертка”.
Грамматикой операторного предшествования называется приведенная КС-грамматика без l-правил, в которой правые части продукций не содержат смежных нетерминальных символов. Для грамматики операторного предшествования строится матрица операторного предшествования, которая содержит только терминальные символы грамматики. Отношения =, < и > называют отношениями предшествования.
Исходная КС-грамматика, представленная выше, является грамматикой операторного предшествования.
Строятся множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 2.
Таблица 2
U |
L(U) |
R(U) |
T |
(, a, c |
), a, c |
E |
E, T |
T |
H |
(, E |
E, ) |
D |
not, H |
D, H |
C |
C, D |
D |
B |
B, C |
C |
O |
if, begin, for, M |
endif, end, O, M |
M |
a |
E |
L |
L, O |
O, ; |
S |
prog |
end. |
На основе полученных множеств строятся множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 3.
Таблица
3
U |
Lt(U) |
Rt(U) |
T |
(, a, c |
), a, c |
E |
-, +,*, /, (, a, c |
-, +,*, /, ), a, c |
H |
<, >, =, (, -, +,*, /, a, c |
<, >, =, ), -, +,*, /, a, c |
D |
not, <, >, =, (, -, +,*, /, a, c |
not, <, >, =, ), -, +,*, /, a, c |
C |
and, not, <, >, =, (, -, +,*, /, a, c |
and, not, <, >, =, ), -, +,*, /, a, c |
B |
or, and, not, <, >, =, (, -, +,*, /, a, c |
or, and, not, <, >, =, ), -, +,*, /, a, c |
O |
if, begin, for, a |
endif, end, do, :=, -, +, ), a, c |
M |
a |
:=, -, +, ), a, c |
L |
;, if, begin, for, a |
;, endif, end, do, :=, -, +, ), a, c |
S |
prog |
end. |
На основе данных множеств и правил исходной КС-грамматики G построим матрицу операторного предшествования, которая представлена в приложении В.
Алгоритм разбора цепочек грамматики операторного предшествования игнорирует нетерминальные символы. Поэтому имеет смысл преобразовать исходную грамматику таким образом, чтобы оставить в ней только один нетерминальный символ.
Остовная грамматика, полученная на основе исходной грамматики:
G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ), -, +,*, /, a, c, ;, :=}, {E}, P', S)
E → program E end.
E → E | E ; E | E ;
E → if E then E else E endif | if E then E endif | begin E end | for E to E do E | for E downto E do E | E
E → a:=E
E → E or E | E
E → E and E | E
E → not E | E
E → E < E | E > E | E = E | (E)
E → E – E | E + E | E * E| E / E | E
E → (E) | a | c
Для различия скобок, определяющих соответственно приоритет арифметических и логических операций, остовная грамматика дополняется нетерминальным символом B, который будет обозначать логические выражения.
Преобразованная остовная грамматика имеет следующий вид:
G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ), -, +,*, /, a, c, ;, :=}, {E}, P', S)
E → program E end.
E → E | E ; E | E ;
E → if B then E else E endif | if B then E endif | begin E end | for E to E do E | for E downto E do E | E
E → a:=E
B → B or B | B
B → B and B | B
B → not B | B
B → E < E | E > E | E = E | (B)
E → E – E | E + E | E * E| E / E | E
E → (E) | a | c
