2014-11-10 8 views
0

+, -, *,/및 float 및 variable 연산자를 처리하는 간단한 계산기 (중위 연산자 사용) 파서를 작성해야합니다. 이렇게하려면 javacc을 사용했고 jytree를 사용하여 this grammar을 만들었습니다. 그것은 작동하지만 최종 트리가 필요한 2 진 트리가되도록 보장하지는 않습니다. 내가 원하는 5 * 3과 같이 + 다음 트리를 생성하는 X-Y :javacc로 이진 트리를 만드는 계산기 문법 만들기

* 
/\ 
5 + 
/\ 
    3 - 
    /\ 
    x y 

어떤 적절한 문법 재귀 왼쪽되지 않을 것이라고, 그렇게하는 것?

답변

0

다음과 같은 것이 당신이 요청한 나무를 줄 것입니다.

void sum(): 
{} 
{ 
    term() 
    [ plus() sum() 
    | minus() sum() 
    | times() sum() 
    | divide() sum() 
    | modulo() sum() 
    ] 
} 


void term() : 
{} 
{ 
    "(" sum() ")" | Number() | Variable() 
} 

--- 편집 : ---

, 당신은 명확한 노드를 사용하여 우선 순위와를 반영하는 트리를 얻을 수 있습니다. JJTree 문서를 참조하십시오.

void sum() #void {} : 
{ 
    term() 
    ( plus() term() #BinOp(3) 
    | minus() term() #BinOp(3) 
    )* 
} 

void term() #void {} : 
{ 
    factor() 
    ( times() factor() #BinOp(3) 
    | divide() factor() #BinOp(3) 
    | modulo() factor() #BinOp(3) 
    )* 
} 

void factor() #void : 
{} 
{ 
    "(" sum() ")" | Number() | Variable() 
} 
+0

하지만 연산자 우선 순위가 유지 될까요? 삽입 기호 표기법을 구문 분석하고 있습니까? – Maeln

+0

아니요, 운영자 우선 순위를 따르지 않습니다. 그것도 연관성을 얻지 못합니다. 이것은 신중한 것입니다. 원래 게시물의 예제 트리를 보면 연산자 우선 순위가 존중되지 않으며 +와 -의 연관성을 얻지 못한다는 것을 알 수 있습니다. 편집을 참조하십시오. –

+0

죄송합니다. 불쾌합니다. 예제를 빨리 완료했습니다. 연산자 우선 순위를 존중해야합니다. 나는 [이] (http://stackoverflow.com/a/7867104/1149206)을 시도하고 있는데, 공식적으로 문법을 사용하는 것은 아니지만, 내가 성취하고자하는 것에 대해서는 꽤 잘 작동한다. 어쨌든 당신의 대답에 감사드립니다! – Maeln

관련 문제