32 lines
775 B
Plaintext
32 lines
775 B
Plaintext
use crate::syntax::{Expression, Name};
|
|
|
|
grammar;
|
|
|
|
pub Expression: Expression = {
|
|
"(" <params:Comma<Name>> ")" "{" <body:Expression> "}" => Expression::Lambda(params, Box::new(body)),
|
|
<callee:Expression> "(" <args:Comma<Expression>> ")" => Expression::Call(Box::new(callee), args),
|
|
Name => Expression::Variable(<>),
|
|
Integer => Expression::Integer(<>),
|
|
Boolean => Expression::Boolean(<>),
|
|
};
|
|
|
|
// TODO: decide on identifier syntax
|
|
Name: Name = r"[a-zA-Z_]+" => <>.to_string();
|
|
|
|
Integer: i64 = r"[0-9]+" => <>.parse::<i64>().unwrap();
|
|
|
|
Boolean: bool = {
|
|
"true" => true,
|
|
"false" => false,
|
|
}
|
|
|
|
Comma<T>: Vec<T> = {
|
|
<mut v:(<T> ",")*> <e:T?> => match e {
|
|
None => v,
|
|
Some(e) => {
|
|
v.push(e);
|
|
v
|
|
}
|
|
}
|
|
};
|