Search code examples
if-statementerror-handlingsyntax-errorocaml

OCaml Syntax error with if-else block without any information


I currently am faced with a problem with if-else block with end keyword. Here is my problem method. enter image description here

And here is a link to my full project.

  let parkVehicle () =
    try
      print_string "Please enter the license plate: ";
      let licensePlate = read_line () in
      let index = checkExists licensePlate in
        if index = -1 then
          begin
            print_string "Adding new ticket....\n";
            let ticket = Ticket.(setId (Int64.of_float (Unix.time ())));
            if addVehicle licensePlate then
              begin
                tickets := ticket :: !tickets;
                print_string "Parking vehicle successfully....\n"
              end
            else
              print_string "Fail to add new ticket! Try again!\n"
          end
         ^^^^^
        else 
          begin
            print_string "Removing existing ticket....\n";
            let ticket = List.nth !tickets index in
            tickets := List.filter (fun t -> t <> ticket) !tickets;
            if Ticket.removeVehicle ticket then
              begin
                let diff = Ticket.getEndTime ticket -. Ticket.getStartTime ticket in
                let minutes = int_of_float (diff /. 60.0) in
                Vehicle.setTotalParkingTime minutes;
                print_string "Payment ticket information....\n";
                print_string (Ticket.toString ticket ^ "\n")
              end
            else
              begin
                print_string "Fail to remove existing ticket! Try again!\n";
                tickets := ticket :: !tickets
              end
          end
    with _ ->
      print_string "An error occurs!\n"      

Solution

  • Your problem isn't actually with the end, but earlier in your code:

    let ticket = Ticket.(setId (Int64.of_float (Unix.time ())));
    

    This is not valid syntax. Rather use a local binding.

    let ticket = Ticket.(setId (Int64.of_float (Unix.time ()))) in
    

    Looking at your full project briefly, it looks like you may have this issue in multiple places. It's a common beginner mistake, and a good one to learn about early.