diff options
| author | Brian Anderson <[email protected]> | 2011-05-11 23:04:16 -0400 |
|---|---|---|
| committer | Brian Anderson <[email protected]> | 2011-05-11 23:04:16 -0400 |
| commit | a459bcd12722ee722176dff8782d50b9536067bc (patch) | |
| tree | 5223f42668991de283cfe99e5ee7ce9e93f20062 /src | |
| parent | rustc: Represent types as uints. Cuts typechecking down from 14s to 12s. (diff) | |
| download | rust-a459bcd12722ee722176dff8782d50b9536067bc.tar.xz rust-a459bcd12722ee722176dff8782d50b9536067bc.zip | |
Give the lexer a session so that it can fail more informatively
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/driver/rustc.rs | 2 | ||||
| -rw-r--r-- | src/comp/front/lexer.rs | 47 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 2 | ||||
| -rw-r--r-- | src/comp/pretty/pprust.rs | 5 |
4 files changed, 34 insertions, 22 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index 049e7428..1c9698bd 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -123,7 +123,7 @@ fn pretty_print_input(session.session sess, auto def = tup(ast.local_crate, 0); auto p = front.parser.new_parser(sess, env, def, input, 0u); auto crate = front.parser.parse_crate_from_source_file(p); - pretty.pprust.print_file(crate.node.module, input, std.IO.stdout()); + pretty.pprust.print_file(sess, crate.node.module, input, std.IO.stdout()); } fn version(str argv0) { diff --git a/src/comp/front/lexer.rs b/src/comp/front/lexer.rs index 2e5304e7..21fce55e 100644 --- a/src/comp/front/lexer.rs +++ b/src/comp/front/lexer.rs @@ -7,6 +7,7 @@ import std.Map.hashmap; import std.Option; import std.Option.some; import std.Option.none; +import driver.session.session; import util.common; import util.common.new_str_hash; @@ -24,11 +25,14 @@ state type reader = state obj { fn get_keywords() -> hashmap[str,token.token]; fn get_reserved() -> hashmap[str,()]; fn get_filemap() -> codemap.filemap; + fn err(str m); }; -fn new_reader(IO.reader rdr, str filename, codemap.filemap filemap) - -> reader { - state obj reader(str file, +fn new_reader(session sess, IO.reader rdr, str filename, + codemap.filemap filemap) -> reader { + + state obj reader(session sess, + str file, uint len, mutable uint pos, mutable char ch, @@ -98,10 +102,14 @@ fn new_reader(IO.reader rdr, str filename, codemap.filemap filemap) fn get_filemap() -> codemap.filemap { ret fm; } + + fn err(str m) { + sess.span_err(rec(lo=chpos, hi=chpos), m); + } } auto file = Str.unsafe_from_bytes(rdr.read_whole_stream()); let vec[str] strs = vec(); - auto rd = reader(file, Str.byte_len(file), 0u, -1 as char, + auto rd = reader(sess, file, Str.byte_len(file), 0u, -1 as char, filemap.start_pos, filemap.start_pos, strs, keyword_table(), reserved_word_table(), @@ -333,7 +341,7 @@ fn consume_block_comment(reader rdr) { } } if (rdr.is_eof()) { - log_err "unterminated block comment"; + rdr.err("unterminated block comment"); fail; } } @@ -371,7 +379,7 @@ fn scan_exponent(reader rdr) -> Option.t[str] { ret(some(res + exponent)); } else { - log_err ("scan_exponent: bad fp literal"); + rdr.err("scan_exponent: bad fp literal"); fail; } } @@ -550,7 +558,7 @@ fn scan_numeric_escape(reader rdr) -> char { case ('u') { n_hex_digits = 4; } case ('U') { n_hex_digits = 8; } case (?c) { - log_err #fmt("unknown numeric character escape: %d", c as int); + rdr.err(#fmt("unknown numeric character escape: %d", c as int)); fail; } } @@ -562,7 +570,7 @@ fn scan_numeric_escape(reader rdr) -> char { while (n_hex_digits != 0) { if (!is_hex_digit(n)) { - log_err #fmt("illegal numeric character escape: %d", n as int); + rdr.err(#fmt("illegal numeric character escape: %d", n as int)); fail; } accum_int *= 16; @@ -603,7 +611,7 @@ fn next_token(reader rdr) -> token.token { auto rsvd = rdr.get_reserved(); if (rsvd.contains_key(accum_str)) { - log_err #fmt("reserved keyword: %s", accum_str); + rdr.err(#fmt("reserved keyword: %s", accum_str)); fail; } @@ -726,8 +734,8 @@ fn next_token(reader rdr) -> token.token { case ('U') { c2 = scan_numeric_escape(rdr); } case (?c2) { - log_err #fmt("unknown character escape: %d", - c2 as int); + rdr.err(#fmt("unknown character escape: %d", + c2 as int)); fail; } } @@ -735,7 +743,7 @@ fn next_token(reader rdr) -> token.token { } if (rdr.next() != '\'') { - log_err "unterminated character constant"; + rdr.err("unterminated character constant"); fail; } rdr.bump(); // advance curr to closing ' @@ -786,8 +794,8 @@ fn next_token(reader rdr) -> token.token { } case (?c2) { - log_err #fmt("unknown string escape: %d", - c2 as int); + rdr.err(#fmt("unknown string escape: %d", + c2 as int)); fail; } } @@ -853,7 +861,7 @@ fn next_token(reader rdr) -> token.token { } case (?c) { - log_err #fmt("unkown start of token: %d", c as int); + rdr.err(#fmt("unkown start of token: %d", c as int)); fail; } } @@ -917,16 +925,19 @@ fn read_block_comment(reader rdr) -> cmnt { Str.push_char(val, rdr.curr()); rdr.bump(); } - if (rdr.is_eof()) {fail;} + if (rdr.is_eof()) { + rdr.err("Unexpected end of file in block comment"); + fail; + } } ret rec(val=cmnt_block(lines), pos=p, space_after=consume_whitespace(rdr) > 1u); } -fn gather_comments(str path) -> vec[cmnt] { +fn gather_comments(session sess, str path) -> vec[cmnt] { auto srdr = IO.file_reader(path); - auto rdr = new_reader(srdr, path, codemap.new_filemap(path, 0u)); + auto rdr = new_reader(sess, srdr, path, codemap.new_filemap(path, 0u)); let vec[cmnt] comments = vec(); while (!rdr.is_eof()) { while (true) { diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 33b74d8d..85b1dc7d 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -142,7 +142,7 @@ fn new_parser(session.session sess, auto srdr = IO.file_reader(path); auto filemap = codemap.new_filemap(path, pos); Vec.push[codemap.filemap](sess.get_codemap().files, filemap); - auto rdr = lexer.new_reader(srdr, path, filemap); + auto rdr = lexer.new_reader(sess, srdr, path, filemap); // Make sure npos points at first actual token. lexer.consume_any_whitespace(rdr); auto npos = rdr.get_chpos(); diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs index ceef6256..3c417eff 100644 --- a/src/comp/pretty/pprust.rs +++ b/src/comp/pretty/pprust.rs @@ -2,6 +2,7 @@ import std.Vec; import std.Str; import std.IO; import std.Option; +import driver.session.session; import front.ast; import front.lexer; import util.common; @@ -15,8 +16,8 @@ type ps = @rec(pp.ps s, Option.t[vec[lexer.cmnt]] comments, mutable uint cur_cmnt); -fn print_file(ast._mod _mod, str filename, IO.writer out) { - auto cmnts = lexer.gather_comments(filename); +fn print_file(session sess, ast._mod _mod, str filename, IO.writer out) { + auto cmnts = lexer.gather_comments(sess, filename); auto s = @rec(s=pp.mkstate(out, default_columns), comments=Option.some[vec[lexer.cmnt]](cmnts), mutable cur_cmnt=0u); |