;; -*-lisp-*-

;; This stanza declares the scripting library
(library
 (name scripting)
 (public_name acgtk.scripting)
 (modules
  (:standard \ acg doc sites))
 (libraries str logs readline menhirLib utilsLib containers logic acgData datalogLib grammars magicRewriting svgLib dump)
 (preprocess
  (per_module
   ((pps sedlex.ppx)
    lexer))))

;; The executable consists of only one module (and the automatically generated module html_sites)
(executable
 (name acg)
 (public_name acg)
 (package acgtk)
 (libraries unix cmdliner readline sedlex logs utilsLib scripting acgData svgLib dune-site)
 (modules acg sites))

(generate_sites_module
 (module sites)
 (sites acgtk))

;; This executable is used to generate the documentation
(executable
 (name doc)
 (libraries scripting)
 (modules doc))

(rule
 (action
  (with-stdout-to doc.mld_part
   (run ./doc.exe))))

(menhir
 (modules parser)
 (merge_into codeParser)
 (flags --explain --external-tokens Parser --code --exn-carries-state --strict))

(menhir
 (modules parser)
 (merge_into tableParser)
 (flags --explain --external-tokens Parser --table --strict))

(rule
 (target parserMessages.ml)
 (deps
  (alias update_messages)
  (alias check_messages)
  (:parser parser.mly)
  (:messages parserMessages.messages))
 (action (with-stdout-to %{target}
  (run menhir %{parser} --compile-errors %{messages}))))

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

(rule
 (target parserMessages.new.messages)
 (deps
  (:parser parser.mly)
  (:updated_messages parserMessages.updated.messages)
  (:auto_messages parserMessages.auto.messages))
 (action (with-stdout-to %{target}
  (run menhir %{parser}
   --merge-errors %{updated_messages}
   --merge-errors %{auto_messages}))))

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

(rule
 (target parserMessages.updated.messages)
 (deps
  (:parser parser.mly)
  (:messages parserMessages.messages))
 (action (with-stdout-to %{target}
  (run menhir %{parser} --update-errors %{messages}))))

(rule
 (alias check_messages)
 (enabled_if (= %{profile} dev))
 (deps
  (:messages parserMessages.messages))
 (action
  (run grep -zvq "<YOUR SYNTAX ERROR MESSAGE HERE>" %{messages})))

(rule
 (targets parser.ml parser.mli)
 (deps
  (:parser parser.mly))
 (action
  (run menhir %{parser} --only-tokens)))

(documentation
 (package acgtk))
