lib/eqn.treetop
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