diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index 42931ad..16c3ef8 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; using Upsilon.BaseTypes.Number; using Upsilon.Parser; using Type = Upsilon.BaseTypes.Type; @@ -38,7 +37,7 @@ namespace Upsilon.Binder case SyntaxKind.AssignmentExpression: return BindAssignmentExpression((AssignmentExpressionSyntax) e); case SyntaxKind.VariableExpression: - break; + return BindVariableExpression((VariableExpressionSyntax) e); case SyntaxKind.BadExpression: break; case SyntaxKind.ScriptUnit: @@ -130,5 +129,17 @@ namespace Upsilon.Binder return new BoundAssignmenExpression(variable, boundExpression); } + + private BoundExpression BindVariableExpression(VariableExpressionSyntax e) + { + var name = e.Identifier.Name; + if (!_scope.TryGetVariable(name, out var variable)) + { + _diagnostics.LogUnknownVariable(e.Identifier.Span, name); + return new BoundLiteralExpression(null, Type.Nil); + } + + return new BoundVariableExpression(variable); + } } } \ No newline at end of file diff --git a/Upsilon/Binder/BoundKind.cs b/Upsilon/Binder/BoundKind.cs index 8ed7b3a..8ed3eb1 100644 --- a/Upsilon/Binder/BoundKind.cs +++ b/Upsilon/Binder/BoundKind.cs @@ -7,6 +7,7 @@ namespace Upsilon.Binder BoundLiteralExpression, BoundBinaryExpression, BoundUnaryExpression, - BoundAssignmentExpression + BoundAssignmentExpression, + VariableExpression } } \ No newline at end of file diff --git a/Upsilon/Binder/BoundVariableExpression.cs b/Upsilon/Binder/BoundVariableExpression.cs new file mode 100644 index 0000000..99b2575 --- /dev/null +++ b/Upsilon/Binder/BoundVariableExpression.cs @@ -0,0 +1,17 @@ +using System; +using Type = Upsilon.BaseTypes.Type; + +namespace Upsilon.Binder +{ + public class BoundVariableExpression : BoundExpression + { + public BoundVariableExpression(VariableSymbol variable) + { + Variable = variable; + } + + public VariableSymbol Variable { get; } + public override BoundKind Kind => BoundKind.VariableExpression; + public override Type Type => Variable.Type; + } +} \ No newline at end of file