eolymp
bolt
Try our new interface for solving problems
Məsələlər

Программа для программы

Программа для программы

Zaman məhdudiyyəti 8 saniyə
Yaddaşı istafadə məhdudiyyəti 256 MiB

Наверное каждый программист после того как написал тетрис, должен обязательно написать компилятор к определённому языку програмирования. Ну что же, каждый - так каждый...

В этой задаче Вам предлагается написать интерпретатор (не будем же мы пачкать руки низкоуровневыми языками программирования) для следующего языка программирования. Назовём его Сю. Это С-подобный язык, но динамически типизированный. И в нём есть следующие конструкции:

1) Вся программа – набор функций. Так как функции могут вызываться до их выполнения, то в наличии также и прототипы функции. Функция задаётся:

«имя» ( «имена аргументов через запятую ») «блок (тело функции)»

Прототип функции:

«имя» («имена аргументов через запятую» );

Программа начинается с выполнения функции main. Если таковая отсутствует, то, если функция одна, то она выполняется.

2) Блок:

{ «набор операторов разделённый точкой с занятой» }

Блок возвращает значение последнего оператора блока.

3) Оператор может быть следующих типов:

а) вызов функции:

«имя функции»(«набор параметров через запятую»)

б) присваивание:

«имя переменной 1» = «имя переменной 2» = ... = «имя переменной n» = выражение.

в) выражение – по всем математическим правилам; также могут присутствовать тернарные операторы.

г) тернарный оператор:

«выражение 1»?«выражение 2»:«выражение 3»

Выполняется следующим образм: если выражение 1 – истина, то результат – выражение 2, иначе – выражение 3.

д) Условный оператор:

if («выражение 1») «блок 1» else «блок 2»

Виполняется как тернарный оператор. Часть else «выражение 3»; можеь отсутствовать.

е) Циклы:

I) for («выражение 1»; «выражение 2»; «выражение 3») «блок»

Выполняет сначала выражение 1. Потом пока выражение 2 истинно выполняется блок и только потом – выражение 3. Сначала проверка истинности – потом выполнение.

II) while(«выражение»)«блок»

Выполняет блок до тех пор, пока истинно значение выражения. Сначала проверка истинности – потом выполнение.

III) do «блок» whileвыражение»)

Виполняет блок до тех пор, пока истинно значение выражения. Сначала выполнение – потом проверка истинности.

ж) оператор возврата:

return «выражение»

Возвращает функции значение выражения и прекращает её работу.

з) оператор выхода из цикла:

break

Прекращает работу цикла или условного оператора. При этом может возвращать значение.

и) Строка – "«набор символів»"

к) Символ в программе - '«символ»'

л) Присутствуют операторы > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), != (не равно), == (логическое равно), || - логическое ИЛИ, - логическое И.

м) Операторы += (прибавить и присвоить), -= (вычесть и присвоить), *= (умножити и присвоить), /= (разделить и присвоить), %= (взять по модулю и присвоить), ++«имя переменной» (прибавить единицу и вернуть значение), «имя переменной»++ (возвратить значение и прибавить 1), «имя переменной» (возвратить значение и вычесть 1), «имя переменной» (вычесть 1 и возвратить значение). Присутстсвует стандартная функция print, которая выводит передаваемые ей аргументы.

н) Имя – это последовательность латинских букв, цифр и символа подчёркивания. Первым символом имени не может быть цифра.

Замечания:

1) Программа синтаксически правильна и выполняет не белее 1000000 итераций.

2) Если есть логические ошибки, то должно выводится соответствующее сообщение.

Их список:

а) Если функция main отсуствует, и всего функция не одна, то выводится сообщение "Ambiguity in function calling".

б) Если программа запрашивает значение переменной, которая пока отсутствует в программе, выводится сообщение "No such variable".

в) Если программа запрашивает значение функции, ещё не описанной в программе, выводится сообщение "No such function"

г) Если в математическом выражении выполняются операции, которые при заданных значениях не могут быть выполнены, выводится сообщение "Incompatible types". С числами выполняются все математические операции. Со строками операции + и * - конкатенация строк. Если конкатентируются число и строка, то результат – конкатенация числа, переведенного в строку, и строки. Все другие операции не разрешены.

д) При делении на ноль выводится сообщение "Division by zero"

3) Все операции, кроме =, выполняются в порядке слева-направо (при одинаковых приоритетах).

Giriş verilənləri

Во входном файле программа на выше описанном языке.

Çıxış verilənləri

В выходном файле результат работы программы (а именно то, что выводили функции print) или же одна из ошибок, если программе не удалось выполнится (первая из ошибок и только она).

Nümunə

Giriş verilənləri #1
main(){
	print("Hello, World!");
	a = "My name is ";
	name = "Sue";
	print('\n',a * name,"\n");
	for (i = 0; i != 10; i++) {
		print('.');
	};
	return (2*3) % 5 ? 0 : 1;
}
Çıxış verilənləri #1
Hello, World!
My name is Sue
..........
Müəllif Кожухивский Виталий
Mənbə Дистанционная Летняя Компьютерная Школа - лето 2013 года