`

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

 

 

 

 

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包4

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包101

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包11

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包6

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包9

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包8

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包5

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包10

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包1

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包3

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    T-Systems:T-Systems(Java 学校)

    T-系统T-Systems (Java School) 测试任务 0. 一般条件 应用程序应该用 Java 1.6 编写,不使用额外的库 - 只有与任务相关的标准类 + 接口。... 计算器 编写一个计算器来计算最简单的算术表达式。 算术表达式是包含以

    Java_School_Tasks:测试

    Java_School_Tasks 测试 0. 一般条件应用程序应该用 Java 1.8 编写,不使用额外的库 - 只有与任务相关的标准类 + 接口。... 计算器编写一个计算器来计算最简单的算术表达式。 算术表达式是包含以下内容的

    java开源包2

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    java开源包7

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    Java资源包01

    用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用...

    analizadorLexico:用于 Lexico 分析的 JAVA 应用

    分析算术表达式的图形界面。 左面板包含一个文本编辑器,用于输入要验证的表达式。 您的程序可以计算的最大表达式数为 10。 右面板由程序识别的词法组件(标记)的结果查看器组成。 每组令牌结束时,您必须通知...

    正则表达式30分钟入门教程

    如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|...

Global site tag (gtag.js) - Google Analytics