Hello,

I'm using ocamlbuild and menhir to compile my project. I was faced with some 
small issues and decided to try some small patches on the menhir source code, 
which I explain below.


1)      Error found with --infer options have bad location
When ocamlbuild invoke menhir to file which is in a sub-directory, ie launch 
the command "menhir --infer MyDir/MyParser.mly", if I have a type error in my 
parser, I get the message

File "MyParser.mly", line 32, characters 41-42: ...

Instead of

File "MyDir/MyParser.mly", line 32, characters 41-42: ...

I understand this is because in the generated file MyDir/MyParser.ml, the #line 
directives are written
                # 239 " MyParser.mly "
instead of
                # 239 "MyDir/MyParser.mly "

So I try to make a little change in menhir's source files. In file error.ml, I 
commented out the "Filename.basename" :
let set_filename name =
  basename := Some ((* Filename.basename  *)name);
  filemark := Mark.fresh()

and idem in back.ml :
let write program =
  let module P = Printer.Make (struct
    let filename = Settings.base ^ ".ml"
    let f = open_out filename
    let locate_stretches =
      if Settings.infer then
      (* Typechecking should not fail at this stage. Omit #line directives. *)
      None
      else
      Some ((* Filename.basename *) filename)
    let raw_stretch_action = false
  end) in
  P.program program

This is correct the issue but I do not know if it is the good correction. At 
least, this seems the way ocamlyacc works.


2)      Ocamlbuild, menhir and the -table option

Ocamlbuild fails is menhir is used with "-table" option because it does'nt link 
with the MenhirLib library (--table option is required when grammar becomes 
large). So I changed the two menhir's makefiles to generate .cma and .cmxa and 
create the following ocamlbuild's plugin:
open Ocamlbuild_plugin;;
open Command;;

let menhirLibDir () =
  Command.execute( Cmd (Sh "menhir --suggest-comp-flags --table > tmp.txt"));
  let path = match string_list_of_file ( "tmp.txt") with
    | [_;path] -> path
    | _ -> assert false in
  rm_f "tmp.txt";
  path
;;

dispatch begin function
| After_rules ->
  let menhirLibDir = menhirLibDir () in
  ocaml_lib ~extern:true ~dir:menhirLibDir ~tag_name:"use_menhir_table" 
"menhirLib";
  flag [ "ocaml" ; "menhir";"use_menhir_table" ] (S[A "--table"]);
| _ -> ()
end;;

and with the following _tags flag, it compiles:
<**/*.ml>: use_menhir_table
<**/*.mly>: explain, use_menhir_table
true: use_menhir
<**/*.{byte,native}>: use_menhir_table

Maybe could this changes be integrated in the official myocamlbuild source 
files ?



3)      Menhir (like ocamlyacc) only raise a warning when it finds  a 
shift/reduce or reduce/reduce conflict.

I propose to add an option "--conflict-is-error" which make menhir fail if it 
finds conflicts. Changes are very small in menhir source code. I have added the 
option in Setting.ml and change the "report statistic" code from


let () =
  if !shift_reduce = 1 then
    Error.warning "one state has shift/reduce conflicts."
  else if !shift_reduce > 1 then
    Error.warning (Printf.sprintf "%d states have shift/reduce conflicts." 
!shift_reduce);
  if !reduce_reduce = 1 then
    Error.warning "one state has reduce/reduce conflicts."
  else if !reduce_reduce > 1 then
    Error.warning (Printf.sprintf "%d states have reduce/reduce conflicts." 
!reduce_reduce)



to


let () =
  let print = if !Settings.conflict_is_error then (fun s -> Error.signalN [] 
("Error: "^s)) else Error.warning in
  if !shift_reduce = 1 then
    print "one state has shift/reduce conflicts."
  else if !shift_reduce > 1 then
    print (Printf.sprintf "%d states have shift/reduce conflicts." 
!shift_reduce);
  if !reduce_reduce = 1 then
    print "one state has reduce/reduce conflicts."
  else if !reduce_reduce > 1 then
    print (Printf.sprintf "%d states have reduce/reduce conflicts." 
!reduce_reduce)


Could these patches be integrated in Menhir next release ?

Daniel Weil

PS : as the menhir-list doesn't seems to work, I'm using the caml-list.




This email and any attachments are intended solely for the use of the 
individual or entity to whom it is addressed and may be confidential and/or 
privileged.

If you are not one of the named recipients or have received this email in error,

(i) you should not read, disclose, or copy it,

(ii) please notify sender of your receipt by reply email and delete this email 
and all attachments,

(iii) Dassault Systemes does not accept or assume any liability or 
responsibility for any use of or reliance on this email.

For other languages, go to http://www.3ds.com/terms/email-disclaimer

-- 
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to