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}}) или же одна из ошибок, если программе не удалось выполнится (первая из ошибок и только она).
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 ..........