From 0c5f39e4161bb16ad28a53cd4f5919a24eb3288f Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Sun, 1 Apr 2018 15:04:09 +0200 Subject: [PATCH] Escape quotes in string literals --- Lexer/PureTokenFactory.cs | 7 ++++++- Parser/MParser.cs | 20 ++++++++++++++++++-- Parser/SyntaxFactory.cs | 15 +++++++++++---- Parser/SyntaxNode.cs | 6 +++++- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Lexer/PureTokenFactory.cs b/Lexer/PureTokenFactory.cs index a5461eb..a3a998e 100644 --- a/Lexer/PureTokenFactory.cs +++ b/Lexer/PureTokenFactory.cs @@ -76,9 +76,14 @@ return new PureToken(TokenKind.NumberLiteral, s, null, Window.Position); // TODO: actually parse number (here or in the lexer?) } + private string EscapeStringLiteral(string s) + { + return s.Replace("'", "''"); + } + public PureToken CreateStringLiteral(string s) { - return new PureToken(TokenKind.StringLiteral, "'" + s + "'", s, Window.Position); + return new PureToken(TokenKind.StringLiteral, "'" + EscapeStringLiteral(s) + "'", s, Window.Position); } public PureToken CreateDoubleQuotedStringLiteral(string s) diff --git a/Parser/MParser.cs b/Parser/MParser.cs index 9cf1137..0cc0e03 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -347,9 +347,14 @@ namespace Parser } } - nodes.Add(ParseExpression()); + var expression = ParseExpression(); + if (expression != null) + { + nodes.Add(expression); + } } + return Factory.ArrayElementList(nodes); } @@ -699,9 +704,20 @@ namespace Parser } var forAssignment = (AssignmentExpressionNode) expression; + var commas = new List(); + while (CurrentToken.Kind == TokenKind.Comma + || CurrentToken.Kind == TokenKind.Semicolon) + { + commas.Add(Factory.Token(EatToken())); + } + if (commas.Count == 0) + { + commas = null; + } + var body = ParseStatements(); var endKeyword = Factory.Token(EatIdentifier("end")); - return Factory.ForStatement(forKeyword, forAssignment, body, endKeyword); + return Factory.ForStatement(forKeyword, forAssignment, body, endKeyword, commas); } public StatementNode ParseStatementCore() diff --git a/Parser/SyntaxFactory.cs b/Parser/SyntaxFactory.cs index 1c80616..1d278ca 100644 --- a/Parser/SyntaxFactory.cs +++ b/Parser/SyntaxFactory.cs @@ -489,21 +489,28 @@ namespace Parser TokenNode forKeyword, AssignmentExpressionNode forAssignment, StatementListNode body, - TokenNode endKeyword) + TokenNode endKeyword, + List optionalCommasAfterAssignment) { var children = new List { forKeyword, forAssignment, - body, - endKeyword }; + if (optionalCommasAfterAssignment != null) + { + children.AddRange(optionalCommasAfterAssignment); + } + + children.Add(body); + children.Add(endKeyword); var result = new ForStatementNode( children, forKeyword, forAssignment, body, - endKeyword); + endKeyword, + optionalCommasAfterAssignment); SetParent(result); return result; } diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index 2ed31c1..1c2c69f 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -545,6 +545,7 @@ namespace Parser { public TokenNode ForKeyword { get; } public AssignmentExpressionNode ForAssignment { get; } + public List OptionalCommasAfterAssignment { get; } public StatementListNode Body { get; } public TokenNode EndKeyword { get; } @@ -553,12 +554,15 @@ namespace Parser TokenNode forKeyword, AssignmentExpressionNode forAssignment, StatementListNode body, - TokenNode endKeyword) : base(children) + TokenNode endKeyword, + List optionalCommasAfterAssignment + ) : base(children) { ForKeyword = forKeyword; ForAssignment = forAssignment; Body = body; EndKeyword = endKeyword; + OptionalCommasAfterAssignment = optionalCommasAfterAssignment; } }