Exemplo n.º 1
0
        /// <summary>
        /// Executes the interpreter.
        /// </summary>
        public void Execute()
        {
            bool quit = false;

            while (!quit)
            {
                _teletypeWithPosition.NewLine();
                _teletypeWithPosition.Write(">");
                var command = _teletypeWithPosition.Read();
                if (command == null)
                {
                    _runEnvironment.KeyboardBreak = false;
                    continue;
                }

                try
                {
                    var parsedLine = _tokeniser.Tokenise(command);
                    if (parsedLine.LineNumber.HasValue)
                    {
                        _programRepository.SetProgramLine(parsedLine);
                    }
                    else
                    {
                        _runEnvironment.CurrentLine = parsedLine;
                        quit = _executor.ExecuteLine();
                    }
                }
                catch (Exceptions.BreakException endError)
                {
                    if (endError.ErrorMessage != string.Empty)
                    {
                        WriteErrorToTeletype(
                            _runEnvironment.CurrentLine.LineNumber,
                            endError.ErrorMessage);
                    }
                }
                catch (Exceptions.BasicException basicError)
                {
                    WriteErrorToTeletype(
                        _runEnvironment.DataErrorLine ?? _runEnvironment.CurrentLine?.LineNumber,
                        "?" + basicError.ErrorMessage + " ERROR");
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Executes the PRINT command.
        /// </summary>
        public void Execute()
        {
            bool newLine = true;

            while (true)
            {
                var token = _runEnvironment.CurrentLine.NextToken();
                if ((token.Seperator == TokenType.Colon) ||
                    (token.Statement == TokenType.Else) ||
                    (token.Seperator == TokenType.EndOfLine))
                {
                    if (newLine)
                    {
                        _teletype.NewLine();
                    }

                    _runEnvironment.CurrentLine.PushToken(token);
                    return;
                }

                if ((token.Statement == TokenType.Tab) || (token.Statement == TokenType.Space))
                {
                    short value = _expressionEvaluator.GetExpression().ValueAsShort();
                    if (_runEnvironment.CurrentLine.NextToken().Seperator != TokenType.CloseBracket)
                    {
                        throw new Exceptions.SyntaxErrorException();
                    }

                    if (token.Statement == TokenType.Tab)
                    {
                        _teletype.Tab(value);
                    }
                    else
                    {
                        _teletype.Space(value);
                    }
                }
                else if ((token.Seperator == TokenType.Semicolon) || (token.Seperator == TokenType.Comma))
                {
                    newLine = false;
                    if (token.Seperator == TokenType.Comma)
                    {
                        _teletype.NextComma();
                    }
                }
                else
                {
                    newLine = true;
                    _runEnvironment.CurrentLine.PushToken(token);
                    _teletype.Write(_expressionEvaluator.GetExpression().ToString());
                }
            }
        }
        public void TeletypeWithPositionWritesEnvironmentNewLine()
        {
            _mockTeletype = new Mock <ITeletype>();
            _mockTeletype.Setup(mt => mt.Width).Returns(80);

            _sut = new TeletypeWithPosition(_mockTeletype.Object);

            _sut.NewLine();

            _mockTeletype.Verify(mt => mt.Write(Environment.NewLine), Times.Once);
            Assert.AreEqual(1, _sut.Position());
        }