@@ -99,13 +99,14 @@ let error s n msg =
99
99
Printf. eprintf " lexing '%s' at char %d: %s\n " s n msg;
100
100
exit 1
101
101
102
- let validate s (tok1 ,lnum1 ,bol1 ,cnum1 ) (tok2 ,lnum2 , bol2 , cnum2 ) =
102
+ let validate s (tok1 ,lnum1 ,bol1 ,bnum1 , cnum1 ) (tok2 ,lnum2 , bol2 , bnum2 , cnum2 ) =
103
103
if tok1 <> tok2 then error s cnum2 (Printf. sprintf " wrong token: got %s instead of %s" (show tok2) (show tok1));
104
104
if lnum1 <> lnum2 then error s cnum2 (Printf. sprintf " wrong line number: got %d instead of %d" lnum2 lnum1);
105
- if bol1 <> bol2 then error s cnum2 (Printf. sprintf " wrong begin of line: got %d instead of %d" bol2 bol1);
106
- if cnum1 <> cnum2 then error s cnum2 (Printf. sprintf " wrong char count: got %d instead of %d" cnum2 cnum1)
105
+ if bnum1 <> bnum2 then error s bnum2 (Printf. sprintf " wrong char begin count: got %d instead of %d" bnum2 bnum1);
106
+ if cnum1 <> cnum2 then error s cnum2 (Printf. sprintf " wrong char end count: got %d instead of %d" cnum2 cnum1);
107
+ if bol1 <> bol2 then error s cnum2 (Printf. sprintf " wrong begin of line: got %d instead of %d" bol2 bol1)
107
108
108
- type exp = T of t * int * int * int | E
109
+ type exp = T of t * int * int * int * int | E
109
110
110
111
let rec expect s b = function
111
112
| [] -> ()
@@ -114,95 +115,108 @@ let rec expect s b = function
114
115
let tok2 = Lexer. token b in
115
116
let open Lexing in
116
117
let p = b.lex_curr_p in
117
- let lnum2, bol2, cnum2 = p.pos_lnum, p.pos_bol, p.pos_cnum in
118
+ let lnum2, bol2, bnum2, cnum2 = p.pos_lnum, p.pos_bol, b.lex_start_p.pos_cnum , p.pos_cnum in
118
119
match sp with
119
- | T (tok1 ,lnum1 ,bol1 ,cnum1 ) -> validate s (tok1,lnum1,bol1,cnum1) (tok2,lnum2, bol2, cnum2)
120
+ | T (tok1 ,lnum1 ,bol1 ,bnum1 , cnum1 ) -> validate s (tok1,lnum1,bol1,bnum1, cnum1) (tok2,lnum2, bol2, bnum2 , cnum2)
120
121
| E -> error s cnum2 (Printf. sprintf " wrong lexing: got %s instead of error" (show tok2))
121
122
with Failure _ ->
122
123
match sp with
123
124
| E -> ()
124
- | T (tok1 ,_ ,_ ,cnum1 ) -> error s cnum1 (Printf. sprintf " wrong lexing: got error instead of %s" (show tok1))
125
+ | T (tok1 ,_ ,_ ,_ , cnum1 ) -> error s cnum1 (Printf. sprintf " wrong lexing: got error instead of %s" (show tok1))
125
126
end ;
126
127
expect s b spec
127
128
128
129
let test s spec =
129
130
let s = Str. global_replace (Str. regexp_string " \r " ) " " s in
130
131
let b = Lexing. from_string s in
132
+ Printf. eprintf " =============================\n " ;
131
133
expect s b spec
132
134
133
135
let () =
136
+
134
137
(* 01234567890123456789012345 *)
135
- test " 3.4" [T (FLOAT 3.4 , 1 , 0 , 3 )];
136
- test " 3.4" [T (FLOAT 3.4 , 1 , 0 , 4 )];
137
- test " \n 3.4" [T (FLOAT 3.4 , 2 , 1 , 4 )];
138
- test " 3.4 .5" [T (FLOAT 3.4 , 1 , 0 , 3 ); T (FLOAT 0.5 , 1 , 0 , 6 )];
139
- test " 3.4\n .5" [T (FLOAT 3.4 , 1 , 0 , 3 ); T (FLOAT 0.5 , 2 , 4 , 7 )];
138
+ test " 3.4" [T (FLOAT 3.4 , 1 , 0 , 0 , 3 )];
139
+ test " 3.4" [T (FLOAT 3.4 , 1 , 0 , 1 , 4 )];
140
+ test " \n 3.4" [T (FLOAT 3.4 , 2 , 1 , 1 , 4 )];
141
+ test " 3.4 .5" [T (FLOAT 3.4 , 1 , 0 , 0 , 3 ); T (FLOAT 0.5 , 1 , 0 , 4 , 6 )];
142
+ test " 3.4\n .5" [T (FLOAT 3.4 , 1 , 0 , 0 , 3 ); T (FLOAT 0.5 , 2 , 4 , 5 , 7 )];
140
143
(* 01234567890123456789012345 *)
141
- test " 3 .4" [T (INTEGER 3 , 1 , 0 , 1 ); T (FLOAT 0.4 , 1 , 0 , 4 )];
142
- test " 3..4" [T (INTEGER 3 , 1 , 0 , 1 ); T (FULLSTOP , 1 , 0 , 2 ); T (FLOAT 0.4 , 1 , 0 , 4 )];
143
- test " 3." [T (INTEGER 3 , 1 , 0 , 1 ); T (FULLSTOP , 1 , 0 , 2 )];
144
- test " -3." [T (INTEGER (- 3 ), 1 , 0 , 2 ); T (FULLSTOP , 1 , 0 , 3 )];
144
+ test " 3 .4" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (FLOAT 0.4 , 1 , 0 , 2 , 4 )];
145
+ test " 3..4" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (FULLSTOP , 1 , 0 , 1 , 2 ); T (FLOAT 0.4 , 1 , 0 , 2 , 4 )];
146
+ test " 3." [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (FULLSTOP , 1 , 0 , 1 , 2 )];
147
+ test " -3." [T (INTEGER (- 3 ), 1 , 0 , 0 , 2 ); T (FULLSTOP , 1 , 0 , 2 , 3 )];
145
148
(* 01234567890123456789012345 *)
146
- test " 3%...\n 3" [T (INTEGER 3 , 1 , 0 , 1 ); T (INTEGER 3 , 2 , 6 , 7 )];
147
- test " 3/*..*/3" [T (INTEGER 3 , 1 , 0 , 1 ); T (INTEGER 3 , 1 , 0 , 8 )];
148
- test " 3/** T **/3" [T (INTEGER 3 , 1 , 0 , 1 ); T (INTEGER 3 , 1 , 0 , 11 )];
149
- test " 3/*\n .*/3" [T (INTEGER 3 , 1 , 0 , 1 ); T (INTEGER 3 , 2 , 4 , 8 )];
150
- test " 3/*\n /*\n */*/3" [T (INTEGER 3 , 1 , 0 , 1 ); T (INTEGER 3 , 3 , 7 , 12 )];
151
- test " 3/*" [T (INTEGER 3 , 1 , 0 , 1 ); E ];
149
+ test " 3%...\n 3" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (INTEGER 3 , 2 , 6 , 6 , 7 )];
150
+ test " 3/*..*/3" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (INTEGER 3 , 1 , 0 , 7 , 8 )];
151
+ test " 3/** T **/3" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (INTEGER 3 , 1 , 0 , 10 , 11 )];
152
+ test " 3/*\n .*/3" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (INTEGER 3 , 2 , 4 , 7 , 8 )];
153
+ test " 3/*\n /*\n */*/3" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); T (INTEGER 3 , 3 , 7 , 11 , 12 )];
154
+ test " 3/*" [T (INTEGER 3 , 1 , 0 , 0 , 1 ); E ];
152
155
(* 01234567890123456789012345 *)
153
- test {| " a" | } [T (STRING " a" , 1 , 0 , 3 )];
154
- test {| " a" " b" | } [T (STRING " a\" b" , 1 , 0 , 6 )];
155
- test {| " a\n b" | } [T (STRING " a\n b" , 1 , 0 , 6 )];
156
+ test {| " a" | } [T (STRING " a" , 1 , 0 , 0 , 3 )];
157
+ test {| " a" " b" | } [T (STRING " a\" b" , 1 , 0 , 0 , 6 )];
158
+ test {| " a\n b" | } [T (STRING " a\n b" , 1 , 0 , 0 , 6 )];
156
159
test {| " a
157
- b" | } [T (STRING " a\n b" , 2 , 3 , 5 )];
160
+ b" | } [T (STRING " a\n b" , 2 , 3 , 0 , 5 )];
161
+ (* 01234567890123456789012345 *)
162
+ test " x" [T (CONSTANT " x" , 1 , 0 , 0 , 1 )];
163
+ test " x" [T (CONSTANT " x" , 1 , 0 , 1 , 2 )];
164
+ test " xx" [T (CONSTANT " xx" , 1 , 0 , 0 , 2 )];
165
+ test " xx" [T (CONSTANT " xx" , 1 , 0 , 1 , 3 )];
166
+
167
+ test " x-y" [T (CONSTANT " x-y" , 1 , 0 , 0 ,3 )];
168
+ test " -y" [T (MINUS , 1 , 0 , 0 ,1 ); T (CONSTANT " y" ,1 ,0 ,1 ,2 )];
169
+ test " _y" [T (CONSTANT " _y" , 1 , 0 , 0 ,2 )];
170
+ test " _X" [T (CONSTANT " _X" , 1 , 0 , 0 ,2 )];
171
+ test " X_" [T (CONSTANT " X_" , 1 , 0 , 0 ,2 )];
172
+ test " x?" [T (CONSTANT " x?" , 1 , 0 , 0 ,2 )];
173
+ test " X" [T (CONSTANT " X" , 1 , 0 , 0 ,1 )];
174
+ test " X1>@!" [T (CONSTANT " X1>@!" , 1 , 0 , 0 ,5 )];
175
+ test " a.B.c" [T (CONSTANT " a.B.c" , 1 , 0 , 0 ,5 )];
176
+ test " a.B." [T (CONSTANT " a.B" , 1 , 0 , 0 ,3 ); T (FULLSTOP , 1 , 0 , 3 , 4 )];
177
+ test " a. >" [T (CONSTANT " a" , 1 , 0 , 0 ,1 ); T (FULLSTOP , 1 , 0 , 1 , 2 ); T (FAMILY_GT " >" , 1 , 0 , 3 ,4 )];
158
178
(* 01234567890123456789012345 *)
159
- test " x" [T (CONSTANT " x" , 1 , 0 , 1 )];
160
- test " x-y" [T (CONSTANT " x-y" , 1 , 0 , 3 )];
161
- test " -y" [T (MINUS , 1 , 0 , 1 ); T (CONSTANT " y" ,1 ,0 ,2 )];
162
- test " _y" [T (CONSTANT " _y" , 1 , 0 , 2 )];
163
- test " _X" [T (CONSTANT " _X" , 1 , 0 , 2 )];
164
- test " X_" [T (CONSTANT " X_" , 1 , 0 , 2 )];
165
- test " x?" [T (CONSTANT " x?" , 1 , 0 , 2 )];
166
- test " X" [T (CONSTANT " X" , 1 , 0 , 1 )];
167
- test " X1>@!" [T (CONSTANT " X1>@!" , 1 , 0 , 5 )];
168
- test " a.B.c" [T (CONSTANT " a.B.c" , 1 , 0 , 5 )];
169
- test " a.B." [T (CONSTANT " a.B" , 1 , 0 , 3 ); T (FULLSTOP , 1 , 0 , 4 )];
170
- test " a. >" [T (CONSTANT " a" , 1 , 0 , 1 ); T (FULLSTOP , 1 , 0 , 2 ); T (FAMILY_GT " >" , 1 , 0 , 4 )];
179
+ test " -->" [T (FAMILY_MINUS " -->" , 1 , 0 , 0 ,3 )];
180
+ test " x.y->z" [T (CONSTANT " x.y->z" , 1 , 0 , 0 ,6 )];
171
181
(* 01234567890123456789012345 *)
172
- test " -->" [T (FAMILY_MINUS " -->" , 1 , 0 , 3 )];
173
- test " x.y->z" [T (CONSTANT " x.y->z" , 1 , 0 , 6 )];
182
+ test " {{{ }} }}}" [T (QUOTED (3 ," }} " ), 1 , 0 , 0 ,10 )];
183
+ test " {{ {{ } }} }}" [T (QUOTED (2 ," {{ } }} " ), 1 , 0 , 0 ,13 )];
184
+
174
185
(* 01234567890123456789012345 *)
175
- test " {{{ }} }}}" [T (QUOTED (3 ," }} " ), 1 , 0 , 10 )];
176
- test " {{ {{ } }} }}" [T (QUOTED (2 ," {{ } }} " ), 1 , 0 , 13 )];
177
- test " {{ x }}3" [T (QUOTED (2 ," x " ), 1 , 0 , 7 ); T (INTEGER 3 , 1 , 0 , 8 )];
178
- test " {{{ x }}}3" [T (QUOTED (3 ," x " ), 1 , 0 , 9 ); T (INTEGER 3 , 1 , 0 , 10 )];
179
- test " {{\n x }}3" [T (QUOTED (2 ," \n x " ), 2 , 4 , 8 ); T (INTEGER 3 , 2 , 4 , 9 )];
186
+ test " {{ x }}3" [T (QUOTED (2 ," x " ), 1 , 0 , 0 , 7 ); T (INTEGER 3 , 1 , 0 , 7 , 8 )];
187
+ test " 2{{ x }}" [T (INTEGER 2 , 1 , 0 , 0 , 1 ); T (QUOTED (2 ," x " ), 1 , 0 , 1 , 8 )];
188
+ test " 2 {{ x }}" [T (INTEGER 2 , 1 , 0 , 0 , 1 ); T (QUOTED (2 ," x " ), 1 , 0 , 2 , 9 )];
189
+ test " {{{ x }}}3" [T (QUOTED (3 ," x " ), 1 , 0 , 0 , 9 ); T (INTEGER 3 , 1 , 0 , 9 , 10 )];
190
+ test " {{\n x }}3" [T (QUOTED (2 ," \n x " ), 2 , 3 , 0 , 8 ); T (INTEGER 3 , 2 , 3 , 8 , 9 )];
191
+
180
192
(* 01234567890123456789012345 *)
181
- test " foo :- bar." [T (CONSTANT " foo" , 1 , 0 , 3 ); T (VDASH , 1 , 0 , 6 ); T (CONSTANT " bar" , 1 , 0 , 10 ); T (FULLSTOP , 1 , 0 , 11 )];
182
- test " foo ?- bar." [T (CONSTANT " foo" , 1 , 0 , 3 ); T (QDASH , 1 , 0 , 6 ); T (CONSTANT " bar" , 1 , 0 , 10 ); T (FULLSTOP , 1 , 0 , 11 )];
183
- test " foo :- x \\ bar." [T (CONSTANT " foo" , 1 , 0 , 3 ); T (VDASH , 1 , 0 , 6 ); T (CONSTANT " x" , 1 , 0 , 8 ); T (BIND , 1 , 0 , 10 ); T (CONSTANT " bar" , 1 , 0 , 14 ); T (FULLSTOP , 1 , 0 , 15 )];
184
- test " foo, bar" [T (CONSTANT " foo" , 1 , 0 , 3 ); T (CONJ , 1 , 0 , 4 ); T (CONSTANT " bar" , 1 , 0 , 8 ) ];
185
- test " foo & bar" [T (CONSTANT " foo" , 1 , 0 , 3 ); T (CONJ2 , 1 , 0 , 5 ); T (CONSTANT " bar" , 1 , 0 , 9 ) ];
186
- test " []" [T (LBRACKET , 1 , 0 , 1 ); T (RBRACKET , 1 , 0 , 2 )];
193
+ test " foo :- bar." [T (CONSTANT " foo" , 1 , 0 , 0 , 3 ); T (VDASH , 1 , 0 , 4 , 6 ); T (CONSTANT " bar" , 1 , 0 , 7 , 10 ); T (FULLSTOP , 1 , 0 , 10 , 11 )];
194
+ test " foo ?- bar." [T (CONSTANT " foo" , 1 , 0 , 0 , 3 ); T (QDASH , 1 , 0 , 4 , 6 ); T (CONSTANT " bar" , 1 , 0 , 7 , 10 ); T (FULLSTOP , 1 , 0 , 10 , 11 )];
195
+ test " foo :- x \\ bar." [T (CONSTANT " foo" , 1 , 0 , 0 , 3 ); T (VDASH , 1 , 0 , 4 , 6 ); T (CONSTANT " x" , 1 , 0 , 7 , 8 ); T (BIND , 1 , 0 , 9 , 10 ); T (CONSTANT " bar" , 1 , 0 , 11 , 14 ); T (FULLSTOP , 1 , 0 , 14 , 15 )];
196
+ test " foo, bar" [T (CONSTANT " foo" , 1 , 0 , 0 , 3 ); T (CONJ , 1 , 0 , 3 , 4 ); T (CONSTANT " bar" , 1 , 0 , 5 , 8 ) ];
197
+ test " foo & bar" [T (CONSTANT " foo" , 1 , 0 , 0 , 3 ); T (CONJ2 , 1 , 0 , 4 , 5 ); T (CONSTANT " bar" , 1 , 0 , 6 , 9 ) ];
198
+ test " []" [T (LBRACKET , 1 , 0 , 0 , 1 ); T (RBRACKET , 1 , 0 , 1 , 2 )];
187
199
(* 01234567890123456789012345 *)
188
- test " X" [T (CONSTANT " X" , 1 , 0 , 1 ) ];
189
- test " is" [T (IS , 1 , 0 , 2 ) ];
190
- test " #line 3 \" xx\"\n a" [T (CONSTANT " a" , 3 , 0 , 1 ) ];
191
- test " b\n #line 3 \" xx\"\n a" [T (CONSTANT " b" , 1 , 0 , 1 );T (CONSTANT " a" , 3 , 2 , 1 ) ];
200
+ test " X" [T (CONSTANT " X" , 1 , 0 , 0 , 1 ) ];
201
+ test " is" [T (IS , 1 , 0 , 0 , 2 ) ];
202
+ test " #line 3 \" xx\"\n a" [T (CONSTANT " a" , 3 , 0 , 0 , 1 ) ];
203
+ test " b\n #line 3 \" xx\"\n a" [T (CONSTANT " b" , 1 , 0 , 0 , 1 );T (CONSTANT " a" , 3 , 2 , 0 , 1 ) ];
192
204
test {|
193
205
b
194
206
c
195
207
#line 7 " xx"
196
- a| } [T (CONSTANT " b" , 2 , 1 , 2 );T (CONSTANT " c" , 3 , 3 , 4 );T (CONSTANT " a" , 7 , 5 , 1 ) ];
208
+ a| } [T (CONSTANT " b" , 2 , 1 , 1 ,2 );T (CONSTANT " c" , 3 , 3 , 3 ,4 );T (CONSTANT " a" , 7 , 5 , 0 ,1 ) ];
209
+
197
210
(* 01234567890123456789012345 *)
198
- test " :name" [T (COLON ,1 ,0 ,1 ); T (NAME ,1 ,0 ,5 )];
199
- test " @foo" [T (CONSTANT " @foo" ,1 ,0 ,4 )];
200
- test " a && b" [T (CONSTANT " a" ,1 ,0 ,1 );T (FAMILY_AND " &&" ,1 ,0 ,4 );T (CONSTANT " b" ,1 ,0 ,6 )];
211
+ test " :name" [T (COLON ,1 ,0 ,0 ,1 ); T (NAME ,1 ,0 ,1 ,5 )];
212
+ test " @foo" [T (CONSTANT " @foo" ,1 ,0 ,0 ,4 )];
213
+ test " a && b" [T (CONSTANT " a" ,1 ,0 ,0 ,1 );T (FAMILY_AND " &&" ,1 ,0 ,2 ,4 );T (CONSTANT " b" ,1 ,0 ,5 ,6 )];
214
+
201
215
(* 01234567890123456789012345 *)
202
- test " i:" [T (IO_COLON 'i' , 1 , 0 , 2 )];
203
- test " o:" [T (IO_COLON 'o' , 1 , 0 , 2 )];
204
- test " i :" [T (IO 'i' , 1 , 0 , 1 ); T (COLON ,1 ,0 ,3 )];
205
- test " o :" [T (IO 'o' , 1 , 0 , 1 ); T (COLON ,1 ,0 ,3 )];
206
- test " i" [T (IO 'i' , 1 , 0 , 1 )];
207
- test " o" [T (IO 'o' , 1 , 0 , 1 )];
208
- test " func" [T (FUNC , 1 , 0 , 4 )];
216
+ test " i:" [T (IO_COLON 'i' , 1 , 0 , 0 , 2 )];
217
+ test " o:" [T (IO_COLON 'o' , 1 , 0 , 0 , 2 )];
218
+ test " i :" [T (IO 'i' , 1 , 0 , 0 , 1 ); T (COLON ,1 ,0 , 2 ,3 )];
219
+ test " o :" [T (IO 'o' , 1 , 0 , 0 , 1 ); T (COLON ,1 ,0 , 2 ,3 )];
220
+ test " i" [T (IO 'i' , 1 , 0 , 0 , 1 )];
221
+ test " o" [T (IO 'o' , 1 , 0 , 0 , 1 )];
222
+ test " func" [T (FUNC , 1 , 0 , 0 , 4 )];
0 commit comments