2014-10-20 5 views

답변

4

여기 예제 접근 방식 :

expr -> addExpr; 
addExpr -> multExpr (('+'|'-') multExpr)*; 
multExpr -> terminalExpr (('*'|'/') terminalExpr)*; 
terminalExpr -> integer | variable | '(' expr ')'; 

그러나 연관성이 모호합니다. 다음은 BNF에서 좀 더 명시 적 방법이있다 :

expr -> addExpr; 
addExpr -> addExpr '+' multExpr | addExpr '-' multExpr | multExpr; 
multExpr -> multExpr '*' terminalExpr | multExpr '/' terminalExpr | terminalExpr; 
terminalExpr -> integer | variable | '(' expr ')'; 

이 문법은 +-로 더 우선 순위를 가진 것으로 운영자에게 */을 정의합니다. 구문 분석 트리에서 더 높은 우선 순위의 연산을 선언하므로 파서가 먼저 시도합니다.

+1

좋은 예. 감사. 그래서 파싱 트리에서 더 높은 우선 순위를 가진 연산이 더 낮아야한다는 것을 의미합니다. 아마 당신의 대답과 이드에 그것을 더할 수 있습니다. –

+0

이 문법은 1 + 2 + 3을 허용하지 않습니다 – rici

+0

@rici huh 내가 뭘 생각하는지 모르겠군요 : - 이걸 알아 줘서 고마워, 대답을 고쳤어. –