factor/extra/peg/expr/expr.factor

30 lines
906 B
Factor

! Copyright (C) 2008 Chris Double.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel arrays strings math.parser sequences
peg peg.ebnf peg.parsers memoize math ;
IN: peg.expr
: operator-fold ( lhs seq -- value )
#! Perform a fold of a lhs, followed by a sequence of pairs being
#! { operator rhs } in to a tree structure of the correct precedence.
swap [ first2 swap call ] reduce ;
EBNF: expr
times = "*" [[ drop [ * ] ]]
divide = "/" [[ drop [ / ] ]]
add = "+" [[ drop [ + ] ]]
subtract = "-" [[ drop [ - ] ]]
digit = [0-9] [[ digit> ]]
number = (digit)+ [[ unclip [ swap 10 * + ] reduce ]]
value = number | ("(" expr ")") [[ second ]]
product = (value ((times | divide) value)*) [[ first2 operator-fold ]]
sum = (product ((add | subtract) product)*) [[ first2 operator-fold ]]
expr = sum
;EBNF
: eval-expr ( string -- number )
expr parse-result-ast ;