;; -*-lisp-*-

(menhir
 (merge_into data_parser)
 (flags
  (--explain --table --strict))
 (modules file_parser sig_parser lex_parser term_type_parser
   bound_term_parser))

;; Rule to generate the messages ml file
(rule
 (target messages.ml)
 (deps
  (alias update_messages)
  (alias check_messages)
  (:parsers file_parser.mly lex_parser.mly sig_parser.mly
            term_type_parser.mly bound_term_parser.mly)
  (:messages data_parser.messages))
 (action (with-stdout-to %{target}
  (run menhir --base data_parser %{parsers} --compile-errors %{messages}))))

(rule
 (alias update_messages)
 (enabled_if (= %{profile} dev))
 (deps
  (:messages data_parser.messages)
  (:new_messages data_parser.new.messages))
 (action
  (diff %{messages} %{new_messages})))

(rule
 (target data_parser.new.messages)
 (deps
  (:parsers file_parser.mly lex_parser.mly sig_parser.mly
            term_type_parser.mly bound_term_parser.mly)
  (:updated_messages data_parser.updated.messages)
  (:auto_messages data_parser.auto.messages))
 (action (with-stdout-to %{target}
  (run menhir --base data_parser %{parsers}
   --merge-errors %{updated_messages}
   --merge-errors %{auto_messages}))))

;; Rule to generate the automatic message file
(rule
 (target data_parser.auto.messages)
 (deps
  (:parsers file_parser.mly lex_parser.mly sig_parser.mly
            term_type_parser.mly bound_term_parser.mly))
 (action (with-stdout-to %{target}
  (run menhir --base data_parser %{parsers} --list-errors))))

;; Rule to generate the message file by updating previously existing
;; message file
(rule
 (target data_parser.updated.messages)
 (deps
  (:parsers file_parser.mly lex_parser.mly sig_parser.mly
            term_type_parser.mly bound_term_parser.mly)
  (:messages data_parser.messages))
 (action (with-stdout-to %{target}
  (run menhir --base data_parser %{parsers} --update-errors %{messages}))))

;; Rule to check if all dummy messages have been replaced by a real message
(rule
 (alias check_messages)
 (enabled_if (= %{profile} dev))
 (deps
  (:messages data_parser.messages))
 (action
  (run grep -zvq "<YOUR SYNTAX ERROR MESSAGE HERE>" %{messages})))

;; This stanza declares the Grammar library
(library
 (name grammars)
 (public_name acgtk.grammars)
 (modules
  (:standard \ acgc))
 (libraries logs menhirLib utilsLib containers logic datalogLib acgData magicRewriting)
 (preprocess
  (per_module
   ((pps sedlex.ppx)
    data_lexer))))

;; This declares the acgc executable implemented by acgc.ml
(executable
 (name acgc)
 (public_name acgc)
 (package acgtk)
 (modules acgc)
 (libraries logs cmdliner logic acgData grammars dump utilsLib))

(documentation
 (package acgtk))
