diff --git a/muppet/puppet/format/parser.py b/muppet/puppet/format/parser.py
index 872a1f5811577bb371faf45ae47a4dba0f2afc82..68c80f4c9e25206faf0cc2584a724c30dfec15b1 100644
--- a/muppet/puppet/format/parser.py
+++ b/muppet/puppet/format/parser.py
@@ -176,7 +176,7 @@ class rich_char(ParseDirective):
 
         match self.c:
             case '\\':
-                return parser.get(r'\\')
+                return parser.get(s(r'\\') | '\\')
             case '\n':
                 return parser.get(s('\n') | r'\n')
             case '\r':
@@ -195,7 +195,7 @@ class rich_char(ParseDirective):
                 # Literal linebreaks can apparently be escaped inside
                 # "rich" strings (thankfully not inside 'plain' strings).
                 try:
-                    return parser.get(s("\\\n") & self.c)
+                    return parser.get(s("\\\n") & many(space) & self.c)
                 except ParseError:
                     return parser.get(self.c)
 
@@ -560,6 +560,10 @@ class ParserFormatter(Serializer[ParseDirective]):
                 case _:
                     parser &= interpolated_form(self.s(fragment))
 
+        # Apparently can a heredoc end with an escaped literal
+        # newline...
+        parser &= optional(many(space) & '\\')
+
         parser &= heredoc_end
         return parser