diff --git a/src/main.rs b/src/main.rs index 2548b55..6675a01 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,6 +48,7 @@ fn cmd_build(path: &str) { match parser::parse(&source) { Ok(ast) => { println!("parsed {} top-level items", ast.statements.len()); + println!("{:#?}", ast.statements) // codegen will go here } Err(e) => { diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3f20605..723005f 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -16,12 +16,24 @@ pub fn parse(source: &str) -> Result { let pairs = MistParser::parse(Rule::program, source)?; let mut statements = vec![]; + // pairs is an iterator over the top-level program pair + // we need to get its inner children for pair in pairs { match pair.as_rule() { - Rule::function_decl => statements.push(TopLevel::Function(parse_function(pair))), - Rule::struct_decl => statements.push(TopLevel::Struct(parse_struct(pair))), - Rule::class_decl => statements.push(TopLevel::Class(parse_class(pair))), - Rule::import_decl => statements.push(TopLevel::Import(parse_import(pair))), + Rule::program => { + for inner in pair.into_inner() { + match inner.as_rule() { + Rule::function_decl => { + statements.push(TopLevel::Function(parse_function(inner))) + } + Rule::struct_decl => statements.push(TopLevel::Struct(parse_struct(inner))), + Rule::class_decl => statements.push(TopLevel::Class(parse_class(inner))), + Rule::import_decl => statements.push(TopLevel::Import(parse_import(inner))), + Rule::EOI => {} + _ => {} + } + } + } Rule::EOI => {} _ => {} } diff --git a/test/main.ms b/test/main.ms index e69de29..8b154dd 100644 --- a/test/main.ms +++ b/test/main.ms @@ -0,0 +1,4 @@ +fn main() { + let message: string = "Hello, World!" + print(message) +}