/// <summary> /// Parses a for command /// </summary> private ICommandNode ParseForCommand() { Debugger.Write("Parsing For Command"); Position startPosition = CurrentToken.Position; Accept(TokenType.For); IdentifierNode identifier = ParseIdentifier(); // Declare I as a new variable of type integer with an undefined value VarDeclarationNode declaration = new VarDeclarationNode(identifier, new TypeDenoterNode( new IdentifierNode( new Token(TokenType.Identifier, "Integer", startPosition))), startPosition); // Evaluate E1 Accept(TokenType.Becomes); IExpressionNode becomesExpression = ParseExpression(); // Assign I to the value of E1 AssignCommandNode assign = new AssignCommandNode(identifier, becomesExpression); // Evaluate E2 Accept(TokenType.To); IExpressionNode toExpression = ParseExpression(); Accept(TokenType.Do); // Execute command ICommandNode command = ParseSingleCommand(); Accept(TokenType.Next); return(new ForCommandNode(declaration, assign, toExpression, command, startPosition)); }
/// <summary> /// Carries out type checking on an assign command node /// </summary> /// <param name="assignCommand">The node to perform type checking on</param> private void PerformTypeCheckingOnAssignCommand(AssignCommandNode assignCommand) { PerformTypeChecking(assignCommand.Identifier); PerformTypeChecking(assignCommand.Expression); if (!(assignCommand.Identifier.Declaration is IVariableDeclarationNode varDeclaration)) { Reporter.ReportError("identifier is not a variable"); }
/// <summary> /// Carries out type checking on an assign command node /// </summary> /// <param name="assignCommand">The node to perform type checking on</param> private void PerformTypeCheckingOnAssignCommand(AssignCommandNode assignCommand) { PerformTypeChecking(assignCommand.Identifier); PerformTypeChecking(assignCommand.Expression); if (!(assignCommand.Identifier.Declaration is IVariableDeclarationNode typeDenoterDeclaration)) { // Error - identifier is not a variable AddToErrorPositions(assignCommand.Position, "Identifier is not a variable"); }
/// <summary> /// Carries out type checking on an assign command node /// </summary> /// <param name="assignCommand">The node to perform type checking on</param> private void PerformTypeCheckingOnAssignCommand(AssignCommandNode assignCommand) { PerformTypeChecking(assignCommand.Identifier); PerformTypeChecking(assignCommand.Expression); if (!(assignCommand.Identifier.Declaration is IVariableDeclarationNode varDeclaration)) { // Error - identifier is not a variable Debugger.WriteDebuggingInfo("Error on Assign command is not a variable"); }
/// <summary> /// Carries out type checking on an assign command node /// </summary> /// <param name="assignCommand">The node to perform type checking on</param> private void PerformTypeCheckingOnAssignCommand(AssignCommandNode assignCommand) { PerformTypeChecking(assignCommand.Identifier); PerformTypeChecking(assignCommand.Expression); // Check identifier is a variable if (!(assignCommand.Identifier.Declaration is IVariableDeclarationNode varDeclaration)) { Debugger.Write("Error: identifier is not a variable"); }
/// <summary> /// Generates code for an assign command node /// </summary> /// <param name="assignCommand">The node to generate code for</param> private void GenerateCodeForAssignCommand(AssignCommandNode assignCommand) { Debugger.Write("Generating code for Assign Command"); GenerateCodeFor(assignCommand.Expression); if (assignCommand.Identifier.Declaration is IVariableDeclarationNode varDeclaration) { code.AddInstruction(varDeclaration.RuntimeEntity.GenerateInstructionToStore()); } else { Debugger.Write("The identifier is not a variable and you should have picked this problem up during type checking"); } }
/// <summary> /// Carries out type checking on an assign command node /// </summary> /// <param name="assignCommand">The node to perform type checking on</param> private void PerformTypeCheckingOnAssignCommand(AssignCommandNode assignCommand) { PerformTypeChecking(assignCommand.Identifier); PerformTypeChecking(assignCommand.Expression); if (!(assignCommand.Identifier.Declaration is IVariableDeclarationNode varDeclaration)) { // Error - identifier is not a variable Debugger.Write("Error on Assign command is not a variable"); //Reporter.ReportError($"Error on Assign command is not a variable {assignCommand.Position.ToString()}"); }
public ICommandNode ParseFor() { Debugger.Write("Parsing for command"); Position startPosition = CurrentToken.Position; Accept(For); AssignCommandNode assign = AssignForCommand(); Accept(To); IExpressionNode expression = ParseExpression(); Accept(Do); ICommandNode command = ParseSingleCommand(); Accept(Next); return(new ForCommandNode(assign, expression, command, startPosition)); }
/// <summary> /// Carries out identification on an assign command node /// </summary> /// <param name="assignCommand">The node to perform identification on</param> private void PerformIdentificationOnAssignCommand(AssignCommandNode assignCommand) { PerformIdentification(assignCommand.Identifier); PerformIdentification(assignCommand.Expression); }