2012-02-16 4 views
3

(실제로 jison를 사용하지만 동일해야합니다). 계산기 데모를 사용하여 설명해 보겠습니다. http://zaach.github.com/jison/try/들소 우선 내가 jison (들소의 자바 스크립트 상당)를 사용하고 있는데 나는 다음과 같은 우선 순위의 문제가있어

잘 작동합니다. 우선 순위는

내가이

| e '*' e %prec TIMESPREC 
     {$$ = $1*$3;} 

을하고

%left '+' '-' 
%left TIMESPREC '/' 
%left '^' 
%left UMINUS 

에 우선 순위를 변경하려면 '*'라인을 변경하는 경우 문법은

e 
    : e '+' e 
     {$$ = $1+$3;} 
    | e '-' e 
     {$$ = $1-$3;} 
    | e '*' e 
     {$$ = $1*$3;} 
    | e '/' e 
     {$$ = $1/$3;} 
    | e '^' e 
     {$$ = Math.pow($1, $3);} 
    | '-' e %prec UMINUS 
     {$$ = -$2;} 

입니다 더 이상 작동하지 않습니다. 그것도 똑같이 작동하지 않아? 예를 들어 2 x + 3이 (2x) +3으로 파싱되는 대수 구문을 궁극적으로 원한다면 유용 할 수 있습니다.

감사합니다. %prec는 모든 개별 토큰에, 규칙의 우선 순위를 설정하기 때문에

답변

2

그 이유는. 따라서 규칙의 RHS에있는 토큰의 개별 우선 순위는 여전히 중요합니다.

곱셈 규칙에 %prec을 설정하면 '*' 심볼의 우선 순위가 변경되지 않습니다. 우선 순위가 충돌을 해결하려고 시도 할 때 감소 동작 우선 순위와 이동 될 토큰의 우선 순위를 비교합니다. *에는 우선 순위가 없으므로 변경 사항에 따라 문법이 모호해집니다.

+0

감사합니다. 그 이유를 설명합니다! 이제 2 * x + 3 대신에 2 x + 3 같은 것을 허용하고 싶다면 올바른 해결책은 무엇입니까? 감사합니다. – user1213898

+0

기본적으로 이것을 허용하기 위해 문법을 다시 작성해야합니다. 중요한 것은 규칙에서'*'를 단순히 제거 할 수없고 우선 순위를 설정하는 것이 충돌을 일으킬 수 있기 때문입니다. 본질적으로'% prec'는 이것으로 여러분의 문제를 해결하지 못할 것입니다. 그건 그렇고, 답변을 upvote 또는 받아보다 감사를 말할 더 좋은 방법은 없습니다 :) – Dervall