From 7f7167365f7d1c936ef1eb6fd4f38b965e3d4430 Mon Sep 17 00:00:00 2001 From: Katja Goltsova <katja.goltsova@protonmail.com> Date: Fri, 30 Sep 2022 15:41:14 +0200 Subject: [PATCH] Add spaces as appropriate when printing a formula --- .../src/main/scala/lisa/utils/Parser.scala | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/lisa-utils/src/main/scala/lisa/utils/Parser.scala b/lisa-utils/src/main/scala/lisa/utils/Parser.scala index e9cb3d67..4c82176b 100644 --- a/lisa-utils/src/main/scala/lisa/utils/Parser.scala +++ b/lisa-utils/src/main/scala/lisa/utils/Parser.scala @@ -36,26 +36,28 @@ object Parser { def printTerm(t: Term): String = SequentParser.printTerm(t).get - private[Parser] sealed abstract class FormulaToken - case object ForallToken extends FormulaToken - case object ExistsOneToken extends FormulaToken - case object ExistsToken extends FormulaToken - case object DotToken extends FormulaToken - case object AndToken extends FormulaToken - case object OrToken extends FormulaToken - case object ImpliesToken extends FormulaToken - case object IffToken extends FormulaToken - case object NegationToken extends FormulaToken - case object EqualityToken extends FormulaToken + private[Parser] sealed abstract class FormulaToken(stringRepr: String) { + override def toString: String = stringRepr + } + case object ForallToken extends FormulaToken(Forall.id) + case object ExistsOneToken extends FormulaToken(ExistsOne.id) + case object ExistsToken extends FormulaToken(Exists.id) + case object DotToken extends FormulaToken(".") + case object AndToken extends FormulaToken(And.id) + case object OrToken extends FormulaToken(Or.id) + case object ImpliesToken extends FormulaToken(Implies.id) + case object IffToken extends FormulaToken(Iff.id) + case object NegationToken extends FormulaToken(Neg.id) + case object EqualityToken extends FormulaToken(equality.id) // Constant functions and predicates - case class ConstantToken(id: String) extends FormulaToken + case class ConstantToken(id: String) extends FormulaToken(id) // Variables, schematic functions and predicates - case class SchematicToken(id: String) extends FormulaToken - case class ParenthesisToken(isOpen: Boolean) extends FormulaToken - case object CommaToken extends FormulaToken - case object SemicolonToken extends FormulaToken - case object SequentToken extends FormulaToken - case object SpaceToken extends FormulaToken + case class SchematicToken(id: String) extends FormulaToken("?" + id) + case class ParenthesisToken(isOpen: Boolean) extends FormulaToken(if (isOpen) "(" else ")") + case object CommaToken extends FormulaToken(",") + case object SemicolonToken extends FormulaToken(";") + case object SequentToken extends FormulaToken("⊢") + case object SpaceToken extends FormulaToken(" ") private[Parser] object SequentLexer extends Lexers with CharLexers { type Token = FormulaToken @@ -93,26 +95,24 @@ object Parser { lexer(source).filter(_ != SpaceToken) } - // TODO: add spaces as needed - def unapply(tokens: Iterator[Token]): String = tokens.map { - case ForallToken => Forall.id - case ExistsOneToken => ExistsOne.id - case ExistsToken => Exists.id - case DotToken => "." - case AndToken => And.id - case OrToken => Or.id - case ImpliesToken => Implies.id - case IffToken => Iff.id - case NegationToken => Neg.id - case EqualityToken => equality.id - case ConstantToken(id) => id - case SchematicToken(id) => "?" + id - case ParenthesisToken(isOpen) => if (isOpen) "(" else ")" - case CommaToken => "," - case SemicolonToken => ";" - case SequentToken => "⊢" - case SpaceToken => " " - }.mkString + def unapply(tokens: Iterator[Token]): String = { + val space = " " + tokens + .foldLeft(Nil: List[String]) { + // Sequent token is the only separator that can have an empty left side; in this case, omit the space before + case (Nil, SequentToken) => SequentToken.toString :: space :: Nil + case (l, t) => + t match { + // do not require spaces + case NegationToken | ConstantToken(_) | SchematicToken(_) | ParenthesisToken(_) | SpaceToken => l :+ t.toString + // space after: quantifiers and separators + case ForallToken | ExistsToken | ExistsOneToken | DotToken | CommaToken | SemicolonToken => l :+ t.toString :+ space + // space before and after: equality, connectors, sequent symbol + case EqualityToken | AndToken | OrToken | ImpliesToken | IffToken | SequentToken => l :+ space :+ t.toString :+ space + } + } + .mkString + } } private[Parser] object SequentParser extends Parsers { -- GitLab