`

java输入“算术表达式”的文本,如何计算表达式的值

 
阅读更多

问题:

java中输入输入“算术表达式”的文本,如何计算表达式的值?例如输入1+2/2+2*(3+1);如何直接给出10.

 

方法:

在动态语言中如python,groovy中,这些根本不是问题,到java语言中,就变成了一件挺难的事。我想到几个解决方案:

1)java中调用动态语言groovy,scala

利用动态语言能支持的这个特性,java集成调用下,当然能完成这个功能

2)手动自定义语言解析器,解析表达式文本,然后执行表达式

具体的做法可参考这篇文章,用解释器模式来做 http://blog.csdn.net/tnt32/article/details/7829288

3)用antlr自定义DSL

这个比较强大,antlr用来作这个有点大材小用,antlr是什么可参见:http://www.antlr.org/

参考资料:

http://www.antlr.org/wiki/display/ANTLR3/ANTLR+v3+documentation

http://www.antlr.org.cn/ 出品的 《antlr教材.pdf》

 

antlr实现

自定义文法:

grammar D;
options{output=AST;}
program:statement+;
statement:expression';'!;
expression:multExpr(('+'^|'-' ^)multExpr)*;
multExpr:atom(('*'^|'/'^)atom)*;
atom:INT| '('!expression')'!;
INT:'0'..'9' +;
WS:(' ' |'\t' |'\n' |'\r' )+{skip();};

 

然后利用antlrWorks工具,自动生成解析器:DLexer.java,,DParser.java

 

因为antlr只完成了词法、语法的识别,所以需要自己编写语义:

package org.mike;

import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.BaseTree;
import org.antlr.runtime.tree.Tree;

//1+1*3+(1+1)*3;
public class App {
    public static void main(String[] args) throws Exception {
        ANTLRInputStream input = new ANTLRInputStream(System.in);
        DLexer lexer = new DLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        DParser parser = new DParser(tokens);
        DParser.program_return r = parser.program();
        System.out.println(((BaseTree) r.getTree()).toStringTree());
        BaseTree tree = (BaseTree) r.getTree();

        System.out.println(calcNode(tree));
    }

    public static int calcNode(Tree tree) {
        if (tree.getChildCount() == 0) {
            return Integer.parseInt(tree.getText());
        }
        if (tree.getChildCount() != 2) {
            throw new RuntimeException("node " + tree.getText() + "illegal expression"
                    + "tree.getChildCount() = " + tree.getChildCount());
        }

        int leftChildValue = calcNode(tree.getChild(0));
        int rightChildVale = calcNode(tree.getChild(1));
        String sign = tree.getText().trim();

        return doCalc(sign, leftChildValue, rightChildVale);
    }

    private static int doCalc(String sign, int leftChildValue, int rightChildVale) {
        if (sign.equals("+")) {
            return leftChildValue + rightChildVale;
        } else if (sign.equals("-")) {
            return leftChildValue - rightChildVale;
        } else if (sign.equals("*")) {
            return leftChildValue * rightChildVale;
        } else if (sign.equals("/")) {
            return leftChildValue / rightChildVale;
        }
        throw new RuntimeException("unknown sign " + sign);
    }
}

 

运行结果

输入:1+10/5+12+(2+3)*1+1;

输出:

(+ (+ (+ (+ 1 (/ 10 5)) 12) (* (+ 2 3) 1)) 1)
21

 

 

 

 

分享到:
评论

相关推荐

    逆向推导算术表达式

    在给定的场景中,用户输入了运算结果和一系列操作数,程序的任务是找出所有可能的算术表达式,使得这些操作数按照特定的计算顺序得到指定的结果。 首先,我们需要理解算术表达式的结构。一个基本的算术表达式通常由...

    算术表达式的求值数据结构课程设计

    这个项目的主要目标是实现一个程序,该程序能够接收用户通过文本文档输入的任意算术表达式,并准确地计算出其结果。下面,我们将详细讲解涉及的知识点: 1. **算术表达式解析**:在计算机科学中,解析算术表达式是...

    正则表达式验证数字、邮件、计算表达式等

    在提供的代码片段中,展示了如何使用正则表达式来验证不同类型的输入,如整数、无符号整数、电子邮件地址、浮点数、数值以及简单的计算表达式。下面我们将详细讨论这些知识点。 1. **整数验证**: - `isInt` 方法...

    java正则实现解析算术表达式 (仅限+-*/和括号)

    在这个场景中,我们关注的是如何使用Java的正则表达式来解析简单的算术表达式,这些表达式只包含加法(+)、减法(-)、乘法(*)和除法(/)操作符,以及括号用于改变运算优先级。下面我们将详细介绍这个过程。 ...

    后缀表达式求值包及其使用

    在计算机科学中,后缀表达式求值是解决复杂算术表达式计算问题的有效手段。本压缩包文件提供了后缀表达式的求值工具,包括两个主要功能:runsome和runall,它们均采用Java编程语言实现,同时也涉及到Scanner和...

    Java 图形界面化实现计算数学表达式

    7. **公式求值**:你可以使用Java的`ScriptEngine`接口,尤其是`javax.script.ScriptEngineManager`和`javax.script.ScriptEngine`,来执行JavaScript引擎(Rhino或Nashorn)计算数学表达式。这样可以避免手动实现...

    Calculator_java.rar_java表达式运算

    总的来说,这个项目是一个用Java实现的自定义表达式运算计算器,它强调了用户输入的有效性和表达式的正确计算。开发者通过字符过滤和输入验证确保了程序的稳定性和安全性。对于想要学习Java编程和表达式运算的人来说...

    利用正则式计算表达式的值

    总的来说,通过正则式计算表达式值的过程涉及字符串处理、解析理论、数学运算等多个方面,是编程中的一个复杂任务。修正后的"Calculate.java"源代码提供了一个具体的实现,对于学习和理解这个过程有着很大的帮助。在...

    java EL 表达式的例子

    Java EL(Expression Language)表达式是Java服务器页面(JSP)技术中的一个重要组成部分,它用于在JSP中简便地访问和操作JavaBeans属性。EL提供了一种简洁的语法,允许开发者在页面上动态地表达数据,而无需编写...

    基于java的表达式语法解析库 parboiled.zip

    这些规则可以是基本的字符匹配,也可以是复杂的组合规则,如算术表达式或者XML标签。 2. **创建解析上下文**:在解析之前,需要创建一个`Input`对象,它代表要解析的输入字符串。同时,创建一个`ParseContext`实例...

    java dhc,计算

    它允许程序在运行时根据特定条件或用户输入来动态地构建和计算表达式。 在Java中,表达式计算通常涉及到以下几个关键知识点: 1. **运算符和表达式**:Java支持多种运算符,包括算术运算符(+,-,*,/,%)、比较...

    EL表达式学习资料

    如 `${expr}"/>`,其中 `${expr}` 表示计算表达式的值,并将该值赋给 `value` 属性。 - **属性值包含多个表达式和文本** 如 `${expr} text ${expr}"/>`,其中每个 `${expr}` 都会被计算成字符串,并拼接成最终的...

    java expression

    ` 在这里,`5 + 3` 是一个算术表达式,它计算出结果并将其赋值给变量 `result`。 2. **关系表达式**:用于比较两个值,如 `>`、`、`>=`、`、`==` 和 `!=`。例如,`if (a > b)` 判断 `a` 是否大于 `b`。 3. **逻辑...

    语义分析实验(java版)

    在这个“语义分析实验(Java版)”中,我们将重点探讨如何利用Java语言实现语义分析,特别是针对算术表达式和赋值语句的处理。 首先,我们要理解语义分析的基本概念。语义分析不关注程序的结构是否符合语法规则,...

    \\(^_^)/ 表达式解析器(MVEL)

    - **强大的表达式支持**:支持算术运算、比较操作、逻辑运算、字符串操作、数组和集合操作等。 - **方法调用**:可以直接在表达式中调用对象的方法,无需通过`obj.method()`这样的方式。 - **属性访问**:可以方便地...

    《编译原理》实验 识别无符号数的词法分析器设计实现

    在这个实验中,我们的目标是设计并实现一个能识别无符号数的词法分析器,用于处理简单的算术四则运算表达式。 【实验目标】 实验旨在让学生掌握词法分析的基本方法,通过对程序设计语言源代码的扫描,将源代码分解...

    java计算工具包

    然而,根据提供的压缩包子文件名称"jeval-0.9.3",我们关注的是另一个名为JEval的库,它是一个强大的Java表达式求值引擎,主要用于解析和执行文本中的数学表达式。 JEval的核心功能是解析和计算字符串中的数学...

    android计算器 可直接运算简单的代数式

    3. **表达式解析**:为了实现代数式的计算,我们需要解析输入的字符串。这可能涉及到正则表达式来识别数字和操作符,以及栈(Stack)数据结构来处理运算优先级。例如,遇到操作符时,将其压入栈,遇到数字则进行相应...

    控制台输入输出&运算符与表达式(学生)

    在编程学习中,控制台输入输出以及运算符与表达式是基础且至关重要的部分。本文将深入探讨这些概念,帮助学生更好地理解和应用。 首先,控制台输入输出是程序与用户交互的基本方式。在命令行环境下,我们通过控制台...

    evaluationTable:动态评估表,显示用户使用HTML,CSS和Java设计的输入的算术运算

    在“evaluationTable”中,HTML用于创建表单元素,如文本输入框,让用户输入算术表达式,以及结果显示区域,用来展示计算结果。HTML的表单元素如`<form>`、`<input>`和`<textarea>`等在这里发挥着关键作用。 2. **...

Global site tag (gtag.js) - Google Analytics