
- •Теория языков программирования и методы трансляции
- •1. Языки и кризис программирования.
- •2. Математические методы описания языков программирования.
- •3. Основные понятия и определения.
- •1. S→ab→aAb→aaAb→aaaB→aaabB→aaabbB→aaabbbB→aaabbbb.
- •2. S→ab→AbB→AbbB→AbbbB→Abbbb→aAbbbb→aaAbbbb→aaabbbb
- •Load a mult b
- •4. Этапы построения транслятора.
- •5. Основные методы поиска ошибок в исходных текстах программ.
- •Устройство управления
- •6. Современное состояние и перспективы развития программирования трансляторов.
- •7. Лексический анализ. Интуитивный подход.
- •8. Классы лексем и их особенности.
- •9. Формирование таблиц лексем и построение дескрипторного текста исходной программы.
- •На основании составленных таблиц можно записать входной текст через введённые дескрипторы (дескрипторный текст):
- •10. Синтаксический анализ. Метод рекурсивного спуска.
- •11. Пример грамматики упрощенного языка Паскаль.
- •12. Пример программы на упрощенном Паскале.
- •Var sum, sumsq, I, value, mean, variance : integer;
- •13. Алгоритм синтаксического анализа по методу рекурсивного спуска.
- •Void read()
- •Void idlist()
- •Void assign()
- •15. Лексический анализ, регулярные грамматики и конечные автоматы.
- •17. Грамматики типа ll(k). Алгоритмы построения магазинных анализаторов.
- •18. Детерминированный синтаксический анализ сверху вниз.
- •19. Правила определения детерминированного мп-разпознавателя по ll(1) грамматике.
- •20. Заключение.
- •Литература
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 |
|
|
|
|
|
|
|
|
|
|
|
|