示例#1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ExpressionEvaluator"/> class.
 /// </summary>
 /// <param name="variableRepository">Variable repository.</param>
 /// <param name="runEnvironment">Run time environment, used mostly for the current line.</param>
 public ExpressionEvaluator(
     IVariableRepository variableRepository,
     IRunEnvironment runEnvironment)
 {
     _variableRepository = variableRepository;
     _runEnvironment     = runEnvironment;
 }
示例#2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Print"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="teletype">Output teletype to use.</param>
 public Print(IRunEnvironment runEnvironment, IExpressionEvaluator expressionEvaluator, ITeletypeWithPosition teletype)
     : base("PRINT", TokenClass.Statement, TokenType.Print)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _teletype            = teletype;
 }
示例#3
0
        /// <summary>
        /// Executes a user defined function.
        /// </summary>
        /// <param name="parameter">new parameter value.</param>
        /// <param name="runEnvironment">Run evironment.</param>
        /// <param name="expressionEvaluator">Expression evaluator.</param>
        /// <param name="variableRepository">Variable repository.</param>
        /// <returns>Value of function.</returns>
        public Accumulator Execute(
            Accumulator parameter,
            IRunEnvironment runEnvironment,
            IExpressionEvaluator expressionEvaluator,
            IVariableRepository variableRepository)
        {
            // Save the variable and program line.
            var savedVariable    = variableRepository.GetOrCreateVariable(VariableName, new short[] { }).GetValue();
            var savedProgramLine = runEnvironment.CurrentLine;

            // Change the variable to be our parameter.
            variableRepository.GetOrCreateVariable(VariableName, new short[] { }).SetValue(parameter);
            runEnvironment.CurrentLine = Line;
            runEnvironment.CurrentLine.CurrentToken = LineToken;

            // Evaluate the expression.
            var returnValue = expressionEvaluator.GetExpression();

            // Restore the variable and program line.
            variableRepository.GetOrCreateVariable(VariableName, new short[] { }).SetValue(savedVariable);
            runEnvironment.CurrentLine = savedProgramLine;

            // return the value.
            return(returnValue);
        }
示例#4
0
        public void DefDefinesFunctionThrowsOnBadToken(int insertRemAt, string nextToken, string message)
        {
            var tokens = new List <IToken>
            {
                new Token("FN", TokenClass.Statement, TokenType.Fn),
                new Token("NAME"),
                new Token("(", TokenClass.Seperator, TokenType.OpenBracket),
                new Token("A"),
                new Token(")", TokenClass.Seperator, TokenType.CloseBracket),
                new Token("=", TokenClass.Seperator, TokenType.Equal),
                new Token("A"),
                new Token("*", TokenClass.Seperator, TokenType.Multiply),
                new Token("A"),
                new Token(":", TokenClass.Seperator, TokenType.Colon)
            };

            tokens.Insert(insertRemAt, new Token("bang", TokenClass.Remark));

            _runEnvironment      = new RunEnvironment();
            _variableRepository  = new VariableRepository();
            _expressionEvaluator = new ExpressionEvaluator(_variableRepository, _runEnvironment);
            var programLine = new ProgramLine(10, tokens);

            _runEnvironment.CurrentLine = programLine;
            var sut = new Def(_runEnvironment, _expressionEvaluator);

            Test.Throws <SyntaxErrorException>(sut.Execute);
            Assert.AreEqual(nextToken, _runEnvironment.CurrentLine.NextToken().Text);
        }
示例#5
0
        public void DefDefinesFunctionAndDoesntEatColon()
        {
            var tokens = new List <IToken>
            {
                new Token("FN", TokenClass.Statement, TokenType.Fn),
                new Token("NAME"),
                new Token("(", TokenClass.Seperator, TokenType.OpenBracket),
                new Token("A"),
                new Token(")", TokenClass.Seperator, TokenType.CloseBracket),
                new Token("=", TokenClass.Seperator, TokenType.Equal),
                new Token("A"),
                new Token("*", TokenClass.Seperator, TokenType.Multiply),
                new Token("A"),
                new Token(":", TokenClass.Seperator, TokenType.Colon)
            };

            _runEnvironment      = new RunEnvironment();
            _variableRepository  = new VariableRepository();
            _expressionEvaluator = new ExpressionEvaluator(_variableRepository, _runEnvironment);
            var programLine = new ProgramLine(10, tokens);

            _runEnvironment.CurrentLine = programLine;

            var sut = new Def(_runEnvironment, _expressionEvaluator);

            sut.Execute();

            Assert.AreEqual(TokenType.Colon, _runEnvironment.CurrentLine.NextToken().Seperator);
            var definition = _runEnvironment.DefinedFunctions["NAME"];

            Assert.AreEqual("NAME", definition.FunctionName);
            Assert.AreEqual("A", definition.VariableName);
            Assert.AreEqual(6, definition.LineToken);
            Assert.AreEqual(programLine, definition.Line);
        }
