[프로그래밍 언어론] 어휘 분석기

2025. 6. 29. 16:44·CS/프로그래밍 언어론

토큰

 어휘 분석(Lexical Analysis)은 소스 프로그램을 읽어 토큰이라는 의미 있는 문법 단위로 분리하는 행위이다. 이러한 어휘 분석을 담당하는 툴을 어휘 분석기, 혹은 스캐너(Scanner)라고 한다. 토큰이란 의미 있는 문법적 단위로 일반적으로 식별자(Identifier), 상수(Constant), 예약어(Keyword), 연산자(Operator), 구분자(Delimiter) 등이 토큰으로 이용된다. 

 

언어 S의 각 토큰을 아래와 같이 정해보겠다. 

 

예약어

 언어에서 미리 그 의미와 용법이 지정되어 사용되는 단어로 예약어 / 키워드라고 한다. 괄호 안이 예약어에 해당되는 문자열이다.

 

BOOL("bool"), TRUE("true"), FALSE("false"), IF("if"),

THEN("then"), ELSE("else"), INT("int"), STRING("string"),

WHILE("while"), VOID("void"), FUN("fun"),

RETURN("return"), LET("let"), IN("in"), END("end"), READ("read"), PRINT("print")

 

식별자

 식별자는 변수 / 함수의 이름을 나타내며, 토큰 이름은 ID이다. 우리가 사용하는 프로그래밍 언어의 변수 / 함수 명이라 생각하면 된다. 

 

ID = letter(letter | digit)*

letter = [a-zA-Z]

digit = [0-9]

정수 리터럴

 정수 리터럴은 정수 상수를 나타내며, 토큰 이름은 NUMBER이다. 정수 리터럴은 숫자로 구성된 문자열이며 다음과 같이 표현한다. 

 

NUMBER = digit*

스트링 리터럴

 스트링 리터럴은 문자열을 나타내며, 토큰 이름은 SIRLITERAL이다. 스트링 리터럴은 다음과 같이 큰 따옴표로 둘러싸진 임의 문자열이다.

 

STRLETERAL = "..."

연산자

ASSIGN("="), EQUAL("=="), LT("<"), LTEQ("<="), GT(">"),

GTEQ(">="), NOT("!"), NOTEQ("!="), PLUS("+"), MINUS(""),

MULTIPLY("*"), DIVIDE("/"), AND("&"), OR("|")

구분자

 구분자는 간단하게 괄호의 모음이라 생각해도 된다. 

 

LBRACE("{"), RBRACE("}"), LBRACKET("["), RBRACKET("]"),

LPAREN("("), RPAREN(")"), SEMICOLON(";"), COMMA(","), EOF("<<EOF>>")

 

정규 표현식

S 언어의 여러 토큰 표현을 알아보았는데, 몇몇 토큰은 정규 표현식 형태로 정의되어 있다. 정규 표현식에 대해 짧게 알아보고 넘어가자.

 

1. x        -> 문자 x 

2. M | N -> M 또는 N

3. MN    -> M 다음에 N이 나타나는 집합

4. M*     -> M이 0번 이상 반복

5. M+    -> M이 1번 이상 반복

6. M?    -> M이 0번 또는 1번 나타남

7. [..]     -> 대괄호 내의 문자 집합을 의미

 

정규 표현식에 대해 알아보았으니, 식별자 토큰의 정규 표현식 표현을 알아보자. 앞서 살펴본 식별자 토큰의 표현은 다음과 같다.

 

ID = letter(letter | digit)*

letter = [a-zA-Z]

digit = [0-9]

 

ID의 표현은 다음과 같다. 우선 알파벳의 집합(letter)이 1회 나타나고, 그 뒤에는 알파벳 또는 숫자가 0번 이상 반복된다. 우리가 Java 언어에서 변수 명을 정하는 경우를 생각해보자. Java에서도 변수 명은 숫자로 시작할 수 없으며, 반드시 변수 명의 첫 글자는 문자로 정해야 한다. 이것을 정규 표현식으로 나타낸 것이 위와 같은 것이다. 

 

어휘 분석기의 구현

 다음으로 프로그램을 읽어 토큰 단위로 분할하는 역할을 하는 어휘 분석기의 구현에 대해 알아보겠다. 어휘 분석기의 getToken() 메소드는 호출될 때마다 다음 토큰을 인식해 리턴하도록 구현한다. 토큰을 읽는 경우를 3가지로 나누어 보자.

 

1. 토큰의 첫 글자가 문자(character) -> 식별자 또는 예약어

앞서 식별자 토큰을 분석해 보았듯이 식별자의 첫 글자는 숫자를 사용할 수 없으므로, 토큰의 첫 글자가 문자라면 식별자 혹은 예약어일 것이다. 

2. 토큰의 첫 글자가 숫자 -> 정수 리터럴

ID 토큰 분석에서 알아보았듯 식별자의 첫 글자는 숫자를 사용할 수 없으므로 토큰의 첫 글자가 숫자라면 이 토큰은 정수 리터럴이다.

3. 나머지 case -> 연산자, 구분자 등

그 외 나머지 경우는 연산자, 구분자 등의 토큰일 것이다.

'CS > 프로그래밍 언어론' 카테고리의 다른 글

[프로그래밍 언어론] 블록 구조 언어  (0) 2025.07.01
[프로그래밍 언어론] 변수의 범위  (0) 2025.06.30
[프로그래밍 언어론] Parser와 추상 구문 트리  (0) 2025.06.26
[프로그래밍 언어론] 구문법 - 파스 트리와 모호성  (1) 2025.06.25
[프로그래밍 언어론] 구문법  (0) 2025.06.24
'CS/프로그래밍 언어론' 카테고리의 다른 글
  • [프로그래밍 언어론] 블록 구조 언어
  • [프로그래밍 언어론] 변수의 범위
  • [프로그래밍 언어론] Parser와 추상 구문 트리
  • [프로그래밍 언어론] 구문법 - 파스 트리와 모호성
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (46) N
      • Algorithm (2)
      • PS (15)
        • Solve (15)
      • CS (29) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (13) N
        • 형식언어 (0)
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PS
    선택 정렬
    어휘 분석기
    의미론
    백준1531
    BOJ
    백준23882
    디자인 패턴
    soild 패턴
    알고리즘
    백준 11899
    자료형
    백준13417
    블록 구조
    블록 구조 언어
    디자인패턴
    플로이드 - 워셜
    백준 10867
    최단 경로
    자료구조
    언어 타입
    백준1895
    백준
    PLT
    누적 합 알고리즘
    백준 6825
    객체지향
    다이나믹 프로그래밍
    객체지향설계
    프로그래밍 언어론
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[프로그래밍 언어론] 어휘 분석기
상단으로

티스토리툴바