Lexical analysis
2023. 9. 28. 05:51ㆍ전공/컴파일러
어휘 분석(Lexical analysis, Scanning)
- 소스코드를 읽고 토큰으로 나누는 것
- 토큰 : 의미를 가지는 문자열
- 토큰은 파서에서 처리
- 토큰 종류
- 예약어 : if, then
- 특별한 기호 : +, -, ...
- integer, double, float, 구분자
- 입력된 문자열에서 토큰을 인식
- lexeme : 토큰을 구성하는 실제 문자열
- token : lexeme이 속하는 일반적인 클래스
- 에러가 거의 감지되지 않음
- 유효한 토큰 or 유효하지 않은 토큰
- 위치를 벗어난 토큰, 선언되지 않은 변수, 철자가 틀린 키워드 등을 찾을 수 없음
정규 표현의 확장
- 1번 이상 반복
- $(0+1)(0+1)^* or (0|1)(0|1)^* \rightarrow (0|1)+$
- 어떤 문자
- 메타문자
- .(period) : 매칭되는 어떤 문자
- b를 최소한 한번 가지는 모든 문자열 : .b.
- 메타문자
- 문자들의 범위
- 소문자 : [a-z]
- 숫자 : [0-9]
- a|b|c → [abc]
- 여러 범위 표현 : [a-zA-Z]
- 주어진 집합에 포함되지 않는 문자
- ~a : not a, ~(a|b|c) : not either a or b or c
- [^a], [^abc]
- 선택적 표현
- 특정 문자열에 나타날 수도 있고 안나타날수도 있는 것
- 메타문자 ? 사용
- r? : r은 선택적으로 매칭됨
프로그래밍 언어 토큰에 대한 정규표현
- 숫자
- nat = [0-9]+
- signedNat = (+|-)?nat
- number = signedNat(”.”nat)?(E signedNat)?
- 예약어
- reserved = if | while | do | ...
- 변수
- letter = [a-zA-Z]
- digit = [0-9]
- identifier = letter(letter|digit)*
모호성
- 어떤 문자열들은 여러 개의 다른 정규 표현으로 매치될 수 있다.
- 정규 표현은 그 자체로는 모호함
- 언어 정의는 모호하지 않은 법칙을 주어야 한다.
- 예약어 : 변수가 될 수 없음
- 가장 긴 서브문자열의 원칙
- 문자열이 하나의 토큰 또는 여러개의 토큰들로 될 수 있을 때 하나의 토큰으로 해석하는 것이 일반적으로 선호됨
- 토큰 구분자 또는 문자
- = 은 왼쪽의 문자열을 변수로 구분
- 빈칸, 새로운 줄, 탭은 구분자로 취급
White space
- 스캐너는 파싱에 기여하지 않는 토큰들을 버린다.
- whitespace = (newline | blank | tab | comment)+
Lookahead
- 구분자는 토큰 문자열을 끝내지만 그들 자체로 토큰이 될 수 없음
- lookahead는 어디서 한 토큰이 끝나고 다음 토큰이 시작될지 결정하기 위해 필요
- = 은 변수를 인식하는데 쓰임
- 다음 토큰이 인식되어야 한다는 것을 표현하기 위해 = 은 입력에 남아있어야 함
- 가끔 단일 문자보다 더 많은 lookahead가 필요
TINY language
- ;으로 문장을 나눔
- 모든 변수는 integer형
- 변수 선언은 항상 assign을 받아야 함
- 2가지 제어문
- if-then
- else는 선택
- end로 끝남
- repeat-until
- if-then
- read, write 상태
- read : 입력
- write : 출력
- Boolean 표현(<, =)
- 산술 표현 (+, -, *, /)
- 주석 : { }
- 중첩 불가능
- white space : blank, tab, newline
- 가장 긴 substring 인식
- = 같다 / =: 할당
'전공 > 컴파일러' 카테고리의 다른 글
Context Free Grammar (0) | 2023.09.28 |
---|---|
Lex (0) | 2023.09.28 |
Finite Automata (0) | 2023.09.28 |
Regular expression (0) | 2023.09.28 |
Formal Language, Grammar and Automata (0) | 2023.09.28 |