Run the parser in a separate task

This commit is contained in:
Patrick Walton 2012-05-04 11:08:52 -07:00
parent 3415a7e429
commit 39462a50a4
2 changed files with 25 additions and 1 deletions

View file

@ -1,3 +1,5 @@
import comm::{port, chan};
type parser = { type parser = {
mut lookahead: option<char_or_eof>, mut lookahead: option<char_or_eof>,
reader: io::reader reader: io::reader
@ -162,3 +164,20 @@ fn parser(reader: io::reader) -> parser {
ret { mut lookahead: none, reader: reader }; ret { mut lookahead: none, reader: reader };
} }
fn spawn_parser_task(filename: str) -> port<token> {
let result_port = port();
let result_chan = chan(result_port);
task::spawn_listener::<()> {|_child_port|
let file_data = io::read_whole_file(filename).get();
let reader = io::bytes_reader(file_data);
let parser = parser(reader);
loop {
let token = parser.parse();
result_chan.send(token);
if token == to_eof { break; }
}
};
ret result_port;
}

View file

@ -16,7 +16,12 @@ fn parse(filename: str) {
fn main(args: [str]) { fn main(args: [str]) {
if args.len() >= 2u { if args.len() >= 2u {
parse(args[1]); let p = html::spawn_parser_task(args[1]);
loop {
let token = p.recv();
io::println(#fmt("token: %?", token));
if token == html::to_eof { break; }
}
} }
// The platform event handler thread // The platform event handler thread