grammar Eqn

rule comparation
  expression comp_group? <Eqn::Comparation>
end

rule comp_group
  comp_op expression <Eqn::Comparation::CompGroup>
end

rule expression
  space? multitive space? addsub_group? space? <Eqn::Expression>
end

rule addsub_group
  addsub_op expression <Eqn::Expression::ExprGroup>
end

rule multitive
  exponentiative space? muldiv_group? <Eqn::Expression>
end

rule muldiv_group
  muldiv_op space? multitive <Eqn::Expression::ExprGroup>
end

rule exponentiative
  operand space? pow_group? <Eqn::Expression>
end

rule pow_group
  pow_op space? exponentiative <Eqn::Expression::ExprGroup>
end

rule operand
  function / group / number
end

rule function
  if_func / round_func / roundup_func / rounddown_func
end

rule if_func
  ('if' / 'IF') space? '(' comparation ',' expression ',' expression ')' <Eqn::Function::If>
end

rule round_func
  ('round' / 'ROUND') space? '(' expression round_group? ')' <Eqn::Function::Round>
end

rule roundup_func
  ('roundup' / 'ROUNDUP') space? '(' expression round_group? ')' <Eqn::Function::RoundUp>
end

rule rounddown_func
  ('rounddown' / 'ROUNDDOWN') space? '(' expression round_group? ')' <Eqn::Function::RoundDown>
end

rule round_group
  ',' expression <Eqn::Expression>
end

rule group
  '(' expression ')' <Eqn::Expression>
end

rule number
  signed_float space? exponent? <Eqn::Number>
end

rule signed_float
  sign? space? (float / digits / variable) <Eqn::Number::SignedNumber>
end

rule float
  digits? decimal <Eqn::Number::Float>
end

rule decimal
  '.' digits <Eqn::Number::Decimal>
end

rule exponent
  exp space? signed_float <Eqn::Number::Exponent>
end

rule pow_op
  '^' <Eqn::Terminal::Op::RightAssociativeOp>
end

rule muldiv_op
    '*' <Eqn::Terminal::Op::RightAssociativeOp>
  / '/' <Eqn::Terminal::Op::LeftAssociativeOp>
end

rule addsub_op
    '+' <Eqn::Terminal::Op::RightAssociativeOp>
  / '-' <Eqn::Terminal::Op::LeftAssociativeOp>
end

rule comp_op
    '<=' <Eqn::Terminal::CompOp>
  / '>=' <Eqn::Terminal::CompOp>
  / '<'  <Eqn::Terminal::CompOp>
  / '>'  <Eqn::Terminal::CompOp>
  / '==' <Eqn::Terminal::CompOp>
  / '='  <Eqn::Terminal::CompOp>
  / '!=' <Eqn::Terminal::CompOp>
end

rule exp
  'e' / 'E'
end

rule sign
    '+' 
  / '-' <Eqn::Terminal::UnaryMinus>
end

rule digits
  [0-9]+ <Eqn::Terminal::Digits>
end

rule variable
  [a-zA-Z]+ <Eqn::Terminal::Variable>
end

rule space
  ("\s" / "\t")*
end

end