Fixed expr statements
This commit is contained in:
@@ -14,6 +14,9 @@ pub type ParseError = pest::error::Error<Rule>;
|
|||||||
|
|
||||||
pub fn parse(source: &str) -> Result<Program, ParseError> {
|
pub fn parse(source: &str) -> Result<Program, ParseError> {
|
||||||
let pairs = MistParser::parse(Rule::program, source)?;
|
let pairs = MistParser::parse(Rule::program, source)?;
|
||||||
|
|
||||||
|
println!("Parsed pairs: {:#?}", pairs);
|
||||||
|
|
||||||
let mut statements = vec![];
|
let mut statements = vec![];
|
||||||
|
|
||||||
// pairs is an iterator over the top-level program pair
|
// pairs is an iterator over the top-level program pair
|
||||||
@@ -155,6 +158,10 @@ fn parse_statement(pair: Pair<Rule>) -> Option<Statement> {
|
|||||||
Rule::return_stmt => Some(Statement::Return(parse_return(pair))),
|
Rule::return_stmt => Some(Statement::Return(parse_return(pair))),
|
||||||
Rule::if_stmt => Some(Statement::If(parse_if(pair))),
|
Rule::if_stmt => Some(Statement::If(parse_if(pair))),
|
||||||
Rule::for_stmt => Some(Statement::For(parse_for(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))),
|
Rule::expression => Some(Statement::Expression(parse_expression(pair))),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-116
@@ -1,120 +1,5 @@
|
|||||||
import "fmt";
|
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() {
|
fn main() {
|
||||||
// variables
|
fmt.Println("Hello World!");
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user