Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конпект лекций по ТЯПиМТ.docx
Скачиваний:
221
Добавлен:
27.01.2015
Размер:
329.63 Кб
Скачать

12. Пример программы на упрощенном Паскале.

Пример программы вычисления математического ожидания и дисперсии по выборке объёмом в 100 значений.

program stats;

Var sum, sumsq, I, value, mean, variance : integer;

begin

sum:=0;

sumsq:=0;

for i:=1 to 100 do

begin

read(value);

sum:=sum+value;

sumsq:=sumsq+value*value;

end;

mean:=sum div 100;

variance:= sumsq div 100 – mean*mean;

write(mean,variance);

end.

Программа должна состоять из слов, принадлежащих данному языку. Кроме того, слова должны состоять из лексем, допускаемых данным языком. В нашем случае к лексемам будут относиться разделители +, -, * , div, (, ), :, :=, идентификаторы, числовые константы, ключевые слова : program, for, do, read, write, integer, begin, end, var. Но использование ключевых слов и прочих лексем должно в точности подчиняться правилам грамматики данного языка.

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

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

Таблица 5. Ключевые слова.

№ строки

Ключевое слово

1

program

2

var

3

begin

4

end

5

for

6

read

7

write

8

To

9

Do

10

integer

Таблица 6. Разделители и служебные символы.

№ строк

Разделители и

служебные символы

Примечание

1

;

2

:

3

,

4

:=

5

+

6

-

7

*

8

Div

целочисленное деление

9

(

10

)

11

Id

обобщённый идентификатор

12

Int

обобщенная числовая константа

13

.

Основная проблема состоит в формировании таблицы идентификаторов, поскольку число идентификаторов и их конкретные имена задаются самими пользователями. Но идентификаторы хотя, имеют общий тип лексемы − идентификаторы, но различаются по именам. Кроме того, на имена идентификаторов накладываются дополнительные ограничения: они не могут быть длиннее 14 символов, начинаться с цифры и содержать разделители. Лексемы языка могут быть описаны регулярной грамматикой, например,

<ID> →<LETTER>|<ID><LETTER>|<ID><DIGIT>

<LETTER> a|b|c|d|,..,|z

<DIGIT> 0|1|2|3|4|5|6|7|8|9

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

Таблица 7. Идентификаторы.

№ строки

Имя идентификатора

1

stats

2

sum

3

sumsq

4

i

5

value

6

mean

7

variance

Все идентификаторы встречаются в таблице только один раз.

Таблица 8. Константы.

№ строки

Константа

1

0

2

1

3

100

Таблица констант составляется аналогично. Но все константы встречаются только один раз.

Теперь дескрипторный текст программы примет следующий вид.

1,1

1,2

3,2

2,3

3,3

2,3

3,4

2,3

3,5

2,3

3,6

2,3

3,7

2,2

1,10

1,3

3,2

2,4

4,1

2,1

3,3

2,4

4,1

2,1

1,5

3,4

2,4

4,2

1,8

4,3

1,9

1,3

1,6

2,9

3,5

2,10

2,1

....

....

....

....

....

....

....

....

....

...

....

....

...

...

1,4

2,13