Skip to content

Commit 159a0a7

Browse files
committed
Add support for ranges to Pearlite parser
1 parent 29b03a8 commit 159a0a7

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

pearlite-syn/src/term.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,34 @@ pub(crate) mod parsing {
971971
}
972972
}
973973
lhs = Term::Binary(TermBinary { left: Box::new(lhs), op, right: Box::new(rhs) });
974+
} else if Precedence::Range >= base && input.peek(Token![..]) {
975+
let limits: RangeLimits = input.parse()?;
976+
let rhs = if matches!(limits, RangeLimits::HalfOpen(_))
977+
&& (input.is_empty()
978+
|| input.peek(Token![,])
979+
|| input.peek(Token![;])
980+
|| input.peek(Token![.]) && !input.peek(Token![..])
981+
|| !allow_struct.0 && input.peek(token::Brace))
982+
{
983+
None
984+
} else {
985+
let mut rhs = unary_term(input, allow_struct)?;
986+
loop {
987+
let next = peek_precedence(input);
988+
if next > Precedence::Range {
989+
rhs = parse_term(input, rhs, allow_struct, next)?;
990+
} else {
991+
break;
992+
}
993+
}
994+
Some(rhs)
995+
};
996+
lhs = Term::Range(TermRange {
997+
// attrs: Vec::new(),
998+
from: Some(Box::new(lhs)),
999+
limits,
1000+
to: rhs.map(Box::new),
1001+
});
9741002
} else if Precedence::Cast >= base && input.peek(Token![as]) {
9751003
let as_token: Token![as] = input.parse()?;
9761004
let ty = input.call(Type::without_plus)?;

0 commit comments

Comments
 (0)