[프로그래밍언어론] lexical analysis / scanner
레츠게릿
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은 인식하지 못하는데 파이썬은 인식하기 때문에 아래의 그림과 다른 문법을 가지고 있다고 생각하면 된다.