Skip to content

Commit a459bcd

Browse files
committed
Give the lexer a session so that it can fail more informatively
1 parent 531515d commit a459bcd

File tree

4 files changed

+34
-22
lines changed

4 files changed

+34
-22
lines changed

src/comp/driver/rustc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ fn pretty_print_input(session.session sess,
123123
auto def = tup(ast.local_crate, 0);
124124
auto p = front.parser.new_parser(sess, env, def, input, 0u);
125125
auto crate = front.parser.parse_crate_from_source_file(p);
126-
pretty.pprust.print_file(crate.node.module, input, std.IO.stdout());
126+
pretty.pprust.print_file(sess, crate.node.module, input, std.IO.stdout());
127127
}
128128

129129
fn version(str argv0) {

src/comp/front/lexer.rs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import std.Map.hashmap;
77
import std.Option;
88
import std.Option.some;
99
import std.Option.none;
10+
import driver.session.session;
1011
import util.common;
1112
import util.common.new_str_hash;
1213

@@ -24,11 +25,14 @@ state type reader = state obj {
2425
fn get_keywords() -> hashmap[str,token.token];
2526
fn get_reserved() -> hashmap[str,()];
2627
fn get_filemap() -> codemap.filemap;
28+
fn err(str m);
2729
};
2830

29-
fn new_reader(IO.reader rdr, str filename, codemap.filemap filemap)
30-
-> reader {
31-
state obj reader(str file,
31+
fn new_reader(session sess, IO.reader rdr, str filename,
32+
codemap.filemap filemap) -> reader {
33+
34+
state obj reader(session sess,
35+
str file,
3236
uint len,
3337
mutable uint pos,
3438
mutable char ch,
@@ -98,10 +102,14 @@ fn new_reader(IO.reader rdr, str filename, codemap.filemap filemap)
98102
fn get_filemap() -> codemap.filemap {
99103
ret fm;
100104
}
105+
106+
fn err(str m) {
107+
sess.span_err(rec(lo=chpos, hi=chpos), m);
108+
}
101109
}
102110
auto file = Str.unsafe_from_bytes(rdr.read_whole_stream());
103111
let vec[str] strs = vec();
104-
auto rd = reader(file, Str.byte_len(file), 0u, -1 as char,
112+
auto rd = reader(sess, file, Str.byte_len(file), 0u, -1 as char,
105113
filemap.start_pos, filemap.start_pos,
106114
strs, keyword_table(),
107115
reserved_word_table(),
@@ -333,7 +341,7 @@ fn consume_block_comment(reader rdr) {
333341
}
334342
}
335343
if (rdr.is_eof()) {
336-
log_err "unterminated block comment";
344+
rdr.err("unterminated block comment");
337345
fail;
338346
}
339347
}
@@ -371,7 +379,7 @@ fn scan_exponent(reader rdr) -> Option.t[str] {
371379
ret(some(res + exponent));
372380
}
373381
else {
374-
log_err ("scan_exponent: bad fp literal");
382+
rdr.err("scan_exponent: bad fp literal");
375383
fail;
376384
}
377385
}
@@ -550,7 +558,7 @@ fn scan_numeric_escape(reader rdr) -> char {
550558
case ('u') { n_hex_digits = 4; }
551559
case ('U') { n_hex_digits = 8; }
552560
case (?c) {
553-
log_err #fmt("unknown numeric character escape: %d", c as int);
561+
rdr.err(#fmt("unknown numeric character escape: %d", c as int));
554562
fail;
555563
}
556564
}
@@ -562,7 +570,7 @@ fn scan_numeric_escape(reader rdr) -> char {
562570

563571
while (n_hex_digits != 0) {
564572
if (!is_hex_digit(n)) {
565-
log_err #fmt("illegal numeric character escape: %d", n as int);
573+
rdr.err(#fmt("illegal numeric character escape: %d", n as int));
566574
fail;
567575
}
568576
accum_int *= 16;
@@ -603,7 +611,7 @@ fn next_token(reader rdr) -> token.token {
603611

604612
auto rsvd = rdr.get_reserved();
605613
if (rsvd.contains_key(accum_str)) {
606-
log_err #fmt("reserved keyword: %s", accum_str);
614+
rdr.err(#fmt("reserved keyword: %s", accum_str));
607615
fail;
608616
}
609617

@@ -726,16 +734,16 @@ fn next_token(reader rdr) -> token.token {
726734
case ('U') { c2 = scan_numeric_escape(rdr); }
727735

728736
case (?c2) {
729-
log_err #fmt("unknown character escape: %d",
730-
c2 as int);
737+
rdr.err(#fmt("unknown character escape: %d",
738+
c2 as int));
731739
fail;
732740
}
733741
}
734742
rdr.bump();
735743
}
736744

737745
if (rdr.next() != '\'') {
738-
log_err "unterminated character constant";
746+
rdr.err("unterminated character constant");
739747
fail;
740748
}
741749
rdr.bump(); // advance curr to closing '
@@ -786,8 +794,8 @@ fn next_token(reader rdr) -> token.token {
786794
}
787795

788796
case (?c2) {
789-
log_err #fmt("unknown string escape: %d",
790-
c2 as int);
797+
rdr.err(#fmt("unknown string escape: %d",
798+
c2 as int));
791799
fail;
792800
}
793801
}
@@ -853,7 +861,7 @@ fn next_token(reader rdr) -> token.token {
853861
}
854862

855863
case (?c) {
856-
log_err #fmt("unkown start of token: %d", c as int);
864+
rdr.err(#fmt("unkown start of token: %d", c as int));
857865
fail;
858866
}
859867
}
@@ -917,16 +925,19 @@ fn read_block_comment(reader rdr) -> cmnt {
917925
Str.push_char(val, rdr.curr());
918926
rdr.bump();
919927
}
920-
if (rdr.is_eof()) {fail;}
928+
if (rdr.is_eof()) {
929+
rdr.err("Unexpected end of file in block comment");
930+
fail;
931+
}
921932
}
922933
ret rec(val=cmnt_block(lines),
923934
pos=p,
924935
space_after=consume_whitespace(rdr) > 1u);
925936
}
926937

927-
fn gather_comments(str path) -> vec[cmnt] {
938+
fn gather_comments(session sess, str path) -> vec[cmnt] {
928939
auto srdr = IO.file_reader(path);
929-
auto rdr = new_reader(srdr, path, codemap.new_filemap(path, 0u));
940+
auto rdr = new_reader(sess, srdr, path, codemap.new_filemap(path, 0u));
930941
let vec[cmnt] comments = vec();
931942
while (!rdr.is_eof()) {
932943
while (true) {

src/comp/front/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn new_parser(session.session sess,
142142
auto srdr = IO.file_reader(path);
143143
auto filemap = codemap.new_filemap(path, pos);
144144
Vec.push[codemap.filemap](sess.get_codemap().files, filemap);
145-
auto rdr = lexer.new_reader(srdr, path, filemap);
145+
auto rdr = lexer.new_reader(sess, srdr, path, filemap);
146146
// Make sure npos points at first actual token.
147147
lexer.consume_any_whitespace(rdr);
148148
auto npos = rdr.get_chpos();

src/comp/pretty/pprust.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import std.Vec;
22
import std.Str;
33
import std.IO;
44
import std.Option;
5+
import driver.session.session;
56
import front.ast;
67
import front.lexer;
78
import util.common;
@@ -15,8 +16,8 @@ type ps = @rec(pp.ps s,
1516
Option.t[vec[lexer.cmnt]] comments,
1617
mutable uint cur_cmnt);
1718

18-
fn print_file(ast._mod _mod, str filename, IO.writer out) {
19-
auto cmnts = lexer.gather_comments(filename);
19+
fn print_file(session sess, ast._mod _mod, str filename, IO.writer out) {
20+
auto cmnts = lexer.gather_comments(sess, filename);
2021
auto s = @rec(s=pp.mkstate(out, default_columns),
2122
comments=Option.some[vec[lexer.cmnt]](cmnts),
2223
mutable cur_cmnt=0u);

0 commit comments

Comments
 (0)