mul/src/parser.lalrpop

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
}
}
};