2014-02-19 51 views
-1

嘿,我正在编写一个递归函数parseString(String s),它需要一个前缀表达式,如“+ 2 2”,并从中创建一个表达式树。例如,当对parseString()给出“+ 2 2”时,“+”返回一个AddExpression(左,右),左右两边都是parseString(s.substring(++i)),这样在评估左边后,i会更大并且离开只有正确的子字符串。问题是i正在对原始字符串进行索引,这意味着它最终会大于子字符串的长度,并且编译器会抛出一个out of range异常。下面是parseString()片段只附加操作明白我的意思:Java解释器索引越界

public static Expression parseString(String s) { 
    if (s.length() == 0) return null; 
    else { 

     /*ADDITION*/ 
     if (s.charAt(i) == '+') { 
      return new AddExpression(parseString(s.substring(++i)), parseString(s.substring(++i))); 
     } 

     /*LITERALS*/ 
     else { 
      int j = i; 
      while (i < s.length() && s.charAt(i) != ' ') { // find the end of the number 
       i++; 
      } 
      return new IntExpression(s.substring(j, i)); 
     } 
    } 
} // parseString 

有什么办法,以保持与索引整个字符串... ...不知何故(parseString只能取1个参数)或者在左侧评估后重置我,或者什么?

+0

声明parseString方法里面的我,每次你打电话parseString是在参数的新字符串时间,因此指数应该为零 – fmodos

+0

为什么不能添加一个接受两个参数的* second *'parseString'方法?另外,我认为你应该查找[抽象语法树](http://en.wikipedia.org/wiki/Abstract_syntax_tree)(s)。 –

+0

@fmodos我试过了,得到了奇怪的结果 – kylecblyth

回答

0

你可以做这样的事情,只是一个示例,您可以建立它:

public static Expression parseString(String s) { 
    if (s.length() == 0) return null; 
    else { 

     /*ADDITION*/ 
     if (s.charAt(0) == '+') { 
      Expression left = parseString(s.substring(1)); 
      Expression right = parseString(s.substring(left.length() +1)); //where length should return expressions length 
      return new AddExpression(left, right); 
     } 

     /*LITERALS*/ 
     else { 
      int i=0; 
      while (i < s.length() && s.charAt(i) != ' ') { // find the end of the number 
       i++; 
      } 
      return new IntExpression(s.substring(0, i)); 
     } 
    } 
}