2012-11-29 3 views
0

나는 간단한 수학 표현 파서를 가지고 있으며 자신이 AST를 작성하려고한다. (ast 파서를 의미하지 않는다.) 그러나 모든 노드는 두 개의 피연산자를 가질 수 있습니다. 여기에 단지 "추가"부분을 인도 표준시간단한 수학 표현 파서

 + 
    /\ 
     2 + 
     /\ 
     3 4 

문제는 내가 재귀를하고 내 문법을 얻을 수 아니라고이다 : 그래서 2 + 3 + 4는이 같은 트리가 발생합니다

add returns [Expression e] 
    : op1=multiply { $e = $op1.e; Print.ln($op1.text); } 
    ('+' op2=multiply { $e = new AddOperator($op1.e, $op2.e); Print.ln($op1.e.getClass(), $op1.text, "+", $op2.e.getClass(), $op2.text); } 
    | '-' op2=multiply { $e = null; } // new MinusOperator  
    )* 
    ; 

그러나 결국이 같은 단일 트리 생성합니다 : A는 "추가"occour 수 있기 때문에

 + 
    /\ 
    2 4 

나는 문제가 어디 있는지 알고는, 그것이 결코 또는 무한히 (*)하지만 이 문제를 해결하는 방법을 모르겠습니다.

"추가"부분 : 나는 같은 생각

add returns [Expression e] 
    : op1=multiply { $e = $op1.e; Print.ln($op1.text); } 
    ('+' op2=(multiply|add) { $e = new AddOperator($op1.e, $op2.e); Print.ln($op1.e.getClass(), $op1.text, "+", $op2.e.getClass(), $op2.text); } 
    | '-' op2=multiply { $e = null; } // new MinusOperator  
    )? 
    ; 

그러나 이것은 나에게 recoursion 오류를 줄 것이다. 어떤 아이디어? 이와

$e = new AddOperator($op1.e, $op2.e); 

:

$e = new AddOperator($e, $op2.e); //$e instead of $op1.e 

이를

답변

1

나는이 솔루션을 테스트하지만,이 (질문의 첫 번째 add 규칙에서) 교체를 고려하기 위해 전체 문법이없는 각 반복은 ('+' multiply)*을 초과하여 e으로 바뀝니다.

정상적으로 작동하려면 약간의 놀림이 필요하거나 관리를 위해 규칙에 Expression 임시가 필요할 수 있습니다. 루프에 의해 생성 된 마지막 표현식이 $e = new XYZ($e, $rhs.e);처럼 = 연산자의 오른쪽에 있는지 확인하십시오.

+0

네, 감사합니다.이 작품은 완벽합니다! – KIC

+0

@KIC 내가 도와 줘서 다행이다 :) – user1201210