From a2ef54329244a08beef275356ff00a36db8f4c04 Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Wed, 4 Apr 2018 11:00:17 +0200 Subject: [PATCH] Parse double-quoted string literals --- Parser.Tests/MParserShould.cs | 12 ++++++++++++ Parser/MParser.cs | 5 +++++ Parser/SyntaxFactory.cs | 6 ++++++ Parser/SyntaxNode.cs | 17 +++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/Parser.Tests/MParserShould.cs b/Parser.Tests/MParserShould.cs index 21a8ac9..c820ffe 100644 --- a/Parser.Tests/MParserShould.cs +++ b/Parser.Tests/MParserShould.cs @@ -427,5 +427,17 @@ namespace Parser.Tests Assert.AreEqual("a", (e.Operand as IdentifierNameNode)?.Token.PureToken.LiteralText); Assert.AreEqual(text, actual.FullText); } + + [Test] + public void ParseDoubleQuotedStringLiteral() + { + var text = "\"some string\""; + var sut = CreateParser(text); + var actual = sut.ParseExpression(); + Assert.IsInstanceOf(actual); + var s = (DoubleQuotedStringLiteralNode) actual; + Assert.AreEqual("some string", s.Token.PureToken.Value); + Assert.AreEqual(text, actual.FullText); + } } } \ No newline at end of file diff --git a/Parser/MParser.cs b/Parser/MParser.cs index d06b867..4010122 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -456,6 +456,11 @@ namespace Parser var str = EatToken(); expression = Factory.StringLiteral(str); } + else if (token.Kind == TokenKind.DoubleQuotedStringLiteral) + { + var str = EatToken(); + expression = Factory.DoubleQuotedStringLiteral(str); + } else if (token.Kind == TokenKind.OpeningSquareBracket) // array literal expression { expression = ParseArrayLiteral(); diff --git a/Parser/SyntaxFactory.cs b/Parser/SyntaxFactory.cs index d026366..11b2721 100644 --- a/Parser/SyntaxFactory.cs +++ b/Parser/SyntaxFactory.cs @@ -245,6 +245,12 @@ namespace Parser return new StringLiteralNode(stringLiteral); } + public DoubleQuotedStringLiteralNode DoubleQuotedStringLiteral( + Token stringLiteral) + { + return new DoubleQuotedStringLiteralNode(stringLiteral); + } + public ExpressionStatementNode ExpressionStatement(ExpressionNode expression) { var children = new List {expression}; diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index d538cd7..97e0840 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -315,6 +315,23 @@ namespace Parser } + public class DoubleQuotedStringLiteralNode : ExpressionNode + { + public Token Token { get; } + + public DoubleQuotedStringLiteralNode(Token token) : base(null) + { + Token = token; + } + + public override string FullText => Token.FullText; + + public override IEnumerable ChildTokens + { + get { yield return Token; } + } + } + public class StatementNode : SyntaxNode { public TokenNode SemicolonOrComma { get; set; }