diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2021-09-23 22:52:03 +0200 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2021-09-23 22:52:03 +0200 |
commit | 425ba77074347f71283f75839224f78bd94f2e10 (patch) | |
tree | 7c0eb7fa5e5a95ee662e127c1ca05b9cd391faa5 /src/main.rs | |
parent | f3a1cd1a5523cdf4cda7925d32674ae969990a30 (diff) | |
download | llvm-kaleidoscope-rs-425ba77074347f71283f75839224f78bd94f2e10.tar.gz llvm-kaleidoscope-rs-425ba77074347f71283f75839224f78bd94f2e10.zip |
main: re-structure main repl loop
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 115 |
1 files changed, 51 insertions, 64 deletions
diff --git a/src/main.rs b/src/main.rs index be3dede..a5b57d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,58 +8,62 @@ use llvm_kaleidoscope_rs::{ use std::io::Read; -fn handle_definition<I>(p: &mut Parser<I>, module: &llvm::Module) +fn main_loop<I>(mut parser: Parser<I>) where I: Iterator<Item = char>, { - match p.parse_definition() { - Ok(func) => { - println!("Parse 'def'\n{:?}", func); - if let Ok(func) = Codegen::compile(module, Either::B(&func)) { - func.dump(); - } - } - Err(err) => { - eprintln!("Error: {:?}", err); - p.get_next_token(); - } - } -} + // Initialize LLVM module with its own context. + // We will emit LLVM IR into this module. + let module = llvm::Module::new(); -fn handle_extern<I>(p: &mut Parser<I>, module: &llvm::Module) -where - I: Iterator<Item = char>, -{ - match p.parse_extern() { - Ok(proto) => { - println!("Parse 'extern'\n{:?}", proto); - if let Ok(proto) = Codegen::compile(module, Either::A(&proto)) { - proto.dump(); + loop { + match parser.cur_tok() { + Token::Eof => break, + Token::Char(';') => { + // Ignore top-level semicolon. + parser.get_next_token(); } - } - Err(err) => { - eprintln!("Error: {:?}", err); - p.get_next_token(); - } + Token::Def => match parser.parse_definition() { + Ok(func) => { + println!("Parse 'def'\n{:?}", func); + if let Ok(func) = Codegen::compile(&module, Either::B(&func)) { + func.dump(); + } + } + Err(err) => { + eprintln!("Error: {:?}", err); + parser.get_next_token(); + } + }, + Token::Extern => match parser.parse_extern() { + Ok(proto) => { + println!("Parse 'extern'\n{:?}", proto); + if let Ok(proto) = Codegen::compile(&module, Either::A(&proto)) { + proto.dump(); + } + } + Err(err) => { + eprintln!("Error: {:?}", err); + parser.get_next_token(); + } + }, + _ => match parser.parse_top_level_expr() { + Ok(func) => { + println!("Parse top-level expression\n{:?}", func); + if let Ok(func) = Codegen::compile(&module, Either::B(&func)) { + func.dump(); + } + } + Err(err) => { + eprintln!("Error: {:?}", err); + parser.get_next_token(); + } + }, + }; } -} -fn handle_top_level_expression<I>(p: &mut Parser<I>, module: &llvm::Module) -where - I: Iterator<Item = char>, -{ - match p.parse_top_level_expr() { - Ok(func) => { - println!("Parse top-level expression\n{:?}", func); - if let Ok(func) = Codegen::compile(module, Either::B(&func)) { - func.dump(); - } - } - Err(err) => { - eprintln!("Error: {:?}", err); - p.get_next_token(); - } - } + // Dump all the emitted LLVM IR to stdout. + module.dump(); } fn main() { @@ -79,25 +83,8 @@ fn main() { // Throw first coin and initialize cur_tok. parser.get_next_token(); - // Initialize LLVM module with its own context. - // We will emit LLVM IR into this module. - let module = llvm::Module::new(); - - loop { - match *parser.cur_tok() { - Token::Eof => break, - Token::Char(';') => { - // Ignore top-level semicolon. - parser.get_next_token() - } - Token::Def => handle_definition(&mut parser, &module), - Token::Extern => handle_extern(&mut parser, &module), - _ => handle_top_level_expression(&mut parser, &module), - } - } - - // Dump all the emitted LLVM IR to stdout. - module.dump(); + main_loop(parser); + // De-allocate managed static LLVM data. llvm::shutdown(); } |