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 ~ ")" }