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