Skip to content

Commit 087b12a

Browse files
committed
syntax: Reorganize mod parse
1 parent 7fa7e56 commit 087b12a

File tree

1 file changed

+77
-75
lines changed

1 file changed

+77
-75
lines changed

src/librustsyntax/parse.rs

+77-75
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#[doc = "The main parser interface"];
2+
13
export parse_sess;
24
export next_node_id;
35
export new_parser_from_file;
@@ -22,63 +24,16 @@ type parse_sess = @{
2224
mut byte_pos: uint
2325
};
2426

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+
}
8237
}
8338

8439
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,
10964
config: p.cfg});
11065
}
11166

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-
12467
fn parse_crate_from_source_file(input: str, cfg: ast::crate_cfg,
12568
sess: parse_sess) -> @ast::crate {
12669
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,
13073
ret r;
13174
}
13275

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 {
13578
let p = new_parser_from_source_str(
13679
sess, cfg, name, codemap::fss_none, source);
137-
let r = parser::parse_expr(p);
80+
let r = parser::parse_crate_mod(p, cfg);
13881
sess.chpos = p.reader.chpos;
13982
sess.byte_pos = sess.byte_pos + p.reader.pos;
14083
ret r;
14184
}
14285

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 {
14588
let p = new_parser_from_source_str(
14689
sess, cfg, name, codemap::fss_none, source);
147-
let r = parser::parse_crate_mod(p, cfg);
90+
let r = parser::parse_expr(p);
14891
sess.chpos = p.reader.chpos;
14992
sess.byte_pos = sess.byte_pos + p.reader.pos;
15093
ret r;
@@ -165,3 +108,62 @@ fn parse_from_source_str<T>(f: fn (p: parser) -> T,
165108
sess.byte_pos = sess.byte_pos + p.reader.pos;
166109
ret r;
167110
}
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

Comments
 (0)