[Compiler] 1. Lexical Analyzer :: 동작하는 방식
* 2019/07/30 - [Programming/Compiler] - [Compiler] 1. Lexical Analyzer :: 소개와 용어 정리에서 이어지는 내용입니다.
지난번 글에서 말했던 개념을 빠르게 복습해봅시다
Token: (Token Name, 어떤 문자들을 대표하는 Symbol)와 (Token Value, 토큰의 구체적인 속성)의 쌍
(ex) "산술연산자(+, -, *, /, %)", "반복문(for, while)"
Lexeme: 토큰들의 구체적인 예
(ex) "+" -> 산술연산자라는 토큰의 구체적인 예
Lexical Analyzer(Scanner)의 동작 방식에 대해 알아보자
Lexical Analyzer는 input으로 준 문자열을 읽어서 각각의 단어들이 무엇을 의미하는 단어인지 분류를 합니다. 동작하는 것이 문자열을 스캔하는 것 같아서 스캐너라고도 부릅니다.
동작하는 순서
1. Input(전체 문자열)를 읽습니다.
스캔할 문자들을 가져옵니다. 예를 들어서, 아래에 문자들을 입력받았다고 해봅시다.
printf("hello, world\n");
2. 의미 있는 단위로 쪼개고 어떤 단어인지 분류합니다. = 문자열을 Lexeme으로 쪼개고 토큰으로 분류합니다.
* Token을 Token_Value가 생략 가능하면 "Token_Name" 아니라면 "Token_Name(Token_Value들)" 형식으로 표현하겠습니다.
Lexical Analyzer가 "함수(출력, 입력)", "문자열", "세미콜론", "괄호(왼쪽,오른쪽)"라는 토큰을 알고 있다고 합시다.
그러면 Lexical Analyzer는 받은 문자열을 아래와 같이 의미 있는 단위로 분류해줍니다.
// "Token: Lexeme"으로 표현함
함수(출력): printf
괄호(왼쪽): (
문자열: "hello, world"
괄호(오른쪽): )
세미콜론: ;
3. 이렇게 Token으로 분류한 것들을 일정한 형식에 맞춰서 저장합니다. 이렇게 일정한 형식으로 저장한 것을 "Symobol Table"이라고 부릅니다.
저는 Symbol Table을 <Token, Lexeme> 형식으로 만들어보겠습니다.
// SymbolTable.txt
<함수(출력),printf>
<괄호(왼쪽),(>
<문자열,"hello, world">
<괄호(오른쪽),)>
<세미콜론,;>
4. 완성한 Symbol Table을 Syntax Analyzer한테 전달합니다.
예를 들어서, 저것을 전역 변수로 저장해 놓는다던가 아래처럼 Syntax Analyzer함수를 호출해서 알려줄 수도 있겠습니다.
Syntax_Analyzer(SymbolTable.txt);
Lexical Analyzer 동작 끝
- Icons made by Freepik from www.flaticon.com
댓글
이 글 공유하기
다른 글
-
[Compiler] 연산자의 Associativity와 Recursion의 연관성
[Compiler] 연산자의 Associativity와 Recursion의 연관성
2020.05.10 -
[Compiler] 1. Lexical Analyzer :: 구현하기
[Compiler] 1. Lexical Analyzer :: 구현하기
2020.04.09 -
[Compiler] 1. Lexical Analyzer :: 소개와 용어 정리
[Compiler] 1. Lexical Analyzer :: 소개와 용어 정리
2019.07.30 -
[Compiler] 0. 컴파일러란 무엇인가?
[Compiler] 0. 컴파일러란 무엇인가?
2019.07.21