fucc で LL(1)

fucc の作者にメールを出したらちゃんと答えが返ってきた。fucc のサンプルももらった。

#-:fucc-generator (asdf:operate 'asdf:load-op :fucc-generator)
#-:fucc-parser (asdf:operate 'asdf:load-op :fucc-parser)
(in-package :fucc-generator)

(defun make-lexer (list)
  (let ((list (copy-list list)))
    (lambda (&rest ignore)
      (let ((atom (pop list)))
        (values atom atom)))))

;;; You should use this macro:
(fucc:defparser *test*
    s
  (a b c)
  ((s ->
      k l (:call #'list))
   (k ->
      a b (:call #'list))
   (l ->
      a c (:call #'list)))
  :type :LL)
;;; Usage:
(setf result
      (fucc:parser-ll (make-lexer '(a b a c)) *test*))
(format t "~a~%" result)
;;;