docs: def p_temp_formula(self, p):
          """temp_formula : temp_formula EQUIVALENCE temp_formula
                          | temp_formula IMPLIES temp_formula
                          | temp_formula OR temp_formula
                          | temp_formula AND temp_formula
                          | BOXLSEPARATOR path BOXRSEPARATOR temp_formula
                          | DIAMONDLSEPARATOR path DIAMONDRSEPARATOR temp_formula
                          | NOT temp_formula
                          | TT
                          | FF
                          | END
                          | LAST"""
          if len(p) == 2:
              if p[1] == Symbols.LOGICAL_TRUE.value:
                  p[0] = LDLfLogicalTrue()
              elif p[1] == Symbols.LOGICAL_FALSE.value:
                  p[0] = LDLfLogicalFalse()
              elif p[1] == Symbols.END.value:
                  p[0] = LDLfEnd()
              elif p[1] == Symbols.LAST.value:
                  p[0] = LDLfLast()
              else:
                  p[0] = LDLfDiamond(RegExpPropositional(p[1]), LDLfLogicalTrue())
          elif len(p) == 3:
              p[0] = LDLfNot(p[2])
          elif len(p) == 4:
              l, o, r = p[1:]
              if o == Symbols.EQUIVALENCE.value:
                  p[0] = LDLfEquivalence([l, r])
              elif o == Symbols.IMPLIES.value:
                  p[0] = LDLfImplies([l, r])
              elif o == Symbols.OR.value:
                  p[0] = LDLfOr([l, r])
              elif o == Symbols.AND.value:
                  p[0] = LDLfAnd([l, r])
              else:
                  raise ValueError
          elif len(p) == 5:
              if p[1] == Symbols.ALWAYS_BRACKET_LEFT.value:
                  p[0] = LDLfBox(p[2], p[4])
              elif p[1] == Symbols.EVENTUALLY_BRACKET_LEFT.value:
                  p[0] = LDLfDiamond(p[2], p[4])
              else:
                  raise ValueError
          else:
              raise ValueError