From d002e029485339ff7c15cdbfb20867e59304c3d0 Mon Sep 17 00:00:00 2001 From: Chris Double Date: Sun, 30 Mar 2008 17:23:11 +1300 Subject: [PATCH] Use left recursive grammar in peg.expr --- extra/peg/expr/expr.factor | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/extra/peg/expr/expr.factor b/extra/peg/expr/expr.factor index 6b690cb5ee..e16d9db0a7 100644 --- a/extra/peg/expr/expr.factor +++ b/extra/peg/expr/expr.factor @@ -4,24 +4,19 @@ 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)+ => [[ 10 digits>integer ]] +value = number + | ("(" exp ")") => [[ second ]] -digit = [0-9] [[ digit> ]] -number = (digit)+ [[ unclip [ swap 10 * + ] reduce ]] +fac = fac "*" value => [[ first3 nip * ]] + | fac "/" value => [[ first3 nip / ]] + | number -value = number | ("(" expr ")") [[ second ]] -product = (value ((times | divide) value)*) [[ first2 operator-fold ]] -sum = (product ((add | subtract) product)*) [[ first2 operator-fold ]] -expr = sum +exp = exp "+" fac => [[ first3 nip + ]] + | exp "-" fac => [[ first3 nip - ]] + | fac ;EBNF : eval-expr ( string -- number )