Программа для программы
Программа для программы
Наверное каждый программист после того как написал тетрис, должен обязательно написать компилятор к определённому языку програмирования. Ну что же, каждый - так каждый...
В этой задаче Вам предлагается написать интерпретатор (не будем же мы пачкать руки низкоуровневыми языками программирования) для следующего языка программирования. Назовём его Сю. Это С-подобный язык, но динамически типизированный. И в нём есть следующие конструкции:
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) Все операции, кроме =, выполняются в порядке слева-направо (при одинаковых приоритетах).
Входные данные
Во входном файле программа на выше описанном языке.
Выходные данные
В выходном файле результат работы программы (а именно то, что выводили функции print) или же одна из ошибок, если программе не удалось выполнится (первая из ошибок и только она).
Пример
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; }
Hello, World! My name is Sue ..........