(library
 (name parsing)
 (modules parser parserMessages lexer driver)
 (libraries common syntax sedlex menhirLib)
 (preprocess
  (pps ppx_deriving.show ppx_deriving.ord sedlex.ppx)))

(menhir
 (modules parser)
 (infer true)
 (flags -lg 1 -la 1 -lc 2 --explain --exn-carries-state))

;;;;;;;;;;;;;;;;;
;;; Messages ;;;;
;;;;;;;;;;;;;;;;;

;; Adapted from https://gitlab.inria.fr/fpottier/menhir/-/blob/master/demos/calc-syntax-errors/dune

;; The following rule generates "parserMessages.ml" based on the source file
;; "parserMessages.messages". It requires the completeness check to have been
;; performed first. (If desired, this check could be disabled.)

(rule
 (deps parserMessages.check)
 (action
  (with-stdout-to
   parserMessages.ml
   (run
    menhir
    %{dep:parser.mly}
    --compile-errors
    %{dep:parserMessages.messages}))))

;; This rule generates a file "parserMessages.auto.messages" that contains a
;; list of all error states. It is used by the completeness check.

(rule
 (with-stdout-to
  parserMessages.auto.messages
  (run menhir %{dep:parser.mly} --list-errors)))

;; This rule implements the completeness check. It checks that every error
;; state listed in the auto-generated file "parserMessages.auto.messages"
;; is also listed in the file "parserMessages.messages" that is maintained
;; by the programmer.

(rule
 (with-stdout-to
  parserMessages.check
  (run
   menhir
   %{dep:parser.mly}
   --compare-errors
   %{dep:parserMessages.auto.messages}
   --compare-errors
   %{dep:parserMessages.messages})))