示例#6
0
        public void DefDefinesFunctionThrowsOnBadLineNumber()
        {
            var tokens = new List <IToken>
            {
                new Token("FN", TokenClass.Statement, TokenType.Fn),
                new Token("NAME"),
                new Token("(", TokenClass.Seperator, TokenType.OpenBracket),
                new Token("A"),
                new Token(")", TokenClass.Seperator, TokenType.CloseBracket),
                new Token("=", TokenClass.Seperator, TokenType.Equal),
                new Token("A"),
                new Token("*", TokenClass.Seperator, TokenType.Multiply),
                new Token("A"),
                new Token(":", TokenClass.Seperator, TokenType.Colon)
            };

            _runEnvironment      = new RunEnvironment();
            _variableRepository  = new VariableRepository();
            _expressionEvaluator = new ExpressionEvaluator(_variableRepository, _runEnvironment);
            var programLine = new ProgramLine(null, tokens);

            _runEnvironment.CurrentLine = programLine;

            var sut = new Def(_runEnvironment, _expressionEvaluator);

            Test.Throws <IllegalDirectException>(sut.Execute);
        }
示例#7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Gosub"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="programRepository">Program Repository.</param>
 public Gosub(
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository)
     : base("GOSUB", TokenClass.Statement, TokenType.Gosub)
 {
     _runEnvironment    = runEnvironment;
     _programRepository = programRepository;
 }
示例#8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Del"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run environment.</param>
 /// <param name="programRepository">Program Repository.</param>
 public Del(
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository)
     : base("DEL", TokenClass.Statement)
 {
     _runEnvironment    = runEnvironment;
     _programRepository = programRepository;
 }
示例#9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Def"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 public Def(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator)
     : base("DEF", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
 }
示例#10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Resume"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="programRepository">Program repository.</param>
 public Resume(
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository)
     : base("RESUME", TokenClass.Statement)
 {
     _runEnvironment    = runEnvironment;
     _programRepository = programRepository;
 }
示例#11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Next"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="variableRepository">Variable repository.</param>
 public Next(
     IRunEnvironment runEnvironment,
     IVariableRepository variableRepository)
     : base("NEXT", TokenClass.Statement)
 {
     _runEnvironment     = runEnvironment;
     _variableRepository = variableRepository;
 }
示例#12
0
 private void SetupSut()
 {
     _runEnvironment         = new RunEnvironment();
     _mockVariableRepository = new Mock <IVariableRepository>();
     _teletype             = new MockTeletype();
     _teletypeWithPosition = new TeletypeWithPosition(_teletype);
     _expressionEvaluator  = new ExpressionEvaluator(_mockVariableRepository.Object, _runEnvironment);
     _sut = new Print(_runEnvironment, _expressionEvaluator, _teletypeWithPosition);
 }
示例#13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Dim"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="variableRepository">Variable repository.</param>
 public Dim(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IVariableRepository variableRepository)
     : base("DIM", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _variableRepository  = variableRepository;
 }
示例#14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Get"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="teletypeWithPosition">Teletype.</param>
 public Get(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     ITeletypeWithPosition teletypeWithPosition)
     : base("GET", TokenClass.Statement)
 {
     _runEnvironment       = runEnvironment;
     _expressionEvaluator  = expressionEvaluator;
     _teletypeWithPosition = teletypeWithPosition;
 }
示例#15
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Edit"/> class.
 /// Edit command, allows editing of a program line.
 /// </summary>
 /// <param name="runEnvironment">Run environment.</param>
 /// <param name="programRepository">Program repository</param>
 /// <param name="teletype">teletype.</param>
 public Edit(
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository,
     ITeletype teletype)
     : base("EDIT", TokenClass.Statement)
 {
     _runEnvironment    = runEnvironment;
     _programRepository = programRepository;
     _teletype          = teletype;
 }
示例#16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Goto"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="programRepository">Program Repository.</param>
 public Goto(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IProgramRepository programRepository)
     : base("GOTO", TokenClass.Statement, TokenType.Goto)
 {
     _programRepository   = programRepository;
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
 }
示例#17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Read"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="dataStatementReader">Data statement reader.</param>
 public Read(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IDataStatementReader dataStatementReader)
     : base("READ", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _dataStatementReader = dataStatementReader;
 }
