Хорошая дискуссия по алгоритмам Shunting Yard http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm В представленном там алгоритме используется ключевая идея стека операторов но имеет некоторую грамматику, чтобы знать, что следует ожидать дальше. Он имеет две основные функции E()
, которые ожидают выражения и P()
, которые ожидают либо префиксный оператор, переменную, число, скобки и функции.
Если мы говорим, что P обозначает некоторую последовательность префикса, а B - двоичный оператор, то любое выражение будет иметь вид
P B P B P
т.е. вы либо ожидаете последовательность префикса, либо двоичный оператор. Формально грамматика
E -> P (B P)*
, а P будет
P -> -P | variable | constant | etc.
. Это означает psudocode как
E() {
P()
while next token is a binary op:
read next op
push onto stack and do the shunting yard logic
P()
if any tokens remain report error
pop remaining operators off the stack
}
P() {
if next token is constant or variable:
add to output
else if next token is unary minus:
push uminus onto operator stack
P()
}
. Вы можете развернуть это, чтобы обрабатывать другие унарные операторы, функции, скобки, суффиксные операторы.