public static string Parse(Afx.Lexer lexer) { char openingQuoteSign; char closingQuoteSign; var contents = new StringBuilder(); var willBeEscaped = false; if (lexer.IsSingleQuote() || lexer.IsDoubleQuote()) { openingQuoteSign = lexer.Consume(); } else { throw new AfxException("Unquoted String literal"); } while (true) { if (lexer.IsEnd()) { throw new AfxException($"Unfinished string literal \"{contents.ToString()}\""); } if (lexer.IsBackSlash() && !willBeEscaped) { willBeEscaped = true; lexer.Consume(); continue; } if (lexer.IsSingleQuote() || lexer.IsDoubleQuote()) { closingQuoteSign = lexer.Consume(); if (!willBeEscaped && openingQuoteSign == closingQuoteSign) { return(contents.ToString()); } contents.Append(closingQuoteSign); willBeEscaped = false; continue; } contents.Append(lexer.Consume()); willBeEscaped = false; } }