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