For expression stuff
This commit is contained in:
parent
9c0f60b6ce
commit
0a471ed71c
@ -267,8 +267,9 @@ pub enum PatternLiteral {
|
||||
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
pub struct Enumerator {
|
||||
pub id: Rc<String>, //TODO rename this field
|
||||
pub identifier: Rc<String>,
|
||||
pub generator: Expression,
|
||||
pub assignment: bool, //true if `=`, false if `<-`
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
|
@ -791,12 +791,13 @@ fn for_expr(input: Span) -> ParseResult<ExpressionKind> {
|
||||
fn enumerator(input: Span) -> ParseResult<Enumerator> {
|
||||
alt((
|
||||
map(separated_pair(identifier, kw("<-"), expression_no_struct), |(ident, generator)| {
|
||||
Enumerator { id: rc_string(ident.fragment()), generator }
|
||||
Enumerator { identifier: rc_string(ident.fragment()), generator, assignment: false }
|
||||
}),
|
||||
//TODO distinguish these two cases in AST
|
||||
map(separated_pair(identifier, kw("="), expression_no_struct), |(ident, generator)| Enumerator {
|
||||
id: rc_string(ident.fragment()),
|
||||
identifier: rc_string(ident.fragment()),
|
||||
generator,
|
||||
assignment: true,
|
||||
}),
|
||||
))(input)
|
||||
}
|
||||
|
@ -298,11 +298,11 @@ peg::parser! {
|
||||
//TODO add guards, etc.
|
||||
rule enumerator(parser: &mut Parser) -> Enumerator =
|
||||
ident:identifier() _ "<-" _ generator:expression_no_struct(parser) {
|
||||
Enumerator { id: Rc::new(ident.to_string()), generator }
|
||||
Enumerator { identifier: Rc::new(ident.to_string()), generator, assignment: false }
|
||||
} /
|
||||
//TODO need to distinguish these two cases in AST
|
||||
ident:identifier() _ "=" _ generator:expression_no_struct(parser) {
|
||||
Enumerator { id: Rc::new(ident.to_string()), generator }
|
||||
Enumerator { identifier: Rc::new(ident.to_string()), generator, assignment: true }
|
||||
}
|
||||
|
||||
rule for_body(parser: &mut Parser) -> Box<ForBody> =
|
||||
|
@ -405,7 +405,11 @@ fn for_expression() {
|
||||
assert_expr!(
|
||||
"for { a <- garodzny::maybeValue } return 1",
|
||||
expr(ForExpression {
|
||||
enumerators: vec![Enumerator { id: rc("a"), generator: expr(Value(qn!(garodzny, maybeValue))) }],
|
||||
enumerators: vec![Enumerator {
|
||||
identifier: rc("a"),
|
||||
assignment: false,
|
||||
generator: expr(Value(qn!(garodzny, maybeValue)))
|
||||
}],
|
||||
body: bx(ForBody::MonadicReturn(expr(NatLiteral(1))))
|
||||
})
|
||||
);
|
||||
@ -413,7 +417,11 @@ fn for_expression() {
|
||||
assert_expr!(
|
||||
"for n <- someRange { f(n) ; }",
|
||||
expr(ForExpression {
|
||||
enumerators: vec![Enumerator { id: rc("n"), generator: expr(Value(qn!(someRange))) }],
|
||||
enumerators: vec![Enumerator {
|
||||
identifier: rc("n"),
|
||||
assignment: false,
|
||||
generator: expr(Value(qn!(someRange)))
|
||||
}],
|
||||
body: bx(ForBody::StatementBlock(
|
||||
vec![stmt(StatementKind::Expression(expr(Call {
|
||||
f: bx(expr(Value(qn!(f)))),
|
||||
|
Loading…
Reference in New Issue
Block a user