diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3dedecd..8be2197 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -14,6 +14,9 @@ pub type ParseError = pest::error::Error; pub fn parse(source: &str) -> Result { let pairs = MistParser::parse(Rule::program, source)?; + + println!("Parsed pairs: {:#?}", pairs); + let mut statements = vec![]; // pairs is an iterator over the top-level program pair @@ -155,6 +158,10 @@ fn parse_statement(pair: Pair) -> Option { Rule::return_stmt => Some(Statement::Return(parse_return(pair))), Rule::if_stmt => Some(Statement::If(parse_if(pair))), Rule::for_stmt => Some(Statement::For(parse_for(pair))), + Rule::expression_stmt => { + let expr = pair.into_inner().next().unwrap(); + Some(Statement::Expression(parse_expression(expr))) + } Rule::expression => Some(Statement::Expression(parse_expression(pair))), _ => None, } diff --git a/test/src/main.ms b/test/src/main.ms index b8ebcb6..cf8f728 100644 --- a/test/src/main.ms +++ b/test/src/main.ms @@ -1,120 +1,5 @@ import "fmt"; -import "strings"; -// structs are plain data -struct Point { - x: float; - y: float; -} - -// classes have fields and methods -class Animal { - name: string; - age: int; - - fn speak() -> string { - return "..."; - } - - fn describe() -> string { - return "I am " + self.name; - } -} - -class Dog { - name: string; - age: int; - - fn speak() -> string { - return "Woof!"; - } - - fn fetch(item: string) -> string { - return self.name + " fetched the " + item; - } -} - -// basic function -fn add(a: int, b: int) -> int { - return a + b; -} - -// optional return type -fn find(name: string) -> string? { - if name == "mist" { - return name; - } - return null; -} - -// array types -fn sum(numbers: [int]) -> int { - let total: int = 0; - for n in numbers { - total = total + n; - } - return total; -} - -// multiple params, no return -fn greet(first: string, last: string) { - let full: string = first + " " + last; - print(full); -} - -// structs initialized with fields -fn make_point(x: float, y: float) -> Point { - return Point { - x: x, - y: y, - }; -} - -// if / else -fn classify(n: int) -> string { - if n < 0 { - return "negative"; - } else { - return "positive"; - } -} - -// entry point fn main() { - // variables - let x: int = 10; - let y: int = 20; - let result: int = add(x, y); - - // inferred (no type annotation) - let message = "Hello from Mist!"; - print(message); - - // struct usage - let p: Point = make_point(1.5, 2.5); - print(p.x); - - // class usage - let dog: Dog = Dog { - name: "Rex", - age: 3, - }; - print(dog.speak()); - print(dog.fetch("ball")); - - // arrays - let nums: [int] = [1, 2, 3, 4, 5]; - let total: int = sum(nums); - print(total); - - // for loop - for n in nums { - print(n); - } - - // optional - let found: string? = find("mist"); - if found { - print(found); - } -} + fmt.Println("Hello World!"); +} \ No newline at end of file