begin
a:=l;
b:=0;
while а<=4 do
b:=b+a*a;
a:=a+1
od;
output(b)
end.
После работы сканера построены:
массив идентификаторов {а,b};
массив констант: {1,0,4};
массив лексем:
1. (begin,0) 2. (id,1) 3. (prsv,0) 4. (int,1) 5. (tz,0) 6. (id,2) 7. (prsv,0) 8. (int,2) 9. (tz,0) | 10. (while,0) 11. (id,1) 12. (otn,5) 13. (int,3) 14. (do,29) 15. (id,2) 16. (prsv,0) 17. (id,2) 18. (ots,0) | 19. (id,1) 20. (otu,0) 21. (id,1) 22. (tz,0) 23. (id,1) 24. (prsv,0) 25. (id,1) 26. (ots,0) 27. (int,1) | 28. (od,11) 29. (tz,0) 30. (output,0) 31. (os,0) 32. (id,2) 33. (zs,0) 34. (end,0) |
Рассмотрев работу компилятора, используя рис.3.1 и описания семантических функций, получим код программы:
1) LDA, A+1
2) STA, B+1
3) LDA, A+2
4) STA, B+2
5) LDA, B+1
6) LDA, A+3
7) СМР, 5
8) JMF, 19
9) LDA, B+2
10) LDA, B+1
11) LDA, B+1
12) MUL
13) ADD
14) LDA, B+1
15) LDA, A+1
16) ADD
17) STA, B+1
18) JMP, 5
19) LDA, B+k
20) OUT
21) HLT
Построенный компилятор обрабатывает только синтаксически правильные программы. Для того, чтобы компилятор обнаруживал синтаксические ошибки, необходимо дополнить синтаксические диаграммы компилятора дополнительными дугами перехода в ошибочных ситуациях и семантическими функциями сообщений об ошибках.
Разработка транслятора (компилятора) с языка Милан
|
|
Написать и отладить транслятор учебного языка Милан в язык СИ.
Вход:
Любая программа на языке МИЛАН.
Выход:
Текст на языке C, или синтаксические ошибки (Диагностика первой ошибки с указанием типа: отсутствует begin, лишняя скобка, нет такого символа, неверный порядок операций …).
[1] На практике, если слово встречается во всех документах, его удаляют из списка термов