LAOXでパーサを書く
今のところの成果
(parse-grammars '((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 <- < #[1-9] num-char > :return (- (char->integer num-char) (char->integer #\0))))) => ((:result (:definition add (:alter (:sequence ((:identifier mult :capture lval) #\+ (:identifier add :capture rval)) :callback (+ lval rval)) (:sequence ((:identifier <mult :capture G6648) (:identifier val> :capture G6649)) :callback val))) #<<derivs> 0x8578ff0>) (:result (:definition mult (:alter (:sequence ((:identifier prim :capture lval) #\* (:identifier mult :capture rval)) :callback (* lval rval)) (:sequence ((:identifier <prim :capture G6650) (:identifier val> :capture G6651)) :callback val))) #<<derivs> 0x8589638>) (:result (:definition prim (:alter (:sequence (#\( (:identifier add :capture val) #\)) :callback val) (:sequence ((:identifier decim :capture val)) :callback val))) #<<derivs> 0x859cc88>) (:result (:definition decim (:alter (:sequence ((:identifier < :capture G6652) #[1-9] (:identifier num-char :capture G6653) (:identifier > :capture G6654)) :callback (- (char->integer num-char) (char->integer #\0))))) #<<derivs> 0x85acb00>))
文字集合の捕捉が何か変だ。家に帰って仕事した後にデバッグする。
文法定義を変更。よきかなよきかな。
((:result (:definition (:identifier add) (:alter (:sequence ((:primary (:identifier mult) :capture lval) (:primary (:char #\+)) (:primary (:identifier add) :capture rval)) :callback (+ lval rval)) (:sequence ((:primary (:identifier <mult)) (:primary (:identifier val>))) :callback val))) #<<derivs> 0x84ef1b0>) (:result (:definition (:identifier mult) (:alter (:sequence ((:primary (:identifier prim) :capture lval) (:primary (:char #\*)) (:primary (:identifier mult) :capture rval)) :callback (* lval rval)) (:sequence ((:primary (:identifier <prim)) (:primary (:identifier val>))) :callback val))) #<<derivs> 0x850f488>) (:result (:definition (:identifier prim) (:alter (:sequence ((:primary (:char #\()) (:primary (:identifier add) :capture val) (:primary (:char #\)))) :callback val) (:sequence ((:primary (:identifier decim) :capture val)) :callback val))) #<<derivs> 0x852b690>) (:result (:definition (:identifier decim) (:alter (:sequence ((:primary (:char-set #[1-9]) :capture num-char)) :callback (- (char->integer num-char) (char->integer #\0))))) #<<derivs> 0x8542d88>))