Автор: Пользователь скрыл имя, 19 Мая 2012 в 17:24, курсовая работа
Теория формальных языков, грамматик и автоматов составляет фундамент синтаксических методов. Основы этой теории были заложены Н. Хомским в 40–50-е годы XX столетия в связи с его лингвистическими работами, посвященными изучению естественных языков. Но уже в следующем десятилетии синтаксические методы нашли широкое практическое применение в области разработки и реализации языков программирования.
Введение 3
1 Постановка задачи 4
2 Формальная модель задачи 5
3 Структура программы………………………………………………….....16
3.1 Лексический анализатор 16
3.2 Синтаксический анализатор 18
3.3 Семантический анализатор 20
3.4 Генерация ПОЛИЗа программы 22
3.5 Интерпритация ПОЛИЗа программы 24
4 Структурная организация данных 31
4.1 Спецификация входной информации 31
4.2 Спецификация выходной информации 31
4.3 Спецификация процедур и функций 31
5 Разработка алгоритма решения задачи 32
5.1 Укрупненная схема алгоритма программного средства 32
5.2 Детальная разработка алгоритмов отдельных подзадач 33
6 Установка и эксплуатация программного средства 34
7 Работа с программным средством 35
Заключение 36
Список использованных источников 37
Приложение А – Текст программы 38
<вывода>::= write «(»<выражение> {, <выражение> } «)»
<программа>::= program var <описание> begin <оператор> {; <оператор>} end.
<операции_группы_
<операции_группы_
<операции_группы_
<унарная_операция>::= not
<слагаемое>::= <множитель> {<операции_группы_умножения> <множитель>}
<множитель>::= <идентификатор> | <число> | <логическая_константа> | <унарная_операция> <множитель> | «(»<выражение>«)»
<логическая_константа>::
Правила вывода грамматики модельного языка М:
P ® program var D1 begin S1 end.
D1 ® O;| D1;O;
O ® integer I1 | real I1 | boolean I1
I1 ® I | I1, I
S1 ® S |S1; S
Z1 ® : |ENTER
S ® S Z1 S | if E then S| if E then S else S | while E do S | for I ass E to E do S | read(I1) | write(E2) | I ass E
E2 ® E | E2 , E
E ® E1 | E1<>E1| E1=E1 | E1<E1 | E1<=E1|E1>E1 | E1>=E1
El ® T | T+E1 | T-E1 | T or El
T ® F | F*T | F/T | F and T
F ® I | N | L | not F | (E)
L ® true | false
I ® C | IC | IR
Z41 ® B | b
Z42 ® O | o
Z43 ® D | d
Z44 ® H | h
N ® R21Z41 | R81Z42 | R101 Z43 | R101 | R161Z44| V
R21® R2 | R21 R2
R81® R8 | R81 R8
R101® R10 | R101R10
R161® R10 | R161R16
Z2 ® + | -
Z3 ® E | e
V ® R101 P | .R101 P |R101 .R101 P | .R101 |R101 .R101
P ® Z3 Z2 R101 | Z3 R101
C ® A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
R2 ® 0 | 1
R8 ® 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
R10 ® 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
R16 ®
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F
Ниже
представлены диаграммы Вирта:
цифра
буква
идентификатор
число
целое
двоичное
десятичное
восьмиричное
Шестнадцатиричное
действительное
порядок
ключевое_слово
Разделитель
программа
описание
оператор
присваивания
условный
усл.
цикла
фикс. цикла
составной
ввода
вывода
выражение
слагаемое
множитель
операнд
логическая_константа
Примеры
программ для описываемого
языка
program
var integer k,n,sum,i;
boolean r;
begin
read(n);
sum ass 0
i ass 1;
while i<=n do
read(k)
sum ass sum+k {комментарий}
i ass i+1;
write(sum)
end.
program
var real a,b,c,d,e,x;
begin
a ass .35;
b ass 1.26;
c ass 5e-1;
d ass 1.2E-1;
e ass .3e+1;
x ass 154.36;
write(x)
end.
program
var integer i,a;
begin
read(a);
for i ass 0 to a do write (i)
end.
3 Структура программы
3.1 Лексический анализатор
Лексический анализатор (ЛА) – это первый этап процесса компиляции, на котором символы, составляющие исходную программу, группируются в отдельные минимальные единицы текста, несущие смысловую нагрузку – лексемы.
Задача лексического анализа - выделить лексемы и преобразовать их к виду, удобному для последующей обработки. ЛА использует регулярные грамматики.
ЛА необязательный этап компиляции, но желательный по следующим причинам:
1)
замена идентификаторов,
2)
ЛА уменьшает длину программы,
устраняя из ее исходного
3)
если будет изменена кодировка
в исходном представлении
В процедурных языках лексемы обычно делятся на классы:
Каждая лексема представляет собой пару чисел вида (n, k), где n – номер таблицы лексем, k - номер лексемы в таблице.
Входные данные ЛА - текст транслируемой программы на входном языке.
Выходные данные ЛА - файл лексем в числовом представлении.
Для модельного языка М таблица служебных слов (1) будет иметь вид:
1)Program 2)var 3)begin 4)end 5)ass 6)or 7)and 8)not 9)for 10)to 11)do 12)read 13)write 14)if 15)then 16)else 17)while 18)true 19)false 20)integer 21)Boolean 22)real
Таблица ограничителей (2) содержит:
1)13 2)<> 3)<= 4)>= 5)= 6)< 7)> 8)+ 9)- 10)* 11)/ 12); 13): 14)( 15)) 16){ 17)} 18), 19). 20)W 21)R 22)! 23)!F 24)$ 25)%
Таблицы идентификаторов (4) и чисел (3) формируются в ходе лексического анализа.
Входные данные ЛА: