Use left recursive grammar in peg.expr
parent
af9e27823a
commit
d002e02948
|
@ -4,24 +4,19 @@ USING: kernel arrays strings math.parser sequences
|
||||||
peg peg.ebnf peg.parsers memoize math ;
|
peg peg.ebnf peg.parsers memoize math ;
|
||||||
IN: peg.expr
|
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
|
EBNF: expr
|
||||||
times = "*" [[ drop [ * ] ]]
|
digit = [0-9] => [[ digit> ]]
|
||||||
divide = "/" [[ drop [ / ] ]]
|
number = (digit)+ => [[ 10 digits>integer ]]
|
||||||
add = "+" [[ drop [ + ] ]]
|
value = number
|
||||||
subtract = "-" [[ drop [ - ] ]]
|
| ("(" exp ")") => [[ second ]]
|
||||||
|
|
||||||
digit = [0-9] [[ digit> ]]
|
fac = fac "*" value => [[ first3 nip * ]]
|
||||||
number = (digit)+ [[ unclip [ swap 10 * + ] reduce ]]
|
| fac "/" value => [[ first3 nip / ]]
|
||||||
|
| number
|
||||||
|
|
||||||
value = number | ("(" expr ")") [[ second ]]
|
exp = exp "+" fac => [[ first3 nip + ]]
|
||||||
product = (value ((times | divide) value)*) [[ first2 operator-fold ]]
|
| exp "-" fac => [[ first3 nip - ]]
|
||||||
sum = (product ((add | subtract) product)*) [[ first2 operator-fold ]]
|
| fac
|
||||||
expr = sum
|
|
||||||
;EBNF
|
;EBNF
|
||||||
|
|
||||||
: eval-expr ( string -- number )
|
: eval-expr ( string -- number )
|
||||||
|
|
Loading…
Reference in New Issue