이제는 사용하지 않는 공부방/Concept of programming language

[프로그래밍언어론] lexical analysis / scanner

환상상상속상 2020. 9. 21. 23:09

레츠게릿

 

0.

overview

 

하나의 언어를 다른 언어로 변환할때, 컴파일러는 잘게 쪼개서 이해를 한다.

그걸 가지고 새로운 언어로 만든다 (즉, 기계어로 만든다)

 

그래서 그 이해하는 과정을 front-end라고 하는데 3개가 있다.

lexical 토큰구분

syntax 문법분석

semantic 의미분석

 

lexical에서 어휘하나하나를 분석하며 토큰을 나누어줍니다.

 

1.

lexical tokens

sequence of characters that can be treated as a unit

 

토큰이 될 수 있는 것은? 예약어, 타입 등

토큰이 될 수 없는 것은? 주석, 헤더파일, 매크로, 탭, 줄바꿈 등 (전처리기가 해결해준다.)

 

토큰은 두 종류로 나누어 진다.

1) 특수 form: keyword(for, goto, if) , operator symbol( + -..), delimiter(;, {, [ )

예약어

 

2) 일반적인 form: identifier(=ID)(stk,ptr,sum1...), constant(4,555,99,0..)

프로그래머가 정의한 것.

 

ex.num(526)

 

 

2.

Lexical tokens 예시연습

//find zero  -> 주석을 무시한다.

float match0(char *s)  -> float은 예약어, 빈칸 무시, ID(match0), LPAREN, CHAR, STAR, ID(s), RPAREN

{   -> LBRACE

  if(!strcmp(s,"0,0",3))   -> IF, LPAREN, BANG, ID(strcmp) LPAREN ID(s) COMMA STRING(0,0) COMMA NUM(3) RPAREN ..

     return 0.0;  -> RETURN REAL(0,0) SEMI

} -> RBRACE EOF

 

자 그래서 원래의 코드를 syntax analysis에 넣으면 안되지만 옆에 써준 것처럼 적어주면 syntax analysis에 쓰기 좋은 format이 된다.

 

3. 

예시 연습

d -> 0|1|2| ...|9

d가 0~9로 치환될 수 있다.

 

4.

오토마타 표현을 예시로 연습

오토마타 -> regular expression -> grammar은 서로 서로 표현이 가능하다.

아래는 그 그림이며, 중앙대학교 김중헌 교수님의 강의를 참조하였습니다.

 

다시 한번 예시를 보자.

아래 사진에서 4번이 논터미널이 하나만 있어서 정리하기가 쉽다.

 

 

결국 여기서 하는 것은 내 추정컨대, 어휘 하나하나를 분석하여 토큰을 구분 인식하는 것이다. 영어로 말하자면 token recognition이다.

예를 들어보면 아래의 그림처럼 recognition of fixed point numbers가 있다. 소수를 토큰으로 인식하는 과정이라고 말할 수 있겠다.

그러한 것들이 매우 많이 생겨서 언어를 구성하는 것이다.

 

근데 아래의 그림에서는 3. 이나 .67은 인식하지 못하는데 파이썬은 인식하기 때문에 아래의 그림과 다른 문법을 가지고 있다고 생각하면 된다.