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)")