1.11.1. ВХОДНОЙ ЯЗЫК КОМПИЛЯТОРА Программа на входном языке представляет собой конечную последовательность лексем. Каждая из лексем изображается с помощью цепочки литер, синтаксис которой может быть описан посредством следующей грамматики (см. главу II, раздел 1):
$ Лексема =
$ КлючевоеСлово | Идентификатор | Число.
$ КлючевоеСлово =
$ ";" | "(" | ")" | "+" | "-" | "*" | "-" |
$ ":=" | "<=" | '<>' | "<" | ">=" | ">" | "=".
$ "DO" | "ELSE" | "IF" | "READ" | "THEN" |
$ "WHILE" | "WRITE".
$ Идентификатор = Буква { Буква | Цифра }.
$ Число = Цифра { Цифра }.
Прописные и строчные буквы в ключевых словах не различаются, т.е. считаются полностью эквивалентными.
Соседние лексемы разделяются между собой "межевыми" литерами: пробелами, табуляциями и литерами конца строки. В тех случаях, когда нет опасности "склеивания" соседних лексем в одну, разделять их не обязательно.
$ Программа = ПослОператоров.
$ ПослОператоров = Оператор { ";" Оператор }.
$ Оператор =
$ "IF" Условие "THEN" Оператор "ELSE" Оператор |
$ "WHILE" Условие "DO" Оператор |
$ "READ" ИмяПеременной |
$ "WRITE" Выражение |
$ "(" ПослОператоров ")".
$ ИмяПеременной ":=" Выражение |
$ Пусто.
$ Пусто = .
$ Условие = Выражение ОперОтношения Выражение.
$ ОперОтношения = "=" | "<=" | "<>" | "<" | ">=" | ">".
$ Выражение = Слагаемое { АддитивнОпер Слагаемое}.
$ Слагаемое = Множитель { МультиплОпер Множитель}.
$ Множитель = ИмяПеременной | Значение | "(" Выражение ")".
$ АддитивнОпер = "+" | "-".
$ МультиплОпер = "*" | "/".
$ ИмяПеременной = Идентификатор.
$ Значение = Целое.
IF Cond THEN St1 ELSE St2
проверяет условие Cond. Затем, если оно выполнено, то выполняется оператор St1, иначе - оператор St2.WHILE Cond DO St
проверяет условие Cond. Если условие выполнено, то выполняется оператор St, а затем все повторяется сначала. Если же условие не выполнено, то выполнение оператора цикла завершается.READ Var
читает из устройства ввода одно число и присваивает его переменной Var.WRITE Expr
вычисляет арифметическое выражение Expr и полученное число записывает на устройство вывода.( St1; St2; ... StN )
означает, что следует последовательно выполнить операторы St1, St2, ..., StN.Var := Expr
вычисляет выражение Expr и полученное число присваивает переменной Var.read value;
count:=1;
result:=1;
while count<value do
(
count:=count+1;
result:=result*count
);
write result