어휘 분석(lexical analysis)
위의 사진에서 오늘은 Lexical Analysis에 대해 알아보겠습니다
- Token : 문법적으로 의미가 있는 최소 단위
- Pattern : 토큰을 서술하는 규칙
- Lexeme : 패턴에 의해 매칭 된 문자열
Token에 관하여
토큰은 크게 Special form과 General form으로 나눌 수 있습니다.
Special form은 언어 디자이너가 미리 정의한 단어들로, 예약어(keyword), 연산자(operator), 구분자(delimiter)가 해당됩니다.
- 예약어(keyword)는 프로그래밍 언어에서 미리 정의된 단어
- 조건문(if, else), 반복문(for, while), 데이터 타입(int, float) 등이 해당됩니다.
- 예약어들은 프로그래머가 변수명이나 함수명 등의 식별자로 사용할 수 없습니다.
- 연산자(operator)는 프로그래밍 언어에서 수학적, 논리적 연산 등을 수행할 때 사용되는 기호입니다.
- 대표적으로
+, -, *, /
등이 해당됩니다.
- 대표적으로
- 구분자(delimiter)는 프로그래밍 언어에서 단어와 단어를 구분하거나 문장과 문장을 구분하는 기호입니다.
- 대표적으로
;, (, ), [, ]
등이 해당됩니다.
- 대표적으로
General form은 프로그래머가 정의하는 변수명, 함수명, 클래스명 등의 토큰으로 식별자(identifier)와 상수(constant)가 해당됩니다.
- 식별자(identifier)는 프로그래머가 변수명, 함수명, 클래스명 등을 정의할 때 사용하는 이름
영문 알파벳, 숫자, 언더스코어(_)
등으로 구성됩니다.- 프로그래머가 정의하는 변수명
- 상수(constant)는 프로그래머가 정의하는 고정된 값
- 숫자, 문자열, 참/거짓 등이 해당됩니다.
- 상수는 프로그램 실행 중 값이 변경되지 않는 값으로 사용됩니다.
Token 표현 : Token 더 간결하게!
이 부분은 구문 분석 단계에서 토큰을 분석하고 토큰 번호와 토큰 값의 순서쌍으로 표현하는 것과 관련이 있으므로 구문 분석과 가깝습니다.
또한, 토큰 값들이 심볼 테이블에 저장된다는 것은 어휘 분석에서 추출된 Lexeme이 다루어지는 단계에서도 관련이 있습니다.
토큰은 토큰 번호와 토큰 값의 순서쌍으로 표현됩니다.
이때 토큰 번호는 토큰을 구분하기 위해 사용되는 번호이고, 토큰 값은 식별자나 상수 등을 구분하기 위해 사용되는 값입니다.
따라서 (토큰 번호, 토큰 값) 형태로 표현됩니다.
이 값들은 일반적으로 심볼 테이블(Symbol Table)에 저장됩니다.
심볼 테이블은 언어에서 사용되는 모든 식별자(변수, 함수, 클래스 등)와 상수의 이름과 관련된 정보(데이터 타입, 메모리 주소 등)를 저장하고 관리합니다.
Pattern에 관하여
패턴은 토큰을 서술하는 규칙을 의미합니다.
예를 들어, C 언어에서의 식별자는 첫 번째 문자는 영문자 또는 언더바를 사용하고, 두 번째 문자부터는 영문자, 숫자, 또는 언더바를 사용한다는 패턴으로 정의됩니다.
이 패턴은 다음과 같이 정규 문법으로 서술할 수 있습니다.
- ident는 식별자(identifier)를 나타내는데 사용되는 기호
- letter는 알파벳 문자를, digit는 숫자를 나타내는 기호
<ident> ::= (<letter> | _) {<letter> | <digit> | _}
<letter> ::= a | b | c | … | z | A | B | C | … | Z
<digit> ::= 0 | 1 | 2 | … | 9
유도(derivation)는 패턴에 따라 어휘 항목이 유도되는 과정을 말합니다.
예를 들어, "foo"가 C 언어에서의 식별자에 해당하는지 판별하기 위해 다음과 같이 유도과정을 거칠 수 있습니다.
<ident> => (<letter> | _) {<letter> | <digit> | _}
=> f {<letter> | <digit> | _}
=> fo {<letter> | <digit> | _} => foo
따라서 "foo"는 C 언어에서 유효한 식별자로 인식됩니다
어휘 항목 구하는 연습
다음 문장에서 어휘항목을 구해보자.
foo = i * j – 60 + bar / (k + 50);
어휘 항목은 글자 하나씩 쪼개는 것이 아니라, 문장에서 패턴에 맞는 문자열을 찾아내는 것입니다.
- 정답
- 식별자: foo, bar, k
- 연산자: =, *, -, +, /
- 구분자 : ;, ( , )
- 상수: 60, 50
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
정규 문법과 문맥 자유 문법 (0) | 2023.04.05 |
---|---|
프로그래밍 언어 정의하는 방법 (0) | 2023.04.05 |
프로그래밍 언어의 구성 (0) | 2023.04.05 |
Scheme 기본 문법 (0) | 2023.04.04 |
람다 대수(Lamda calcuus)란 무엇인가 (0) | 2023.03.29 |