Програма для програми#4678

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

8 секунд
256 мегабайтів
Легка

Напевно кожен програміст опісля того як написав тетріс, повинен обов'язково написати компілятор для певної мови програмування. Ну що ж, кожен - так кожен...

У цій задачі Вам пропонується написати інтерпретатор (не будемо ж ми бруднити руки низькорівневими мовами програмування) для наступної мови програмування. Назвемо її Сю. Це С-подібна мова, але динамічно типізована. І у ній є наступні конструкції:

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

Приклади

Приклад 1

Loading
Loading