Introduce binding
This commit is contained in:
parent
0529e87d43
commit
188dca85d8
@ -159,10 +159,10 @@ namespace ConsoleDemo
|
|||||||
_insideFunction = false;
|
_insideFunction = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMethodDefinition(MethodDefinitionSyntaxNode node)
|
public override void VisitConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
{
|
{
|
||||||
_insideMethod = true;
|
_insideMethod = true;
|
||||||
base.VisitMethodDefinition(node);
|
base.VisitConcreteMethodDeclaration(node);
|
||||||
_insideMethod = false;
|
_insideMethod = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ namespace ProjectConsole
|
|||||||
OutputKeyword(node.EndKeyword);
|
OutputKeyword(node.EndKeyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMethodDefinition(MethodDefinitionSyntaxNode node)
|
public override void VisitConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputKeyword(node.FunctionKeyword);
|
OutputKeyword(node.FunctionKeyword);
|
||||||
Visit(node.OutputDescription);
|
Visit(node.OutputDescription);
|
||||||
@ -306,12 +306,12 @@ namespace ProjectConsole
|
|||||||
OutputControlKeyword(node.EndKeyword);
|
OutputControlKeyword(node.EndKeyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitUnquotedStringLiteral(UnquotedStringLiteralSyntaxNode node)
|
public override void VisitUnquotedStringLiteralExpression(UnquotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputUnquotedStringLiteral(node.StringToken);
|
OutputUnquotedStringLiteral(node.StringToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitStringLiteral(StringLiteralSyntaxNode node)
|
public override void VisitStringLiteralExpression(StringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputStringLiteral(node.StringToken);
|
OutputStringLiteral(node.StringToken);
|
||||||
}
|
}
|
||||||
@ -359,7 +359,7 @@ namespace ProjectConsole
|
|||||||
Visit(node.Arguments);
|
Visit(node.Arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitNumberLiteral(NumberLiteralSyntaxNode node)
|
public override void VisitNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputNumberLiteral(node.Number);
|
OutputNumberLiteral(node.Number);
|
||||||
}
|
}
|
||||||
@ -370,13 +370,13 @@ namespace ProjectConsole
|
|||||||
Visit(node.Operand);
|
Visit(node.Operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitUnaryPostixOperationExpression(UnaryPostixOperationExpressionSyntaxNode node)
|
public override void VisitUnaryPostfixOperationExpression(UnaryPostfixOperationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.Operand);
|
Visit(node.Operand);
|
||||||
OutputOperator(node.Operation);
|
OutputOperator(node.Operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitBaseClassInvokation(BaseClassInvokationSyntaxNode node)
|
public override void VisitClassInvokationExpression(ClassInvokationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.MethodName);
|
Visit(node.MethodName);
|
||||||
OutputOperator(node.AtSign);
|
OutputOperator(node.AtSign);
|
||||||
@ -415,7 +415,7 @@ namespace ProjectConsole
|
|||||||
Visit(node.Nodes);
|
Visit(node.Nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitDoubleQuotedStringLiteral(DoubleQuotedStringLiteralSyntaxNode node)
|
public override void VisitDoubleQuotedStringLiteralExpression(DoubleQuotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputStringLiteral(node.StringToken);
|
OutputStringLiteral(node.StringToken);
|
||||||
}
|
}
|
||||||
@ -472,7 +472,7 @@ namespace ProjectConsole
|
|||||||
OutputOperator(node.AssignmentSign);
|
OutputOperator(node.AssignmentSign);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitIndirectMemberAccess(IndirectMemberAccessSyntaxNode node)
|
public override void VisitIndirectMemberAccessExpression(IndirectMemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
OutputBracket(node.OpeningBracket);
|
OutputBracket(node.OpeningBracket);
|
||||||
Visit(node.Expression);
|
Visit(node.Expression);
|
||||||
@ -492,7 +492,7 @@ namespace ProjectConsole
|
|||||||
Visit(node.FunctionName);
|
Visit(node.FunctionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMemberAccess(MemberAccessSyntaxNode node)
|
public override void VisitMemberAccessExpression(MemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.LeftOperand);
|
Visit(node.LeftOperand);
|
||||||
OutputOperator(node.Dot);
|
OutputOperator(node.Dot);
|
||||||
|
@ -120,7 +120,7 @@ namespace ConsoleDemo
|
|||||||
_insideFunction = false;
|
_insideFunction = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMethodDefinition(MethodDefinitionSyntaxNode node)
|
public override void VisitConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
{
|
{
|
||||||
_insideMethod = true;
|
_insideMethod = true;
|
||||||
_variableAssignments = new VariableAssignments();
|
_variableAssignments = new VariableAssignments();
|
||||||
@ -146,7 +146,7 @@ namespace ConsoleDemo
|
|||||||
Console.WriteLine($"Parameter token: {parameter.AsToken()}");
|
Console.WriteLine($"Parameter token: {parameter.AsToken()}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base.VisitMethodDefinition(node);
|
base.VisitConcreteMethodDeclaration(node);
|
||||||
_variableAssignments = null;
|
_variableAssignments = null;
|
||||||
_insideMethod = false;
|
_insideMethod = false;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@ namespace MApplication
|
|||||||
AddToken(node.EndKeyword, _scheme.Keyword);
|
AddToken(node.EndKeyword, _scheme.Keyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMethodDefinition(MethodDefinitionSyntaxNode node)
|
public override void VisitConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.FunctionKeyword, _scheme.Keyword);
|
AddToken(node.FunctionKeyword, _scheme.Keyword);
|
||||||
Visit(node.OutputDescription);
|
Visit(node.OutputDescription);
|
||||||
@ -253,12 +253,12 @@ namespace MApplication
|
|||||||
AddToken(node.EndKeyword, _scheme.ControlKeyword);
|
AddToken(node.EndKeyword, _scheme.ControlKeyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitUnquotedStringLiteral(UnquotedStringLiteralSyntaxNode node)
|
public override void VisitUnquotedStringLiteralExpression(UnquotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.StringToken, _scheme.UnquotedStringLiteral);
|
AddToken(node.StringToken, _scheme.UnquotedStringLiteral);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitStringLiteral(StringLiteralSyntaxNode node)
|
public override void VisitStringLiteralExpression(StringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.StringToken, _scheme.StringLiteral);
|
AddToken(node.StringToken, _scheme.StringLiteral);
|
||||||
}
|
}
|
||||||
@ -306,7 +306,7 @@ namespace MApplication
|
|||||||
Visit(node.Arguments);
|
Visit(node.Arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitNumberLiteral(NumberLiteralSyntaxNode node)
|
public override void VisitNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.Number, _scheme.NumberLiteral);
|
AddToken(node.Number, _scheme.NumberLiteral);
|
||||||
}
|
}
|
||||||
@ -317,13 +317,13 @@ namespace MApplication
|
|||||||
Visit(node.Operand);
|
Visit(node.Operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitUnaryPostixOperationExpression(UnaryPostixOperationExpressionSyntaxNode node)
|
public override void VisitUnaryPostfixOperationExpression(UnaryPostfixOperationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.Operand);
|
Visit(node.Operand);
|
||||||
AddToken(node.Operation, _scheme.Operator);
|
AddToken(node.Operation, _scheme.Operator);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitBaseClassInvokation(BaseClassInvokationSyntaxNode node)
|
public override void VisitClassInvokationExpression(ClassInvokationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.MethodName);
|
Visit(node.MethodName);
|
||||||
AddToken(node.AtSign, _scheme.Operator);
|
AddToken(node.AtSign, _scheme.Operator);
|
||||||
@ -362,7 +362,7 @@ namespace MApplication
|
|||||||
Visit(node.Nodes);
|
Visit(node.Nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitDoubleQuotedStringLiteral(DoubleQuotedStringLiteralSyntaxNode node)
|
public override void VisitDoubleQuotedStringLiteralExpression(DoubleQuotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.StringToken, _scheme.StringLiteral);
|
AddToken(node.StringToken, _scheme.StringLiteral);
|
||||||
}
|
}
|
||||||
@ -419,7 +419,7 @@ namespace MApplication
|
|||||||
AddToken(node.AssignmentSign, _scheme.Operator);
|
AddToken(node.AssignmentSign, _scheme.Operator);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitIndirectMemberAccess(IndirectMemberAccessSyntaxNode node)
|
public override void VisitIndirectMemberAccessExpression(IndirectMemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
AddToken(node.OpeningBracket, _scheme.Bracket);
|
AddToken(node.OpeningBracket, _scheme.Bracket);
|
||||||
Visit(node.Expression);
|
Visit(node.Expression);
|
||||||
@ -439,7 +439,7 @@ namespace MApplication
|
|||||||
Visit(node.FunctionName);
|
Visit(node.FunctionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void VisitMemberAccess(MemberAccessSyntaxNode node)
|
public override void VisitMemberAccessExpression(MemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
Visit(node.LeftOperand);
|
Visit(node.LeftOperand);
|
||||||
AddToken(node.Dot, _scheme.Operator);
|
AddToken(node.Dot, _scheme.Operator);
|
||||||
|
353
Parser/Binding/Binder.cs
Normal file
353
Parser/Binding/Binder.cs
Normal file
@ -0,0 +1,353 @@
|
|||||||
|
using Parser.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Parser.Binding
|
||||||
|
{
|
||||||
|
public class Binder
|
||||||
|
{
|
||||||
|
private readonly DiagnosticsBag _diagnostics = new DiagnosticsBag();
|
||||||
|
|
||||||
|
private BoundRoot BindRoot(RootSyntaxNode node)
|
||||||
|
{
|
||||||
|
var boundFile = BindFile(node.File);
|
||||||
|
return new BoundRoot(node, boundFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundFile BindFile(FileSyntaxNode node)
|
||||||
|
{
|
||||||
|
var statements = BindStatementList(node.StatementList);
|
||||||
|
return new BoundFile(node, statements);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundStatement BindStatement(StatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
return node.Kind switch
|
||||||
|
{
|
||||||
|
TokenKind.AbstractMethodDeclaration =>
|
||||||
|
BindAbstractMethodDeclaration((AbstractMethodDeclarationSyntaxNode)node),
|
||||||
|
TokenKind.ClassDeclaration =>
|
||||||
|
BindClassDeclaration((ClassDeclarationSyntaxNode)node),
|
||||||
|
TokenKind.ConcreteMethodDeclaration =>
|
||||||
|
BindConcreteMethodDeclaration((ConcreteMethodDeclarationSyntaxNode)node),
|
||||||
|
TokenKind.EmptyStatement =>
|
||||||
|
BindEmptyStatement((EmptyStatementSyntaxNode)node),
|
||||||
|
TokenKind.ExpressionStatement =>
|
||||||
|
BindExpressionStatement((ExpressionStatementSyntaxNode)node),
|
||||||
|
TokenKind.ForStatement =>
|
||||||
|
BindForStatement((ForStatementSyntaxNode)node),
|
||||||
|
TokenKind.FunctionDeclaration =>
|
||||||
|
BindFunctionDeclaration((FunctionDeclarationSyntaxNode)node),
|
||||||
|
TokenKind.IfStatement =>
|
||||||
|
BindIfStatement((IfStatementSyntaxNode)node),
|
||||||
|
TokenKind.SwitchStatement =>
|
||||||
|
BindSwitchStatement((SwitchStatementSyntaxNode)node),
|
||||||
|
TokenKind.TryCatchStatement =>
|
||||||
|
BindTryCatchStatement((TryCatchStatementSyntaxNode)node),
|
||||||
|
TokenKind.WhileStatement =>
|
||||||
|
BindWhileStatement((WhileStatementSyntaxNode)node),
|
||||||
|
_ =>
|
||||||
|
throw new Exception($"Invalid statement node kind '{node.Kind}'."),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundWhileStatement BindWhileStatement(WhileStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundTryCatchStatement BindTryCatchStatement(TryCatchStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundSwitchStatement BindSwitchStatement(SwitchStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundIfStatement BindIfStatement(IfStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
var condition = BindExpression(node.Condition);
|
||||||
|
var body = BindStatementList(node.Body);
|
||||||
|
var elseIfClauses = node.ElseifClauses
|
||||||
|
.Where(n => n.IsNode)
|
||||||
|
.Select(n => (ElseifClause)n.AsNode()!);
|
||||||
|
var builder = ImmutableArray.CreateBuilder<BoundElseIfClause>();
|
||||||
|
foreach (var elseIfClause in elseIfClauses)
|
||||||
|
{
|
||||||
|
var clause = BindElseIfClause(elseIfClause);
|
||||||
|
builder.Add(clause);
|
||||||
|
}
|
||||||
|
var maybeElseClause = node.ElseClause switch
|
||||||
|
{
|
||||||
|
{ } elseClause => BindElseClause(elseClause),
|
||||||
|
_ => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
return new BoundIfStatement(node, condition, body, elseIfClauses, maybeElseClause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundElseClause BindElseClause(ElseClause node)
|
||||||
|
{
|
||||||
|
var body = BindStatementList(node.Body);
|
||||||
|
return new BoundElseClause(node, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ImmutableArray<BoundStatement> BindStatementList(SyntaxNodeOrTokenList list)
|
||||||
|
{
|
||||||
|
var builder = ImmutableArray.CreateBuilder<BoundStatement>();
|
||||||
|
var statements = list.Where(s => s.IsNode).Select(s => (StatementSyntaxNode)s.AsNode()!);
|
||||||
|
foreach (var statement in statements)
|
||||||
|
{
|
||||||
|
var boundStatement = BindStatement(statement);
|
||||||
|
builder.Add(boundStatement);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.ToImmutable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ImmutableArray<BoundExpression> BindExpressionList(SyntaxNodeOrTokenList list)
|
||||||
|
{
|
||||||
|
var builder = ImmutableArray.CreateBuilder<BoundExpression>();
|
||||||
|
var expressions = list.Where(s => s.IsNode).Select(s => (ExpressionSyntaxNode)s.AsNode()!);
|
||||||
|
foreach (var expression in expressions)
|
||||||
|
{
|
||||||
|
var boundExpression = BindExpression(expression);
|
||||||
|
builder.Add(boundExpression);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.ToImmutable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundElseIfClause BindElseIfClause(ElseifClause node)
|
||||||
|
{
|
||||||
|
var condition = BindExpression(node.Condition);
|
||||||
|
var body = BindStatementList(node.Body);
|
||||||
|
return new BoundElseIfClause(node, condition, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundFunctionDeclaration BindFunctionDeclaration(FunctionDeclarationSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundForStatement BindForStatement(ForStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundExpressionStatement BindExpressionStatement(ExpressionStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
var expression = BindExpression(node.Expression);
|
||||||
|
return new BoundExpressionStatement(node, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundExpression BindExpression(ExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
return node.Kind switch
|
||||||
|
{
|
||||||
|
TokenKind.ArrayLiteralExpression =>
|
||||||
|
BindArrayLiteralExpression((ArrayLiteralExpressionSyntaxNode)node),
|
||||||
|
TokenKind.AssignmentExpression =>
|
||||||
|
BindAssignmentExpression((AssignmentExpressionSyntaxNode)node),
|
||||||
|
TokenKind.BinaryOperationExpression =>
|
||||||
|
BindBinaryOperationExpression((BinaryOperationExpressionSyntaxNode)node),
|
||||||
|
TokenKind.CellArrayElementAccessExpression =>
|
||||||
|
BindCellArrayElementAccessExpression((CellArrayElementAccessExpressionSyntaxNode)node),
|
||||||
|
TokenKind.CellArrayLiteralExpression =>
|
||||||
|
BindCellArrayLiteralExpression((CellArrayLiteralExpressionSyntaxNode)node),
|
||||||
|
TokenKind.ClassInvokationExpression =>
|
||||||
|
BindClassInvokationExpression((ClassInvokationExpressionSyntaxNode)node),
|
||||||
|
TokenKind.CommandExpression =>
|
||||||
|
BindCommandExpression((CommandExpressionSyntaxNode)node),
|
||||||
|
TokenKind.CompoundNameExpression =>
|
||||||
|
BindCompoundNameExpression((CompoundNameExpressionSyntaxNode)node),
|
||||||
|
TokenKind.DoubleQuotedStringLiteralExpression =>
|
||||||
|
BindDoubleQuotedStringLiteralExpression((DoubleQuotedStringLiteralExpressionSyntaxNode)node),
|
||||||
|
TokenKind.EmptyExpression =>
|
||||||
|
BindEmptyExpression((EmptyExpressionSyntaxNode)node),
|
||||||
|
TokenKind.FunctionCallExpression =>
|
||||||
|
BindFunctionCallExpression((FunctionCallExpressionSyntaxNode)node),
|
||||||
|
TokenKind.IdentifierNameExpression =>
|
||||||
|
BindIdentifierNameExpression((IdentifierNameExpressionSyntaxNode)node),
|
||||||
|
TokenKind.IndirectMemberAccessExpression =>
|
||||||
|
BindIndirectMemberAccessExpression((IndirectMemberAccessExpressionSyntaxNode)node),
|
||||||
|
TokenKind.LambdaExpression =>
|
||||||
|
BindLambdaExpression((LambdaExpressionSyntaxNode)node),
|
||||||
|
TokenKind.MemberAccessExpression =>
|
||||||
|
BindMemberAccessExpression((MemberAccessExpressionSyntaxNode)node),
|
||||||
|
TokenKind.NamedFunctionHandleExpression =>
|
||||||
|
BindNamedFunctionHandleExpression((NamedFunctionHandleExpressionSyntaxNode)node),
|
||||||
|
TokenKind.NumberLiteralExpression =>
|
||||||
|
BindNumberLiteralExpression((NumberLiteralExpressionSyntaxNode)node),
|
||||||
|
TokenKind.ParenthesizedExpression =>
|
||||||
|
BindParenthesizedExpression((ParenthesizedExpressionSyntaxNode)node),
|
||||||
|
TokenKind.StringLiteralExpression =>
|
||||||
|
BindStringLiteralExpression((StringLiteralExpressionSyntaxNode)node),
|
||||||
|
TokenKind.UnaryPrefixOperationExpression =>
|
||||||
|
BindUnaryPrefixOperationExpression((UnaryPrefixOperationExpressionSyntaxNode)node),
|
||||||
|
TokenKind.UnaryPostfixOperationExpression =>
|
||||||
|
BindUnaryPostfixOperationExpression((UnaryPostfixOperationExpressionSyntaxNode)node),
|
||||||
|
TokenKind.UnquotedStringLiteralExpression =>
|
||||||
|
BindUnquotedStringLiteralExpression((UnquotedStringLiteralExpressionSyntaxNode)node),
|
||||||
|
_ =>
|
||||||
|
throw new Exception($"Invalid statement node kind '{node.Kind}'."),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundArrayLiteralExpression BindArrayLiteralExpression(ArrayLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundAssignmentExpression BindAssignmentExpression(AssignmentExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var left = BindExpression(node.Lhs);
|
||||||
|
var right = BindExpression(node.Rhs);
|
||||||
|
return new BoundAssignmentExpression(node, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundBinaryOperationExpression BindBinaryOperationExpression(BinaryOperationExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var left = BindExpression(node.Lhs);
|
||||||
|
var right = BindExpression(node.Rhs);
|
||||||
|
var op = BindBinaryOperator(node.Operation);
|
||||||
|
return new BoundBinaryOperationExpression(node, left, op, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundBinaryOperator BindBinaryOperator(SyntaxToken token)
|
||||||
|
{
|
||||||
|
return BoundBinaryOperator.GetOperator(token.Kind)
|
||||||
|
?? throw new Exception($"Unexpected binary operator kind {token.Kind}.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundCellArrayElementAccessExpression BindCellArrayElementAccessExpression(CellArrayElementAccessExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundCellArrayLiteralExpression BindCellArrayLiteralExpression(CellArrayLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundClassInvokationExpression BindClassInvokationExpression(ClassInvokationExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundCommandExpression BindCommandExpression(CommandExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundCompoundNameExpression BindCompoundNameExpression(CompoundNameExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundDoubleQuotedStringLiteralExpression BindDoubleQuotedStringLiteralExpression(DoubleQuotedStringLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundEmptyExpression BindEmptyExpression(EmptyExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundFunctionCallExpression BindFunctionCallExpression(FunctionCallExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var name = BindExpression(node.FunctionName);
|
||||||
|
var arguments = BindExpressionList(node.Nodes);
|
||||||
|
return new BoundFunctionCallExpression(node, name, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundIdentifierNameExpression BindIdentifierNameExpression(IdentifierNameExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
return new BoundIdentifierNameExpression(node, node.Name.Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundIndirectMemberAccessExpression BindIndirectMemberAccessExpression(IndirectMemberAccessExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundLambdaExpression BindLambdaExpression(LambdaExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundMemberAccessExpression BindMemberAccessExpression(MemberAccessExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundNamedFunctionHandleExpression BindNamedFunctionHandleExpression(NamedFunctionHandleExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundNumberLiteralExpression BindNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var value = (double)node.Number.Value!;
|
||||||
|
return new BoundNumberLiteralExpression(node, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundParenthesizedExpression BindParenthesizedExpression(ParenthesizedExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var expression = BindExpression(node.Expression);
|
||||||
|
return new BoundParenthesizedExpression(node, expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundStringLiteralExpression BindStringLiteralExpression(StringLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
var value = (string)node.StringToken.Value!;
|
||||||
|
return new BoundStringLiteralExpression(node, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundUnaryPrefixOperationExpression BindUnaryPrefixOperationExpression(UnaryPrefixOperationExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundUnaryPostfixOperationExpression BindUnaryPostfixOperationExpression(UnaryPostfixOperationExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundUnquotedStringLiteralExpression BindUnquotedStringLiteralExpression(UnquotedStringLiteralExpressionSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundEmptyStatement BindEmptyStatement(EmptyStatementSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundConcreteMethodDeclaration BindConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundClassDeclaration BindClassDeclaration(ClassDeclarationSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BoundAbstractMethodDeclaration BindAbstractMethodDeclaration(AbstractMethodDeclarationSyntaxNode node)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BoundProgram BindProgram(SyntaxTree syntaxTree)
|
||||||
|
{
|
||||||
|
var binder = new Binder();
|
||||||
|
var boundRoot = binder.BindRoot(syntaxTree.NullRoot);
|
||||||
|
return new BoundProgram(boundRoot, binder._diagnostics.ToImmutableArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
Parser/Binding/BoundProgram.cs
Normal file
20
Parser/Binding/BoundProgram.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using Parser.Internal;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
|
||||||
|
namespace Parser.Binding
|
||||||
|
{
|
||||||
|
public class BoundProgram
|
||||||
|
{
|
||||||
|
public BoundProgram(BoundRoot nullRoot, ImmutableArray<Diagnostic> diagnostics)
|
||||||
|
{
|
||||||
|
NullRoot = nullRoot;
|
||||||
|
Diagnostics = diagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImmutableArray<Diagnostic> Diagnostics { get; }
|
||||||
|
|
||||||
|
public BoundRoot NullRoot { get; }
|
||||||
|
|
||||||
|
public BoundFile Root => NullRoot.File;
|
||||||
|
}
|
||||||
|
}
|
581
Parser/Binding/BoundRoot.cs
Normal file
581
Parser/Binding/BoundRoot.cs
Normal file
@ -0,0 +1,581 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Parser.Binding
|
||||||
|
{
|
||||||
|
public enum BoundNodeKind
|
||||||
|
{
|
||||||
|
Root,
|
||||||
|
File,
|
||||||
|
|
||||||
|
// Statements
|
||||||
|
|
||||||
|
AbstractMethodDeclaration,
|
||||||
|
ClassDeclaration,
|
||||||
|
ConcreteMethodDeclaration,
|
||||||
|
EmptyStatement,
|
||||||
|
ExpressionStatement,
|
||||||
|
ForStatement,
|
||||||
|
FunctionDeclaration,
|
||||||
|
IfStatement,
|
||||||
|
SwitchStatement,
|
||||||
|
TryCatchStatement,
|
||||||
|
WhileStatement,
|
||||||
|
|
||||||
|
// Expressions
|
||||||
|
|
||||||
|
ArrayLiteralExpression,
|
||||||
|
AssignmentExpression,
|
||||||
|
BinaryOperationExpression,
|
||||||
|
CellArrayElementAccessExpression,
|
||||||
|
CellArrayLiteralExpression,
|
||||||
|
ClassInvokationExpression,
|
||||||
|
CommandExpression,
|
||||||
|
CompoundNameExpression,
|
||||||
|
DoubleQuotedStringLiteralExpression,
|
||||||
|
EmptyExpression,
|
||||||
|
FunctionCallExpression,
|
||||||
|
IdentifierNameExpression,
|
||||||
|
IndirectMemberAccessExpression,
|
||||||
|
LambdaExpression,
|
||||||
|
MemberAccessExpression,
|
||||||
|
NamedFunctionHandleExpression,
|
||||||
|
NumberLiteralExpression,
|
||||||
|
ParenthesizedExpression,
|
||||||
|
StringLiteralExpression,
|
||||||
|
UnaryPrefixOperationExpression,
|
||||||
|
UnaryPostfixOperationExpression,
|
||||||
|
UnquotedStringLiteralExpression,
|
||||||
|
|
||||||
|
// Parts
|
||||||
|
ElseIfClause,
|
||||||
|
ElseClause
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BoundBinaryOperatorKind
|
||||||
|
{
|
||||||
|
Equals,
|
||||||
|
PipePipe,
|
||||||
|
AmpersandAmpersand,
|
||||||
|
Pipe,
|
||||||
|
Ampersand,
|
||||||
|
Less,
|
||||||
|
LessOrEquals,
|
||||||
|
Greater,
|
||||||
|
GreaterOrEquals,
|
||||||
|
EqualsEquals,
|
||||||
|
TildeEquals,
|
||||||
|
Colon,
|
||||||
|
Plus,
|
||||||
|
Minus,
|
||||||
|
Star,
|
||||||
|
DotStar,
|
||||||
|
Slash,
|
||||||
|
DotSlash,
|
||||||
|
Backslash,
|
||||||
|
DotBackslash,
|
||||||
|
Tilde,
|
||||||
|
Caret,
|
||||||
|
DotCaret,
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class BoundNode
|
||||||
|
{
|
||||||
|
public BoundNode(SyntaxNode syntax)
|
||||||
|
{
|
||||||
|
Syntax = syntax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyntaxNode Syntax { get; }
|
||||||
|
public abstract BoundNodeKind Kind { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundRoot : BoundNode
|
||||||
|
{
|
||||||
|
public BoundRoot(SyntaxNode syntax, BoundFile file)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
File = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundFile File { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.Root;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundFile : BoundNode
|
||||||
|
{
|
||||||
|
public BoundFile(SyntaxNode syntax, ImmutableArray<BoundStatement> statements)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Statements = statements;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImmutableArray<BoundStatement> Statements { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.File;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class BoundStatement : BoundNode
|
||||||
|
{
|
||||||
|
public BoundStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class BoundMethodDeclaration : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundMethodDeclaration(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundAbstractMethodDeclaration : BoundMethodDeclaration
|
||||||
|
{
|
||||||
|
public BoundAbstractMethodDeclaration(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.AbstractMethodDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundClassDeclaration : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundClassDeclaration(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ClassDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundConcreteMethodDeclaration : BoundMethodDeclaration
|
||||||
|
{
|
||||||
|
public BoundConcreteMethodDeclaration(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ConcreteMethodDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundEmptyStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundEmptyStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.EmptyStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundExpressionStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundExpression Expression { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ExpressionStatement;
|
||||||
|
|
||||||
|
public BoundExpressionStatement(SyntaxNode syntax, BoundExpression expression)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Expression = expression;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundForStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundForStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ForStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundFunctionDeclaration : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundFunctionDeclaration(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.FunctionDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundIfStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, ImmutableArray<BoundStatement> body, IEnumerable<ElseifClause> elseIfClauses, BoundElseClause? elseClause)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Condition = condition;
|
||||||
|
Body = body;
|
||||||
|
ElseIfClauses = elseIfClauses;
|
||||||
|
ElseClause = elseClause;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundExpression Condition { get; }
|
||||||
|
public ImmutableArray<BoundStatement> Body { get; }
|
||||||
|
public IEnumerable<ElseifClause> ElseIfClauses { get; }
|
||||||
|
public BoundElseClause? ElseClause { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.IfStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundSwitchStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundSwitchStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.SwitchStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundTryCatchStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundTryCatchStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.TryCatchStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundWhileStatement : BoundStatement
|
||||||
|
{
|
||||||
|
public BoundWhileStatement(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.WhileStatement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class BoundExpression : BoundNode
|
||||||
|
{
|
||||||
|
public BoundExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundArrayLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundArrayLiteralExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ArrayLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundAssignmentExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundAssignmentExpression(SyntaxNode syntax, BoundExpression left, BoundExpression right)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Left = left;
|
||||||
|
Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundExpression Left { get; }
|
||||||
|
public BoundExpression Right { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.AssignmentExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundBinaryOperationExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundBinaryOperationExpression(SyntaxNode syntax, BoundExpression left, BoundBinaryOperator op, BoundExpression right)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Left = left;
|
||||||
|
Op = op;
|
||||||
|
Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundExpression Left { get; }
|
||||||
|
public BoundBinaryOperator Op { get; }
|
||||||
|
public BoundExpression Right { get; }
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.BinaryOperationExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundCellArrayElementAccessExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundCellArrayElementAccessExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.CellArrayElementAccessExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundCellArrayLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundCellArrayLiteralExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.CellArrayLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundClassInvokationExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundClassInvokationExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ClassInvokationExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundCommandExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundCommandExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.CommandExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundCompoundNameExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundCompoundNameExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.CompoundNameExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundDoubleQuotedStringLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundDoubleQuotedStringLiteralExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.DoubleQuotedStringLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundEmptyExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundEmptyExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.EmptyExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundFunctionCallExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundFunctionCallExpression(SyntaxNode syntax, BoundExpression name, ImmutableArray<BoundExpression> arguments)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Arguments = arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundExpression Name { get; }
|
||||||
|
public ImmutableArray<BoundExpression> Arguments { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.FunctionCallExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundIdentifierNameExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundIdentifierNameExpression(SyntaxNode syntax, string name)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.IdentifierNameExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundIndirectMemberAccessExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundIndirectMemberAccessExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.IndirectMemberAccessExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundLambdaExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundLambdaExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.LambdaExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundMemberAccessExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundMemberAccessExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.MemberAccessExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundNamedFunctionHandleExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundNamedFunctionHandleExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.NamedFunctionHandleExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundNumberLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundNumberLiteralExpression(SyntaxNode syntax, double value)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Value { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.NumberLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundParenthesizedExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundParenthesizedExpression(SyntaxNode syntax, BoundExpression expression)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Expression = expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ParenthesizedExpression;
|
||||||
|
|
||||||
|
public BoundExpression Expression { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundStringLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundStringLiteralExpression(SyntaxNode syntax, string value)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Value { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.StringLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundUnaryPrefixOperationExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundUnaryPrefixOperationExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.UnaryPrefixOperationExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundUnaryPostfixOperationExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundUnaryPostfixOperationExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.UnaryPostfixOperationExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundUnquotedStringLiteralExpression : BoundExpression
|
||||||
|
{
|
||||||
|
public BoundUnquotedStringLiteralExpression(SyntaxNode syntax)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.UnquotedStringLiteralExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundElseIfClause : BoundNode
|
||||||
|
{
|
||||||
|
public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, ImmutableArray<BoundStatement> body)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Condition = condition;
|
||||||
|
Body = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundExpression Condition { get; }
|
||||||
|
public ImmutableArray<BoundStatement> Body { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ElseIfClause;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundElseClause : BoundNode
|
||||||
|
{
|
||||||
|
public BoundElseClause(SyntaxNode syntax, ImmutableArray<BoundStatement> body)
|
||||||
|
: base(syntax)
|
||||||
|
{
|
||||||
|
Body = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImmutableArray<BoundStatement> Body { get; }
|
||||||
|
public override BoundNodeKind Kind => BoundNodeKind.ElseClause;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoundBinaryOperator
|
||||||
|
{
|
||||||
|
private static BoundBinaryOperator[] _operators =
|
||||||
|
{
|
||||||
|
new BoundBinaryOperator(TokenKind.EqualsToken, BoundBinaryOperatorKind.Equals),
|
||||||
|
new BoundBinaryOperator(TokenKind.PipePipeToken, BoundBinaryOperatorKind.PipePipe),
|
||||||
|
new BoundBinaryOperator(TokenKind.AmpersandAmpersandToken, BoundBinaryOperatorKind.AmpersandAmpersand),
|
||||||
|
new BoundBinaryOperator(TokenKind.PipeToken, BoundBinaryOperatorKind.Pipe),
|
||||||
|
new BoundBinaryOperator(TokenKind.AmpersandToken, BoundBinaryOperatorKind.Ampersand),
|
||||||
|
new BoundBinaryOperator(TokenKind.LessToken, BoundBinaryOperatorKind.Less),
|
||||||
|
new BoundBinaryOperator(TokenKind.LessOrEqualsToken, BoundBinaryOperatorKind.LessOrEquals),
|
||||||
|
new BoundBinaryOperator(TokenKind.GreaterToken, BoundBinaryOperatorKind.Greater),
|
||||||
|
new BoundBinaryOperator(TokenKind.GreaterOrEqualsToken, BoundBinaryOperatorKind.GreaterOrEquals),
|
||||||
|
new BoundBinaryOperator(TokenKind.EqualsEqualsToken, BoundBinaryOperatorKind.EqualsEquals),
|
||||||
|
new BoundBinaryOperator(TokenKind.TildeEqualsToken, BoundBinaryOperatorKind.TildeEquals),
|
||||||
|
new BoundBinaryOperator(TokenKind.ColonToken, BoundBinaryOperatorKind.Colon),
|
||||||
|
new BoundBinaryOperator(TokenKind.PlusToken, BoundBinaryOperatorKind.Plus),
|
||||||
|
new BoundBinaryOperator(TokenKind.MinusToken, BoundBinaryOperatorKind.Minus),
|
||||||
|
new BoundBinaryOperator(TokenKind.StarToken, BoundBinaryOperatorKind.Star),
|
||||||
|
new BoundBinaryOperator(TokenKind.DotStarToken, BoundBinaryOperatorKind.DotStar),
|
||||||
|
new BoundBinaryOperator(TokenKind.SlashToken, BoundBinaryOperatorKind.Slash),
|
||||||
|
new BoundBinaryOperator(TokenKind.DotSlashToken, BoundBinaryOperatorKind.DotSlash),
|
||||||
|
new BoundBinaryOperator(TokenKind.BackslashToken, BoundBinaryOperatorKind.Backslash),
|
||||||
|
new BoundBinaryOperator(TokenKind.DotBackslashToken, BoundBinaryOperatorKind.DotBackslash),
|
||||||
|
new BoundBinaryOperator(TokenKind.TildeToken, BoundBinaryOperatorKind.Tilde),
|
||||||
|
new BoundBinaryOperator(TokenKind.CaretToken, BoundBinaryOperatorKind.Caret),
|
||||||
|
new BoundBinaryOperator(TokenKind.DotCaretToken, BoundBinaryOperatorKind.DotCaret),
|
||||||
|
};
|
||||||
|
|
||||||
|
public BoundBinaryOperator(TokenKind syntaxKind, BoundBinaryOperatorKind kind)
|
||||||
|
{
|
||||||
|
SyntaxKind = syntaxKind;
|
||||||
|
Kind = kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenKind SyntaxKind { get; }
|
||||||
|
public BoundBinaryOperatorKind Kind { get; }
|
||||||
|
|
||||||
|
internal static BoundBinaryOperator? GetOperator(TokenKind kind)
|
||||||
|
{
|
||||||
|
return _operators.FirstOrDefault(op => op.SyntaxKind == kind);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,6 @@
|
|||||||
namespace Parser
|
using Parser.Binding;
|
||||||
|
|
||||||
|
namespace Parser
|
||||||
{
|
{
|
||||||
public class Compilation
|
public class Compilation
|
||||||
{
|
{
|
||||||
@ -14,9 +16,20 @@
|
|||||||
return new Compilation(syntaxTree);
|
return new Compilation(syntaxTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BoundProgram GetBoundProgram()
|
||||||
|
{
|
||||||
|
return Binder.BindProgram(_syntaxTree);
|
||||||
|
}
|
||||||
|
|
||||||
public EvaluationResult Evaluate(CompilationContext context)
|
public EvaluationResult Evaluate(CompilationContext context)
|
||||||
{
|
{
|
||||||
var evaluator = new Evaluator(_syntaxTree, context);
|
var program = GetBoundProgram();
|
||||||
|
if (program.Diagnostics.Length > 0)
|
||||||
|
{
|
||||||
|
return new EvaluationResult(null, program.Diagnostics);
|
||||||
|
}
|
||||||
|
|
||||||
|
var evaluator = new Evaluator(program, context);
|
||||||
return evaluator.Evaluate();
|
return evaluator.Evaluate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Parser.Internal;
|
using Parser.Binding;
|
||||||
|
using Parser.Internal;
|
||||||
using Parser.MFunctions;
|
using Parser.MFunctions;
|
||||||
using Parser.Objects;
|
using Parser.Objects;
|
||||||
using System;
|
using System;
|
||||||
@ -10,15 +11,15 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
internal class Evaluator
|
internal class Evaluator
|
||||||
{
|
{
|
||||||
private readonly SyntaxTree _syntaxTree;
|
private readonly BoundProgram _program;
|
||||||
private readonly CompilationContext _context;
|
private readonly CompilationContext _context;
|
||||||
private readonly DiagnosticsBag _diagnostics = new DiagnosticsBag();
|
private readonly DiagnosticsBag _diagnostics = new DiagnosticsBag();
|
||||||
private bool _insideFunction = false;
|
private bool _insideFunction = false;
|
||||||
private readonly Stack<EvaluationScope> _scopeStack = new Stack<EvaluationScope>();
|
private readonly Stack<EvaluationScope> _scopeStack = new Stack<EvaluationScope>();
|
||||||
|
|
||||||
public Evaluator(SyntaxTree syntaxTree, CompilationContext context)
|
public Evaluator(BoundProgram program, CompilationContext context)
|
||||||
{
|
{
|
||||||
_syntaxTree = syntaxTree;
|
_program = program;
|
||||||
_context = context;
|
_context = context;
|
||||||
var outerScope = new EvaluationScope();
|
var outerScope = new EvaluationScope();
|
||||||
_scopeStack.Push(outerScope);
|
_scopeStack.Push(outerScope);
|
||||||
@ -26,209 +27,204 @@ namespace Parser
|
|||||||
|
|
||||||
internal EvaluationResult Evaluate()
|
internal EvaluationResult Evaluate()
|
||||||
{
|
{
|
||||||
var result = EvaluateFile(_syntaxTree.Root);
|
var result = EvaluateFile(_program.Root);
|
||||||
return new EvaluationResult(result, _diagnostics.ToImmutableArray());
|
return new EvaluationResult(result, _diagnostics.ToImmutableArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateFile(FileSyntaxNode root)
|
private MObject? EvaluateFile(BoundFile root)
|
||||||
{
|
{
|
||||||
MObject? lastResult = null;
|
MObject? lastResult = null;
|
||||||
foreach (var nodeOrToken in root.StatementList)
|
foreach (var statement in root.Statements)
|
||||||
{
|
{
|
||||||
if (nodeOrToken.IsNode)
|
lastResult = EvaluateStatement(statement) ?? lastResult;
|
||||||
{
|
|
||||||
var statement = (StatementSyntaxNode)nodeOrToken.AsNode()!;
|
|
||||||
lastResult = EvaluateStatement(statement) ?? lastResult;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return lastResult;
|
return lastResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateStatement(StatementSyntaxNode statement)
|
private MObject? EvaluateStatement(BoundStatement node)
|
||||||
{
|
{
|
||||||
return statement.Kind switch
|
return node.Kind switch
|
||||||
{
|
{
|
||||||
TokenKind.AbstractMethodDeclaration =>
|
BoundNodeKind.AbstractMethodDeclaration =>
|
||||||
EvaluateAbstractMethodDeclaration((AbstractMethodDeclarationSyntaxNode)statement),
|
EvaluateAbstractMethodDeclaration((BoundAbstractMethodDeclaration)node),
|
||||||
TokenKind.ClassDeclaration =>
|
BoundNodeKind.ClassDeclaration =>
|
||||||
EvaluateClassDeclaration((ClassDeclarationSyntaxNode)statement),
|
EvaluateClassDeclaration((BoundClassDeclaration)node),
|
||||||
TokenKind.EmptyStatement =>
|
BoundNodeKind.EmptyStatement =>
|
||||||
EvaluateEmptyStatement((EmptyStatementSyntaxNode)statement),
|
EvaluateEmptyStatement((BoundEmptyStatement)node),
|
||||||
TokenKind.ExpressionStatement =>
|
BoundNodeKind.ExpressionStatement =>
|
||||||
EvaluateExpressionStatement((ExpressionStatementSyntaxNode)statement),
|
EvaluateExpressionStatement((BoundExpressionStatement)node),
|
||||||
TokenKind.ForStatement =>
|
BoundNodeKind.ForStatement =>
|
||||||
EvaluateForStatement((ForStatementSyntaxNode)statement),
|
EvaluateForStatement((BoundForStatement)node),
|
||||||
TokenKind.FunctionDeclaration =>
|
BoundNodeKind.FunctionDeclaration =>
|
||||||
EvaluateFunctionDeclaration((FunctionDeclarationSyntaxNode)statement),
|
EvaluateFunctionDeclaration((BoundFunctionDeclaration)node),
|
||||||
TokenKind.IfStatement =>
|
BoundNodeKind.IfStatement =>
|
||||||
EvaluateIfStatement((IfStatementSyntaxNode)statement),
|
EvaluateIfStatement((BoundIfStatement)node),
|
||||||
TokenKind.ConcreteMethodDeclaration =>
|
BoundNodeKind.ConcreteMethodDeclaration =>
|
||||||
EvaluateMethodDefinition((MethodDefinitionSyntaxNode)statement),
|
EvaluateMethodDefinition((BoundConcreteMethodDeclaration)node),
|
||||||
TokenKind.SwitchStatement =>
|
BoundNodeKind.SwitchStatement =>
|
||||||
EvaluateSwitchStatement((SwitchStatementSyntaxNode)statement),
|
EvaluateSwitchStatement((BoundSwitchStatement)node),
|
||||||
TokenKind.TryCatchStatement =>
|
BoundNodeKind.TryCatchStatement =>
|
||||||
EvaluateTryCatchStatement((TryCatchStatementSyntaxNode)statement),
|
EvaluateTryCatchStatement((BoundTryCatchStatement)node),
|
||||||
TokenKind.WhileStatement =>
|
BoundNodeKind.WhileStatement =>
|
||||||
EvaluateWhileStatement((WhileStatementSyntaxNode)statement),
|
EvaluateWhileStatement((BoundWhileStatement)node),
|
||||||
_ => throw new NotImplementedException($"Invalid statement kind '{statement.Kind}'."),
|
_ => throw new NotImplementedException($"Invalid statement kind '{node.Kind}'."),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateClassDeclaration(ClassDeclarationSyntaxNode statement)
|
private MObject? EvaluateClassDeclaration(BoundClassDeclaration node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateEmptyStatement(EmptyStatementSyntaxNode statement)
|
private MObject? EvaluateEmptyStatement(BoundEmptyStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateTryCatchStatement(TryCatchStatementSyntaxNode statement)
|
private MObject? EvaluateTryCatchStatement(BoundTryCatchStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateForStatement(ForStatementSyntaxNode statement)
|
private MObject? EvaluateForStatement(BoundForStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateIfStatement(IfStatementSyntaxNode statement)
|
private MObject? EvaluateIfStatement(BoundIfStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateWhileStatement(WhileStatementSyntaxNode statement)
|
private MObject? EvaluateWhileStatement(BoundWhileStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateSwitchStatement(SwitchStatementSyntaxNode statement)
|
private MObject? EvaluateSwitchStatement(BoundSwitchStatement node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateFunctionDeclaration(FunctionDeclarationSyntaxNode statement)
|
private MObject? EvaluateFunctionDeclaration(BoundFunctionDeclaration node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateAbstractMethodDeclaration(AbstractMethodDeclarationSyntaxNode statement)
|
private MObject? EvaluateAbstractMethodDeclaration(BoundAbstractMethodDeclaration node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateMethodDefinition(MethodDefinitionSyntaxNode statement)
|
private MObject? EvaluateMethodDefinition(BoundConcreteMethodDeclaration node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateExpressionStatement(ExpressionStatementSyntaxNode statement)
|
private MObject? EvaluateExpressionStatement(BoundExpressionStatement node)
|
||||||
{
|
{
|
||||||
return EvaluateExpression(statement.Expression);
|
return EvaluateExpression(node.Expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateExpression(ExpressionSyntaxNode expression)
|
private MObject? EvaluateExpression(BoundExpression node)
|
||||||
{
|
{
|
||||||
return expression.Kind switch
|
return node.Kind switch
|
||||||
{
|
{
|
||||||
TokenKind.ArrayLiteralExpression =>
|
BoundNodeKind.ArrayLiteralExpression =>
|
||||||
EvaluateArrayLiteralExpression((ArrayLiteralExpressionSyntaxNode)expression),
|
EvaluateArrayLiteralExpression((BoundArrayLiteralExpression)node),
|
||||||
TokenKind.AssignmentExpression =>
|
BoundNodeKind.AssignmentExpression =>
|
||||||
EvaluateAssignmentExpression((AssignmentExpressionSyntaxNode)expression),
|
EvaluateAssignmentExpression((BoundAssignmentExpression)node),
|
||||||
TokenKind.BinaryOperationExpression =>
|
BoundNodeKind.BinaryOperationExpression =>
|
||||||
EvaluateBinaryOperation((BinaryOperationExpressionSyntaxNode)expression),
|
EvaluateBinaryOperation((BoundBinaryOperationExpression)node),
|
||||||
TokenKind.CellArrayElementAccessExpression =>
|
BoundNodeKind.CellArrayElementAccessExpression =>
|
||||||
EvaluateCellArrayElementAccess((CellArrayElementAccessExpressionSyntaxNode)expression),
|
EvaluateCellArrayElementAccess((BoundCellArrayElementAccessExpression)node),
|
||||||
TokenKind.CellArrayLiteralExpression =>
|
BoundNodeKind.CellArrayLiteralExpression =>
|
||||||
EvaluateCellArrayLiteralExpression((CellArrayLiteralExpressionSyntaxNode)expression),
|
EvaluateCellArrayLiteralExpression((BoundCellArrayLiteralExpression)node),
|
||||||
TokenKind.ClassInvokationExpression =>
|
BoundNodeKind.ClassInvokationExpression =>
|
||||||
EvaluateClassInvokation((BaseClassInvokationSyntaxNode)expression),
|
EvaluateClassInvokation((BoundClassInvokationExpression)node),
|
||||||
TokenKind.CommandExpression =>
|
BoundNodeKind.CommandExpression =>
|
||||||
EvaluateCommand((CommandExpressionSyntaxNode)expression),
|
EvaluateCommand((BoundCommandExpression)node),
|
||||||
TokenKind.CompoundNameExpression =>
|
BoundNodeKind.CompoundNameExpression =>
|
||||||
EvaluateCompoundName((CompoundNameExpressionSyntaxNode)expression),
|
EvaluateCompoundName((BoundCompoundNameExpression)node),
|
||||||
TokenKind.DoubleQuotedStringLiteralExpression =>
|
BoundNodeKind.DoubleQuotedStringLiteralExpression =>
|
||||||
EvaluateDoubleQuotedStringLiteralExpression((DoubleQuotedStringLiteralSyntaxNode)expression),
|
EvaluateDoubleQuotedStringLiteralExpression((BoundDoubleQuotedStringLiteralExpression)node),
|
||||||
TokenKind.EmptyExpression =>
|
BoundNodeKind.EmptyExpression =>
|
||||||
EvaluateEmptyExpression((EmptyExpressionSyntaxNode)expression),
|
EvaluateEmptyExpression((BoundEmptyExpression)node),
|
||||||
TokenKind.FunctionCallExpression =>
|
BoundNodeKind.FunctionCallExpression =>
|
||||||
EvaluateFunctionCall((FunctionCallExpressionSyntaxNode)expression),
|
EvaluateFunctionCall((BoundFunctionCallExpression)node),
|
||||||
TokenKind.IdentifierNameExpression =>
|
BoundNodeKind.IdentifierNameExpression =>
|
||||||
EvaluateIdentifierNameExpression((IdentifierNameExpressionSyntaxNode)expression),
|
EvaluateIdentifierNameExpression((BoundIdentifierNameExpression)node),
|
||||||
TokenKind.IndirectMemberAccessExpression =>
|
BoundNodeKind.IndirectMemberAccessExpression =>
|
||||||
EvaluateIndirectMemberAccess((IndirectMemberAccessSyntaxNode)expression),
|
EvaluateIndirectMemberAccess((BoundIndirectMemberAccessExpression)node),
|
||||||
TokenKind.LambdaExpression =>
|
BoundNodeKind.LambdaExpression =>
|
||||||
EvaluateLambdaExpression((LambdaExpressionSyntaxNode)expression),
|
EvaluateLambdaExpression((BoundLambdaExpression)node),
|
||||||
TokenKind.MemberAccessExpression =>
|
BoundNodeKind.MemberAccessExpression =>
|
||||||
EvaluateMemberAccess((MemberAccessSyntaxNode)expression),
|
EvaluateMemberAccess((BoundMemberAccessExpression)node),
|
||||||
TokenKind.NamedFunctionHandleExpression =>
|
BoundNodeKind.NamedFunctionHandleExpression =>
|
||||||
EvaluateNamedFunctionHandleExpression((NamedFunctionHandleExpressionSyntaxNode)expression),
|
EvaluateNamedFunctionHandleExpression((BoundNamedFunctionHandleExpression)node),
|
||||||
TokenKind.NumberLiteralExpression =>
|
BoundNodeKind.NumberLiteralExpression =>
|
||||||
EvaluateNumberLiteralExpression((NumberLiteralSyntaxNode)expression),
|
EvaluateNumberLiteralExpression((BoundNumberLiteralExpression)node),
|
||||||
TokenKind.ParenthesizedExpression =>
|
BoundNodeKind.ParenthesizedExpression =>
|
||||||
EvaluateParenthesizedExpression((ParenthesizedExpressionSyntaxNode)expression),
|
EvaluateParenthesizedExpression((BoundParenthesizedExpression)node),
|
||||||
TokenKind.StringLiteralExpression =>
|
BoundNodeKind.StringLiteralExpression =>
|
||||||
EvaluateStringLiteralExpression((StringLiteralSyntaxNode)expression),
|
EvaluateStringLiteralExpression((BoundStringLiteralExpression)node),
|
||||||
TokenKind.UnaryPrefixOperationExpression =>
|
BoundNodeKind.UnaryPrefixOperationExpression =>
|
||||||
EvaluateUnaryPrefixOperationExpression((UnaryPrefixOperationExpressionSyntaxNode)expression),
|
EvaluateUnaryPrefixOperationExpression((BoundUnaryPrefixOperationExpression)node),
|
||||||
TokenKind.UnaryPostfixOperationExpression =>
|
BoundNodeKind.UnaryPostfixOperationExpression =>
|
||||||
EvaluateUnaryPostfixOperationExpression((UnaryPostixOperationExpressionSyntaxNode)expression),
|
EvaluateUnaryPostfixOperationExpression((BoundUnaryPostfixOperationExpression)node),
|
||||||
TokenKind.UnquotedStringLiteralExpression =>
|
BoundNodeKind.UnquotedStringLiteralExpression =>
|
||||||
EvaluateUnquotedStringLiteralExpression((UnquotedStringLiteralSyntaxNode)expression),
|
EvaluateUnquotedStringLiteralExpression((BoundUnquotedStringLiteralExpression)node),
|
||||||
_ => throw new NotImplementedException($"Invalid expression kind '{expression.Kind}'."),
|
_ => throw new NotImplementedException($"Invalid expression kind '{node.Kind}'."),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateParenthesizedExpression(ParenthesizedExpressionSyntaxNode expression)
|
private MObject? EvaluateParenthesizedExpression(BoundParenthesizedExpression node)
|
||||||
{
|
{
|
||||||
return EvaluateExpression(expression.Expression);
|
return EvaluateExpression(node.Expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateClassInvokation(BaseClassInvokationSyntaxNode expression)
|
private MObject? EvaluateClassInvokation(BoundClassInvokationExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateCommand(CommandExpressionSyntaxNode expression)
|
private MObject? EvaluateCommand(BoundCommandExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateIndirectMemberAccess(IndirectMemberAccessSyntaxNode expression)
|
private MObject? EvaluateIndirectMemberAccess(BoundIndirectMemberAccessExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateUnaryPostfixOperationExpression(UnaryPostixOperationExpressionSyntaxNode expression)
|
private MObject? EvaluateUnaryPostfixOperationExpression(BoundUnaryPostfixOperationExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateMemberAccess(MemberAccessSyntaxNode expression)
|
private MObject? EvaluateMemberAccess(BoundMemberAccessExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateFunctionCall(FunctionCallExpressionSyntaxNode expression)
|
private MObject? EvaluateFunctionCall(BoundFunctionCallExpression node)
|
||||||
{
|
{
|
||||||
var arguments = new List<MObject>();
|
var arguments = new List<MObject>();
|
||||||
var nodes = expression.Nodes.Where(n => n.IsNode).Select(n => (ExpressionSyntaxNode)n.AsNode()!);
|
|
||||||
var allGood = true;
|
var allGood = true;
|
||||||
foreach (var node in nodes)
|
foreach (var argument in node.Arguments)
|
||||||
{
|
{
|
||||||
var argument = EvaluateExpression(node);
|
var evaluatedArgument = EvaluateExpression(argument);
|
||||||
if (argument is null)
|
if (argument is null)
|
||||||
{
|
{
|
||||||
_diagnostics.ReportCannotEvaluateExpression(
|
_diagnostics.ReportCannotEvaluateExpression(
|
||||||
new TextSpan(node.Position, node.FullWidth));
|
new TextSpan(argument.Syntax.Position, argument.Syntax.FullWidth));
|
||||||
allGood = false;
|
allGood = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
arguments.Add(argument);
|
arguments.Add(evaluatedArgument);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -237,7 +233,7 @@ namespace Parser
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var function = GetFunctionSymbol(expression.FunctionName);
|
var function = GetFunctionSymbol(node.Name);
|
||||||
if (function.Name == "disp")
|
if (function.Name == "disp")
|
||||||
{
|
{
|
||||||
return EvaluateDisp(arguments);
|
return EvaluateDisp(arguments);
|
||||||
@ -256,128 +252,126 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine(arguments[0]);
|
Console.WriteLine(arguments[0]);
|
||||||
return null;
|
return arguments[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
private FunctionSymbol GetFunctionSymbol(ExpressionSyntaxNode functionName)
|
private FunctionSymbol GetFunctionSymbol(BoundExpression functionName)
|
||||||
{
|
{
|
||||||
if (functionName.Kind == TokenKind.IdentifierNameExpression)
|
if (functionName.Kind == BoundNodeKind.IdentifierNameExpression)
|
||||||
{
|
{
|
||||||
return new FunctionSymbol(((IdentifierNameExpressionSyntaxNode)functionName).Text);
|
return new FunctionSymbol(((BoundIdentifierNameExpression)functionName).Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotImplementedException($"Unknown function symbol '{functionName.Text}'.");
|
throw new NotImplementedException($"Unknown function symbol '{functionName.Syntax.Text}'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateCellArrayElementAccess(CellArrayElementAccessExpressionSyntaxNode expression)
|
private MObject? EvaluateCellArrayElementAccess(BoundCellArrayElementAccessExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateCellArrayLiteralExpression(CellArrayLiteralExpressionSyntaxNode expression)
|
private MObject? EvaluateCellArrayLiteralExpression(BoundCellArrayLiteralExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateArrayLiteralExpression(ArrayLiteralExpressionSyntaxNode expression)
|
private MObject? EvaluateArrayLiteralExpression(BoundArrayLiteralExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateUnquotedStringLiteralExpression(UnquotedStringLiteralSyntaxNode expression)
|
private MObject? EvaluateUnquotedStringLiteralExpression(BoundUnquotedStringLiteralExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateDoubleQuotedStringLiteralExpression(DoubleQuotedStringLiteralSyntaxNode expression)
|
private MObject? EvaluateDoubleQuotedStringLiteralExpression(BoundDoubleQuotedStringLiteralExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateStringLiteralExpression(StringLiteralSyntaxNode expression)
|
private MObject? EvaluateStringLiteralExpression(BoundStringLiteralExpression node)
|
||||||
{
|
{
|
||||||
return expression.StringToken.Value switch
|
return node.Value switch
|
||||||
{
|
{
|
||||||
string s => MObject.CreateCharArray(s.ToCharArray()),
|
string s => MObject.CreateCharArray(s.ToCharArray()),
|
||||||
_ => null,
|
_ => null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateNumberLiteralExpression(NumberLiteralSyntaxNode expression)
|
private MObject? EvaluateNumberLiteralExpression(BoundNumberLiteralExpression node)
|
||||||
{
|
{
|
||||||
return expression.Number.Value is double value
|
return MObject.CreateDoubleNumber(node.Value);
|
||||||
? MObject.CreateDoubleNumber(value)
|
|
||||||
: null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateIdentifierNameExpression(IdentifierNameExpressionSyntaxNode expression)
|
private MObject? EvaluateIdentifierNameExpression(BoundIdentifierNameExpression node)
|
||||||
{
|
{
|
||||||
var variableName = expression.Name.Text;
|
var variableName = node.Name;
|
||||||
var maybeValue = GetVariableValue(variableName);
|
var maybeValue = GetVariableValue(variableName);
|
||||||
if (maybeValue is null)
|
if (maybeValue is null)
|
||||||
{
|
{
|
||||||
_diagnostics.ReportVariableNotFound(
|
_diagnostics.ReportVariableNotFound(
|
||||||
new TextSpan(expression.Name.Position, expression.Name.Text.Length),
|
new TextSpan(node.Syntax.Position, node.Syntax.FullWidth),
|
||||||
variableName);
|
variableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return maybeValue;
|
return maybeValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateBinaryOperation(BinaryOperationExpressionSyntaxNode expression)
|
private MObject? EvaluateBinaryOperation(BoundBinaryOperationExpression node)
|
||||||
{
|
{
|
||||||
var left = EvaluateExpression(expression.Lhs);
|
var left = EvaluateExpression(node.Left);
|
||||||
if (left is null)
|
if (left is null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var right = EvaluateExpression(expression.Rhs);
|
var right = EvaluateExpression(node.Right);
|
||||||
if (right is null)
|
if (right is null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return expression.Operation.Kind switch
|
return node.Op.Kind switch
|
||||||
{
|
{
|
||||||
TokenKind.PlusToken => MOperations.Plus(left, right),
|
BoundBinaryOperatorKind.Plus => MOperations.Plus(left, right),
|
||||||
TokenKind.MinusToken => MOperations.Minus(left, right),
|
BoundBinaryOperatorKind.Minus => MOperations.Minus(left, right),
|
||||||
TokenKind.StarToken => MOperations.Star(left, right),
|
BoundBinaryOperatorKind.Star => MOperations.Star(left, right),
|
||||||
TokenKind.SlashToken => MOperations.Slash(left, right),
|
BoundBinaryOperatorKind.Slash => MOperations.Slash(left, right),
|
||||||
_ => throw new NotImplementedException($"Binary operation {expression.Operation.Kind} is not implemented."),
|
_ => throw new NotImplementedException($"Binary operation {node.Op.Kind} is not implemented."),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateCompoundName(CompoundNameExpressionSyntaxNode expression)
|
private MObject? EvaluateCompoundName(BoundCompoundNameExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateUnaryPrefixOperationExpression(UnaryPrefixOperationExpressionSyntaxNode expression)
|
private MObject? EvaluateUnaryPrefixOperationExpression(BoundUnaryPrefixOperationExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateEmptyExpression(EmptyExpressionSyntaxNode expression)
|
private MObject? EvaluateEmptyExpression(BoundEmptyExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateAssignmentExpression(AssignmentExpressionSyntaxNode expression)
|
private MObject? EvaluateAssignmentExpression(BoundAssignmentExpression node)
|
||||||
{
|
{
|
||||||
var rightValue = EvaluateExpression(expression.Rhs);
|
var rightValue = EvaluateExpression(node.Right);
|
||||||
if (rightValue is null)
|
if (rightValue is null)
|
||||||
{
|
{
|
||||||
_diagnostics.ReportCannotEvaluateExpression(
|
_diagnostics.ReportCannotEvaluateExpression(
|
||||||
new TextSpan(expression.Rhs.Position, expression.Rhs.Position + expression.Rhs.FullWidth));
|
new TextSpan(node.Right.Syntax.Position, node.Right.Syntax.Position + node.Right.Syntax.FullWidth));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var left = expression.Lhs;
|
var left = node.Left;
|
||||||
if (left.Kind == TokenKind.IdentifierNameExpression)
|
if (left.Kind == BoundNodeKind.IdentifierNameExpression)
|
||||||
{
|
{
|
||||||
var leftIdentifier = (IdentifierNameExpressionSyntaxNode)left;
|
var leftIdentifier = (BoundIdentifierNameExpression)left;
|
||||||
var variableName = leftIdentifier.Name.Text;
|
var variableName = leftIdentifier.Name;
|
||||||
SetVariableValue(variableName, rightValue);
|
SetVariableValue(variableName, rightValue);
|
||||||
return rightValue;
|
return rightValue;
|
||||||
}
|
}
|
||||||
@ -428,12 +422,12 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateLambdaExpression(LambdaExpressionSyntaxNode expression)
|
private MObject? EvaluateLambdaExpression(BoundLambdaExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private MObject? EvaluateNamedFunctionHandleExpression(NamedFunctionHandleExpressionSyntaxNode expression)
|
private MObject? EvaluateNamedFunctionHandleExpression(BoundNamedFunctionHandleExpression node)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -307,13 +307,13 @@ namespace Parser.Internal
|
|||||||
switch (token.Kind)
|
switch (token.Kind)
|
||||||
{
|
{
|
||||||
case TokenKind.NumberLiteralToken:
|
case TokenKind.NumberLiteralToken:
|
||||||
expression = Factory.NumberLiteralSyntax(EatToken());
|
expression = Factory.NumberLiteralExpressionSyntax(EatToken());
|
||||||
break;
|
break;
|
||||||
case TokenKind.StringLiteralToken:
|
case TokenKind.StringLiteralToken:
|
||||||
expression = Factory.StringLiteralSyntax(EatToken());
|
expression = Factory.StringLiteralExpressionSyntax(EatToken());
|
||||||
break;
|
break;
|
||||||
case TokenKind.DoubleQuotedStringLiteralToken:
|
case TokenKind.DoubleQuotedStringLiteralToken:
|
||||||
expression = Factory.DoubleQuotedStringLiteralSyntax(EatToken());
|
expression = Factory.DoubleQuotedStringLiteralExpressionSyntax(EatToken());
|
||||||
break;
|
break;
|
||||||
case TokenKind.OpenSquareBracketToken:
|
case TokenKind.OpenSquareBracketToken:
|
||||||
expression = ParseArrayLiteral();
|
expression = ParseArrayLiteral();
|
||||||
@ -378,13 +378,13 @@ namespace Parser.Internal
|
|||||||
break;
|
break;
|
||||||
case TokenKind.DotToken: // member access
|
case TokenKind.DotToken: // member access
|
||||||
if (expression is IdentifierNameExpressionSyntaxNode
|
if (expression is IdentifierNameExpressionSyntaxNode
|
||||||
|| expression is MemberAccessSyntaxNode
|
|| expression is MemberAccessExpressionSyntaxNode
|
||||||
|| expression is FunctionCallExpressionSyntaxNode
|
|| expression is FunctionCallExpressionSyntaxNode
|
||||||
|| expression is CellArrayElementAccessExpressionSyntaxNode)
|
|| expression is CellArrayElementAccessExpressionSyntaxNode)
|
||||||
{
|
{
|
||||||
var dot = EatToken();
|
var dot = EatToken();
|
||||||
var member = ParseMemberAccess();
|
var member = ParseMemberAccess();
|
||||||
expression = Factory.MemberAccessSyntax(expression, dot, member);
|
expression = Factory.MemberAccessExpressionSyntax(expression, dot, member);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -396,7 +396,7 @@ namespace Parser.Internal
|
|||||||
case TokenKind.ApostropheToken:
|
case TokenKind.ApostropheToken:
|
||||||
case TokenKind.DotApostropheToken:
|
case TokenKind.DotApostropheToken:
|
||||||
var operation = EatToken();
|
var operation = EatToken();
|
||||||
expression = Factory.UnaryPostixOperationExpressionSyntax(expression, operation);
|
expression = Factory.UnaryPostfixOperationExpressionSyntax(expression, operation);
|
||||||
break;
|
break;
|
||||||
case TokenKind.UnquotedStringLiteralToken:
|
case TokenKind.UnquotedStringLiteralToken:
|
||||||
return ParseCommandExpression(expression);
|
return ParseCommandExpression(expression);
|
||||||
@ -416,10 +416,10 @@ namespace Parser.Internal
|
|||||||
{
|
{
|
||||||
if (expression is IdentifierNameExpressionSyntaxNode idNameNode)
|
if (expression is IdentifierNameExpressionSyntaxNode idNameNode)
|
||||||
{
|
{
|
||||||
var builder = new SyntaxListBuilder<UnquotedStringLiteralSyntaxNode>();
|
var builder = new SyntaxListBuilder<UnquotedStringLiteralExpressionSyntaxNode>();
|
||||||
while (CurrentToken.Kind == TokenKind.UnquotedStringLiteralToken)
|
while (CurrentToken.Kind == TokenKind.UnquotedStringLiteralToken)
|
||||||
{
|
{
|
||||||
builder.Add(Factory.UnquotedStringLiteralSyntax(EatToken()));
|
builder.Add(Factory.UnquotedStringLiteralExpressionSyntax(EatToken()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Factory.CommandExpressionSyntax(idNameNode._name, builder.ToList());
|
return Factory.CommandExpressionSyntax(idNameNode._name, builder.ToList());
|
||||||
@ -432,7 +432,7 @@ namespace Parser.Internal
|
|||||||
throw new ParsingException($"Unexpected token \"{CurrentToken}\" while parsing expression \"{expression.FullText}\" at {CurrentPosition}.");
|
throw new ParsingException($"Unexpected token \"{CurrentToken}\" while parsing expression \"{expression.FullText}\" at {CurrentPosition}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseClassInvokationSyntaxNode ParseBaseClassInvokation(ExpressionSyntaxNode expression)
|
private ClassInvokationExpressionSyntaxNode ParseBaseClassInvokation(ExpressionSyntaxNode expression)
|
||||||
{
|
{
|
||||||
if (expression is IdentifierNameExpressionSyntaxNode methodName
|
if (expression is IdentifierNameExpressionSyntaxNode methodName
|
||||||
&& !expression.TrailingTrivia.Any())
|
&& !expression.TrailingTrivia.Any())
|
||||||
@ -443,9 +443,9 @@ namespace Parser.Internal
|
|||||||
{
|
{
|
||||||
throw new Exception($"Base class name cannot be empty.");
|
throw new Exception($"Base class name cannot be empty.");
|
||||||
}
|
}
|
||||||
return Factory.BaseClassInvokationSyntax(methodName, atToken, baseClassNameWithArguments);
|
return Factory.ClassInvokationExpressionSyntax(methodName, atToken, baseClassNameWithArguments);
|
||||||
}
|
}
|
||||||
if (expression is MemberAccessSyntaxNode memberAccess
|
if (expression is MemberAccessExpressionSyntaxNode memberAccess
|
||||||
&& !expression.TrailingTrivia.Any())
|
&& !expression.TrailingTrivia.Any())
|
||||||
{
|
{
|
||||||
var atToken = EatToken();
|
var atToken = EatToken();
|
||||||
@ -454,7 +454,7 @@ namespace Parser.Internal
|
|||||||
{
|
{
|
||||||
throw new Exception($"Base class name cannot be empty.");
|
throw new Exception($"Base class name cannot be empty.");
|
||||||
}
|
}
|
||||||
return Factory.BaseClassInvokationSyntax(memberAccess, atToken, baseClassNameWithArguments);
|
return Factory.ClassInvokationExpressionSyntax(memberAccess, atToken, baseClassNameWithArguments);
|
||||||
}
|
}
|
||||||
throw new ParsingException($"Unexpected token \"{CurrentToken}\" at {CurrentPosition}.");
|
throw new ParsingException($"Unexpected token \"{CurrentToken}\" at {CurrentPosition}.");
|
||||||
}
|
}
|
||||||
@ -474,7 +474,7 @@ namespace Parser.Internal
|
|||||||
throw new Exception("Indirect member invokation cannot be empty.");
|
throw new Exception("Indirect member invokation cannot be empty.");
|
||||||
}
|
}
|
||||||
var closingBracket = EatToken(TokenKind.CloseParenthesisToken);
|
var closingBracket = EatToken(TokenKind.CloseParenthesisToken);
|
||||||
return Factory.IndirectMemberAccessSyntax(
|
return Factory.IndirectMemberAccessExpressionSyntax(
|
||||||
openingBracket,
|
openingBracket,
|
||||||
indirectMember,
|
indirectMember,
|
||||||
closingBracket);
|
closingBracket);
|
||||||
@ -920,7 +920,7 @@ namespace Parser.Internal
|
|||||||
throw new ParsingException($"Unexpected token {CurrentToken} while parsing method declaration at {CurrentPosition}.");
|
throw new ParsingException($"Unexpected token {CurrentToken} while parsing method declaration at {CurrentPosition}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private MethodDefinitionSyntaxNode ParseMethodDefinition()
|
private ConcreteMethodDeclarationSyntaxNode ParseMethodDefinition()
|
||||||
{
|
{
|
||||||
var functionKeyword = EatIdentifier("function");
|
var functionKeyword = EatIdentifier("function");
|
||||||
var outputDescription = ParseFunctionOutputDescription();
|
var outputDescription = ParseFunctionOutputDescription();
|
||||||
@ -929,7 +929,7 @@ namespace Parser.Internal
|
|||||||
var commas = ParseOptionalCommas();
|
var commas = ParseOptionalCommas();
|
||||||
var body = ParseStatementList();
|
var body = ParseStatementList();
|
||||||
var endKeyword = ParseEndKeyword();
|
var endKeyword = ParseEndKeyword();
|
||||||
return Factory.MethodDefinitionSyntax(
|
return Factory.ConcreteMethodDeclarationSyntax(
|
||||||
functionKeyword,
|
functionKeyword,
|
||||||
outputDescription,
|
outputDescription,
|
||||||
name,
|
name,
|
||||||
|
@ -118,24 +118,24 @@ namespace Parser.Internal
|
|||||||
return new IdentifierNameExpressionSyntaxNode(name);
|
return new IdentifierNameExpressionSyntaxNode(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NumberLiteralSyntaxNode NumberLiteralSyntax(SyntaxToken number)
|
public NumberLiteralExpressionSyntaxNode NumberLiteralExpressionSyntax(SyntaxToken number)
|
||||||
{
|
{
|
||||||
return new NumberLiteralSyntaxNode(number);
|
return new NumberLiteralExpressionSyntaxNode(number);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringLiteralSyntaxNode StringLiteralSyntax(SyntaxToken stringToken)
|
public StringLiteralExpressionSyntaxNode StringLiteralExpressionSyntax(SyntaxToken stringToken)
|
||||||
{
|
{
|
||||||
return new StringLiteralSyntaxNode(stringToken);
|
return new StringLiteralExpressionSyntaxNode(stringToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DoubleQuotedStringLiteralSyntaxNode DoubleQuotedStringLiteralSyntax(SyntaxToken stringToken)
|
public DoubleQuotedStringLiteralExpressionSyntaxNode DoubleQuotedStringLiteralExpressionSyntax(SyntaxToken stringToken)
|
||||||
{
|
{
|
||||||
return new DoubleQuotedStringLiteralSyntaxNode(stringToken);
|
return new DoubleQuotedStringLiteralExpressionSyntaxNode(stringToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UnquotedStringLiteralSyntaxNode UnquotedStringLiteralSyntax(SyntaxToken stringToken)
|
public UnquotedStringLiteralExpressionSyntaxNode UnquotedStringLiteralExpressionSyntax(SyntaxToken stringToken)
|
||||||
{
|
{
|
||||||
return new UnquotedStringLiteralSyntaxNode(stringToken);
|
return new UnquotedStringLiteralExpressionSyntaxNode(stringToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayLiteralExpressionSyntaxNode ArrayLiteralExpressionSyntax(SyntaxToken openingSquareBracket, SyntaxList nodes, SyntaxToken closingSquareBracket)
|
public ArrayLiteralExpressionSyntaxNode ArrayLiteralExpressionSyntax(SyntaxToken openingSquareBracket, SyntaxList nodes, SyntaxToken closingSquareBracket)
|
||||||
@ -163,29 +163,29 @@ namespace Parser.Internal
|
|||||||
return new FunctionCallExpressionSyntaxNode(functionName, openingBracket, nodes, closingBracket);
|
return new FunctionCallExpressionSyntaxNode(functionName, openingBracket, nodes, closingBracket);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MemberAccessSyntaxNode MemberAccessSyntax(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand)
|
public MemberAccessExpressionSyntaxNode MemberAccessExpressionSyntax(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand)
|
||||||
{
|
{
|
||||||
return new MemberAccessSyntaxNode(leftOperand, dot, rightOperand);
|
return new MemberAccessExpressionSyntaxNode(leftOperand, dot, rightOperand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UnaryPostixOperationExpressionSyntaxNode UnaryPostixOperationExpressionSyntax(ExpressionSyntaxNode operand, SyntaxToken operation)
|
public UnaryPostfixOperationExpressionSyntaxNode UnaryPostfixOperationExpressionSyntax(ExpressionSyntaxNode operand, SyntaxToken operation)
|
||||||
{
|
{
|
||||||
return new UnaryPostixOperationExpressionSyntaxNode(operand, operation);
|
return new UnaryPostfixOperationExpressionSyntaxNode(operand, operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndirectMemberAccessSyntaxNode IndirectMemberAccessSyntax(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket)
|
public IndirectMemberAccessExpressionSyntaxNode IndirectMemberAccessExpressionSyntax(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket)
|
||||||
{
|
{
|
||||||
return new IndirectMemberAccessSyntaxNode(openingBracket, expression, closingBracket);
|
return new IndirectMemberAccessExpressionSyntaxNode(openingBracket, expression, closingBracket);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandExpressionSyntaxNode CommandExpressionSyntax(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralSyntaxNode> arguments)
|
public CommandExpressionSyntaxNode CommandExpressionSyntax(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralExpressionSyntaxNode> arguments)
|
||||||
{
|
{
|
||||||
return new CommandExpressionSyntaxNode(commandName, arguments);
|
return new CommandExpressionSyntaxNode(commandName, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseClassInvokationSyntaxNode BaseClassInvokationSyntax(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments)
|
public ClassInvokationExpressionSyntaxNode ClassInvokationExpressionSyntax(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments)
|
||||||
{
|
{
|
||||||
return new BaseClassInvokationSyntaxNode(methodName, atSign, baseClassNameAndArguments);
|
return new ClassInvokationExpressionSyntaxNode(methodName, atSign, baseClassNameAndArguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AttributeAssignmentSyntaxNode AttributeAssignmentSyntax(SyntaxToken assignmentSign, ExpressionSyntaxNode value)
|
public AttributeAssignmentSyntaxNode AttributeAssignmentSyntax(SyntaxToken assignmentSign, ExpressionSyntaxNode value)
|
||||||
@ -203,9 +203,9 @@ namespace Parser.Internal
|
|||||||
return new AttributeListSyntaxNode(openingBracket, nodes, closingBracket);
|
return new AttributeListSyntaxNode(openingBracket, nodes, closingBracket);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MethodDefinitionSyntaxNode MethodDefinitionSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword)
|
public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword)
|
||||||
{
|
{
|
||||||
return new MethodDefinitionSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword);
|
return new ConcreteMethodDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AbstractMethodDeclarationSyntaxNode AbstractMethodDeclarationSyntax(FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription)
|
public AbstractMethodDeclarationSyntaxNode AbstractMethodDeclarationSyntax(FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription)
|
||||||
|
@ -1105,17 +1105,17 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class NumberLiteralSyntaxNode : ExpressionSyntaxNode
|
internal class NumberLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _number;
|
internal readonly SyntaxToken _number;
|
||||||
internal NumberLiteralSyntaxNode(SyntaxToken number): base(TokenKind.NumberLiteralExpression)
|
internal NumberLiteralExpressionSyntaxNode(SyntaxToken number): base(TokenKind.NumberLiteralExpression)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(number);
|
this.AdjustWidth(number);
|
||||||
_number = number;
|
_number = number;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal NumberLiteralSyntaxNode(SyntaxToken number, TokenDiagnostic[] diagnostics): base(TokenKind.NumberLiteralExpression, diagnostics)
|
internal NumberLiteralExpressionSyntaxNode(SyntaxToken number, TokenDiagnostic[] diagnostics): base(TokenKind.NumberLiteralExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(number);
|
this.AdjustWidth(number);
|
||||||
@ -1124,12 +1124,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.NumberLiteralSyntaxNode(parent, this, position);
|
return new Parser.NumberLiteralExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new NumberLiteralSyntaxNode(_number, diagnostics);
|
return new NumberLiteralExpressionSyntaxNode(_number, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1143,17 +1143,17 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class StringLiteralSyntaxNode : ExpressionSyntaxNode
|
internal class StringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _stringToken;
|
internal readonly SyntaxToken _stringToken;
|
||||||
internal StringLiteralSyntaxNode(SyntaxToken stringToken): base(TokenKind.StringLiteralExpression)
|
internal StringLiteralExpressionSyntaxNode(SyntaxToken stringToken): base(TokenKind.StringLiteralExpression)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
_stringToken = stringToken;
|
_stringToken = stringToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal StringLiteralSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.StringLiteralExpression, diagnostics)
|
internal StringLiteralExpressionSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.StringLiteralExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
@ -1162,12 +1162,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.StringLiteralSyntaxNode(parent, this, position);
|
return new Parser.StringLiteralExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new StringLiteralSyntaxNode(_stringToken, diagnostics);
|
return new StringLiteralExpressionSyntaxNode(_stringToken, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1181,17 +1181,17 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DoubleQuotedStringLiteralSyntaxNode : ExpressionSyntaxNode
|
internal class DoubleQuotedStringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _stringToken;
|
internal readonly SyntaxToken _stringToken;
|
||||||
internal DoubleQuotedStringLiteralSyntaxNode(SyntaxToken stringToken): base(TokenKind.DoubleQuotedStringLiteralExpression)
|
internal DoubleQuotedStringLiteralExpressionSyntaxNode(SyntaxToken stringToken): base(TokenKind.DoubleQuotedStringLiteralExpression)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
_stringToken = stringToken;
|
_stringToken = stringToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal DoubleQuotedStringLiteralSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.DoubleQuotedStringLiteralExpression, diagnostics)
|
internal DoubleQuotedStringLiteralExpressionSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.DoubleQuotedStringLiteralExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
@ -1200,12 +1200,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.DoubleQuotedStringLiteralSyntaxNode(parent, this, position);
|
return new Parser.DoubleQuotedStringLiteralExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new DoubleQuotedStringLiteralSyntaxNode(_stringToken, diagnostics);
|
return new DoubleQuotedStringLiteralExpressionSyntaxNode(_stringToken, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1219,17 +1219,17 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class UnquotedStringLiteralSyntaxNode : ExpressionSyntaxNode
|
internal class UnquotedStringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _stringToken;
|
internal readonly SyntaxToken _stringToken;
|
||||||
internal UnquotedStringLiteralSyntaxNode(SyntaxToken stringToken): base(TokenKind.UnquotedStringLiteralExpression)
|
internal UnquotedStringLiteralExpressionSyntaxNode(SyntaxToken stringToken): base(TokenKind.UnquotedStringLiteralExpression)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
_stringToken = stringToken;
|
_stringToken = stringToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UnquotedStringLiteralSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.UnquotedStringLiteralExpression, diagnostics)
|
internal UnquotedStringLiteralExpressionSyntaxNode(SyntaxToken stringToken, TokenDiagnostic[] diagnostics): base(TokenKind.UnquotedStringLiteralExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 1;
|
Slots = 1;
|
||||||
this.AdjustWidth(stringToken);
|
this.AdjustWidth(stringToken);
|
||||||
@ -1238,12 +1238,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.UnquotedStringLiteralSyntaxNode(parent, this, position);
|
return new Parser.UnquotedStringLiteralExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new UnquotedStringLiteralSyntaxNode(_stringToken, diagnostics);
|
return new UnquotedStringLiteralExpressionSyntaxNode(_stringToken, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1507,12 +1507,12 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MemberAccessSyntaxNode : ExpressionSyntaxNode
|
internal class MemberAccessExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxNode _leftOperand;
|
internal readonly SyntaxNode _leftOperand;
|
||||||
internal readonly SyntaxToken _dot;
|
internal readonly SyntaxToken _dot;
|
||||||
internal readonly SyntaxNode _rightOperand;
|
internal readonly SyntaxNode _rightOperand;
|
||||||
internal MemberAccessSyntaxNode(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand): base(TokenKind.MemberAccessExpression)
|
internal MemberAccessExpressionSyntaxNode(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand): base(TokenKind.MemberAccessExpression)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(leftOperand);
|
this.AdjustWidth(leftOperand);
|
||||||
@ -1523,7 +1523,7 @@ namespace Parser.Internal
|
|||||||
_rightOperand = rightOperand;
|
_rightOperand = rightOperand;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal MemberAccessSyntaxNode(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand, TokenDiagnostic[] diagnostics): base(TokenKind.MemberAccessExpression, diagnostics)
|
internal MemberAccessExpressionSyntaxNode(SyntaxNode leftOperand, SyntaxToken dot, SyntaxNode rightOperand, TokenDiagnostic[] diagnostics): base(TokenKind.MemberAccessExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(leftOperand);
|
this.AdjustWidth(leftOperand);
|
||||||
@ -1536,12 +1536,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.MemberAccessSyntaxNode(parent, this, position);
|
return new Parser.MemberAccessExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new MemberAccessSyntaxNode(_leftOperand, _dot, _rightOperand, diagnostics);
|
return new MemberAccessExpressionSyntaxNode(_leftOperand, _dot, _rightOperand, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1555,11 +1555,11 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class UnaryPostixOperationExpressionSyntaxNode : ExpressionSyntaxNode
|
internal class UnaryPostfixOperationExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly ExpressionSyntaxNode _operand;
|
internal readonly ExpressionSyntaxNode _operand;
|
||||||
internal readonly SyntaxToken _operation;
|
internal readonly SyntaxToken _operation;
|
||||||
internal UnaryPostixOperationExpressionSyntaxNode(ExpressionSyntaxNode operand, SyntaxToken operation): base(TokenKind.UnaryPostfixOperationExpression)
|
internal UnaryPostfixOperationExpressionSyntaxNode(ExpressionSyntaxNode operand, SyntaxToken operation): base(TokenKind.UnaryPostfixOperationExpression)
|
||||||
{
|
{
|
||||||
Slots = 2;
|
Slots = 2;
|
||||||
this.AdjustWidth(operand);
|
this.AdjustWidth(operand);
|
||||||
@ -1568,7 +1568,7 @@ namespace Parser.Internal
|
|||||||
_operation = operation;
|
_operation = operation;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UnaryPostixOperationExpressionSyntaxNode(ExpressionSyntaxNode operand, SyntaxToken operation, TokenDiagnostic[] diagnostics): base(TokenKind.UnaryPostfixOperationExpression, diagnostics)
|
internal UnaryPostfixOperationExpressionSyntaxNode(ExpressionSyntaxNode operand, SyntaxToken operation, TokenDiagnostic[] diagnostics): base(TokenKind.UnaryPostfixOperationExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 2;
|
Slots = 2;
|
||||||
this.AdjustWidth(operand);
|
this.AdjustWidth(operand);
|
||||||
@ -1579,12 +1579,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.UnaryPostixOperationExpressionSyntaxNode(parent, this, position);
|
return new Parser.UnaryPostfixOperationExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new UnaryPostixOperationExpressionSyntaxNode(_operand, _operation, diagnostics);
|
return new UnaryPostfixOperationExpressionSyntaxNode(_operand, _operation, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1598,12 +1598,12 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class IndirectMemberAccessSyntaxNode : ExpressionSyntaxNode
|
internal class IndirectMemberAccessExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _openingBracket;
|
internal readonly SyntaxToken _openingBracket;
|
||||||
internal readonly ExpressionSyntaxNode _expression;
|
internal readonly ExpressionSyntaxNode _expression;
|
||||||
internal readonly SyntaxToken _closingBracket;
|
internal readonly SyntaxToken _closingBracket;
|
||||||
internal IndirectMemberAccessSyntaxNode(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket): base(TokenKind.IndirectMemberAccessExpression)
|
internal IndirectMemberAccessExpressionSyntaxNode(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket): base(TokenKind.IndirectMemberAccessExpression)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(openingBracket);
|
this.AdjustWidth(openingBracket);
|
||||||
@ -1614,7 +1614,7 @@ namespace Parser.Internal
|
|||||||
_closingBracket = closingBracket;
|
_closingBracket = closingBracket;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IndirectMemberAccessSyntaxNode(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket, TokenDiagnostic[] diagnostics): base(TokenKind.IndirectMemberAccessExpression, diagnostics)
|
internal IndirectMemberAccessExpressionSyntaxNode(SyntaxToken openingBracket, ExpressionSyntaxNode expression, SyntaxToken closingBracket, TokenDiagnostic[] diagnostics): base(TokenKind.IndirectMemberAccessExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(openingBracket);
|
this.AdjustWidth(openingBracket);
|
||||||
@ -1627,12 +1627,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.IndirectMemberAccessSyntaxNode(parent, this, position);
|
return new Parser.IndirectMemberAccessExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new IndirectMemberAccessSyntaxNode(_openingBracket, _expression, _closingBracket, diagnostics);
|
return new IndirectMemberAccessExpressionSyntaxNode(_openingBracket, _expression, _closingBracket, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1649,8 +1649,8 @@ namespace Parser.Internal
|
|||||||
internal class CommandExpressionSyntaxNode : ExpressionSyntaxNode
|
internal class CommandExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _commandName;
|
internal readonly SyntaxToken _commandName;
|
||||||
internal readonly SyntaxList<UnquotedStringLiteralSyntaxNode> _arguments;
|
internal readonly SyntaxList<UnquotedStringLiteralExpressionSyntaxNode> _arguments;
|
||||||
internal CommandExpressionSyntaxNode(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralSyntaxNode> arguments): base(TokenKind.CommandExpression)
|
internal CommandExpressionSyntaxNode(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralExpressionSyntaxNode> arguments): base(TokenKind.CommandExpression)
|
||||||
{
|
{
|
||||||
Slots = 2;
|
Slots = 2;
|
||||||
this.AdjustWidth(commandName);
|
this.AdjustWidth(commandName);
|
||||||
@ -1659,7 +1659,7 @@ namespace Parser.Internal
|
|||||||
_arguments = arguments;
|
_arguments = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal CommandExpressionSyntaxNode(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralSyntaxNode> arguments, TokenDiagnostic[] diagnostics): base(TokenKind.CommandExpression, diagnostics)
|
internal CommandExpressionSyntaxNode(SyntaxToken commandName, SyntaxList<UnquotedStringLiteralExpressionSyntaxNode> arguments, TokenDiagnostic[] diagnostics): base(TokenKind.CommandExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 2;
|
Slots = 2;
|
||||||
this.AdjustWidth(commandName);
|
this.AdjustWidth(commandName);
|
||||||
@ -1689,12 +1689,12 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class BaseClassInvokationSyntaxNode : ExpressionSyntaxNode
|
internal class ClassInvokationExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly ExpressionSyntaxNode _methodName;
|
internal readonly ExpressionSyntaxNode _methodName;
|
||||||
internal readonly SyntaxToken _atSign;
|
internal readonly SyntaxToken _atSign;
|
||||||
internal readonly ExpressionSyntaxNode _baseClassNameAndArguments;
|
internal readonly ExpressionSyntaxNode _baseClassNameAndArguments;
|
||||||
internal BaseClassInvokationSyntaxNode(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments): base(TokenKind.ClassInvokationExpression)
|
internal ClassInvokationExpressionSyntaxNode(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments): base(TokenKind.ClassInvokationExpression)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(methodName);
|
this.AdjustWidth(methodName);
|
||||||
@ -1705,7 +1705,7 @@ namespace Parser.Internal
|
|||||||
_baseClassNameAndArguments = baseClassNameAndArguments;
|
_baseClassNameAndArguments = baseClassNameAndArguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal BaseClassInvokationSyntaxNode(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments, TokenDiagnostic[] diagnostics): base(TokenKind.ClassInvokationExpression, diagnostics)
|
internal ClassInvokationExpressionSyntaxNode(ExpressionSyntaxNode methodName, SyntaxToken atSign, ExpressionSyntaxNode baseClassNameAndArguments, TokenDiagnostic[] diagnostics): base(TokenKind.ClassInvokationExpression, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 3;
|
Slots = 3;
|
||||||
this.AdjustWidth(methodName);
|
this.AdjustWidth(methodName);
|
||||||
@ -1718,12 +1718,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.BaseClassInvokationSyntaxNode(parent, this, position);
|
return new Parser.ClassInvokationExpressionSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new BaseClassInvokationSyntaxNode(_methodName, _atSign, _baseClassNameAndArguments, diagnostics);
|
return new ClassInvokationExpressionSyntaxNode(_methodName, _atSign, _baseClassNameAndArguments, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
@ -1871,7 +1871,7 @@ namespace Parser.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MethodDefinitionSyntaxNode : MethodDeclarationSyntaxNode
|
internal class ConcreteMethodDeclarationSyntaxNode : MethodDeclarationSyntaxNode
|
||||||
{
|
{
|
||||||
internal readonly SyntaxToken _functionKeyword;
|
internal readonly SyntaxToken _functionKeyword;
|
||||||
internal readonly FunctionOutputDescriptionSyntaxNode? _outputDescription;
|
internal readonly FunctionOutputDescriptionSyntaxNode? _outputDescription;
|
||||||
@ -1880,7 +1880,7 @@ namespace Parser.Internal
|
|||||||
internal readonly SyntaxList<SyntaxToken> _commas;
|
internal readonly SyntaxList<SyntaxToken> _commas;
|
||||||
internal readonly SyntaxList _body;
|
internal readonly SyntaxList _body;
|
||||||
internal readonly EndKeywordSyntaxNode? _endKeyword;
|
internal readonly EndKeywordSyntaxNode? _endKeyword;
|
||||||
internal MethodDefinitionSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration)
|
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration)
|
||||||
{
|
{
|
||||||
Slots = 7;
|
Slots = 7;
|
||||||
this.AdjustWidth(functionKeyword);
|
this.AdjustWidth(functionKeyword);
|
||||||
@ -1899,7 +1899,7 @@ namespace Parser.Internal
|
|||||||
_endKeyword = endKeyword;
|
_endKeyword = endKeyword;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal MethodDefinitionSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics)
|
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics)
|
||||||
{
|
{
|
||||||
Slots = 7;
|
Slots = 7;
|
||||||
this.AdjustWidth(functionKeyword);
|
this.AdjustWidth(functionKeyword);
|
||||||
@ -1920,12 +1920,12 @@ namespace Parser.Internal
|
|||||||
|
|
||||||
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
|
||||||
{
|
{
|
||||||
return new Parser.MethodDefinitionSyntaxNode(parent, this, position);
|
return new Parser.ConcreteMethodDeclarationSyntaxNode(parent, this, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
|
||||||
{
|
{
|
||||||
return new MethodDefinitionSyntaxNode(_functionKeyword, _outputDescription, _name, _inputDescription, _commas, _body, _endKeyword, diagnostics);
|
return new ConcreteMethodDeclarationSyntaxNode(_functionKeyword, _outputDescription, _name, _inputDescription, _commas, _body, _endKeyword, diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GreenNode? GetSlot(int i)
|
public override GreenNode? GetSlot(int i)
|
||||||
|
@ -115,16 +115,16 @@
|
|||||||
<Class Name="IdentifierNameExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="IdentifierNameExpression">
|
<Class Name="IdentifierNameExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="IdentifierNameExpression">
|
||||||
<Field Type="SyntaxToken" Name="name" />
|
<Field Type="SyntaxToken" Name="name" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="NumberLiteralSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="NumberLiteralExpression">
|
<Class Name="NumberLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="NumberLiteralExpression">
|
||||||
<Field Type="SyntaxToken" Name="number" />
|
<Field Type="SyntaxToken" Name="number" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="StringLiteralSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="StringLiteralExpression">
|
<Class Name="StringLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="StringLiteralExpression">
|
||||||
<Field Type="SyntaxToken" Name="stringToken" />
|
<Field Type="SyntaxToken" Name="stringToken" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="DoubleQuotedStringLiteralSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="DoubleQuotedStringLiteralExpression">
|
<Class Name="DoubleQuotedStringLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="DoubleQuotedStringLiteralExpression">
|
||||||
<Field Type="SyntaxToken" Name="stringToken" />
|
<Field Type="SyntaxToken" Name="stringToken" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="UnquotedStringLiteralSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="UnquotedStringLiteralExpression">
|
<Class Name="UnquotedStringLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="UnquotedStringLiteralExpression">
|
||||||
<Field Type="SyntaxToken" Name="stringToken" />
|
<Field Type="SyntaxToken" Name="stringToken" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="ArrayLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="ArrayLiteralExpression">
|
<Class Name="ArrayLiteralExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="ArrayLiteralExpression">
|
||||||
@ -154,25 +154,25 @@
|
|||||||
<Field Type="SyntaxList" Name="nodes" />
|
<Field Type="SyntaxList" Name="nodes" />
|
||||||
<Field Type="SyntaxToken" Name="closingBracket" />
|
<Field Type="SyntaxToken" Name="closingBracket" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="MemberAccessSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="MemberAccessExpression">
|
<Class Name="MemberAccessExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="MemberAccessExpression">
|
||||||
<Field Type="SyntaxNode" Name="leftOperand" />
|
<Field Type="SyntaxNode" Name="leftOperand" />
|
||||||
<Field Type="SyntaxToken" Name="dot" />
|
<Field Type="SyntaxToken" Name="dot" />
|
||||||
<Field Type="SyntaxNode" Name="rightOperand" />
|
<Field Type="SyntaxNode" Name="rightOperand" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="UnaryPostixOperationExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="UnaryPostfixOperationExpression">
|
<Class Name="UnaryPostfixOperationExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="UnaryPostfixOperationExpression">
|
||||||
<Field Type="ExpressionSyntaxNode" Name="operand" />
|
<Field Type="ExpressionSyntaxNode" Name="operand" />
|
||||||
<Field Type="SyntaxToken" Name="operation" />
|
<Field Type="SyntaxToken" Name="operation" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="IndirectMemberAccessSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="IndirectMemberAccessExpression">
|
<Class Name="IndirectMemberAccessExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="IndirectMemberAccessExpression">
|
||||||
<Field Type="SyntaxToken" Name="openingBracket" />
|
<Field Type="SyntaxToken" Name="openingBracket" />
|
||||||
<Field Type="ExpressionSyntaxNode" Name="expression" />
|
<Field Type="ExpressionSyntaxNode" Name="expression" />
|
||||||
<Field Type="SyntaxToken" Name="closingBracket" />
|
<Field Type="SyntaxToken" Name="closingBracket" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="CommandExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="CommandExpression">
|
<Class Name="CommandExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="CommandExpression">
|
||||||
<Field Type="SyntaxToken" Name="commandName" />
|
<Field Type="SyntaxToken" Name="commandName" />
|
||||||
<Field Type="SyntaxList<UnquotedStringLiteralSyntaxNode>" Name="arguments" />
|
<Field Type="SyntaxList<UnquotedStringLiteralExpressionSyntaxNode>" Name="arguments" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="BaseClassInvokationSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="ClassInvokationExpression">
|
<Class Name="ClassInvokationExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="ClassInvokationExpression">
|
||||||
<Field Type="ExpressionSyntaxNode" Name="methodName" />
|
<Field Type="ExpressionSyntaxNode" Name="methodName" />
|
||||||
<Field Type="SyntaxToken" Name="atSign" />
|
<Field Type="SyntaxToken" Name="atSign" />
|
||||||
<Field Type="ExpressionSyntaxNode" Name="baseClassNameAndArguments" />
|
<Field Type="ExpressionSyntaxNode" Name="baseClassNameAndArguments" />
|
||||||
@ -190,7 +190,7 @@
|
|||||||
<Field Type="SyntaxList" Name="nodes" />
|
<Field Type="SyntaxList" Name="nodes" />
|
||||||
<Field Type="SyntaxToken" Name="closingBracket" />
|
<Field Type="SyntaxToken" Name="closingBracket" />
|
||||||
</Class>
|
</Class>
|
||||||
<Class Name="MethodDefinitionSyntaxNode" BaseClass="MethodDeclarationSyntaxNode" Kind="ConcreteMethodDeclaration">
|
<Class Name="ConcreteMethodDeclarationSyntaxNode" BaseClass="MethodDeclarationSyntaxNode" Kind="ConcreteMethodDeclaration">
|
||||||
<Field Type="SyntaxToken" Name="functionKeyword" />
|
<Field Type="SyntaxToken" Name="functionKeyword" />
|
||||||
<Field Type="FunctionOutputDescriptionSyntaxNode" Name="outputDescription" Nullable="true" />
|
<Field Type="FunctionOutputDescriptionSyntaxNode" Name="outputDescription" Nullable="true" />
|
||||||
<Field Type="CompoundNameExpressionSyntaxNode" Name="name" />
|
<Field Type="CompoundNameExpressionSyntaxNode" Name="name" />
|
||||||
|
@ -1143,9 +1143,9 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NumberLiteralSyntaxNode : ExpressionSyntaxNode
|
public class NumberLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal NumberLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal NumberLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1153,7 +1153,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.NumberLiteralSyntaxNode)_green)._number, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.NumberLiteralExpressionSyntaxNode)_green)._number, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1169,13 +1169,13 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitNumberLiteral(this);
|
visitor.VisitNumberLiteralExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StringLiteralSyntaxNode : ExpressionSyntaxNode
|
public class StringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal StringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal StringLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1183,7 +1183,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.StringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.StringLiteralExpressionSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1199,13 +1199,13 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitStringLiteral(this);
|
visitor.VisitStringLiteralExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DoubleQuotedStringLiteralSyntaxNode : ExpressionSyntaxNode
|
public class DoubleQuotedStringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal DoubleQuotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal DoubleQuotedStringLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1213,7 +1213,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.DoubleQuotedStringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.DoubleQuotedStringLiteralExpressionSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1229,13 +1229,13 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitDoubleQuotedStringLiteral(this);
|
visitor.VisitDoubleQuotedStringLiteralExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UnquotedStringLiteralSyntaxNode : ExpressionSyntaxNode
|
public class UnquotedStringLiteralExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
internal UnquotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal UnquotedStringLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1243,7 +1243,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.UnquotedStringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.UnquotedStringLiteralExpressionSyntaxNode)_green)._stringToken, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1259,7 +1259,7 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitUnquotedStringLiteral(this);
|
visitor.VisitUnquotedStringLiteralExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1523,11 +1523,11 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MemberAccessSyntaxNode : ExpressionSyntaxNode
|
public class MemberAccessExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
private SyntaxNode? _leftOperand;
|
private SyntaxNode? _leftOperand;
|
||||||
private SyntaxNode? _rightOperand;
|
private SyntaxNode? _rightOperand;
|
||||||
internal MemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal MemberAccessExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1535,7 +1535,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.MemberAccessSyntaxNode)_green)._dot, this.GetChildPosition(1));
|
return new SyntaxToken(this, ((Parser.Internal.MemberAccessExpressionSyntaxNode)_green)._dot, this.GetChildPosition(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1569,14 +1569,14 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitMemberAccess(this);
|
visitor.VisitMemberAccessExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UnaryPostixOperationExpressionSyntaxNode : ExpressionSyntaxNode
|
public class UnaryPostfixOperationExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
private SyntaxNode? _operand;
|
private SyntaxNode? _operand;
|
||||||
internal UnaryPostixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal UnaryPostfixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1584,7 +1584,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.UnaryPostixOperationExpressionSyntaxNode)_green)._operation, this.GetChildPosition(1));
|
return new SyntaxToken(this, ((Parser.Internal.UnaryPostfixOperationExpressionSyntaxNode)_green)._operation, this.GetChildPosition(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1609,14 +1609,14 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitUnaryPostixOperationExpression(this);
|
visitor.VisitUnaryPostfixOperationExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IndirectMemberAccessSyntaxNode : ExpressionSyntaxNode
|
public class IndirectMemberAccessExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
private SyntaxNode? _expression;
|
private SyntaxNode? _expression;
|
||||||
internal IndirectMemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal IndirectMemberAccessExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1624,7 +1624,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._openingBracket, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessExpressionSyntaxNode)_green)._openingBracket, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1632,7 +1632,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._closingBracket, this.GetChildPosition(2));
|
return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessExpressionSyntaxNode)_green)._closingBracket, this.GetChildPosition(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1657,7 +1657,7 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitIndirectMemberAccess(this);
|
visitor.VisitIndirectMemberAccessExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1701,11 +1701,11 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BaseClassInvokationSyntaxNode : ExpressionSyntaxNode
|
public class ClassInvokationExpressionSyntaxNode : ExpressionSyntaxNode
|
||||||
{
|
{
|
||||||
private SyntaxNode? _methodName;
|
private SyntaxNode? _methodName;
|
||||||
private SyntaxNode? _baseClassNameAndArguments;
|
private SyntaxNode? _baseClassNameAndArguments;
|
||||||
internal BaseClassInvokationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal ClassInvokationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1713,7 +1713,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.BaseClassInvokationSyntaxNode)_green)._atSign, this.GetChildPosition(1));
|
return new SyntaxToken(this, ((Parser.Internal.ClassInvokationExpressionSyntaxNode)_green)._atSign, this.GetChildPosition(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1747,7 +1747,7 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitBaseClassInvokation(this);
|
visitor.VisitClassInvokationExpression(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1879,7 +1879,7 @@ namespace Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MethodDefinitionSyntaxNode : MethodDeclarationSyntaxNode
|
public class ConcreteMethodDeclarationSyntaxNode : MethodDeclarationSyntaxNode
|
||||||
{
|
{
|
||||||
private SyntaxNode? _outputDescription;
|
private SyntaxNode? _outputDescription;
|
||||||
private SyntaxNode? _name;
|
private SyntaxNode? _name;
|
||||||
@ -1887,7 +1887,7 @@ namespace Parser
|
|||||||
private SyntaxNode? _commas;
|
private SyntaxNode? _commas;
|
||||||
private SyntaxNode? _body;
|
private SyntaxNode? _body;
|
||||||
private SyntaxNode? _endKeyword;
|
private SyntaxNode? _endKeyword;
|
||||||
internal MethodDefinitionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
internal ConcreteMethodDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1895,7 +1895,7 @@ namespace Parser
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new SyntaxToken(this, ((Parser.Internal.MethodDefinitionSyntaxNode)_green)._functionKeyword, this.GetChildPosition(0));
|
return new SyntaxToken(this, ((Parser.Internal.ConcreteMethodDeclarationSyntaxNode)_green)._functionKeyword, this.GetChildPosition(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1965,7 +1965,7 @@ namespace Parser
|
|||||||
|
|
||||||
public override void Accept(SyntaxVisitor visitor)
|
public override void Accept(SyntaxVisitor visitor)
|
||||||
{
|
{
|
||||||
visitor.VisitMethodDefinition(this);
|
visitor.VisitConcreteMethodDeclaration(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,22 +118,22 @@ namespace Parser
|
|||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitNumberLiteral(NumberLiteralSyntaxNode node)
|
public virtual void VisitNumberLiteralExpression(NumberLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitStringLiteral(StringLiteralSyntaxNode node)
|
public virtual void VisitStringLiteralExpression(StringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitDoubleQuotedStringLiteral(DoubleQuotedStringLiteralSyntaxNode node)
|
public virtual void VisitDoubleQuotedStringLiteralExpression(DoubleQuotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitUnquotedStringLiteral(UnquotedStringLiteralSyntaxNode node)
|
public virtual void VisitUnquotedStringLiteralExpression(UnquotedStringLiteralExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
@ -163,17 +163,17 @@ namespace Parser
|
|||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitMemberAccess(MemberAccessSyntaxNode node)
|
public virtual void VisitMemberAccessExpression(MemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitUnaryPostixOperationExpression(UnaryPostixOperationExpressionSyntaxNode node)
|
public virtual void VisitUnaryPostfixOperationExpression(UnaryPostfixOperationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitIndirectMemberAccess(IndirectMemberAccessSyntaxNode node)
|
public virtual void VisitIndirectMemberAccessExpression(IndirectMemberAccessExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
@ -183,7 +183,7 @@ namespace Parser
|
|||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitBaseClassInvokation(BaseClassInvokationSyntaxNode node)
|
public virtual void VisitClassInvokationExpression(ClassInvokationExpressionSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
@ -203,7 +203,7 @@ namespace Parser
|
|||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void VisitMethodDefinition(MethodDefinitionSyntaxNode node)
|
public virtual void VisitConcreteMethodDeclaration(ConcreteMethodDeclarationSyntaxNode node)
|
||||||
{
|
{
|
||||||
DefaultVisit(node);
|
DefaultVisit(node);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using Parser;
|
using Parser;
|
||||||
|
|
||||||
namespace Repl
|
namespace Repl
|
||||||
@ -50,8 +51,7 @@ namespace Repl
|
|||||||
private string Evaluate(string submission)
|
private string Evaluate(string submission)
|
||||||
{
|
{
|
||||||
var tree = SyntaxTree.Parse(submission);
|
var tree = SyntaxTree.Parse(submission);
|
||||||
var compilation = Compilation.Create(tree);
|
if (tree.Diagnostics.Any())
|
||||||
if (tree.Diagnostics.Diagnostics.Count > 0)
|
|
||||||
{
|
{
|
||||||
foreach (var diagnostic in tree.Diagnostics.Diagnostics)
|
foreach (var diagnostic in tree.Diagnostics.Diagnostics)
|
||||||
{
|
{
|
||||||
@ -64,7 +64,7 @@ namespace Repl
|
|||||||
}
|
}
|
||||||
|
|
||||||
TreeRenderer.RenderTree(tree);
|
TreeRenderer.RenderTree(tree);
|
||||||
|
var compilation = Compilation.Create(tree);
|
||||||
var evaluationResult = compilation.Evaluate(_context);
|
var evaluationResult = compilation.Evaluate(_context);
|
||||||
|
|
||||||
foreach (var diagnostic in evaluationResult.Diagnostics)
|
foreach (var diagnostic in evaluationResult.Diagnostics)
|
||||||
|
@ -7,7 +7,7 @@ namespace Semantics
|
|||||||
{
|
{
|
||||||
public class GetClass
|
public class GetClass
|
||||||
{
|
{
|
||||||
private static MMethod MethodFromDefinition(MethodDefinitionSyntaxNode methodDefinition)
|
private static MMethod MethodFromDefinition(ConcreteMethodDeclarationSyntaxNode methodDefinition)
|
||||||
{
|
{
|
||||||
var name = methodDefinition.Name.Text;
|
var name = methodDefinition.Name.Text;
|
||||||
var description = "";
|
var description = "";
|
||||||
@ -42,7 +42,7 @@ namespace Semantics
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method.AsNode() is MethodDefinitionSyntaxNode methodDefinition)
|
if (method.AsNode() is ConcreteMethodDeclarationSyntaxNode methodDefinition)
|
||||||
{
|
{
|
||||||
result.Add(MethodFromDefinition(methodDefinition));
|
result.Add(MethodFromDefinition(methodDefinition));
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
x = 1;
|
x = 2;
|
||||||
disp(x + 2);
|
y = 3;
|
||||||
|
disp(x + y * y);
|
||||||
disp('Hello world!');
|
disp('Hello world!');
|
||||||
|
|
||||||
|
% x = 2 * 3;
|
||||||
|
% if x > 5
|
||||||
|
% y = 3;
|
||||||
|
% else
|
||||||
|
% y = 10;
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% disp(y);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user