Computer Science/프로그래밍 언어론

어휘 분석부터 구문 분석까지 실습

Beomsu Koh 2023. 4. 8.

어휘 분석부터 구문 분석까지 실습

어휘 분석기의 소중함을 배워보자

어휘 분석기의 유무에 따라 어떻게 식을 인식해 가는지 과정을 봅시다

  • 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> 규칙에 따라 다음과 같이 분석할 수 있습니다.
  1. <assign-st>로 시작합니다. (규칙 2)
  2. <lhs>foo이며, 이는 <variable>에 해당합니다. (규칙 3)
  3. foo<ident>에 해당합니다. (규칙 7)
  4. = 기호를 인식합니다.
  5. <exp>(bar - 60)에 해당합니다. (규칙 4)
  6. <term>bar이며, 이는 <factor>에 해당합니다. (규칙 5)
  7. bar<variable>에 해당하며, 이는 <ident>에 해당합니다. (규칙 7)
  8. - 기호를 인식합니다.
  9. <term>60이며, 이는 <factor>에 해당합니다. (규칙 5)
  10. 60<number>에 해당합니다. (규칙 9)
  11. ) 기호를 인식합니다.
  12. ; 기호를 인식합니다.

어휘 분석기 있는 구문 분석

주어진 문장 "foo=(bar-60);"을 구문분석과 어휘분석을 포함한 C 언어 문법에 따라 분석해보겠습니다.

  1. 어휘분석: 입력된 문자열을 토큰 단위로 분해합니다.

    • “foo”, “=”, “(”, “bar”, “-”, “60”, “)”, “;”
  2. 구문분석: 분해된 토큰들을 문법에 따라 구문 분석합니다.

    • <assign-st>를 사용하여 "foo = (bar - 60);"를 구성합니다.
      • <lhs>는 "foo"이며, 이는 <variable>에 해당합니다.
      • = 기호를 인식합니다.
      • <exp>는 "(bar - 60)"에 해당합니다.
        • <term>는 "bar"이며, 이는 <factor>에 해당합니다.
          • "bar"는 <variable>에 해당하며, 이는 <ident>에 해당합니다.
        • - 기호를 인식합니다.
        • <term>는 "60"이며, 이는 <factor>에 해당합니다.
          • "60"은 <number>에 해당합니다.
        • ) 기호를 인식합니다.
      • ; 기호를 인식합니다.
        따라서, 주어진 문장 "foo=(bar-60);"은 문법 오류가 없는 유효한 C 언어 문장입니다.

구문 분석을 할 때 연산자들이 어디들어가는지 애매하다 싶을 때가 있다.
그럴 땐, 문법을 확인해서, 트리 구조로 토큰에 알맞는 값을 찾으면 된다

규칙을 나타내는 요소라는 개념으로 접근하면 이해하기 쉬울 듯하다
전위나 후위 연산을 계산 할 때 연산자 등은 규칙(연산)을 나타내는 요소로 쓰이는 것처럼, 표현 자체를 위한 것이라 생각하자.

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

댓글