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