cl-parser: semantics changes
allow let in conditionals (restricts init of let to non-assignment) allow semicolons after items at file scope
This commit is contained in:
parent
124bb2f680
commit
6bb855cff7
@ -258,7 +258,8 @@ impl Parse<'_> for File {
|
|||||||
Ok(_) => true,
|
Ok(_) => true,
|
||||||
Err(e) => Err(e)?,
|
Err(e) => Err(e)?,
|
||||||
} {
|
} {
|
||||||
items.push(Item::parse(p)?)
|
items.push(Item::parse(p)?);
|
||||||
|
let _ = p.match_type(TokenKind::Semi, Parsing::File);
|
||||||
}
|
}
|
||||||
Ok(File { name: p.file.to_ref(), items })
|
Ok(File { name: p.file.to_ref(), items })
|
||||||
}
|
}
|
||||||
@ -929,7 +930,7 @@ impl Parse<'_> for Let {
|
|||||||
None
|
None
|
||||||
},
|
},
|
||||||
init: if p.match_type(TokenKind::Eq, Parsing::Let).is_ok() {
|
init: if p.match_type(TokenKind::Eq, Parsing::Let).is_ok() {
|
||||||
Some(p.parse()?)
|
Some(condition(p)?.into())
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
@ -1127,7 +1128,7 @@ fn pathpattern(p: &mut Parser<'_>) -> PResult<Pattern> {
|
|||||||
impl Parse<'_> for Pattern {
|
impl Parse<'_> for Pattern {
|
||||||
fn parse(p: &mut Parser<'_>) -> PResult<Self> {
|
fn parse(p: &mut Parser<'_>) -> PResult<Self> {
|
||||||
const P: Parsing = Parsing::Pattern;
|
const P: Parsing = Parsing::Pattern;
|
||||||
Ok(match p.peek_kind(P)? {
|
let head = match p.peek_kind(P)? {
|
||||||
// Name, Path, Struct, TupleStruct
|
// Name, Path, Struct, TupleStruct
|
||||||
TokenKind::Identifier => pathpattern(p)?,
|
TokenKind::Identifier => pathpattern(p)?,
|
||||||
// Literal
|
// Literal
|
||||||
@ -1173,7 +1174,19 @@ impl Parse<'_> for Pattern {
|
|||||||
let bad_expr = p.parse()?;
|
let bad_expr = p.parse()?;
|
||||||
Err(p.error(ErrorKind::InvalidPattern(bad_expr), P))?
|
Err(p.error(ErrorKind::InvalidPattern(bad_expr), P))?
|
||||||
}
|
}
|
||||||
})
|
};
|
||||||
|
|
||||||
|
match p.peek_kind(P) {
|
||||||
|
Ok(TokenKind::DotDot) => {
|
||||||
|
p.consume_peeked();
|
||||||
|
Ok(Pattern::RangeExc(head.into(), p.parse()?))
|
||||||
|
}
|
||||||
|
Ok(TokenKind::DotDotEq) => {
|
||||||
|
p.consume_peeked();
|
||||||
|
Ok(Pattern::RangeInc(head.into(), p.parse()?))
|
||||||
|
}
|
||||||
|
_ => Ok(head),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user