Пример #1
0
        /// <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));
        }
Пример #2
0
 /// <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");
     }
Пример #4
0
 /// <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");
     }
Пример #5
0
        /// <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");
            }
Пример #6
0
 /// <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");
     }
 }
Пример #7
0
        /// <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()}");
            }
Пример #8
0
        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));
        }
Пример #9
0
 /// <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);
 }