Пример. После работы сканера построены

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] На практике, если слово встречается во всех документах, его удаляют из списка термов


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: