将正常,中缀表达式转换为标记的arraylist

时间:2012-03-04 00:47:54

标签: java tokenize

我想转换类似

的内容

233 + 4 *(4-8)+5

到[233,+,4,*,(,4, - ,8,),+,5]

后者是字符串数组。

到目前为止,我有:

 String s = "233 + 4 *(4-8) +5";
 for(int i = 0; i<s.length(); i++)
    {
        int j = i + 1;
        String sub = s.substring(i,j);
        String checkdigit = s.substring(i,j);
        while(checkdigit.matches("\\d|\\.") && j<s.length())
        {
            checkdigit = s.substring(j,j+1);
            j++;
        }
        System.out.print(sub);
        if(!sub.equals(" ")) expression.add(sub);
    }

但我得到空指针异常。有人可以帮我纠正这个吗?

此外,如果有人可以帮助我解析这个,以便它接受负值(如-5)也会有所帮助。

编辑: 顺便说一下。用于双打(如5.0)

编辑2:

如果有人知道任何可以替换我的代码的Java API类,请说明如何用它们替换我的代码。

2 个答案:

答案 0 :(得分:0)

解析算术表达式比先前看起来要复杂一些(例如,很难区分减号和负号)。

虽然您可以编写自己的解析器,但我建议您使用通用解析器(例如ANTLRJavaCC),为其提供所需的语法或查找更简单的算术特定库(例如JEP或某些开源等价物。)

这是一个帮助您使用ANTLR解析算术表达式的链接: http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

答案 1 :(得分:0)

org.nfunk.jep.JEP适用于大多数复杂的算术解析,非常适合您的要求。确保您正在下载最新的jar(我相信3.x.x)。 2.x不支持一些明显的功能!