Дана строка — арифметическое выражение из неотрицательных целых чисел, знаков + и *
и пробелов, например "7 + 8 * 2". Проверьте, что выражение корректно, и вычислите его
с обычным приоритетом: умножение раньше сложения.
var (
ErrSyntax = errors.New("invalid expression")
ErrOverflow = errors.New("integer overflow")
)
// Eval вычисляет выражение expr.
func Eval(expr string) (int64, error)
Корректное выражение — число (знак число)*, где число — одна или больше цифр
(ведущие нули допустимы: 007 — это 7), знак — + или *. Пробелы (только ' ')
допустимы в любом количестве до, после и между числами и знаками, но не внутри числа.
Всё остальное — ErrSyntax: пустая строка, другие символы, унарный +, два знака или
два числа подряд, знак в начале или в конце.
Переполнение. Если число в записи, произведение (считаем слева направо) или сумма
выходят за math.MaxInt64 — ErrOverflow. Синтаксическая ошибка важнее: если выражение
некорректно, возвращается ErrSyntax, даже если в нём есть огромные числа.
Примеры
"7 + 8 * 2" → 23
"2*3*4 + 1" → 25
" 42 " → 42
"0 * 5 + 007" → 7
"7 +" → ErrSyntax
"7 + + 8" → ErrSyntax
"1 2 + 3" → ErrSyntax (пробел внутри числа)
"7 - 2" → ErrSyntax
"" → ErrSyntax
"9223372036854775807 + 1" → ErrOverflow
Ограничения: 0 ≤ len(expr) ≤ 10⁶, ожидается O(n). Ошибки сравниваются через errors.Is.