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