@@ -11,88 +11,95 @@ import util.common;
11
11
import util. common . new_str_hash ;
12
12
13
13
state type reader = state obj {
14
- fn is_eof( ) -> bool;
15
- fn curr ( ) -> char ;
16
- fn next ( ) -> char ;
17
- impure fn bump ( ) ;
18
- fn mark ( ) ;
19
- fn get_filename ( ) -> str ;
20
- fn get_mark_pos ( ) -> common . pos;
21
- fn get_curr_pos ( ) -> common . pos;
22
- fn get_keywords ( ) -> hashmap [ str, token. token ] ;
23
- fn get_reserved ( ) -> hashmap [ str, ( ) ] ;
14
+ fn is_eof( ) -> bool;
15
+ fn curr ( ) -> char ;
16
+ fn next ( ) -> char ;
17
+ impure fn init ( ) ;
18
+ impure fn bump ( ) ;
19
+ fn mark ( ) ;
20
+ fn get_filename ( ) -> str ;
21
+ fn get_mark_pos ( ) -> common . pos;
22
+ fn get_curr_pos ( ) -> common . pos;
23
+ fn get_keywords ( ) -> hashmap [ str, token. token ] ;
24
+ fn get_reserved ( ) -> hashmap [ str, ( ) ] ;
24
25
} ;
25
26
26
27
impure fn new_reader ( io. reader rdr, str filename) -> reader
27
28
{
28
- state obj reader( io . reader rdr ,
29
+ state obj reader( str file ,
29
30
str filename,
30
- mutable char c,
31
- mutable char n,
31
+ uint len,
32
+ mutable uint pos,
33
+ mutable char ch,
32
34
mutable uint mark_line,
33
35
mutable uint mark_col,
34
36
mutable uint line,
35
37
mutable uint col,
36
38
hashmap[ str, token. token ] keywords,
37
39
hashmap[ str, ( ) ] reserved) {
38
40
39
- fn is_eof ( ) -> bool {
40
- ret c == ( - 1 ) as char ;
41
- }
41
+ fn is_eof ( ) -> bool {
42
+ ret ch == - 1 as char ;
43
+ }
42
44
43
- fn get_curr_pos ( ) -> common . pos {
44
- ret rec ( line=line, col=col) ;
45
- }
45
+ fn get_curr_pos ( ) -> common . pos {
46
+ ret rec ( line=line, col=col) ;
47
+ }
46
48
47
- fn get_mark_pos ( ) -> common . pos {
48
- ret rec ( line=mark_line, col=mark_col) ;
49
- }
49
+ fn get_mark_pos ( ) -> common . pos {
50
+ ret rec ( line=mark_line, col=mark_col) ;
51
+ }
50
52
51
- fn get_filename ( ) -> str {
52
- ret filename;
53
- }
53
+ fn get_filename ( ) -> str {
54
+ ret filename;
55
+ }
54
56
55
- fn curr ( ) -> char {
56
- ret c ;
57
- }
57
+ fn curr ( ) -> char {
58
+ ret ch ;
59
+ }
58
60
59
- fn next ( ) -> char {
60
- ret n;
61
+ fn next ( ) -> char {
62
+ if ( pos < len) { ret _str. char_at ( file, pos) ; }
63
+ else { ret -1 as char ; }
64
+ }
65
+
66
+ impure fn init ( ) {
67
+ if ( pos < len) {
68
+ auto next = _str. char_range_at ( file, pos) ;
69
+ pos = next. _1 ;
70
+ ch = next. _0 ;
61
71
}
72
+ }
62
73
63
- impure fn bump ( ) {
64
-
65
- let char prev = c;
66
-
67
- c = n;
68
-
69
- if ( c == ( -1 ) as char ) {
70
- ret;
71
- }
72
-
73
- if ( prev == '\n' ) {
74
+ impure fn bump ( ) {
75
+ if ( pos < len) {
76
+ if ( ch == '\n' ) {
74
77
line += 1 u;
75
78
col = 0 u;
76
79
} else {
77
80
col += 1 u;
78
81
}
79
-
80
- n = rdr. read_char ( ) ;
82
+ auto next = _str. char_range_at ( file, pos) ;
83
+ pos = next. _1 ;
84
+ ch = next. _0 ;
85
+ } else {
86
+ ch = -1 as char ;
81
87
}
88
+ }
82
89
83
- fn mark ( ) {
84
- mark_line = line;
85
- mark_col = col;
86
- }
90
+ fn mark ( ) {
91
+ mark_line = line;
92
+ mark_col = col;
93
+ }
87
94
88
- fn get_keywords ( ) -> hashmap [ str, token. token ] {
89
- ret keywords;
90
- }
95
+ fn get_keywords ( ) -> hashmap [ str, token. token ] {
96
+ ret keywords;
97
+ }
91
98
92
- fn get_reserved ( ) -> hashmap [ str, ( ) ] {
93
- ret reserved;
94
- }
99
+ fn get_reserved ( ) -> hashmap [ str, ( ) ] {
100
+ ret reserved;
95
101
}
102
+ }
96
103
97
104
auto keywords = new_str_hash[ token. token ] ( ) ;
98
105
@@ -208,13 +215,14 @@ impure fn new_reader(io.reader rdr, str filename) -> reader
208
215
reserved. insert ( "m128" , ( ) ) ; // IEEE 754-2008 'decimal128'
209
216
reserved. insert ( "dec" , ( ) ) ; // One of m32, m64, m128
210
217
211
- ret reader( rdr, filename, rdr. read_char ( ) ,
212
- rdr. read_char ( ) , 1 u, 0 u, 1 u, 0 u, keywords, reserved) ;
218
+ auto file = _str. unsafe_from_bytes ( rdr. read_whole_stream ( ) ) ;
219
+ auto rd = reader ( file, filename, _str. byte_len ( file) , 0 u, -1 as char ,
220
+ 1 u, 0 u, 1 u, 0 u, keywords, reserved) ;
221
+ rd. init ( ) ;
222
+ ret rd;
213
223
}
214
224
215
225
216
-
217
-
218
226
fn in_range ( char c, char lo, char hi) -> bool {
219
227
ret lo <= c && c <= hi;
220
228
}
@@ -689,7 +697,6 @@ impure fn next_token(reader rdr) -> token.token {
689
697
690
698
case ( '"' ) {
691
699
rdr. bump ( ) ;
692
- // FIXME: general utf8-consumption support.
693
700
while ( rdr. curr ( ) != '"' ) {
694
701
alt ( rdr. curr ( ) ) {
695
702
case ( '\\' ) {
@@ -850,7 +857,7 @@ impure fn read_block_comment(reader rdr) -> cmnt {
850
857
851
858
impure fn gather_comments ( str path ) -> vec[ cmnt ] {
852
859
auto srdr = io. file_reader ( path) ;
853
- auto rdr = lexer . new_reader ( srdr, path) ;
860
+ auto rdr = new_reader ( srdr, path) ;
854
861
let vec[ cmnt] comments = vec ( ) ;
855
862
while ( !rdr. is_eof ( ) ) {
856
863
while ( true ) {
0 commit comments