Java解析加减乘除表达式

导言

在计算机科学中,表达式通常用于表示数学算式或逻辑关系。在编程中,我们经常需要解析和计算这些表达式。本文将介绍如何使用Java解析和计算加减乘除表达式,并提供相应的代码示例。

表达式的基本概念

在数学中,加减乘除表达式是由数字、运算符(+、-、*、/)和括号组成的算式。在编程中,我们可以将表达式表示为字符串,然后使用算法解析和计算该表达式。

解析表达式

在Java中,我们可以使用递归下降法来解析表达式。递归下降法是一种基于规则的语法分析方法,它通过递归地调用各个规则来解析语法。

下面是一个简单的递归下降解析器的示例代码:

public class ExpressionParser {
    private String input;
    private int position;

    public ExpressionParser(String input) {
        this.input = input;
        this.position = 0;
    }

    public double parse() {
        return parseExpression();
    }

    private double parseExpression() {
        double left = parseTerm();

        while (position < input.length()) {
            char operator = input.charAt(position++);
            double right = parseTerm();

            switch (operator) {
                case '+':
                    left += right;
                    break;
                case '-':
                    left -= right;
                    break;
                default:
                    throw new IllegalArgumentException("Invalid operator");
            }
        }

        return left;
    }

    private double parseTerm() {
        double factor = parseFactor();

        while (position < input.length()) {
            char operator = input.charAt(position++);
            double operand = parseFactor();

            switch (operator) {
                case '*':
                    factor *= operand;
                    break;
                case '/':
                    factor /= operand;
                    break;
                default:
                    throw new IllegalArgumentException("Invalid operator");
            }
        }

        return factor;
    }

    private double parseFactor() {
        if (position >= input.length()) {
            throw new IllegalArgumentException("Invalid expression");
        }

        char ch = input.charAt(position++);

        if (ch == '(') {
            double result = parseExpression();
            if (position >= input.length() || input.charAt(position++) != ')') {
                throw new IllegalArgumentException("Invalid expression");
            }
            return result;
        } else if (Character.isDigit(ch)) {
            StringBuilder sb = new StringBuilder();
            sb.append(ch);

            while (position < input.length() && Character.isDigit(input.charAt(position))) {
                sb.append(input.charAt(position++));
            }

            return Double.parseDouble(sb.toString());
        } else {
            throw new IllegalArgumentException("Invalid expression");
        }
    }
}

在上述代码中,我们使用了三个递归函数来解析表达式:parseExpressionparseTermparseFactorparseExpression函数用于解析加减表达式,parseTerm函数用于解析乘除表达式,parseFactor函数用于解析括号、数字等因子。

代码示例

下面是一个使用上述解析器的示例代码:

public class Main {
    public static void main(String[] args) {
        String input = "(1 + 2) * (3 - 4) / 5";
        ExpressionParser parser = new ExpressionParser(input);
        double result = parser.parse();
        System.out.println("Result: " + result);
    }
}

在上述示例代码中,我们使用了一个简单的加减乘除表达式 (1 + 2) * (3 - 4) / 5。我们创建了一个ExpressionParser对象,并将表达式作为参数传递给它的构造函数。然后,我们调用parse方法来解析和计算表达式,并将结果打印输出。

类图

下面是一个使用Mermaid语法表示的类图,展示了解析器的类结构和关系:

classDiagram
    class ExpressionParser {
        -String input
        -int position
        +ExpressionParser(input: String)
        +parse(): double
        -parseExpression(): double
        -parseTerm(): double
        -parseFactor(): double
    }

在上述类图中,我们定义了一个ExpressionParser类,它包含了解析和计算表达式的方法和属性。

结论

本文介绍了如何使用Java解析和计算加减乘除表达式。