Separate new lines trivia

This commit is contained in:
Alexander Luzgarev 2018-04-04 20:21:50 +02:00
parent b695f4961a
commit 4c2f37b000
7 changed files with 46 additions and 10 deletions

View File

@ -15,7 +15,7 @@ namespace Parser.Tests
[Test]
public void ParseSequenceOfIdentifiers()
{
var sut = CreateLexer("undefined is not a function");
var sut = CreateLexer("undefined is not\n a function");
var tokens = sut.ParseAll();
Assert.AreEqual(6, tokens.Count);
CollectionAssert.AreEqual(

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lexer
@ -7,6 +8,7 @@ namespace Lexer
{
private ITextWindow Window { get; }
private Token LastToken { get; set; }
private int TokensSinceNewLine { get; set; }
private PureTokenFactory PureTokenFactory { get; }
public MLexer(ITextWindow window, PureTokenFactory pureTokenFactory)
@ -67,16 +69,19 @@ namespace Lexer
break;
case '\r':
case '\n':
if (whiteSpaceCache.Length > 0)
{
triviaList.Add(new Trivia(TriviaType.Whitespace, whiteSpaceCache.ToString()));
}
whiteSpaceCache.Clear();
Window.ConsumeChar();
whiteSpaceCache.Append(character);
var whiteSpace = whiteSpaceCache.ToString();
triviaList.Add(new Trivia(TriviaType.Whitespace, whiteSpace));
triviaList.Add(new Trivia(TriviaType.NewLine, character.ToString()));
if (isTrailing)
{
return triviaList;
}
whiteSpaceCache.Clear();
break;
case '%':
if (whiteSpaceCache.Length > 0)
@ -595,6 +600,14 @@ namespace Lexer
var leadingTrivia = LexTrivia(false);
var token = LexTokenWithoutTrivia(leadingTrivia);
var trailingTrivia = LexTrivia(true);
if (trailingTrivia.Where(t => t.Type == TriviaType.NewLine).Any())
{
TokensSinceNewLine = 0;
}
else
{
TokensSinceNewLine++;
}
var result = new Token(token, leadingTrivia, trailingTrivia);
LastToken = result;

View File

@ -12,11 +12,13 @@
private static readonly string[] PureTokenOfKind =
{
null, // None = 0,
null, // Identifier = 1,
null, // NumberLiteral = 2,
null, // StringLiteral = 3,
null, // DoubleQuotedStringLiteral = 4,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, // EndOfFile = 1,
null, // Identifier = 2,
null, // NumberLiteral = 3,
null, // StringLiteral = 4,
null, // DoubleQuotedStringLiteral = 5,
null, // UnquotedStringLiteral = 6
null, null, null, null, null, null, null, null, null, null, null, null, null,
"=", // Assignment = 20,
"==", // Equality = 21,
"~=", // Inequality = 22,

View File

@ -8,6 +8,7 @@
NumberLiteral = 3,
StringLiteral = 4,
DoubleQuotedStringLiteral = 5,
UnquotedStringLiteral = 6,
Assignment = 20,
Equality = 21,

View File

@ -3,6 +3,7 @@
public enum TriviaType
{
Whitespace,
NewLine,
Comment
}
}

View File

@ -449,5 +449,6 @@ namespace Parser.Tests
Assert.IsInstanceOf<TryCatchStatementNode>(actual);
Assert.AreEqual(text, actual.FullText);
}
}
}

View File

@ -335,6 +335,24 @@ namespace Parser
}
}
public class UnquotedStringLiteralNode : ExpressionNode
{
public Token Token { get; }
public UnquotedStringLiteralNode(Token token) : base(null)
{
Token = token;
}
public override string FullText => Token.FullText;
public override IEnumerable<Token> ChildTokens
{
get { yield return Token; }
}
}
public class StatementNode : SyntaxNode
{
public TokenNode SemicolonOrComma { get; set; }