示例#18
0
 private void SetupSut()
 {
     _runEnvironment             = new RunEnvironment();
     _variableRepository         = new VariableRepository();
     _mockExpressionEvaluator    = new Mock <IExpressionEvaluator>();
     _mockTeletypeWithPosition   = new Mock <ITeletypeWithPosition>();
     _runEnvironment.CurrentLine = new ProgramLine(10, new List <IToken> {
     });
     _sut = new Get(_runEnvironment, _mockExpressionEvaluator.Object, _mockTeletypeWithPosition.Object);
 }
示例#19
0
 /// <summary>
 /// Initializes a new instance of the <see cref="If"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="programRepository">Program repository.</param>
 public If(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IProgramRepository programRepository)
     : base("IF", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _programRepository   = programRepository;
 }
示例#20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Clear"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="variableRepository">Variable Repository.</param>
 /// <param name="dataStatementReader">Data statement reader.</param>
 public Clear(
     IRunEnvironment runEnvironment,
     IVariableRepository variableRepository,
     IDataStatementReader dataStatementReader)
     : base("CLEAR", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _variableRepository  = variableRepository;
     _dataStatementReader = dataStatementReader;
 }
示例#21
0
 /// <summary>
 /// Initializes a new instance of the <see cref="On"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="programRepository">Program Repository.</param>
 public On(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IProgramRepository programRepository)
     : base("ON", TokenClass.Statement, TokenType.Gosub)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _programRepository   = programRepository;
 }
示例#22
0
 /// <summary>
 /// Initializes a new instance of the <see cref="List"/> class.
 /// </summary>
 /// <param name="programRepository">Program Repository.</param>
 /// <param name="teletype">Output teletype to use.</param>
 /// <param name="runEnvironment">Run environment.</param>
 public List(
     IProgramRepository programRepository,
     ITeletype teletype,
     IRunEnvironment runEnvironment)
     : base("LIST", TokenClass.Statement)
 {
     _programRepository = programRepository;
     _teletype          = teletype;
     _runEnvironment    = runEnvironment;
 }
示例#23
0
 private void SetupSut()
 {
     _mockExpressionEvaluator = new Mock <IExpressionEvaluator>();
     _runEnvironment          = new RunEnvironment();
     _variableRepository      = new VariableRepository();
     _toToken    = new Token("TO", TokenClass.Statement, TokenType.To);
     _colonToken = new Token(":", TokenClass.Seperator, TokenType.Colon);
     _equalToken = new Token("=", TokenClass.Seperator, TokenType.Equal);
     _stepToken  = new Token("STEP", TokenClass.Statement, TokenType.Step);
     _commaToken = new Token(",", TokenClass.Seperator, TokenType.Comma);
 }
示例#24
0
        private void SetupSut()
        {
            _runEnvironment          = new RunEnvironment();
            _mockExpressionEvaluator = new Mock <IExpressionEvaluator>();
            _variableRepository      = new VariableRepository();
            _variableReference       = _variableRepository.GetOrCreateVariable("A", new short[] { });

            _mockExpressionEvaluator.Setup(mre => mre.GetLeftValue()).Returns(_variableReference);
            _mockExpressionEvaluator.Setup(mre => mre.GetExpression()).Returns(new Accumulator(3.0));
            _sut = new Let(_runEnvironment, _mockExpressionEvaluator.Object);
        }
示例#25
0
 /// <summary>
 /// Initializes a new instance of the <see cref="New"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="programRepository">Program Repository.</param>
 /// <param name="variableRepository">Variable Repository.</param>
 /// <param name="dataStatementReader">Data statement reader.</param>
 public New(
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository,
     IVariableRepository variableRepository,
     IDataStatementReader dataStatementReader)
     : base("NEW", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _programRepository   = programRepository;
     _variableRepository  = variableRepository;
     _dataStatementReader = dataStatementReader;
 }
