eolymp
bolt
Try our new interface for solving problems
Problems

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

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

Наверное каждый программист после того как написал тетрис, должен обязательно написать компилятор к определённому языку програмирования. Ну что же, каждый - так каждый... В этой задаче Вам предлагается написать интерпретатор (не будем же мы пачкать руки низкоуровневыми языками программирования) для следующего языка программирования. Назовём его \textbf{Сю}. Это \textbf{С}-подобный язык, но динамически типизированный. И в нём есть следующие конструкции: 1) Вся программа -- набор функций. Так как функции могут вызываться до их выполнения, то в наличии также и прототипы функции. Функция задаётся: <<\textbf{имя}>> ( <<\textbf{имена аргументов через запятую }>>) <<\textbf{блок (тело функции)}>> Прототип функции: <<\textbf{имя}>> (<<\textbf{имена аргументов через запятую}>> ); Программа начинается с выполнения функции \textbf{main}. Если таковая отсутствует, то, если функция одна, то она выполняется. 2) Блок: \{ <<\textbf{набор операторов разделённый точкой с занятой}>> \} Блок возвращает значение последнего оператора блока. 3) Оператор может быть следующих типов: а) вызов функции: <<\textbf{имя функции}>>(<<\textbf{набор параметров через запятую}>>) б) присваивание: <<\textbf{имя переменной 1}>> = <<имя переменной\textbf{ 2}>> = ... = <<имя переменной\textbf{ n}>> = \textbf{выражение}. в) \textbf{выражение} -- по всем математическим правилам; также могут присутствовать тернарные операторы. г) тернарный оператор: <<\textbf{выражение 1}>>\textbf{?}<<выражение\textbf{ 2}>>\textbf{:}<<выражение\textbf{ 3}>> Выполняется следующим образм: если выражение\textbf{ 1} -- истина, то результат -- выражение\textbf{ 2}, иначе --выражение\textbf{ 3}. д) Условный оператор: \textbf{if} (<<выражение\textbf{ 1}>>) <<\textbf{блок 1}>> \textbf{else} <<\textbf{блок 2}>> Виполняется как тернарный оператор. Часть \textbf{else} <<выражение\textbf{ 3}>>; можеь отсутствовать. е) Циклы: I) \textbf{for} (<<выражение\textbf{ 1}>>\textbf{;} <<выражение\textbf{ 2}>>\textbf{;} <<выражение\textbf{ 3}>>) <<\textbf{блок}>> Выполняет сначала выражение\textbf{ 1}. Потом пока выражение\textbf{ 2} истинно выполняется \textbf{блок} и только потом --выражение\textbf{ 3}. Сначала проверка истинности -- потом выполнение. II) \textbf{while(}<<\textbf{выражение}>>\textbf{)}<<\textbf{блок}>> Выполняет \textbf{блок} до тех пор, пока истинно значение \textbf{выражения}. Сначала проверка истинности -- потом выполнение. III) \textbf{do} <<\textbf{блок}>> \textbf{while} (<<\textbf{выражение}>>) Виполняет блок до тех пор, пока истинно значение \textbf{выражения}. Сначала выполнение -- потом проверка истинности. ж) оператор возврата: \textbf{return} <<\textbf{выражение}>> Возвращает функции значение выражения и прекращает её работу. з) оператор выхода из цикла: \textbf{break} Прекращает работу цикла или условного оператора. При этом может возвращать значение. и) Строка -- \textbf{"}<<\textbf{набор символів}>>\textbf{"} к) Символ в программе - \textbf{'}<<\textbf{символ}>>\textbf{'} л) Присутствуют операторы \textbf{>} (больше), \textbf{<} (меньше), \textbf{>=} (больше или равно), \textbf{<=} (меньше или равно), \textbf{!=} (не равно), \textbf{==} (логическое равно), \textbf{||} - логическое ИЛИ, \textbf{&&} - логическое И. м) Операторы \textbf{+=} (прибавить и присвоить), \textbf{-=} (вычесть и присвоить), \textbf{*=} (умножити и присвоить), \textbf{/=} (разделить и присвоить), \textbf{\%=} (взять по модулю и присвоить), \textbf{++}<<\textbf{имя переменной}>> (прибавить единицу и вернуть значение), <<\textbf{имя переменной}>>\textbf{++} (возвратить значение и прибавить \textbf{1}), <<\textbf{имя переменной}>>\textbf{--} (возвратить значение и вычесть \textbf{1}), \textbf{--}<<\textbf{имя переменной}>> (вычесть \textbf{1} и возвратить значение). Присутстсвует стандартная функция \textbf{print}, которая выводит передаваемые ей аргументы. н) \textbf{Имя} -- это последовательность латинских букв, цифр и символа подчёркивания. Первым символом имени не может быть цифра. \textit{\textbf{Замечания:}} 1) Программа синтаксически правильна и выполняет не белее \textbf{1000000} итераций. 2) Если есть логические ошибки, то должно выводится соответствующее сообщение. Их список: а) Если функция \textbf{main} отсуствует, и всего функция не одна, то выводится сообщение "\textbf{Ambiguity in function calling}". б) Если программа запрашивает значение переменной, которая пока отсутствует в программе, выводится сообщение "\textbf{No such variable}". в) Если программа запрашивает значение функции, ещё не описанной в программе, выводится сообщение "\textbf{No such function}" г) Если в математическом выражении выполняются операции, которые при заданных значениях не могут быть выполнены, выводится сообщение "\textbf{Incompatible types}". С числами выполняются все математические операции. Со строками операции \textbf{+} и \textbf{*} - конкатенация строк. Если конкатентируются число и строка, то результат -- конкатенация числа, переведенного в строку, и строки. Все другие операции не разрешены. д) При делении на ноль выводится сообщение "\textbf{Division by zero}" 3) Все операции, кроме =, выполняются в порядке слева-направо (при одинаковых приоритетах). \InputFile Во входном файле программа на выше описанном языке. \OutputFile В выходном файле результат работы программы (а именно то, что выводили функции \textit{\textbf{print}}) или же одна из ошибок, если программе не удалось выполнится (первая из ошибок и только она).
Time limit 8 seconds
Memory limit 256 MiB
Input example #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;
}
Output example #1
Hello, World!
My name is Sue
..........
Author Kozhukhivskiy Vitaliy
Source Distance Summer Computer School - Summer 2013