Escape quotes in string literals

This commit is contained in:
Alexander Luzgarev 2018-04-01 15:04:09 +02:00
parent 356b4d4eea
commit 0c5f39e416
4 changed files with 40 additions and 8 deletions

View File

@ -76,9 +76,14 @@
return new PureToken(TokenKind.NumberLiteral, s, null, Window.Position); // TODO: actually parse number (here or in the lexer?) 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) 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) public PureToken CreateDoubleQuotedStringLiteral(string s)

View File

@ -347,9 +347,14 @@ namespace Parser
} }
} }
nodes.Add(ParseExpression()); var expression = ParseExpression();
if (expression != null)
{
nodes.Add(expression);
}
} }
return Factory.ArrayElementList(nodes); return Factory.ArrayElementList(nodes);
} }
@ -699,9 +704,20 @@ namespace Parser
} }
var forAssignment = (AssignmentExpressionNode) expression; var forAssignment = (AssignmentExpressionNode) expression;
var commas = new List<TokenNode>();
while (CurrentToken.Kind == TokenKind.Comma
|| CurrentToken.Kind == TokenKind.Semicolon)
{
commas.Add(Factory.Token(EatToken()));
}
if (commas.Count == 0)
{
commas = null;
}
var body = ParseStatements(); var body = ParseStatements();
var endKeyword = Factory.Token(EatIdentifier("end")); var endKeyword = Factory.Token(EatIdentifier("end"));
return Factory.ForStatement(forKeyword, forAssignment, body, endKeyword); return Factory.ForStatement(forKeyword, forAssignment, body, endKeyword, commas);
} }
public StatementNode ParseStatementCore() public StatementNode ParseStatementCore()

View File

@ -489,21 +489,28 @@ namespace Parser
TokenNode forKeyword, TokenNode forKeyword,
AssignmentExpressionNode forAssignment, AssignmentExpressionNode forAssignment,
StatementListNode body, StatementListNode body,
TokenNode endKeyword) TokenNode endKeyword,
List<TokenNode> optionalCommasAfterAssignment)
{ {
var children = new List<SyntaxNode> var children = new List<SyntaxNode>
{ {
forKeyword, forKeyword,
forAssignment, forAssignment,
body,
endKeyword
}; };
if (optionalCommasAfterAssignment != null)
{
children.AddRange(optionalCommasAfterAssignment);
}
children.Add(body);
children.Add(endKeyword);
var result = new ForStatementNode( var result = new ForStatementNode(
children, children,
forKeyword, forKeyword,
forAssignment, forAssignment,
body, body,
endKeyword); endKeyword,
optionalCommasAfterAssignment);
SetParent(result); SetParent(result);
return result; return result;
} }

View File

@ -545,6 +545,7 @@ namespace Parser
{ {
public TokenNode ForKeyword { get; } public TokenNode ForKeyword { get; }
public AssignmentExpressionNode ForAssignment { get; } public AssignmentExpressionNode ForAssignment { get; }
public List<TokenNode> OptionalCommasAfterAssignment { get; }
public StatementListNode Body { get; } public StatementListNode Body { get; }
public TokenNode EndKeyword { get; } public TokenNode EndKeyword { get; }
@ -553,12 +554,15 @@ namespace Parser
TokenNode forKeyword, TokenNode forKeyword,
AssignmentExpressionNode forAssignment, AssignmentExpressionNode forAssignment,
StatementListNode body, StatementListNode body,
TokenNode endKeyword) : base(children) TokenNode endKeyword,
List<TokenNode> optionalCommasAfterAssignment
) : base(children)
{ {
ForKeyword = forKeyword; ForKeyword = forKeyword;
ForAssignment = forAssignment; ForAssignment = forAssignment;
Body = body; Body = body;
EndKeyword = endKeyword; EndKeyword = endKeyword;
OptionalCommasAfterAssignment = optionalCommasAfterAssignment;
} }
} }