Lex numbers starting with dot

This commit is contained in:
Alexander Luzgarev 2018-04-01 19:02:21 +02:00
parent a550b4f96c
commit efbecd67d9
2 changed files with 24 additions and 1 deletions

View File

@ -225,5 +225,14 @@ namespace Parser.Tests
Assert.AreEqual(TokenKind.StringLiteral, tokens[0].Kind);
Assert.AreEqual("just a 'string'", tokens[0].PureToken.Value);
}
[Test]
public void ParseNumberStartingWithDot()
{
var sut = CreateLexer(".42");
var tokens = sut.ParseAll();
Assert.AreEqual(2, tokens.Count);
Assert.AreEqual(TokenKind.NumberLiteral, tokens[0].Kind);
}
}
}

View File

@ -150,6 +150,11 @@ namespace Lexer
return c >= '0' && c <= '9';
}
private static bool IsDigitOrDot(char c)
{
return c == '.' || (c >= '0' && c <= '9');
}
private static bool IsWhitespace(char c)
{
return c == ' ' || c == '\t' || c == '\n';
@ -168,7 +173,7 @@ namespace Lexer
switch (state)
{
case NumberParsingState.Start:
if (IsDigit(c))
if (IsDigitOrDot(c))
{
state = NumberParsingState.DigitsBeforeDot;
}
@ -438,6 +443,15 @@ namespace Lexer
return PureTokenFactory.CreatePunctuation(TokenKind.Assignment);
case '.':
if (IsDigit(Window.PeekChar(1)))
{
var possiblyNumberToken2 = ContinueParsingNumber();
if (possiblyNumberToken2 == null)
{
throw new ParsingException($"Unexpected character \"{Window.PeekChar()}\" while parsing a number");
}
return (PureToken)possiblyNumberToken2;
}
Window.ConsumeChar();
var c = Window.PeekChar();
switch (c)