schneidmaster/eqn

View on GitHub
lib/eqn.treetop

Summary

Maintainability
Test Coverage
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