Skip to content

Commit 6547385

Browse files
orpuente-MSidavis
authored andcommitted
fix lexer bug and remove second from cooked lexer
1 parent 42f65a6 commit 6547385

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

compiler/qsc_qasm3/src/lex/cooked.rs

+23-26
Original file line numberDiff line numberDiff line change
@@ -461,14 +461,6 @@ impl<'a> Lexer<'a> {
461461
self.tokens.peek().map(|i| i.kind)
462462
}
463463

464-
/// Returns the second token ahead of the cursor without consuming it. This is slower
465-
/// than [`first`] and should be avoided when possible.
466-
fn second(&self) -> Option<raw::TokenKind> {
467-
let mut tokens = self.tokens.clone();
468-
tokens.next();
469-
tokens.next().map(|i| i.kind)
470-
}
471-
472464
/// Consumes the characters while they satisfy `f`. Returns the last character eaten, if any.
473465
fn eat_while(&mut self, mut f: impl FnMut(raw::TokenKind) -> bool) -> Option<raw::TokenKind> {
474466
let mut last_eaten: Option<raw::Token> = None;
@@ -554,26 +546,31 @@ impl<'a> Lexer<'a> {
554546
raw::TokenKind::Number(number) => {
555547
// after reading a decimal number or a float there could be a whitespace
556548
// followed by a fragment, which will change the type of the literal.
549+
let numeric_part_hi = self.offset();
557550
self.next_if_eq(raw::TokenKind::Whitespace);
558551

559-
match self.first() {
560-
Some(raw::TokenKind::LiteralFragment(fragment)) => {
561-
use self::Literal::{Imaginary, Timing};
562-
use TokenKind::Literal;
563-
564-
// Consume the fragment.
565-
self.next();
566-
567-
Ok(Some(match fragment {
568-
raw::LiteralFragmentKind::Imag => Literal(Imaginary),
569-
raw::LiteralFragmentKind::Dt => Literal(Timing(TimingLiteralKind::Dt)),
570-
raw::LiteralFragmentKind::Ns => Literal(Timing(TimingLiteralKind::Ns)),
571-
raw::LiteralFragmentKind::Us => Literal(Timing(TimingLiteralKind::Us)),
572-
raw::LiteralFragmentKind::Ms => Literal(Timing(TimingLiteralKind::Ms)),
573-
raw::LiteralFragmentKind::S => Literal(Timing(TimingLiteralKind::S)),
574-
}))
575-
}
576-
_ => Ok(Some(number.into())),
552+
if let Some(raw::TokenKind::LiteralFragment(fragment)) = self.first() {
553+
use self::Literal::{Imaginary, Timing};
554+
use TokenKind::Literal;
555+
556+
// Consume the fragment.
557+
self.next();
558+
559+
Ok(Some(match fragment {
560+
raw::LiteralFragmentKind::Imag => Literal(Imaginary),
561+
raw::LiteralFragmentKind::Dt => Literal(Timing(TimingLiteralKind::Dt)),
562+
raw::LiteralFragmentKind::Ns => Literal(Timing(TimingLiteralKind::Ns)),
563+
raw::LiteralFragmentKind::Us => Literal(Timing(TimingLiteralKind::Us)),
564+
raw::LiteralFragmentKind::Ms => Literal(Timing(TimingLiteralKind::Ms)),
565+
raw::LiteralFragmentKind::S => Literal(Timing(TimingLiteralKind::S)),
566+
}))
567+
} else {
568+
let kind: TokenKind = number.into();
569+
let span = Span {
570+
lo: token.offset,
571+
hi: numeric_part_hi,
572+
};
573+
return Ok(Some(Token { kind, span }));
577574
}
578575
}
579576
raw::TokenKind::Single(Single::Sharp) => {

compiler/qsc_qasm3/src/parser/expr/tests.rs

+11
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,17 @@ fn lit_float_imag_leading_zero() {
535535
check_expr("0.23im", &expect!["Expr [0-6]: Lit: Imaginary(0.23)"]);
536536
}
537537

538+
#[test]
539+
fn pratt_parsing_binary_expr() {
540+
check_expr(
541+
"1 + 2",
542+
&expect![[r#"
543+
Expr [0-5]: BinOp (Add):
544+
Expr [0-1]: Lit: Int(1)
545+
Expr [4-5]: Lit: Int(2)"#]],
546+
);
547+
}
548+
538549
#[test]
539550
fn pratt_parsing_mul_add() {
540551
check_expr(

0 commit comments

Comments
 (0)