Add float lexing
This commit is contained in:
parent
ec312b3132
commit
39521fbb19
41
Tokenizer.cs
41
Tokenizer.cs
@ -376,7 +376,7 @@ class Tokenizer
|
|||||||
else if(char.IsDigit(ch))
|
else if(char.IsDigit(ch))
|
||||||
{
|
{
|
||||||
lastIndex = index;
|
lastIndex = index;
|
||||||
state = State.Number;
|
state = State.Integer;
|
||||||
currentToken = new(region: new(start: new(currentLocation), end: new(currentLocation)), type: TokenType.Numeral, data: new Token.NumeralData(new INumeral.Integer(ch - '0')));
|
currentToken = new(region: new(start: new(currentLocation), end: new(currentLocation)), type: TokenType.Numeral, data: new Token.NumeralData(new INumeral.Integer(ch - '0')));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -702,7 +702,11 @@ class Tokenizer
|
|||||||
}
|
}
|
||||||
else if(ch == '.')
|
else if(ch == '.')
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
state = State.Float;
|
||||||
|
currentToken!.type = null;
|
||||||
|
currentToken!.data = null;
|
||||||
|
AppendDataChar('0');
|
||||||
|
AppendDataChar('.');
|
||||||
}
|
}
|
||||||
else if(char.IsAsciiDigit(ch))
|
else if(char.IsAsciiDigit(ch))
|
||||||
{
|
{
|
||||||
@ -724,6 +728,31 @@ class Tokenizer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case State.Float:
|
||||||
|
{
|
||||||
|
if(char.IsAsciiDigit(ch))
|
||||||
|
{
|
||||||
|
lastIndex = index;
|
||||||
|
AppendDataChar(ch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(currentToken == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"Lexer error at {currentLocation}");
|
||||||
|
}
|
||||||
|
currentLocation = new(currentToken.region.end);
|
||||||
|
currentToken.type = TokenType.Numeral;
|
||||||
|
currentToken.data = new Token.NumeralData(new INumeral.Float(float.Parse(((Token.StringData)currentToken.data!).data)));
|
||||||
|
tokens.Add(currentToken);
|
||||||
|
currentToken = null;
|
||||||
|
index = lastIndex!.Value;
|
||||||
|
lastIndex = null;
|
||||||
|
state = State.Start;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case State.HexNumberX:
|
case State.HexNumberX:
|
||||||
{
|
{
|
||||||
if(char.IsAsciiHexDigit(ch))
|
if(char.IsAsciiHexDigit(ch))
|
||||||
@ -776,7 +805,7 @@ class Tokenizer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case State.Number:
|
case State.Integer:
|
||||||
{
|
{
|
||||||
if(ch == 'e')
|
if(ch == 'e')
|
||||||
{
|
{
|
||||||
@ -785,7 +814,9 @@ class Tokenizer
|
|||||||
}
|
}
|
||||||
else if(ch == '.')
|
else if(ch == '.')
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
currentToken!.type = null;
|
||||||
|
currentToken.data = new Token.StringData($"{((INumeral.Integer)((Token.NumeralData)currentToken!.data!).numeral).value}.");
|
||||||
|
state = State.Float;
|
||||||
}
|
}
|
||||||
else if(char.IsAsciiDigit(ch))
|
else if(char.IsAsciiDigit(ch))
|
||||||
{
|
{
|
||||||
@ -3610,7 +3641,7 @@ class Tokenizer
|
|||||||
private enum State
|
private enum State
|
||||||
{
|
{
|
||||||
Start,
|
Start,
|
||||||
Quote, SingleQuote, Name, Number, Zero,
|
Quote, SingleQuote, Name, Integer, Float, Zero,
|
||||||
A, B, D, E, F, G, I, L, N, O, R, T, U, W,
|
A, B, D, E, F, G, I, L, N, O, R, T, U, W,
|
||||||
Plus, Minus, Star, Slash, Percent, Caret, Hash,
|
Plus, Minus, Star, Slash, Percent, Caret, Hash,
|
||||||
Ampersand, Tilde, Pipe, Lt, Gt, Equals, RoundOpen, RoundClosed, CurlyOpen, CurlyClosed, SquareOpen, SquareClosed, StringStartLongBracket, StringWithLongBracket, StringEndLongBracket,
|
Ampersand, Tilde, Pipe, Lt, Gt, Equals, RoundOpen, RoundClosed, CurlyOpen, CurlyClosed, SquareOpen, SquareClosed, StringStartLongBracket, StringWithLongBracket, StringEndLongBracket,
|
||||||
|
5
test/simpleFloat.lua
Normal file
5
test/simpleFloat.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
0.000001
|
||||||
|
0.1
|
||||||
|
0.12345
|
||||||
|
1234566788.21212
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user