public void ExecuteConstantExpression()
 {
     ConstantExpression expr = new ConstantExpression(1);
     ExpressionCommand command = new ExpressionCommand(expr);
     Assert.AreEqual(1, command.Execute(null));
     Assert.AreEqual(expr, command.Expression);
 }
示例#2
0
        public ICommand ParseCommand()
        {
            Token token = this.NextToken();

            if (token == null)
                return null;

            if (token.Type == TokenType.Separator)
            {
                if (token.Value == ";")
                    return NullCommand.Instance;

                if (token.Value == "{")
                {
                    ICommand commands = new CompositeCommand(this.ParseCommands());
                    this.ParseToken("}", TokenType.Separator);
                    return commands;
                }
            }

            if (token.Type == TokenType.Name)
            {
                if (token.Value == "if")
                    return this.ParseIfCommand();

                if (token.Value == "while")
                    return this.ParseWhileCommand();

                if (token.Value == "class")
                    return this.ParseDefineClassCommand();

                if (token.Value == "return")
                {
                    var expr = this.ParseExpression();
                    this.ParseToken(";", TokenType.Separator);
                    return new ReturnCommand(expr);
                }

                if (token.Value == "void")
                    return this.ParseDefineFunction(this.ParseName());

                if (token.Value == "main")
                    return this.ParseDefineFunction(token.Value);
            }

            this.PushToken(token);

            IExpression expression = this.ParseExpression();

            if (expression == null)
                return null;

            token = this.NextToken();

            if (token != null && token.Type == TokenType.Name && this.IsTypeExpression(expression))
            {
                if (this.TryPeekToken("(", TokenType.Separator))
                    return this.ParseDefineFunction(token.Value);

                return this.ParseDefineVariableCommand(expression, token.Value);
            }

            ICommand command = null;

            if (expression is VariableExpression && token.Type == TokenType.Operator && token.Value == "=")
            {
                string name = ((VariableExpression)expression).Name;
                IExpression expr = this.ParseExpression();

                command = new SetVariableCommand(name, expr);

                token = this.NextToken();
            }
            else
                command = new ExpressionCommand(expression);

            if (token == null || token.Type != TokenType.Separator || token.Value != ";")
                throw new ParserException("Expected ';'");

            return command;
        }