S式PEG改良

変数に値を捕捉するフォームを、括弧を使って書けるようにしてみた。

(parse-string-with
 ((add <- (mult lval) #\+ (add rval) :return `(+ ,lval ,rval)
       / (mult val) :return val)
  (mult <- (prim lval) #\* (mult rval) :return `(* ,lval ,rval)
	/ (prim val) :return val)
  (prim <- #\( (add val) #\) :return val / (decim val) :return val)
  (decim <- (digit nch) :return (- (char->integer nch) (char->integer #\0)))
  (digit <- #[0-9]))
 "(1*2+3)*4*(5+(6+7)*8)")
;; => (* (+ (* 1 2) 3) (* 4 (+ 5 (* (+ 6 7) 8))))

視認性が向上した(気がする)。

昔の記述方法

(parse-string-with
 ((add <- < mult lval > #p\+ < add rval > :return `(+ ,lval ,rval)
	/ < mult val > :return val)
   (mult <- < prim lval > #\* < mult rval > :return `(* ,lval ,rval)
	 / < prim val > :return val)
   (prim <- #\( < add val > #\) :return val / < decim val > :return val)
   (decim <- < digit nch > :return (- (char->integer nch) (char->integer #\0)))
   (digit <- #[0-9]))
 "(1*2+3)*4*(5+(6+7)*8)")