어휘 분석부터 구문 분석까지 실습
어휘 분석기의 소중함을 배워보자
어휘 분석기의 유무에 따라 어떻게 식을 인식해 가는지 과정을 봅시다
- foo = (bar - 60)
어휘 분석기가 없는 구문 분석
- 간단한 C 언어 문법
(1) <Sub C> ::= <assign-st>
(2) <assign-st> ::= <lhs> = <exp>;
(3) <lhs> ::= <variable>
(4) <exp> ::= <exp>+<term> | <exp>-<term> | <term>
(5) <term> ::= <term>*<factor> | <term>/<factor> | <factor>
(6) <factor> ::= <variable> | <number> | ( <exp> )
(7) <variable> ::= <ident>
(8) <ident> ::= (<letter> | _){<letter> | <digit> | _}
(9) <number> ::= {<digit>}
(10) <letter> ::= a |⋯| z
(11) <digit> ::= 0 | 1 | ⋯| 9
어휘 분석
- 토큰 단위 분리 : foo | = | ( | bar | - | 60 | ) |
- 식별자 : foo, bar
- 연산자 : = , -
- 상수 : 60
- 구분자 : ( , ) , ;
구문 분석
- 구문 분석(Syntax Analysis): 토큰들이 문법 규칙에 맞게 구성되어 있는지 검사합니다.
주어진 문장에서는<assign-st>
규칙에 따라 다음과 같이 분석할 수 있습니다.
<assign-st>
로 시작합니다. (규칙 2)<lhs>
는foo
이며, 이는<variable>
에 해당합니다. (규칙 3)foo
는<ident>
에 해당합니다. (규칙 7)=
기호를 인식합니다.<exp>
는(bar - 60)
에 해당합니다. (규칙 4)<term>
은bar
이며, 이는<factor>
에 해당합니다. (규칙 5)bar
는<variable>
에 해당하며, 이는<ident>
에 해당합니다. (규칙 7)-
기호를 인식합니다.<term>
은60
이며, 이는<factor>
에 해당합니다. (규칙 5)60
은<number>
에 해당합니다. (규칙 9))
기호를 인식합니다.;
기호를 인식합니다.
어휘 분석기 있는 구문 분석
주어진 문장 "foo=(bar-60);"을 구문분석과 어휘분석을 포함한 C 언어 문법에 따라 분석해보겠습니다.
-
어휘분석: 입력된 문자열을 토큰 단위로 분해합니다.
- “foo”, “=”, “(”, “bar”, “-”, “60”, “)”, “;”
-
구문분석: 분해된 토큰들을 문법에 따라 구문 분석합니다.
<assign-st>
를 사용하여 "foo = (bar - 60);"를 구성합니다.<lhs>
는 "foo"이며, 이는<variable>
에 해당합니다.=
기호를 인식합니다.<exp>
는 "(bar - 60)"에 해당합니다.<term>
는 "bar"이며, 이는<factor>
에 해당합니다.- "bar"는
<variable>
에 해당하며, 이는<ident>
에 해당합니다.
- "bar"는
-
기호를 인식합니다.<term>
는 "60"이며, 이는<factor>
에 해당합니다.- "60"은
<number>
에 해당합니다.
- "60"은
)
기호를 인식합니다.
;
기호를 인식합니다.
따라서, 주어진 문장 "foo=(bar-60);"은 문법 오류가 없는 유효한 C 언어 문장입니다.
구문 분석을 할 때 연산자들이 어디들어가는지 애매하다 싶을 때가 있다.
그럴 땐, 문법을 확인해서, 트리 구조로 토큰에 알맞는 값을 찾으면 된다
규칙을 나타내는 요소라는 개념으로 접근하면 이해하기 쉬울 듯하다
전위나 후위 연산을 계산 할 때 연산자 등은 규칙(연산)을 나타내는 요소로 쓰이는 것처럼, 표현 자체를 위한 것이라 생각하자.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
728x90
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
형식 언어 (2) - 언어 (0) | 2023.04.08 |
---|---|
형식 언어 (1) - 문자열 (0) | 2023.04.08 |
BNF (Backus-Naur Form) (0) | 2023.04.08 |
정규 문법과 문맥 자유 문법 (0) | 2023.04.05 |
프로그래밍 언어 정의하는 방법 (0) | 2023.04.05 |