Пример #1
0
        /// <summary>
        /// Returns a factor (integer, string, boolean, unaryast)
        /// </summary>
        /// <returns>Factor AST</returns>
        private AST Factor()
        {
            Token token = this.currentToken;

            if (token.type == TokenType.INTEGER)
            {
                this.ConsumeToken(TokenType.INTEGER);
                return(new NumericAST(token));
            }
            else if (token.type == TokenType.STRING)
            {
                this.ConsumeToken(TokenType.STRING);
                return(new StringAST(token));
            }
            else if (token.type == TokenType.BOOL)
            {
                this.ConsumeToken(TokenType.BOOL);
                return(new BooleanAST(token));
            }
            else if (token.type == TokenType.PARENLEFT)
            {
                this.ConsumeToken(TokenType.PARENLEFT);
                AST ast = this.Expression();
                this.ConsumeToken(TokenType.PARENRIGHT);
                return(ast);
            }
            else if (token.type == TokenType.PLUS)
            {
                this.ConsumeToken(TokenType.PLUS);
                AST ast = new OneOperatorAST(token, this.Factor());
                return(ast);
            }
            else if (token.type == TokenType.MINUS)
            {
                this.ConsumeToken(TokenType.MINUS);
                AST ast = new OneOperatorAST(token, this.Factor());
                return(ast);
            }
            else if (token.type == TokenType.LOGICAL_NOT)
            {
                this.ConsumeToken(TokenType.LOGICAL_NOT);
                AST ast = new OneOperatorAST(token, this.Factor());
                return(ast);
            }
            else
            {
                AST ast = this.Variable();
                return(ast);
            }
        }
Пример #2
0
        /// <summary>
        /// Traverses unary operation AST
        /// </summary>
        /// <param name="ast"></param>
        /// <returns>OneOperatorAST</returns>
        private object VisitOneOperatorAST(OneOperatorAST ast)
        {
            object component1 = this.VisitNode(ast.expression);

            if (component1 is bool)
            {
                return(!(bool)component1);
            }
            else
            {
                if (ast.token.type == TokenType.MINUS)
                {
                    return(-(int)this.VisitNode(ast.expression));
                }
                return(+(int)this.VisitNode(ast.expression));
            }
        }