可以使用大括号解析Expression的解析器

时间:2014-03-16 12:47:38

标签: java parsing

您好我在java中创建了一个简单的解析器 解析像1 + 4,-5 / 3-7这样的算术表达式...... 我的问题是如何修改我的cosw 这样它也可以解析像(-3 + 6)/ 7那样的大括号...... 我的想法不清楚...... 任何人请给我一些想法,以便我能 让它工作.... 谢谢 这是我的代码

package parser;
public class Parser
{
    boolean isNum(StringBuffer s)
    {
        try
        {
            Double.parseDouble(new String(s));
        }
        catch(NumberFormatException e)
        {
            return false;
        }
        return true;
    }
    double toNum(StringBuffer s)
    {
        return Double.parseDouble(new String(s));
    }
    double eval(StringBuffer exp)
    {        
       if(isNum(exp))
       {
           return toNum(exp);
       }
       else if(!isNum(exp))
       {
           for(int i=exp.length()-1;i>=0;i--)
           {
               if(exp.charAt(i)=='/')
               {               
                   return (double)eval(new StringBuffer(exp.substring(0, i))) / eval(new StringBuffer(exp.substring(i+1,exp.length())));
               }
               else if(exp.charAt(i)=='*')
               {
                   return (double)eval(new StringBuffer(exp.substring(0, i))) * eval(new StringBuffer(exp.substring(i+1,exp.length())));
               }
               else if(exp.charAt(i)=='-')
               {
                   return (double)eval(new StringBuffer(exp.substring(0, i))) - eval(new StringBuffer(exp.substring(i+1,exp.length())));
               }
               else if(exp.charAt(i)=='+')
               {
                   return (double)eval(new StringBuffer(exp.substring(0, i))) + eval(new StringBuffer(exp.substring(i+1,exp.length())));
               }
           }
       }
       return 0;
    }
    public static void main(String[] args)
    {
        System.out.println("Simple Expression Parser \n");
        System.out.println(new Parser().eval(new StringBuffer("-1+2*3/4")));
    }
}

1 个答案:

答案 0 :(得分:2)

  

我在java中创建了一个简单的解析器,解析了像1 + 4,-5 / 3-7这样的算术表达式

但不正确。您尚未实现运算符优先级。

您需要查找Dijsktra Shunting-yard算法或递归下降表达式解析。在那里,您还将找到如何正确处理括号。