Skip to content

Latest commit

 

History

History
46 lines (36 loc) · 3.71 KB

README.md

File metadata and controls

46 lines (36 loc) · 3.71 KB

Assignment #5. Trees

Варіант #0. Побудова математичного інтерпретатора

Написати програму-інтерпретатор математичних виразів, що підтримує змінні та (в більш складному варіанті) оператори розгалуження. Можете взяти за основу вашу або чиюсь попередню лабораторну роботу із Shunting Yard.

В цій роботі замість того, щоб одразу обчислювати значення кожної операції, необхідно спочатку побудувати абстрактне синтаксичне дерево виразу. Далі обчислення виразу зводиться до обходу дерева в глибину і обчислення значення вузлів дерева або прийняття рішення про зміну порядку обходу дерева. Як приклад, можна навести умовний оператор: обчислюється лише одна з гілок вершини цього оператора, а інша пропускається.

Значення змінних під час обходу дерева найкраще зберігати в хеш-таблиці. Ніякі типи даних, крім чисел із плаваючою комою, впроваджувати не обов'язково.

AST використовують щоразу при компіляції програм написаних практично всіма мовами програмування. Наприклад, наступному фрагментові коду (приклад з вікіпедії)

while b ≠ 0
  if a > b
    a := a − b
  else
    b := b − a
return a

може відповідати таке дерево:

Вхідні та вихідні дані

На вхід програмі подається текстовий файл з кодом, наприклад:

abc = 1;
q = 3;
2+abc*q;

Програма має вивести результат обчислення останнього виразу на екран: result = 5.0

Синтаксис вашої мови можете вибрати будь-який. Програма має підтримувати змінні з іменем довжиною в будь-яку кількість символів, наприклад "a", "abc", "getthereveryfastindeed".

Складніший варіант (+1 бал): додати оператор if. Щоб не додавати булеві типи даних, можна вважати за true будь-яке відмінне від 0 число з плаваючою комою. Синтаксис оператора довільний (з дужками, без дужок, з endif, з блоками { }, або відступами, як у python), але це має бути не тернарний оператор. Наприклад,

a = if b then 1 else 2 або a = b ? 1 : 2 рівнозначні вирази. Перший варіант синтаксис python, другий - С. Обидва вирази є тернарними операторами, а не умовними.

Приклад правильного умовного оператора:

if D then
    x1 = (b + sD) / (2 * a)
    x2 = (b - sD) / (2 * a)
else
    x = b / (2 * a)