1 # Sample PEG file to demonstrate CL-Opossum use -*- mode:peg -*-
4 # Every successfully matched rule makes a list named DATA available to the action code
9 Sum <- Product (('+' / '-') Product)* {
11 ,(reduce #'(lambda (op/p tail)
12 (if (char= #\+ (car op/p))
13 `(+ ,(second op/p) ,old)
14 `(- ,(second op/p) ,old))))
15 (cdr data) :from-end T :initial-value 0))
18 Product <- Value (('*' / '/') Value)* {
20 ,(reduce #'(lambda (op/p tail)
21 (if (char= #\* (car op/p))
22 `(* ,(second op/p) ,old)
23 `(/ ,(second op/p) ,old))))
24 (cdr data) :from-end T :initial-value 1))
27 Value <- [1-9] [0-9]+ { (reduce #'(lambda (x y) (+ y (* x 10))) data :initial-value 0) }
28 / '(' Expr ')' { (second data) }