示例#26
0
        private void SetupSut()
        {
            _mockTeletype = new MockTeletype();

            // Use a real RunEnvironment
            _runEnvironment = new RunEnvironment();

            _mockListToken = new Mock <IToken>();
            _mockListToken.Setup(mlt => mlt.Statement).Returns(TokenType.Unknown);
            _mockListToken.Setup(mlt => mlt.TokenClass).Returns(TokenClass.Statement);
            _mockListCmd = _mockListToken.As <IInterruptableCommand>();

            _mockRunToken = new Mock <IToken>();
            _mockRunToken.Setup(mrt => mrt.TokenClass).Returns(TokenClass.Statement);
            _mockRunToken.Setup(mrt => mrt.Statement).Returns(TokenType.Unknown);
            _mockRunCmd = _mockRunToken.As <ITokeniserCommand>();

            _mockLetToken = new Mock <IToken>();
            _mockLetToken.Setup(mlt => mlt.Statement).Returns(TokenType.Let);
            _mockLetCmd = _mockLetToken.As <ICommand>();
            _mockLetCmd.Setup(mlt => mlt.Execute())
            .Callback(() => _runEnvironment.CurrentLine.NextToken());

            _mockPrintToken = new Mock <IToken>();
            _mockPrintToken.Setup(mpt => mpt.TokenClass).Returns(TokenClass.Statement);
            _mockPrintCmd = _mockPrintToken.As <ICommand>();

            _mockSystemToken = new Mock <IToken>();
            _mockSystemToken.Setup(mst => mst.Statement).Returns(TokenType.System);

            _mockColonToken = new Mock <IToken>();
            _mockColonToken.Setup(mct => mct.Seperator).Returns(TokenType.Colon);

            _mockNotStatement = new Mock <IToken>();
            _mockNotStatement.Setup(mns => mns.TokenClass).Returns(TokenClass.Unknown);
            _mockNotStatement.Setup(mns => mns.Seperator).Returns(TokenType.Unknown);
            _mockNotStatement.Setup(mns => mns.Statement).Returns(TokenType.Unknown);

            _mockTokensProvider = new Mock <ITokensProvider>();
            _mockTokensProvider.Setup(mtp => mtp.Tokens).Returns(new List <IToken>
            {
                _mockLetToken.Object
            });

            _mockProgramRepository = new Mock <IProgramRepository>();
            _sut = new Executor(
                _mockTeletype,
                _runEnvironment,
                _mockProgramRepository.Object,
                _mockTokensProvider.Object,
                Mock.Of <ITokeniser>());
        }
示例#27
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Input"/> class.
 /// </summary>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="expressionEvaluator">Expression evaluator.</param>
 /// <param name="variableRepository">Variable repository.</param>
 /// <param name="teletype">Teletype to use.</param>
 public Input(
     IRunEnvironment runEnvironment,
     IExpressionEvaluator expressionEvaluator,
     IVariableRepository variableRepository,
     ITeletype teletype)
     : base("INPUT", TokenClass.Statement)
 {
     _runEnvironment      = runEnvironment;
     _expressionEvaluator = expressionEvaluator;
     _variableRepository  = variableRepository;
     _teletype            = teletype;
     _readInputParser     = new ReadInputParser(ReadLine);
 }
示例#28
0
 private void SetupSut()
 {
     _runEnvironment        = new RunEnvironment();
     _mockProgramRepository = new Mock <IProgramRepository>();
     _mockProgramRepository.Setup(mpr => mpr.GetLine(1000)).Returns(new ProgramLine(1000, new List <IToken> {
     }));
     _mockProgramRepository.Setup(mpr => mpr.GetLine(2000)).Returns(new ProgramLine(2000, new List <IToken> {
     }));
     _mockProgramRepository.Setup(mpr => mpr.GetLine(3000)).Returns(new ProgramLine(3000, new List <IToken> {
     }));
     _mockExpressionEvaluator = new Mock <IExpressionEvaluator>();
     _sut = new On(_runEnvironment, _mockExpressionEvaluator.Object, _mockProgramRepository.Object);
 }
示例#29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Interpreter"/> class.
 /// </summary>
 /// <param name="teletypeWithPosition">Teletype to use for input output.</param>
 /// <param name="tokeniser">Tokeniser.</param>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="programRepository">Program repository.</param>
 /// <param name="executor">Executor class to run program lines.</param>
 public Interpreter(
     ITeletypeWithPosition teletypeWithPosition,
     ITokeniser tokeniser,
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository,
     IExecutor executor)
 {
     _teletypeWithPosition = teletypeWithPosition;
     _tokeniser            = tokeniser;
     _runEnvironment       = runEnvironment;
     _programRepository    = programRepository;
     _executor             = executor;
 }
示例#30
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Executor"/> class.
 /// </summary>
 /// <param name="teletype">Teletype to use for input output.</param>
 /// <param name="runEnvironment">Run time environment.</param>
 /// <param name="programRepository">Program repository.</param>
 /// <param name="tokensProvider">Provider of tokens.</param>
 /// <param name="tokeniser">Tokeniser to pass to ITokeniserCommands.</param>
 public Executor(
     ITeletype teletype,
     IRunEnvironment runEnvironment,
     IProgramRepository programRepository,
     ITokensProvider tokensProvider,
     ITokeniser tokeniser)
 {
     _runEnvironment              = runEnvironment;
     _programRepository           = programRepository;
     _tokeniser                   = tokeniser;
     _letToken                    = tokensProvider.Tokens.Find(t => t.Statement == TokenType.Let);
     teletype.CancelEventHandler += InterruptExecution;
 }