2014-10-16 7 views
0

기본적으로 다음 문을 가지고 있으며 순서에 상관없이 동일한 내용을 처리하기를 원합니다. 예를 들어 코드가 현재와 같이 "ABS (5) + 3"을 허용하지만 그렇지 않습니다. "3 + ABS (5)". 아무도 내가 어떤 순서로 어떻게 작동시킬 수 있는지 알고 있습니까?JavaCC -이 성명서에서 순서를 어떻게 지정할 수 있습니까?

나는 모든 것을 OR로 생각하고 *로 처리하는 것이 좋겠다고 생각했지만 그 차이는별로 없었던 것으로 보입니다.

((s1=ABS() { s=s+s1; }) 
| ("+" { op="+"; s=s+op; } 
    | "-" { op="-"; s=s+op; } 
    | "*" { op="*"; s=s+op; } 
    | "/" { op="/"; s=s+op; }) 
| (s1=EXPR() { s=s+s1; }))* 

답변

0

나는 당신이 거의 바른 길에 있다고 생각합니다. 당신은, 다음 화합물 식에 대한 규칙이 EJP 그들의 대답에서 지적한대로

s = EXPR() 
(
    (
     "+" { op="+"; s=s+op; } 
    | "-" { op="-"; s=s+op; } 
    | "*" { op="*"; s=s+op; } 
    | "/" { op="/"; s=s+op; } 
    ) 
    s1=EXPR() { s=s+s1; } 
)* 

는 EXPR의 몸이

(s = ABS() | s = NUMBER()) 
{return s;} 

같이 보일 것입니다 수있는 ABS는 EXPR의 일종이 될 수 있음을 원하는 이것은 운영자 우선 순위를 다루지는 않지만 바로 그 목표라는 것은 분명하지 않습니다. 또한, Expr을 호출 한 것을 대개 Primary라고합니다. 우선 순위 및 결합에 대한 자세한 내용은 Parsing Expressions by Recursive Descent을 참조하십시오.

0

기본적으로 완전히 잘못하고 있습니다. 표현 문법은 다른 언어와 마찬가지로 많아야합니다 (expression, term, factor,primary.). 과 같은 함수 호출은 primary 및 기타 문자와 함께 '(' expression ')' 등의 프로덕션에 표시되어야합니다.