Комментарии 2
кстати, в статье "Operator-precedence parser" на вики написано, что приоритет операторов можно указать расстановкой круглых скобок (parenthesize):
"Another approach is to first fully parenthesize the expression, inserting a number of parentheses around each operator, such that they lead to the correct precedence even when parsed with a linear, left-to-right parser." Но здесь не совсем понятно, что означает линейный парсер.
Здесь речь идёт о выражениях, где вокруг каждого оператора стоят скобки (так называемое полноскобочное выражение). В таком выражении действительно не нужны приоритеты и ассоциативность операторам.
Для сравнения вот такие выражения: (1+(2*3))
и ((1+2)*3)
Или такие: (3*(2^(2^3)))
, (3*((2^2)^3))
, (((3*2)^2)^3)
Полная расстановка скобок однозначно определяет порядок действий и при парсинге нам не нужно проверять условия с приоритетом и ассоциативностью. А так линейный парсер — это всё та же сортировочная станция по своей сути, просто чуть упрощённая.
Просто никто в здравом уме не захочет вводить выражения, записанное в такой форме, когда оно содержит больше 3 операций.
Всё, что вам не рассказали про Shunting Yard