Better error reporter
This commit is contained in:
parent
d341318989
commit
f903a3ca58
|
@ -131,7 +131,7 @@ namespace Upsilon.Binder
|
||||||
case SyntaxKind.FunctionExpression:
|
case SyntaxKind.FunctionExpression:
|
||||||
return BindFunctionExpression((FunctionExpressionSyntax) e);
|
return BindFunctionExpression((FunctionExpressionSyntax) e);
|
||||||
case SyntaxKind.BadExpression:
|
case SyntaxKind.BadExpression:
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
case SyntaxKind.ScriptUnit:
|
case SyntaxKind.ScriptUnit:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -143,6 +143,8 @@ namespace Upsilon.Binder
|
||||||
private BoundExpression BindUnaryExpression(UnaryExpressionSyntax e)
|
private BoundExpression BindUnaryExpression(UnaryExpressionSyntax e)
|
||||||
{
|
{
|
||||||
var inExp = BindExpression(e.Expression);
|
var inExp = BindExpression(e.Expression);
|
||||||
|
if (inExp.Kind == BoundKind.BoundBadExpression)
|
||||||
|
return new BoundBadExpression(e.Span);
|
||||||
var op = BoundUnaryOperator.Bind(e.Operator.Kind, inExp.Type);
|
var op = BoundUnaryOperator.Bind(e.Operator.Kind, inExp.Type);
|
||||||
if (op == null)
|
if (op == null)
|
||||||
{
|
{
|
||||||
|
@ -157,6 +159,8 @@ namespace Upsilon.Binder
|
||||||
{
|
{
|
||||||
var left = BindExpression(e.Left);
|
var left = BindExpression(e.Left);
|
||||||
var right = BindExpression(e.Right);
|
var right = BindExpression(e.Right);
|
||||||
|
if (left.Kind == BoundKind.BoundBadExpression || right.Kind == BoundKind.BoundBadExpression)
|
||||||
|
return new BoundBadExpression(e.Span);
|
||||||
var op = BoundBinaryOperator.Bind(e.Operator.Kind, left.Type, right.Type);
|
var op = BoundBinaryOperator.Bind(e.Operator.Kind, left.Type, right.Type);
|
||||||
if (op == null)
|
if (op == null)
|
||||||
{
|
{
|
||||||
|
@ -206,7 +210,7 @@ namespace Upsilon.Binder
|
||||||
if (expression.Type != Type.Function && expression.Type != Type.Unknown)
|
if (expression.Type != Type.Function && expression.Type != Type.Unknown)
|
||||||
{
|
{
|
||||||
_diagnostics.LogError($"Unknown function called.", e.Span);
|
_diagnostics.LogError($"Unknown function called.", e.Span);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
}
|
}
|
||||||
|
|
||||||
var parameters = ImmutableArray.CreateBuilder<BoundExpression>();
|
var parameters = ImmutableArray.CreateBuilder<BoundExpression>();
|
||||||
|
@ -378,7 +382,7 @@ namespace Upsilon.Binder
|
||||||
if (!Scope.TryGetVariable(name, true, out var variable))
|
if (!Scope.TryGetVariable(name, true, out var variable))
|
||||||
{
|
{
|
||||||
_diagnostics.LogUnknownVariable(e.Identifier.Span, name);
|
_diagnostics.LogUnknownVariable(e.Identifier.Span, name);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
}
|
}
|
||||||
var boundVariable = new BoundVariableSymbol(variable, false, e.Identifier.Span);
|
var boundVariable = new BoundVariableSymbol(variable, false, e.Identifier.Span);
|
||||||
return new BoundVariableExpression(boundVariable, e.Span);
|
return new BoundVariableExpression(boundVariable, e.Span);
|
||||||
|
@ -480,7 +484,7 @@ namespace Upsilon.Binder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new BoundExpressionStatement(new BoundLiteralExpression(new ScriptNull(), e.Span), e.Span);
|
return new BoundExpressionStatement(new BoundBadExpression(e.Span), e.Span);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BoundStatement BindMultiAssignmentStatement(MultiAssignmentStatementSyntax s)
|
private BoundStatement BindMultiAssignmentStatement(MultiAssignmentStatementSyntax s)
|
||||||
|
@ -642,7 +646,7 @@ namespace Upsilon.Binder
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_diagnostics.LogCannotConvert(Type.Function, variable.Type, e.Span);
|
_diagnostics.LogCannotConvert(Type.Function, variable.Type, e.Span);
|
||||||
return new BoundExpressionStatement(new BoundLiteralExpression(new ScriptNull(), e.Span), e.Span);
|
return new BoundExpressionStatement(new BoundBadExpression(e.Span), e.Span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -706,7 +710,7 @@ namespace Upsilon.Binder
|
||||||
if (index.Type != Type.Number && index.Type != Type.String && index.Type != Type.Unknown)
|
if (index.Type != Type.Number && index.Type != Type.String && index.Type != Type.Unknown)
|
||||||
{
|
{
|
||||||
_diagnostics.LogInvalidIndexExpression(expression.Type, index.Type, e.Span);
|
_diagnostics.LogInvalidIndexExpression(expression.Type, index.Type, e.Span);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
}
|
}
|
||||||
switch (expression.Type)
|
switch (expression.Type)
|
||||||
{
|
{
|
||||||
|
@ -756,7 +760,7 @@ namespace Upsilon.Binder
|
||||||
return new BoundIndexExpression(expression, index, Type.String, e.Span);
|
return new BoundIndexExpression(expression, index, Type.String, e.Span);
|
||||||
default:
|
default:
|
||||||
_diagnostics.LogInvalidIndexExpression(expression.Type, index.Type, e.Span);
|
_diagnostics.LogInvalidIndexExpression(expression.Type, index.Type, e.Span);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,7 +827,7 @@ namespace Upsilon.Binder
|
||||||
return new BoundFullStopIndexExpression(expression, index, Type.String, e.Span);
|
return new BoundFullStopIndexExpression(expression, index, Type.String, e.Span);
|
||||||
default:
|
default:
|
||||||
_diagnostics.LogInvalidIndexExpression(expression.Type, Type.String, e.Span);
|
_diagnostics.LogInvalidIndexExpression(expression.Type, Type.String, e.Span);
|
||||||
return new BoundLiteralExpression(new ScriptNull(), e.Span);
|
return new BoundBadExpression(e.Span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Upsilon.BaseTypes;
|
||||||
|
using Upsilon.Text;
|
||||||
|
|
||||||
|
namespace Upsilon.Binder
|
||||||
|
{
|
||||||
|
public class BoundBadExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundBadExpression(TextSpan span) : base(span)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundKind Kind => BoundKind.BoundBadExpression;
|
||||||
|
public override IEnumerable<BoundNode> GetNodeAtPosition(int linePosition, int characterPosition)
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<BoundNode> GetChildren()
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Type Type => Type.Nil;
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ namespace Upsilon.Binder
|
||||||
BoundTableExpression,
|
BoundTableExpression,
|
||||||
BoundIndexExpression,
|
BoundIndexExpression,
|
||||||
BoundFunctionExpression,
|
BoundFunctionExpression,
|
||||||
|
BoundBadExpression,
|
||||||
|
|
||||||
// Statements
|
// Statements
|
||||||
BoundAssignmentStatement,
|
BoundAssignmentStatement,
|
||||||
|
@ -29,6 +30,6 @@ namespace Upsilon.Binder
|
||||||
BoundNumericForStatement,
|
BoundNumericForStatement,
|
||||||
BoundGenericForStatement,
|
BoundGenericForStatement,
|
||||||
BoundBreakStatement,
|
BoundBreakStatement,
|
||||||
BoundWhileStatement
|
BoundWhileStatement,
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -254,7 +254,7 @@ namespace Upsilon.Evaluator
|
||||||
case BoundKind.BoundFullstopIndexExpression:
|
case BoundKind.BoundFullstopIndexExpression:
|
||||||
return EvaluateFullStopIndexExpression((BoundFullStopIndexExpression) e);
|
return EvaluateFullStopIndexExpression((BoundFullStopIndexExpression) e);
|
||||||
default:
|
default:
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException(e.Kind.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,19 @@ namespace Ycicle
|
||||||
Console.ResetColor();
|
Console.ResetColor();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
script.Bind();
|
||||||
|
if (script.Diagnostics.Errors.Count > 0)
|
||||||
|
{
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
Console.WriteLine("Errors were found during parsing");
|
||||||
|
foreach (var diagnosticsMessage in script.Diagnostics.Errors)
|
||||||
|
{
|
||||||
|
LogMessage(DiagnosticLevel.Error, diagnosticsMessage);
|
||||||
|
}
|
||||||
|
Console.ResetColor();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
//Console.WriteLine(script.PrettyPrintSyntaxTree());
|
//Console.WriteLine(script.PrettyPrintSyntaxTree());
|
||||||
var evaluate = script.Evaluate();
|
var evaluate = script.Evaluate();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue