Ejemplo n.º 1
0
        public Node ParseOperand()
        {
            //NOTE(patrik): Parse Numbers, Power, Paren, Function operations

            if (lexer.CurrentToken == TokenType.NUMBER)
            {
                // Format 1: number
                //        2: number^number
                double value = lexer.CurrentNumber;
                lexer.NextToken();

                if (lexer.CurrentToken == TokenType.POWER)
                {
                    lexer.NextToken();

                    double power = lexer.CurrentNumber;
                    lexer.ExpectToken(TokenType.NUMBER);

                    return(new POWNode(value, power));
                }
                return(new NumberNode(value));
            }
            else if (lexer.CurrentToken == TokenType.MINUS)
            {
                // Format 1: -number
                lexer.NextToken();

                double value = lexer.CurrentNumber;
                lexer.ExpectToken(TokenType.NUMBER);

                return(new NumberNode(-value));
            }
            else if (lexer.CurrentToken == TokenType.OPEN_PAREN)
            {
                // Format 1: (expr)
                lexer.NextToken();

                Node result = Parse();

                lexer.ExpectToken(TokenType.CLOSE_PAREN);

                return(result);
            }
            else if (lexer.CurrentToken == TokenType.IDENTIFIER)
            {
                // Format 1: identifier
                //        2: identifier(expr, ...)
                string identifier = lexer.CurrentIdentifier;
                lexer.NextToken();

                if (lexer.CurrentToken == TokenType.OPEN_PAREN)
                {
                    lexer.NextToken();

                    Node node = Parse();

                    lexer.ExpectToken(TokenType.CLOSE_PAREN);

                    if (identifier.Equals("sqrt", StringComparison.OrdinalIgnoreCase))
                    {
                        SQRTNode result = new SQRTNode(node);
                        return(result);
                    }
                }
            }

            return(null);
        }