Start work on binary expressions

This commit is contained in:
nub31
2025-01-26 22:51:56 +01:00
parent 880c85d296
commit c20981e4cb
3 changed files with 66 additions and 6 deletions

View File

@@ -11,6 +11,14 @@ public class Lexer
["let"] = Symbol.Let, ["let"] = Symbol.Let,
}; };
private static readonly Dictionary<char[], Symbol> Chians = new()
{
[['=', '=']] = Symbol.Equal,
[['!', '=']] = Symbol.NotEqual,
[['<', '=']] = Symbol.LessThanOrEqual,
[['>', '=']] = Symbol.GreaterThanOrEqual,
};
private static readonly Dictionary<char, Symbol> Chars = new() private static readonly Dictionary<char, Symbol> Chars = new()
{ {
[';'] = Symbol.Semicolon, [';'] = Symbol.Semicolon,
@@ -26,6 +34,11 @@ public class Lexer
['='] = Symbol.Assign, ['='] = Symbol.Assign,
['<'] = Symbol.LessThan, ['<'] = Symbol.LessThan,
['>'] = Symbol.GreaterThan, ['>'] = Symbol.GreaterThan,
['+'] = Symbol.Plus,
['-'] = Symbol.Minus,
['*'] = Symbol.Star,
['/'] = Symbol.ForwardSlash,
['!'] = Symbol.Bang,
}; };
private readonly string _src; private readonly string _src;
@@ -84,6 +97,22 @@ public class Lexer
return new LiteralToken(new PrimitiveType(PrimitiveTypeKind.Int64), buffer); return new LiteralToken(new PrimitiveType(PrimitiveTypeKind.Int64), buffer);
} }
foreach (var chain in Chians)
{
if (current.Value != chain.Key[0]) continue;
for (var i = 1; i < chain.Key.Length; i++)
{
var c = Peek(i);
if (!c.HasValue || c.Value != chain.Key[i]) break;
if (i == chain.Key.Length - 1)
{
return new SymbolToken(chain.Value);
}
}
}
if (Chars.TryGetValue(current.Value, out var charSymbol)) if (Chars.TryGetValue(current.Value, out var charSymbol))
{ {
Next(); Next();
@@ -116,11 +145,11 @@ public class Lexer
throw new Exception($"Unknown character {current.Value}"); throw new Exception($"Unknown character {current.Value}");
} }
private Optional<char> Peek() private Optional<char> Peek(int offset = 0)
{ {
if (_index < _src.Length) if (_index + offset < _src.Length)
{ {
return _src[_index]; return _src[_index + offset];
} }
return Optional<char>.Empty(); return Optional<char>.Empty();

View File

@@ -19,9 +19,18 @@ public enum Symbol
CloseBrace, CloseBrace,
OpenBracket, OpenBracket,
CloseBracket, CloseBracket,
LessThan,
GreaterThan,
Comma, Comma,
Period, Period,
Assign Assign,
Equal,
Bang,
NotEqual,
LessThan,
LessThanOrEqual,
GreaterThan,
GreaterThanOrEqual,
Plus,
Minus,
Star,
ForwardSlash,
} }

View File

@@ -0,0 +1,22 @@
namespace Nub.Lang.Parsing;
public class BinaryExpressionNode(ExpressionNode left, BinaryExpressionOperator @operator, ExpressionNode right) : ExpressionNode
{
public ExpressionNode Left { get; } = left;
public BinaryExpressionOperator Operator { get; } = @operator;
public ExpressionNode Right { get; } = right;
}
public enum BinaryExpressionOperator
{
Equal,
NotEqual,
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual,
Plus,
Minus,
Multiply,
Divide
}