Syntax error beyond end of program
I am experimenting with writing a toy compiler in ocaml. Currently, I am trying to implement the offside rule for my lexer. However, I am having some trouble with the ocaml syntax (the compiler errors are extremely un-informative). The code below (33 lines of it) causes an error on line 34, beyond the end of the source code. I am unsure what is causing this error.
open Printf
let s = (Stack.create():int Stack.t);
let rec check x =
(
if Stack.is_empty s then
Stack.push x s
else if Stack.top s < x then
(
Stack.push x s;
printf "INDENT\n";
)
else if Stack.top s > x then
(
printf "DEDENT\n";
Stack.开发者_运维技巧pop s;
check x;
)
else
printf "MATCHED\n";
);
let main () =
(
check 0;
check 4;
check 6;
check 8;
check 5;
);
let _ = Printexc.print main ()
Ocaml output:
File "lexer.ml", line 34, characters 0-0:
Error: Syntax error
Can someone help me work out what the error is caused by and help me on my way to fixing it?
The trailing ; after the definitions of main, check and s are erroneous.
Replace these 3 occurences with ;; as follows:
let s = (Stack.create():int Stack.t);;
let rec check x =
(
(* ...sequence of imperative statements... *)
);;
let main () =
(
(* ...sequence of imperative statements... *)
);;
; is used in the following cases:
- to sequence imperative statements
- as a separator between list elements
- as a separator between array elements
- as a separator between record fields
Some examples:
let hello_world1 () =
print_endline "Hello";
print_endline "World !"
;;
let hello_world2 () =
begin
print_endline "Hello";
print_endline "World !"
end
;;
let hello_world3 () =
(
print_endline "Hello";
print_endline "World !";
)
;;
let some_list =
[1; 2; 3]
;;
let some_array =
[| 'a'; 'b'; 'c' |]
;;
type my_process =
{
pid: int;
executable_path: string;
}
;;
let p1 = { pid = 142; executable_path = "./my_exec" };;
Just removing the ;
works:
open Printf
let (s:int Stack.t) = Stack.create()
let rec check x =
(
if Stack.is_empty s then
Stack.push x s
else if Stack.top s < x then
(
Stack.push x s;
printf "INDENT\n";
)
else if Stack.top s > x then
(
printf "DEDENT\n";
Stack.pop s;
check x;
)
else
printf "MATCHED\n";
)
let main () =
(
check 0;
check 4;
check 6;
check 8;
check 5;
)
let _ =
Printexc.print main ()
Running it:
gaius@debian:~/Projects/TestCase$ ./lexer
INDENT
INDENT
INDENT
DEDENT
DEDENT
INDENT
精彩评论