|
@@ -19,9 +19,9 @@ let tokenize next_char emit =
|
|
|
in
|
|
in
|
|
|
|
|
|
|
|
let emit_buf () =
|
|
let emit_buf () =
|
|
|
- match Buffer.length buf with
|
|
|
|
|
- | 0 -> ()
|
|
|
|
|
- | _ ->
|
|
|
|
|
|
|
+ if Buffer.length buf = 0 then
|
|
|
|
|
+ ()
|
|
|
|
|
+ else
|
|
|
emit (ID (Buffer.contents buf));
|
|
emit (ID (Buffer.contents buf));
|
|
|
Buffer.clear buf
|
|
Buffer.clear buf
|
|
|
in
|
|
in
|
|
@@ -74,6 +74,9 @@ let parse next_char =
|
|
|
| MINUS -> expect := E_ntest
|
|
| MINUS -> expect := E_ntest
|
|
|
| LPAREN -> stack := ref [] :: !stack
|
|
| LPAREN -> stack := ref [] :: !stack
|
|
|
| RPAREN ->
|
|
| RPAREN ->
|
|
|
|
|
+ if List.length !stack < 2 then begin
|
|
|
|
|
+ raise (ParseError "too many closing parentheses")
|
|
|
|
|
+ end;
|
|
|
let body = List.rev !(List.hd !stack) in
|
|
let body = List.rev !(List.hd !stack) in
|
|
|
stack := List.tl !stack;
|
|
stack := List.tl !stack;
|
|
|
append (Repeat (program_of_list body))
|
|
append (Repeat (program_of_list body))
|
|
@@ -89,6 +92,10 @@ let parse next_char =
|
|
|
expect := E_basic
|
|
expect := E_basic
|
|
|
in
|
|
in
|
|
|
tokenize next_char handler;
|
|
tokenize next_char handler;
|
|
|
|
|
+
|
|
|
|
|
+ if List.length !stack > 1 then
|
|
|
|
|
+ raise (ParseError "missing closing parenthesis");
|
|
|
|
|
+
|
|
|
Concat (List.rev !(List.hd !stack))
|
|
Concat (List.rev !(List.hd !stack))
|
|
|
|
|
|
|
|
let parse_string s =
|
|
let parse_string s =
|