1 program      =   { SOI ~ expr ~ EOI }
2   expr       =   { prefix* ~ primary ~ postfix* ~ (infix ~ prefix* ~ primary ~ postfix* )* }
3     infix    =  _{ add | sub | mul | div | pow }
4       add    =   { "+" } // Addition
5       sub    =   { "-" } // Subtraction
6       mul    =   { "*" } // Multiplication
7       div    =   { "/" } // Division
8       pow    =   { "^" } // Exponentiation
9     prefix   =  _{ neg }
10       neg    =   { "-" } // Negation
11     postfix  =  _{ fac }
12       fac    =   { "!" } // Factorial
13     primary  =  _{ int | "(" ~ expr ~ ")" }