1
+ #[ doc = "The main parser interface" ] ;
2
+
1
3
export parse_sess;
2
4
export next_node_id;
3
5
export new_parser_from_file;
@@ -22,63 +24,16 @@ type parse_sess = @{
22
24
mut byte_pos : uint
23
25
} ;
24
26
25
- fn next_node_id ( sess : parse_sess ) -> node_id {
26
- let rv = sess. next_id ;
27
- sess. next_id += 1 ;
28
- // ID 0 is reserved for the crate and doesn't actually exist in the AST
29
- assert rv != 0 ;
30
- ret rv;
31
- }
32
-
33
- fn new_parser_from_file ( sess : parse_sess , cfg : ast:: crate_cfg , path : str ,
34
- ftype : parser:: file_type ) ->
35
- parser {
36
- let src = alt io:: read_whole_file_str ( path) {
37
- result:: ok ( src) {
38
- // FIXME: This copy is unfortunate
39
- @src
40
- }
41
- result:: err ( e) {
42
- sess. span_diagnostic . handler ( ) . fatal ( e)
43
- }
44
- } ;
45
- let filemap = codemap:: new_filemap ( path, src,
46
- sess. chpos , sess. byte_pos ) ;
47
- sess. cm . files += [ filemap] ;
48
- let itr = @interner:: mk ( str:: hash, str:: eq) ;
49
- let rdr = lexer:: new_reader ( sess. span_diagnostic , filemap, itr) ;
50
- ret new_parser( sess, cfg, rdr, ftype) ;
51
- }
52
-
53
- fn new_parser_from_source_str ( sess : parse_sess , cfg : ast:: crate_cfg ,
54
- name : str , ss : codemap:: file_substr ,
55
- source : @str ) -> parser {
56
- let ftype = parser:: SOURCE_FILE ;
57
- let filemap = codemap:: new_filemap_w_substr
58
- ( name, ss, source, sess. chpos , sess. byte_pos ) ;
59
- sess. cm . files += [ filemap] ;
60
- let itr = @interner:: mk ( str:: hash, str:: eq) ;
61
- let rdr = lexer:: new_reader ( sess. span_diagnostic ,
62
- filemap, itr) ;
63
- ret new_parser( sess, cfg, rdr, ftype) ;
64
- }
65
-
66
- fn new_parser ( sess : parse_sess , cfg : ast:: crate_cfg , rdr : lexer:: reader ,
67
- ftype : parser:: file_type ) -> parser {
68
- let tok0 = lexer:: next_token ( rdr) ;
69
- let span0 = ast_util:: mk_sp ( tok0. chpos , rdr. chpos ) ;
70
- @{ sess: sess,
71
- cfg: cfg,
72
- file_type: ftype,
73
- mut token: tok0. tok ,
74
- mut span: span0,
75
- mut last_span: span0,
76
- mut buffer: [ ] ,
77
- mut restriction: parser:: UNRESTRICTED ,
78
- reader: rdr,
79
- binop_precs: prec:: binop_prec_table ( ) ,
80
- keywords: token:: keyword_table ( ) ,
81
- bad_expr_words: token:: bad_expr_word_table ( ) }
27
+ fn parse_crate_from_file ( input : str , cfg : ast:: crate_cfg , sess : parse_sess ) ->
28
+ @ast:: crate {
29
+ if str:: ends_with ( input, ".rc" ) {
30
+ parse_crate_from_crate_file ( input, cfg, sess)
31
+ } else if str:: ends_with ( input, ".rs" ) {
32
+ parse_crate_from_source_file ( input, cfg, sess)
33
+ } else {
34
+ sess. span_diagnostic . handler ( ) . fatal ( "unknown input file type: " +
35
+ input)
36
+ }
82
37
}
83
38
84
39
fn parse_crate_from_crate_file ( input : str , cfg : ast:: crate_cfg ,
@@ -109,18 +64,6 @@ fn parse_crate_from_crate_file(input: str, cfg: ast::crate_cfg,
109
64
config: p. cfg } ) ;
110
65
}
111
66
112
- fn parse_crate_from_file ( input : str , cfg : ast:: crate_cfg , sess : parse_sess ) ->
113
- @ast:: crate {
114
- if str:: ends_with ( input, ".rc" ) {
115
- parse_crate_from_crate_file ( input, cfg, sess)
116
- } else if str:: ends_with ( input, ".rs" ) {
117
- parse_crate_from_source_file ( input, cfg, sess)
118
- } else {
119
- sess. span_diagnostic . handler ( ) . fatal ( "unknown input file type: " +
120
- input)
121
- }
122
- }
123
-
124
67
fn parse_crate_from_source_file ( input : str , cfg : ast:: crate_cfg ,
125
68
sess : parse_sess ) -> @ast:: crate {
126
69
let p = new_parser_from_file ( sess, cfg, input, parser:: SOURCE_FILE ) ;
@@ -130,21 +73,21 @@ fn parse_crate_from_source_file(input: str, cfg: ast::crate_cfg,
130
73
ret r;
131
74
}
132
75
133
- fn parse_expr_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
134
- sess : parse_sess ) -> @ast:: expr {
76
+ fn parse_crate_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
77
+ sess : parse_sess ) -> @ast:: crate {
135
78
let p = new_parser_from_source_str (
136
79
sess, cfg, name, codemap:: fss_none, source) ;
137
- let r = parser:: parse_expr ( p ) ;
80
+ let r = parser:: parse_crate_mod ( p , cfg ) ;
138
81
sess. chpos = p. reader . chpos ;
139
82
sess. byte_pos = sess. byte_pos + p. reader . pos ;
140
83
ret r;
141
84
}
142
85
143
- fn parse_crate_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
144
- sess : parse_sess ) -> @ast:: crate {
86
+ fn parse_expr_from_source_str ( name : str , source : @str , cfg : ast:: crate_cfg ,
87
+ sess : parse_sess ) -> @ast:: expr {
145
88
let p = new_parser_from_source_str (
146
89
sess, cfg, name, codemap:: fss_none, source) ;
147
- let r = parser:: parse_crate_mod ( p , cfg ) ;
90
+ let r = parser:: parse_expr ( p ) ;
148
91
sess. chpos = p. reader . chpos ;
149
92
sess. byte_pos = sess. byte_pos + p. reader . pos ;
150
93
ret r;
@@ -165,3 +108,62 @@ fn parse_from_source_str<T>(f: fn (p: parser) -> T,
165
108
sess. byte_pos = sess. byte_pos + p. reader . pos ;
166
109
ret r;
167
110
}
111
+
112
+ fn next_node_id ( sess : parse_sess ) -> node_id {
113
+ let rv = sess. next_id ;
114
+ sess. next_id += 1 ;
115
+ // ID 0 is reserved for the crate and doesn't actually exist in the AST
116
+ assert rv != 0 ;
117
+ ret rv;
118
+ }
119
+
120
+ fn new_parser ( sess : parse_sess , cfg : ast:: crate_cfg , rdr : lexer:: reader ,
121
+ ftype : parser:: file_type ) -> parser {
122
+ let tok0 = lexer:: next_token ( rdr) ;
123
+ let span0 = ast_util:: mk_sp ( tok0. chpos , rdr. chpos ) ;
124
+ @{ sess: sess,
125
+ cfg: cfg,
126
+ file_type: ftype,
127
+ mut token: tok0. tok ,
128
+ mut span: span0,
129
+ mut last_span: span0,
130
+ mut buffer: [ ] ,
131
+ mut restriction: parser:: UNRESTRICTED ,
132
+ reader: rdr,
133
+ binop_precs: prec:: binop_prec_table ( ) ,
134
+ keywords: token:: keyword_table ( ) ,
135
+ bad_expr_words: token:: bad_expr_word_table ( ) }
136
+ }
137
+
138
+ fn new_parser_from_source_str ( sess : parse_sess , cfg : ast:: crate_cfg ,
139
+ name : str , ss : codemap:: file_substr ,
140
+ source : @str ) -> parser {
141
+ let ftype = parser:: SOURCE_FILE ;
142
+ let filemap = codemap:: new_filemap_w_substr
143
+ ( name, ss, source, sess. chpos , sess. byte_pos ) ;
144
+ sess. cm . files += [ filemap] ;
145
+ let itr = @interner:: mk ( str:: hash, str:: eq) ;
146
+ let rdr = lexer:: new_reader ( sess. span_diagnostic ,
147
+ filemap, itr) ;
148
+ ret new_parser( sess, cfg, rdr, ftype) ;
149
+ }
150
+
151
+ fn new_parser_from_file ( sess : parse_sess , cfg : ast:: crate_cfg , path : str ,
152
+ ftype : parser:: file_type ) ->
153
+ parser {
154
+ let src = alt io:: read_whole_file_str ( path) {
155
+ result:: ok ( src) {
156
+ // FIXME: This copy is unfortunate
157
+ @src
158
+ }
159
+ result:: err ( e) {
160
+ sess. span_diagnostic . handler ( ) . fatal ( e)
161
+ }
162
+ } ;
163
+ let filemap = codemap:: new_filemap ( path, src,
164
+ sess. chpos , sess. byte_pos ) ;
165
+ sess. cm . files += [ filemap] ;
166
+ let itr = @interner:: mk ( str:: hash, str:: eq) ;
167
+ let rdr = lexer:: new_reader ( sess. span_diagnostic , filemap, itr) ;
168
+ ret new_parser( sess, cfg, rdr, ftype) ;
169
+ }
0 commit comments