Задачі
Програма для програми
Програма для програми
Напевно кожен програміст опісля того як написав тетріс, повинен обов'язково написати компілятор для певної мови програмування. Ну що ж, кожен - так кожен...
У цій задачі Вам пропонується написати інтерпретатор (не будемо ж ми бруднити руки низькорівневими мовами програмування) для наступної мови програмування. Назвемо її \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{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}}) або ж одна із помилок, якщо програмі не вдалось виконатись (перша із помилок і лише вона).
Вхідні дані #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; }
Вихідні дані #1
Hello, World! My name is Sue ..........