summaryrefslogtreecommitdiffstats
path: root/parsing/parser.mly
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1997-08-22 08:55:41 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1997-08-22 08:55:41 +0000
commit579e1523e94f7fef3d11346207161beea667b9dc (patch)
treec41dd7d0041ef03ce58e40772b3a3ac612c9e7f7 /parsing/parser.mly
parent23686e53207f43ee1b913095acc964063a36281f (diff)
Meilleures erreurs de syntaxe pour les parentheses mal fermees, etc
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1689 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'parsing/parser.mly')
-rw-r--r--parsing/parser.mly56
1 files changed, 56 insertions, 0 deletions
diff --git a/parsing/parser.mly b/parsing/parser.mly
index 79a5ef3cf..74c90f1e7 100644
--- a/parsing/parser.mly
+++ b/parsing/parser.mly
@@ -96,6 +96,10 @@ let rec mkrangepat c1 c2 =
mkpat(Ppat_or(mkpat(Ppat_constant(Const_char c1)),
mkrangepat (Char.chr(Char.code c1 + 1)) c2))
+let unclosed opening_name opening_num closing_name closing_num =
+ raise(Syntaxerr.Error(Syntaxerr.Unclosed(rhs_loc opening_num, opening_name,
+ rhs_loc closing_num, closing_name)))
+
%}
/* Tokens */
@@ -277,15 +281,23 @@ module_expr:
{ mkmod(Pmod_ident $1) }
| STRUCT structure END
{ mkmod(Pmod_structure($2)) }
+ | STRUCT structure error
+ { unclosed "struct" 1 "end" 3 }
| FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_expr
%prec prec_fun
{ mkmod(Pmod_functor($3, $5, $8)) }
| module_expr LPAREN module_expr RPAREN
{ mkmod(Pmod_apply($1, $3)) }
+ | module_expr LPAREN module_expr error
+ { unclosed "(" 2 ")" 4 }
| LPAREN module_expr COLON module_type RPAREN
{ mkmod(Pmod_constraint($2, $4)) }
+ | LPAREN module_expr COLON module_type error
+ { unclosed "(" 1 ")" 5 }
| LPAREN module_expr RPAREN
{ $2 }
+ | LPAREN module_expr error
+ { unclosed "(" 1 ")" 3 }
;
structure:
structure_tail { $1 }
@@ -317,6 +329,8 @@ structure_item:
{ mkstr(Pstr_open $2) }
| CLASS class_list END
{ mkstr(Pstr_class (List.rev $2)) }
+ | CLASS class_list error
+ { unclosed "class" 1 "end" 3 }
;
module_binding:
EQUAL module_expr
@@ -334,6 +348,8 @@ module_type:
{ mkmty(Pmty_ident $1) }
| SIG signature END
{ mkmty(Pmty_signature(List.rev $2)) }
+ | SIG signature error
+ { unclosed "sig" 1 "end" 3 }
| FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_type
%prec prec_fun
{ mkmty(Pmty_functor($3, $5, $8)) }
@@ -341,6 +357,8 @@ module_type:
{ mkmty(Pmty_with($1, List.rev $3)) }
| LPAREN module_type RPAREN
{ $2 }
+ | LPAREN module_type error
+ { unclosed "(" 1 ")" 3 }
;
signature:
/* empty */ { [] }
@@ -391,6 +409,8 @@ expr:
{ mkexp(Pexp_apply($1, List.rev $2)) }
| LET rec_flag let_bindings IN seq_expr %prec prec_let
{ mkexp(Pexp_let($2, List.rev $3, $5)) }
+ | LET rec_flag let_bindings error %prec prec_let
+ { unclosed "let" 1 "in" 4 }
| PARSER opt_pat opt_bar parser_cases %prec prec_fun
{ Pstream.cparser ($2, List.rev $4) }
| FUNCTION opt_bar match_cases %prec prec_fun
@@ -403,6 +423,8 @@ expr:
{ mkexp(Pexp_apply(Pstream.cparser ($5, List.rev $7), [$2])) }
| TRY seq_expr WITH opt_bar match_cases %prec prec_try
{ mkexp(Pexp_try($2, List.rev $5)) }
+ | TRY seq_expr error %prec prec_try
+ { unclosed "try" 1 "with" 3 }
| expr_comma_list
{ mkexp(Pexp_tuple(List.rev $1)) }
| constr_longident simple_expr %prec prec_constr_appl
@@ -413,8 +435,12 @@ expr:
{ mkexp(Pexp_ifthenelse($2, $4, None)) }
| WHILE seq_expr DO seq_expr DONE
{ mkexp(Pexp_while($2, $4)) }
+ | WHILE seq_expr DO seq_expr error
+ { unclosed "while" 1 "done" 5 }
| FOR val_ident EQUAL seq_expr direction_flag seq_expr DO seq_expr DONE
{ mkexp(Pexp_for($2, $4, $6, $5, $8)) }
+ | FOR val_ident EQUAL seq_expr direction_flag seq_expr DO seq_expr error
+ { unclosed "for" 1 "done" 9 }
| expr COLONCOLON expr
{ mkexp(Pexp_construct(Lident "::", Some(mkexp(Pexp_tuple[$1;$3])), false)) }
| expr INFIXOP0 expr
@@ -471,30 +497,48 @@ simple_expr:
{ mkexp(Pexp_construct($1, None, false)) }
| LPAREN seq_expr RPAREN
{ $2 }
+ | LPAREN seq_expr error
+ { unclosed "(" 1 ")" 3 }
| BEGIN seq_expr END
{ $2 }
+ | BEGIN seq_expr error
+ { unclosed "begin" 1 "end" 3 }
| LPAREN seq_expr type_constraint RPAREN
{ let (t, t') = $3 in mkexp(Pexp_constraint($2, t, t')) }
+ | LPAREN seq_expr type_constraint error
+ { unclosed "(" 1 ")" 4 }
| simple_expr DOT label_longident
{ mkexp(Pexp_field($1, $3)) }
| simple_expr DOT LPAREN seq_expr RPAREN
{ mkexp(Pexp_apply(mkexp(Pexp_ident(array_function "Array" "get")),
[$1; $4])) }
+ | simple_expr DOT LPAREN seq_expr error
+ { unclosed "(" 3 ")" 5 }
| simple_expr DOT LBRACKET seq_expr RBRACKET
{ mkexp(Pexp_apply(mkexp(Pexp_ident(array_function "String" "get")),
[$1; $4])) }
+ | simple_expr DOT LBRACKET seq_expr error
+ { unclosed "[" 3 "]" 5 }
| LBRACE lbl_expr_list opt_semi RBRACE
{ mkexp(Pexp_record(List.rev $2)) }
+ | LBRACE lbl_expr_list opt_semi error
+ { unclosed "{" 1 "}" 4 }
| LBRACKETLESS stream_expr opt_semi GREATERRBRACKET
{ Pstream.cstream (List.rev $2) }
+ | LBRACKETLESS stream_expr opt_semi error
+ { unclosed "[<" 1 ">]" 4 }
| LBRACKETLESS GREATERRBRACKET
{ Pstream.cstream [] }
| LBRACKETBAR expr_semi_list opt_semi BARRBRACKET
{ mkexp(Pexp_array(List.rev $2)) }
+ | LBRACKETBAR expr_semi_list opt_semi error
+ { unclosed "[|" 1 "|]" 4 }
| LBRACKETBAR BARRBRACKET
{ mkexp(Pexp_array []) }
| LBRACKET expr_semi_list opt_semi RBRACKET
{ mklistexp(List.rev $2) }
+ | LBRACKET expr_semi_list opt_semi error
+ { unclosed "[" 1 "]" 4 }
| PREFIXOP simple_expr
{ mkexp(Pexp_apply(mkoperator $1 1, [$2])) }
| simple_expr SHARP label
@@ -503,6 +547,8 @@ simple_expr:
{ mkexp(Pexp_new($2)) }
| LBRACELESS label_expr_list opt_semi GREATERRBRACE
{ mkexp(Pexp_override(List.rev $2)) }
+ | LBRACELESS label_expr_list opt_semi error
+ { unclosed "{<" 1 ">}" 4 }
| LBRACELESS GREATERRBRACE
{ mkexp(Pexp_override []) }
| LPAREN SHARP label RPAREN
@@ -541,6 +587,8 @@ parser_case:
LBRACKETLESS stream_pattern opt_semi GREATERRBRACKET opt_pat
MINUSGREATER seq_expr
{ (List.rev $2, $5, $7) }
+ | LBRACKETLESS stream_pattern opt_semi error
+ { unclosed "[<" 1 ">]" 4 }
| LBRACKETLESS GREATERRBRACKET opt_pat MINUSGREATER seq_expr
{ ([], $3, $5) }
;
@@ -642,12 +690,20 @@ simple_pattern:
{ mkpat(Ppat_construct($1, None, false)) }
| LBRACE lbl_pattern_list opt_semi RBRACE
{ mkpat(Ppat_record(List.rev $2)) }
+ | LBRACE lbl_pattern_list opt_semi error
+ { unclosed "{" 1 "}" 4 }
| LBRACKET pattern_semi_list opt_semi RBRACKET
{ mklistpat(List.rev $2) }
+ | LBRACKET pattern_semi_list opt_semi error
+ { unclosed "{" 1 "}" 4 }
| LPAREN pattern RPAREN
{ $2 }
+ | LPAREN pattern error
+ { unclosed "(" 1 ")" 3 }
| LPAREN pattern COLON core_type RPAREN
{ mkpat(Ppat_constraint($2, $4)) }
+ | LPAREN pattern COLON core_type error
+ { unclosed "(" 1 ")" 5 }
;
pattern_comma_list: