Skip to content

Commit df94141

Browse files
committed
Handle associativity
1 parent 0dc7ae6 commit df94141

1 file changed

Lines changed: 65 additions & 72 deletions

File tree

src/annot.rs

Lines changed: 65 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -412,56 +412,55 @@ where
412412
}
413413

414414
fn parse_binop_1(&mut self) -> Result<FormulaOrTerm<T::Output>> {
415-
let lhs = self.parse_prefix()?;
415+
let mut formula_or_term = self.parse_prefix()?;
416416

417-
let formula_or_term = match self.look_ahead_token(0).map(|t| &t.kind) {
418-
Some(TokenKind::BinOp(BinOpToken::Star)) => {
419-
self.consume();
420-
let (lhs, _) = lhs
421-
.into_term()
422-
.ok_or_else(|| ParseAttrError::unexpected_formula("before * operator"))?;
423-
let (rhs, _) = self
424-
.parse_prefix()?
425-
.into_term()
426-
.ok_or_else(|| ParseAttrError::unexpected_formula("after * operator"))?;
427-
FormulaOrTerm::Term(lhs.mul(rhs), chc::Sort::int())
428-
}
429-
_ => return Ok(lhs),
430-
};
417+
while let Some(TokenKind::BinOp(BinOpToken::Star)) =
418+
self.look_ahead_token(0).map(|t| &t.kind)
419+
{
420+
self.consume();
421+
let (lhs, _) = formula_or_term
422+
.into_term()
423+
.ok_or_else(|| ParseAttrError::unexpected_formula("before * operator"))?;
424+
let (rhs, _) = self
425+
.parse_prefix()?
426+
.into_term()
427+
.ok_or_else(|| ParseAttrError::unexpected_formula("after * operator"))?;
428+
formula_or_term = FormulaOrTerm::Term(lhs.mul(rhs), chc::Sort::int())
429+
}
431430

432431
Ok(formula_or_term)
433432
}
434433

435434
fn parse_binop_2(&mut self) -> Result<FormulaOrTerm<T::Output>> {
436-
let lhs = self.parse_binop_1()?;
435+
let mut formula_or_term = self.parse_binop_1()?;
437436

438-
let formula_or_term = match self.look_ahead_token(0).map(|t| &t.kind) {
439-
Some(TokenKind::BinOp(BinOpToken::Plus)) => {
440-
self.consume();
441-
let (lhs, _) = lhs
442-
.into_term()
443-
.ok_or_else(|| ParseAttrError::unexpected_formula("before + operator"))?;
444-
let (rhs, _) = self
445-
.parse_binop_1()?
446-
.into_term()
447-
.ok_or_else(|| ParseAttrError::unexpected_formula("after + operator"))?;
448-
FormulaOrTerm::Term(lhs.add(rhs), chc::Sort::int())
449-
}
450-
Some(TokenKind::BinOp(BinOpToken::Minus)) => {
451-
self.consume();
452-
let (lhs, _) = lhs
453-
.into_term()
454-
.ok_or_else(|| ParseAttrError::unexpected_formula("before - operator"))?;
455-
let (rhs, _) = self
456-
.parse_binop_1()?
457-
.into_term()
458-
.ok_or_else(|| ParseAttrError::unexpected_formula("after - operator"))?;
459-
FormulaOrTerm::Term(lhs.sub(rhs), chc::Sort::int())
437+
loop {
438+
match self.look_ahead_token(0).map(|t| &t.kind) {
439+
Some(TokenKind::BinOp(BinOpToken::Plus)) => {
440+
self.consume();
441+
let (lhs, _) = formula_or_term
442+
.into_term()
443+
.ok_or_else(|| ParseAttrError::unexpected_formula("before + operator"))?;
444+
let (rhs, _) = self
445+
.parse_binop_1()?
446+
.into_term()
447+
.ok_or_else(|| ParseAttrError::unexpected_formula("after + operator"))?;
448+
formula_or_term = FormulaOrTerm::Term(lhs.add(rhs), chc::Sort::int())
449+
}
450+
Some(TokenKind::BinOp(BinOpToken::Minus)) => {
451+
self.consume();
452+
let (lhs, _) = formula_or_term
453+
.into_term()
454+
.ok_or_else(|| ParseAttrError::unexpected_formula("before - operator"))?;
455+
let (rhs, _) = self
456+
.parse_binop_1()?
457+
.into_term()
458+
.ok_or_else(|| ParseAttrError::unexpected_formula("after - operator"))?;
459+
formula_or_term = FormulaOrTerm::Term(lhs.sub(rhs), chc::Sort::int())
460+
}
461+
_ => return Ok(formula_or_term),
460462
}
461-
_ => return Ok(lhs),
462-
};
463-
464-
Ok(formula_or_term)
463+
}
465464
}
466465

467466
fn parse_binop_3(&mut self) -> Result<FormulaOrTerm<T::Output>> {
@@ -541,43 +540,37 @@ where
541540
}
542541

543542
fn parse_binop_4(&mut self) -> Result<FormulaOrTerm<T::Output>> {
544-
let lhs = self.parse_binop_3()?;
543+
let mut formula_or_term = self.parse_binop_3()?;
545544

546-
let formula_or_term = match self.look_ahead_token(0).map(|t| &t.kind) {
547-
Some(TokenKind::AndAnd) => {
548-
self.consume();
549-
let lhs = lhs
550-
.into_formula()
551-
.ok_or_else(|| ParseAttrError::unexpected_term("before && operator"))?;
552-
let rhs = self
553-
.parse_binop_3()?
554-
.into_formula()
555-
.ok_or_else(|| ParseAttrError::unexpected_term("after && operator"))?;
556-
FormulaOrTerm::Formula(lhs.and(rhs))
557-
}
558-
_ => return Ok(lhs),
559-
};
545+
while let Some(TokenKind::AndAnd) = self.look_ahead_token(0).map(|t| &t.kind) {
546+
self.consume();
547+
let lhs = formula_or_term
548+
.into_formula()
549+
.ok_or_else(|| ParseAttrError::unexpected_term("before && operator"))?;
550+
let rhs = self
551+
.parse_binop_3()?
552+
.into_formula()
553+
.ok_or_else(|| ParseAttrError::unexpected_term("after && operator"))?;
554+
formula_or_term = FormulaOrTerm::Formula(lhs.and(rhs))
555+
}
560556

561557
Ok(formula_or_term)
562558
}
563559

564560
fn parse_binop_5(&mut self) -> Result<FormulaOrTerm<T::Output>> {
565-
let lhs = self.parse_binop_4()?;
561+
let mut formula_or_term = self.parse_binop_4()?;
566562

567-
let formula_or_term = match self.look_ahead_token(0).map(|t| &t.kind) {
568-
Some(TokenKind::OrOr) => {
569-
self.consume();
570-
let lhs = lhs
571-
.into_formula()
572-
.ok_or_else(|| ParseAttrError::unexpected_term("before || operator"))?;
573-
let rhs = self
574-
.parse_binop_4()?
575-
.into_formula()
576-
.ok_or_else(|| ParseAttrError::unexpected_term("after || operator"))?;
577-
FormulaOrTerm::Formula(lhs.or(rhs))
578-
}
579-
_ => return Ok(lhs),
580-
};
563+
while let Some(TokenKind::OrOr) = self.look_ahead_token(0).map(|t| &t.kind) {
564+
self.consume();
565+
let lhs = formula_or_term
566+
.into_formula()
567+
.ok_or_else(|| ParseAttrError::unexpected_term("before || operator"))?;
568+
let rhs = self
569+
.parse_binop_4()?
570+
.into_formula()
571+
.ok_or_else(|| ParseAttrError::unexpected_term("after || operator"))?;
572+
formula_or_term = FormulaOrTerm::Formula(lhs.or(rhs))
573+
}
581574

582575
Ok(formula_or_term)
583576
}

0 commit comments

Comments
 (0)