📢 Parser의 역할
📢 Context-Free grammar
- Starting non-terminal : 문법을 시작하는 non-terminal이다.
- Non-terminal : 다른 표현으로 derivation 될 수 있는 표현
- Terminal : 다른 표현으로 derivation 되지 않고, input에 포함될 수 있는 표현
- Production Rule : derivation rule을 정의
📢 Derivation
👍 Leftmost Derivation과 Rightmost Derivation은 결국에 같은 표현으로 derive하지만, Parse tree의 형태는 다르게 나타나고, 이는 곧 다른 evaluation order를 의미한다!
e.g). x - 2 * y; 를 해당 grammar로 파싱했을 때
1. Leftmost Derivation으로 parsing 했을 경우
vs 📢 Reduction?
👍 Derivation: e.g) A를 aB로 치환 (terminal을 sentential expr로)
👍 Reduction: e.g) aB를 A로 치환 (Sentential expr를 terminal로)
📢 Precedence in Derivations
- 우선순위마다 non-terminal을 추가
- 문법 분리
- 우선순위에 있는 expression을 먼저 parsing하도록 parser 강제
📢 Ambiguous Grammar
📜 정의
E -> E op E | x 인 grammar가 있다고 가정 할 때, 맨 앞의 E는 x 또는 E op E로 치환 될 수 있으며, 이때 어떤 production rule을 적용하더라도 똑같이 parsing에 성공하게 된다. 이때 이 grammar는 ambiguous하다고 할 수 있다.
👍 주의! Leftmost Derivation과 Rightmost Derivation으로 생성된 parse tree의 모양이 다른 것은 ambiguity와 관련이 없다. 이 특성은 precedence와 관련이 있다.
📜 Ambiguity의 예시: IF-THEN-ELSE(Dangling Else) 문제
IF E1 THEN IF E2 THEN S1 ELSE S2 라는 문장이 있다고 가정하면, 이는 두 가지 의미로 해석 될 수 있다.
📢 해석 1IF E1: THEN: IF E2: S1 ELSE: S2
📢 해석 2 - 참고) 대부분의 컴파일러는 이 방식을 채택함
IF E1: THEN: IF E2: S1 ELSE: S2
- 마지막 ELSE가 첫 번째 IF-THEN-ELSE 로 묶이는지, 아니면 첫 번째 THEN 안의 IF-ELSE로 묶이는지 확인이 불가능하다. (어떤 production rule을 써도 parsing이 가능하며 parse tree의 모양이 다르다. -> Ambiguous grammar
- Ambiguity를 없애는 방법은 grammar를 다시 쓰거나, precedence를 부여하면 해결할 수 있다...
📢 1. grammar를 다시 써보자
- 다시 쓴 grammar가 복잡해 보일 수 있으나, 해당 grammar의 핵심은 THEN과 ELSE 사이에는 IF-THEN-ELSE 구문만 들어 올 수 있다는 것이다.
- 이렇게 grammar를 다시 쓰게 되면 가장 마지막의 else는 해석 2와 같이 내부 if와 묶이게 된다.
📢 2. parsing precedence를 부여하자!
- 만일 derivation시 IF-THEN에 낮은 순위를 부여하고, reduction시 IF-THEN-ELSE에 높은 우선순위를 부여했다면?
- 위와 같이 reduction시 IF-THEN-ELSE에 우선순위를 부여하게 되면 자동적으로 else는 inner if와 묶이게 해석된다.