Написать программу — калькулятор с переменными и обработкой ошибок. Программа построчно вводит команды калькулятора, и если надо, выводит результат их выполнения или ошибку. Конец ввода — пустая строка. Все буквы — английские.
- Пробелы в строках игнорируются
Команда, начинающаяся на '#' — комментарий, такие команды игнорируются
Команда вида Идентификатор = выражение задаёт переменную Идентификатор
идентификатор определяется как .isidentifier()
Если слева от "=" стоит не идентификатор, выводится "Assignment error"; всё, что справа, игнорируется, присваивания не происходит
Команда вида выражение выводит значение выражения.
Выражение вычисляется по правилам арифметики, и может состоять из
целых десятичных чисел
- уже определённых идентификаторов
- круглых скобок, внутри которых должно находиться непустое выражение
действий +, -, *, /, % и унарных + и -.
Деление целочисленное
Любое другое выражение приводит к выводу ошибки "Syntax error"
Если выражение нельзя вычислить, потому что в нём встречаются неопределённые переменные, выводится ошибка "Name error"
Если выражение нельзя вычислить по какой-то другой причине, выводится "Runtime error"
# Ошибок нет 234 10/3 A = 3*(2+(1-7)%5) A+100 + ++ - -- - + - - 0 # Начинаются ошибки 7*B 3=3 A=4=5 A() A/0
Подсказка 1: удобно пользоваться eval() с двумя параметрами
- Подсказка 2: кое-какие иные конструкции Python являются синтаксическими ошибками для калькулятора и наоборот (например, ключевые слова)
234 3 118 0 Name error Assignment error Syntax error Syntax error Runtime error
Спойлер:
Не надо пытаться exec()-ать тест — синтаксис калькулятора отличается от синтаксиса Python.
Если в строке есть =, проверить, идентификатор ли справа (Assignment Error), если этих "=" больше 1 — Syntax error
Если в строке есть "**" или "//" — выдать Syntax error (оно может за-eval-иться, а в калькуляторе такого нет)
Если в строке есть "буква(" — выдать Syntax error (вызова функций тоже нет).
Во избежание конфликта имён переменных с ключевыми словами python приписать к ним всем какую-нибудь ерунду, типа '_C_'.
За-join-ить обратно, и вот в таком виде eval()-ить — причём переменные калькулятора хранить в словаре, и этот самый словарь передавать в качестве globals.