Lex numbers starting with dot
This commit is contained in:
parent
a550b4f96c
commit
efbecd67d9
@ -225,5 +225,14 @@ namespace Parser.Tests
|
|||||||
Assert.AreEqual(TokenKind.StringLiteral, tokens[0].Kind);
|
Assert.AreEqual(TokenKind.StringLiteral, tokens[0].Kind);
|
||||||
Assert.AreEqual("just a 'string'", tokens[0].PureToken.Value);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -150,6 +150,11 @@ namespace Lexer
|
|||||||
return c >= '0' && c <= '9';
|
return c >= '0' && c <= '9';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool IsDigitOrDot(char c)
|
||||||
|
{
|
||||||
|
return c == '.' || (c >= '0' && c <= '9');
|
||||||
|
}
|
||||||
|
|
||||||
private static bool IsWhitespace(char c)
|
private static bool IsWhitespace(char c)
|
||||||
{
|
{
|
||||||
return c == ' ' || c == '\t' || c == '\n';
|
return c == ' ' || c == '\t' || c == '\n';
|
||||||
@ -168,7 +173,7 @@ namespace Lexer
|
|||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case NumberParsingState.Start:
|
case NumberParsingState.Start:
|
||||||
if (IsDigit(c))
|
if (IsDigitOrDot(c))
|
||||||
{
|
{
|
||||||
state = NumberParsingState.DigitsBeforeDot;
|
state = NumberParsingState.DigitsBeforeDot;
|
||||||
}
|
}
|
||||||
@ -438,6 +443,15 @@ namespace Lexer
|
|||||||
|
|
||||||
return PureTokenFactory.CreatePunctuation(TokenKind.Assignment);
|
return PureTokenFactory.CreatePunctuation(TokenKind.Assignment);
|
||||||
case '.':
|
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();
|
Window.ConsumeChar();
|
||||||
var c = Window.PeekChar();
|
var c = Window.PeekChar();
|
||||||
switch (c)
|
switch (c)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user