KNOU/프로그래밍언어론
[프로그래밍 언어론] 5. 구문 분석
워터파슬리
2022. 9. 20. 01:01
728x90
반응형
1. 어휘 분석
🔸프로그램 분석
int x12; x12 = 1 + 5 * 2; if x12>10 then ... |
문자: i, n, t, x, 1, 2, ;, =, 5, *, f, >, ... |
↓ 어휘 분석 | |
어휘: int, x12, ;, =, 1, +, 5, if, >, 10, then, ... | |
↓ 구문 분석 | |
구문 <선언문> ::= <자료형> <변수> ; <대입문> ::= <변수> = <수식> ; |
✅ 어휘 분석
- 프로그램에서 사용된 (의미를 가지는 최소한의) 단어를 구별해 냄
- 토큰: 어휘 분석을 통해 얻어지는 결과
- 연산자, 구분자, 식별자, 예약어 등
연산자 | +, -, *, /, = 등 |
구분자 | ,(콤마), ;, [, ] 등 |
식별자 | - 변수나 함수 등의 이름을 나타내는 토큰 예) x12, printf 등 - 전통적인 식별자 예) 문자와 숫자로 구성, 첫 글자는 문자 ![]() |
예약어 | - 프로그래밍 언어 자체에 정의되어 포함된 토큰 예) if, for, int 등 - 식별자와 구문 구조가 같지만 식별자로 사용 못함 → 사용자 재정의 불가 |
⭐2. 파스 트리
✅ 구문 분석
- 유도(derivation)
- 구문 규칙을 이용하여 주어진 프로그램을 만들어 내는 과정
- 유도가 가능하면 문법적 오류가 없는 유효한 프로그램임
- = 해당하는 언어의 구문 규칙을 잘 활용해서 쭉 유도를 했더니 어떤 프로그램이 만들어졌음
예)
수식 | 구문 규칙 | 유도 |
1+5*2 | ![]() |
<exp> → <exp>+<exp> → <exp>+<exp>*<exp> → <exp>+<exp>*<digit> → <exp>+<exp>*2 → <exp>+<digit>*2 → <exp>+5*2 → <digit>+5*2 → 1+5*2 |
✅ 파스 트리(parse tree)
유도 | 파스 트리 |
<exp> → <exp>+<exp> → <exp>+<exp>*<exp> → <exp>+<exp>*<digit> → <exp>+<exp>*2 → <exp>+<digit>*2 → <exp>+5*2 → <digit>+5*2 → 1+5*2 |
![]() |
- 유도를 트리 형태로 나타낸 것
- 구조
- 루트 노드: 시작 비단말 기호
- 비단말 노드: 비단말 기호
- 단말 노드: 단말 기호
- 단말 노드를 왼쪽에서 오른쪽 방향으로 차례대로 나열하면 주어진 프로그램이 됨
- 주어진 표현에 대한 파스 트리가 존재하면 구문에 부합하는 표현임 ↔ 파스 트리가 존재하지 않으면 오류있는 표현
- 예) 수식 1+5*
수식 | 구문 규칙 | 유도 |
1+5* | ![]() |
<exp> → <exp>+<exp> → <digit>+<exp> → 1+<exp> → 1+<exp>*<exp> → 1+<digit>*<exp> → 1+5*<exp> → 1+5*<digit> → ❌ |
유도 | 파스 트리 |
<exp> → <exp>+<exp> → <digit>+<exp> → 1+<exp> → 1+<exp>*<exp> → 1+<digit>*<exp> → 1+5*<ex> → 1+5*<digit> → ❌ |
![]() |
3. 모호성
💡주어진 표현에 대한 파스 트리가 존재하면 구문에 부합하는 표현임. 만약 주어진 표현에 대한 파스 트리가 여러 개 존재한다면?
- 구문론 관점: 파스 트리가 존재하므로 구문에는 부합
- 의미론 관점: 주어진 표현이 서로 다른 의미로 해석될 수 있음
🔸서로 다른 파스 트리
수식 1+5*2 | |
파스 트리1 | 파스 트리2 |
![]() |
![]() |
파스 트리1 계산 | 파스 트리2 계산 |
![]() |
![]() |
🔸모호한 문법
- 동일한 표현에 대해 서로 다른 파스 트리가 만들어지는 문법
- 문제점
- 하나의 프로그램이 서로 다른 결과를 도출할 수 있음
- 프로그래머의 의도와는 다르게 해석되어 잘못된 결과를 도출할 수 있는 위험을 내포
🔸모호성 제거
- 문법의 명확화
- 의도하지 않은 의미로 해석되지 않도록 모호한 문법을 명확하게 변경
- 새로운 비단말 기호와 새로운 구문 규칙을 추가하여 변경
- 대표적인 예
- 연산자 우선순위
- 좌결합 연산자
- 중첩된 if문의 else
🔸연산자 우선순위
- +, - : 가장 낮음
- *, / : 중간
- ( ) : 가장 높음
수식 1+5*2 | ||
모호한 문법 | 연산자 우선순위 | 연산자 우선순위 파스 트리 |
![]() |
![]() |
![]() |
🔸좌결합 연산자
: 우선 순위가 동일한 연산자 사이의 계산 순서는 왼쪽이 우선
수식 5-3+2 | ||
모호한 문법 | 좌결합 연산자 | 좌결합 연산자 파스 트리 |
![]() |
![]() |
![]() |
🔸중첩된 if문의 else
: 중첩된 if문에서 else문의 개수가 if문의 개수보다 적은 경우 각 else문을 어느 조건이 거짓일 때 수행해야 하는지 모호
예)
if x>1 then if x<5 then y=1 else y=2 | |
![]() |
|
파스 트리1 | 파스 트리2 |
![]() |
![]() |
↓
if x>1 then if x<5 then y=1 else y=2 | |
![]() else문 앞에 나온 if문들 중 다른 else문과 짝이 되지 않은 가장 가까운 if문과 짝이 되도록 함 |
|
파스 트리 | |
![]() |
728x90
반응형