Дипломная работа: Программно методический комплекс для обучения процессу создания компиляторов
В дальнейшем мы будем работать с синтаксически-неориентированными алгоритмами, т.к. будем работать лишь с одним языком – учебный язык на основе языка Паскаль.
1.5 Грамматики
Грамматика языка программирования является формальным описанием его синтаксиса или формы, в которой записаны отдельные предложения программы или вся программа. Грамматика не описывает семантику или значения различных предложений. Информация о семантике содержится в программах генерации объектного кода. В качестве иллюстрации разницы между синтаксисом и семантикой рассмотрим два предложения:
I:=J+K
и
I:=X+Y
где Х и Y являются действительными переменными, aI, J, К — целыми переменными. Эти два предложения имеют одинаковый синтаксис. Оба являются операторами присваивания, в которых присваиваемое значение определяется выражением, состоящим из двух имен переменных, разделенных оператором сложения. Однако семантика этих двух предложений совершенно различна. Первое предложение говорит о том, что переменные в выражении должны быть сложены с использованием целых арифметических операций, а результат сложения должен быть присвоен переменной I. Второе предложение задает сложение с плавающей точкой, результат которого должен быть преобразован в целое число перед присваиванием. Очевидно, эти два предложения будут скомпилированы в различные последовательности машинных команд, хотя их грамматическое описание одинаково. Различия между ними проявятся на этапе генерации объектного кода.
На рисунке 4 показаны БНФ грамматики, используемые в дипломном проекте. Подчеркнутые волнистой линией элементы могут опускаться (не использоваться).
1. <prog> ::= PROGRAM <prog-name> VAR <dec-list> BEGIN <stmt-list> END.
2. <prog-name> ::= id ;
3. <dec-list> ::= <dec> { ; <dec> } ;
4. <dec> ::= <id-list> : <type>
5. <type> ::= INTEGER | REAL | STRING
6. <id-list> ::= id { , id }
7. <stmt-list> ::= <stmt> { ; <stmt> } ;
8. <stmt> ::= <assign> | <for> | <read> | <write> | <while> | <repeat> | <if>
9. <assign> ::= id := <exp>
10. <exp> ::= – <term> { + <term> | – <term> }
11. <term> ::= <factor> { * <factor> | DIV <factor> | / <factor> }
12. <factor> ::= id | int | real | <text-val> | (<exp>)
13. <read> ::= READ ( <id-list> )
14. <write> ::= WRITE ( <value> { , <value>} )
15. <for> ::= FOR <index-exp> DO <body>
16. <index-exp> ::= id := <exp> TO|DOWNTO <exp>
17. <body> ::= <stmt> | BEGIN <stmt-list> END
18. <value> ::= <id-list> | <text-val>
19. <text-val> ::= ′ <text> ′
20. <text> ::= string
21. <if> ::= IF <сравнение> THEN <body> ELSE <body>
22. <сравнение>::= <factor> <условие> <factor>