2014-02-19 5 views
-1

안녕하세요 저는 "+ 2 2"와 같은 접두사 표현식을 사용하는 표현식 트리를 만드는 재귀 함수 parseString(String s)을 작성하고 있습니다. 예를 들어, parseString()에 "+ 2"가 주어지면 "+"는 왼쪽과 오른쪽이 모두 parseString(s.substring(++i)) 인 AddExpression (왼쪽, 오른쪽)을 반환합니다. 그러면 왼쪽이 계산 된 후 i은 더 커지고 오른쪽 부분 문자열 만. 문제는 i이 원래 문자열을 기준으로 인덱싱하는 것이므로 결국 하위 문자열의 길이보다 커서 컴파일러에서 out of range 예외를 throw합니다. 여기 parseString()의 조각이 무슨 뜻인지 볼 만 추가 작업과 함께입니다 :자바 인터프리터가 범위를 벗어남

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 개 매개 변수를 사용합니다) , 또는 왼쪽을 평가 한 후 i를 재설정하거나 무엇을 할 수 있습니까?

+0

가 parseString을 방법 안에 내가, 당신이 parseString을 매개 변수에 새로운 문자열로 전화를 할 때마다, 그래서 인덱스를 선언 0이어야합니다 – fmodos

+0

왜 두 개의 인수를 취하는 * 두 번째 *'parseString' 메서드를 추가 할 수 없습니까? 또한 [Abstract syntax tree] (http://en.wikipedia.org/wiki/Abstract_syntax_tree)를 검색해야한다고 생각합니다. –

+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)); 
     } 
    } 
}