Синтаксис и семантика языка программирования Синтаксис – формальные правила, которым должна соответствовать программа на некотором языке программирования. Семантика – смысл отдельных элементов программы, написанной по правилам синтаксиса. Прагматика – правила преобразования элементов программы, написанной на языке программирования, в элементы программы на другом языке, например в команды компьютера. Синтаксис задается в виде правил грамматики, точнее, порождающей грамматики. Расширенные порождающие правила Бэкуса 1) каждое правило записывается с новой строки текста; 2) понятие - слово, взятое в угловые скобки < и >; 3) слова Паскаля – зарезервированные слова (например, begin, end и др.), используются при написании программы; 4) символы Паскаля (например, +, /, *, :=, <= и др.), используются при написании программы; 5) правило начинается с определяемого понятия, после него пишутся символы ::= (это есть), далее идет собственно определение понятия; 6) определение понятия состоит из последовательности понятий, слов Паскаля, символов Паскаля, символов | (большая вертикальная черта, надо читать как «или»), символов { } (большие фигурные скобки), символов [ ] (большие квадратные скобки); 7) если две части определения разделены символом |, то для конкретного варианта определяемого понятия используется только одна из таких частей; 8) если часть определения взята в скобки { }, то она рассматривается как единое целое; 9) если часть определения взята в скобки [ ], то в конкретном варианте определяемого понятия она может отсутствовать. Грамматика базового подмножества Паскаля (Delphi) <программа> ::= [program <имя> ;] [uses <список имен> ;] <блок> . <имя> ::= <имя> {<буква> | _ | <цифра>} | {<буква> | _ } <список имен> ::= [<список имен> ,] <имя> <блок> ::= [<описания> ;] <группа операторов> <описания> ::= [<описания> ;] {<описание типов> | <описание констант> | <описание переменных> | <описание процедуры> | <описание функции>} <группа операторов> ::= begin <список операторов> end <список операторов> ::= [<список операторов> ;] <оператор> <описание типов> ::= type <имя> = <тип> | <описание типов> ; <имя> = <тип> <тип> ::= [^]<имя> | [^]<стандартный тип> | [^]<запись> | <файловый тип> | <процедурный тип> | [^] array [[<размерность>]] of <тип> | <класс> <стандартный тип> ::= <целочисленный тип> | <вещественный тип> | char | string [[<константа>]]| boolean <целочисленный тип> ::= integer | word | longint | byte | shortint <вещественный тип> ::= real | single | double | extended | comp <размерность> ::= [<размерность> ,] <константа> .. <константа> <процедурный тип> ::= procedure [(<список аргументов>)] | function [(<список аргументов>)]:<тип> <файловый тип> ::= file [of <тип>] | text <константа> ::= <имя> | <целая константа> | <вещественная константа> | <символьная константа> | <строковая константа> | <логическая константа> |(<список констант>) | nil <список констант> ::= [<список констант> ,] < константа> <описание констант> ::= const <имя> [:<тип>] = <константа> | <описание констант> ; <имя> [: <тип>] = <константа>