Merge commit 'ocaml3102'
[ocaml.git] / test / Lex / testscanner.mll
blob3f1f0f34f45f5995e9e0d958aa56ad900499ad52
1 (***********************************************************************)
2 (*                                                                     *)
3 (*                           Objective Caml                            *)
4 (*                                                                     *)
5 (*            Xavier Leroy, projet Cristal, INRIA Rocquencourt         *)
6 (*                                                                     *)
7 (*  Copyright 1996 Institut National de Recherche en Informatique et   *)
8 (*  en Automatique.  All rights reserved.  This file is distributed    *)
9 (*  under the terms of the Q Public License version 1.0.               *)
10 (*                                                                     *)
11 (***********************************************************************)
13 (* $Id$ *)
15 (* The lexical analyzer for lexer definitions. *)
18 #open "syntax";;
19 #open "grammar";;
20 #open "scan_aux";;
23 rule main = parse
24     _ * "qwertyuiopasdfghjklzxcvbnm0123456789!@#$%^&*()"
25     { main lexbuf }
26   | [' ' '\010' '\013' '\009' ] + 
27     { main lexbuf }
28   | "(*" 
29     { comment_depth := 1;
30       comment lexbuf;
31       main lexbuf }
32   | (['A'-'Z' 'a'-'z'] | '_' ['A'-'Z' 'a'-'z' '\'' '0'-'9'])
33     ( '_' ? ['A'-'Z' 'a'-'z' ''' '0'-'9'] ) * 
34     { match lexing.lexeme lexbuf with
35         "rule" -> Trule
36       | "parse" -> Tparse
37       | "and" -> Tand
38       | "eof" -> Teof
39       | s -> Tident s }
40   | '"' 
41     { reset_string_buffer();
42       string lexbuf;
43       Tstring(get_stored_string()) }
44   | "'" 
45     { Tchar(char lexbuf) }
46   | '{' 
47     { let n1 = lexing.lexeme_end lexbuf in
48         brace_depth := 1;
49         let n2 = action lexbuf in
50           Taction(Location(n1, n2)) }
51   | '='  { Tequal }
52   | ";;"  { Tend }
53   | '|'  { Tor }
54   | '_'  { Tunderscore }
55   | "eof"  { Teof }
56   | '['  { Tlbracket }
57   | ']'  { Trbracket }
58   | '*'  { Tstar }
59   | '?'  { Tmaybe }
60   | '+'  { Tplus }
61   | '('  { Tlparen }
62   | ')'  { Trparen }
63   | '^'  { Tcaret }
64   | '-'  { Tdash }
65   | eof
66     { raise(Lexical_error "unterminated lexer definition") }
67   | _
68     { raise(Lexical_error("illegal character " ^ lexing.lexeme lexbuf)) }
70 and action = parse
71     '{' 
72     { brace_depth := brace_depth + 1;
73       action lexbuf }
74   | '}' 
75     { brace_depth := brace_depth - 1;
76       if brace_depth = 0 then lexing.lexeme_start lexbuf else action lexbuf }
77   | '"' 
78     { reset_string_buffer();
79       string lexbuf;
80       reset_string_buffer();
81       action lexbuf }
82   | '\''
83     { char lexbuf; action lexbuf }
84   | "(*" 
85     { comment_depth := 1;
86       comment lexbuf;
87       action lexbuf }
88   | eof 
89     { raise (Lexical_error "unterminated action") }
90   | _ 
91     { action lexbuf }
92       
93 and string = parse
94     '"' 
95     { () }
96   | '\\' [' ' '\010' '\013' '\009' '\026' '\012'] +
97     { string lexbuf }
98   | '\\' ['\\' '"' 'n' 't' 'b' 'r'] 
99     { store_string_char(char_for_backslash(lexing.lexeme_char lexbuf 1));
100       string lexbuf }
101   | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] 
102     { store_string_char(char_for_decimal_code lexbuf 1);
103       string lexbuf }
104   | eof 
105     { raise(Lexical_error "unterminated string") }
106   | _ 
107     { store_string_char(lexing.lexeme_char lexbuf 0);
108       string lexbuf }
110 and char = parse
111     [^ '\\'] "'" 
112     { lexing.lexeme_char lexbuf 0 }
113   | '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'" 
114     { char_for_backslash (lexing.lexeme_char lexbuf 1) }
115   | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'" 
116     { char_for_decimal_code lexbuf 1 }
117   | _ 
118     { raise(Lexical_error "bad character constant") }
120 and comment = parse
121     "(*" 
122     { comment_depth := comment_depth + 1; comment lexbuf }
123   | "*)" 
124     { comment_depth := comment_depth - 1;
125       if comment_depth = 0 then () else comment lexbuf }
126   | '"' 
127     { reset_string_buffer();
128       string lexbuf;
129       reset_string_buffer();
130       comment lexbuf }
131   | eof 
132     { raise(Lexical_error "unterminated comment") }
133   | _ 
134     { comment lexbuf }