4주차(CS07): 23-01-25 ~ 23-01-27
코드스쿼드 학습 시스템에 익숙해지고 설 연휴까지 껴서 많이 나태해진 것 같다. 😴
그리고 새로운 팀원들이랑도 많이 친해져서 줌각코하는 동안 잡담도 많이 나눴다.
마스터께서 "잡담은 경쟁력이다!" 라고 했지만 그래도 마음 한편은 "너무 풀어졌나?"하는 생각도 든다. ㅠㅠ
그런 의미에서 인프런에서 김영한님의 스프링 강의를 구매하고
지구님이랑 2월부터 스프링 스터디를 하기로 했다!
(제발 2월에는 더 열심히 하자...!)
그리고 지금까지는 주간 회고만 썼는데 앞으로 월간 회고도 작성해 볼 예정이다.
글을 잘 못써서 꾸준한 연습도 필요하고... 스스로 돌아보는 시간을 더 갖기 위함이다.
이번주차 미션은 XML Parser의 동작 방식에 대해 학습하는 것이었다.
Parser의 동작 방식에 앞서 XML이 뭔지 조차 몰라서 XML에 대해 우선 알아보았다.
그 후 컴파일러 작동원리에 대해 공부하고 XML 파서 구현을 위해 코드 작성을 시작했다.
컴파일러 작동원리에 대해 필자가 이해한 바를 간단히 정리해보면 3단계로 나뉜다.
(물론 더 많은 단계와 디테일이 있다.)
컴파일러가 맨 처음하는 것은 우리가 작성한 소스코드를 토큰화(tokenizer)하는 것이다.
이게 무슨 말이냐 하면...
가령 아래와 같은 코드가 있다고 하자.
<!DOCTYPE html><HTML lang="ko"><BODY><P>Hello, World!</P></BODY></HTML>
요리할 때도 요리를 위해 미리 재료를 다듬어 준비하듯
컴파일러도 코드 분석하기 전 코드를 분석하기 좋게 준비해야 한다.
그 과정이 바로 토큰화인 것이다.
토큰화를 하게되면 위 코드가 아래처럼 바뀐다.
["<", :!DOCTYPE html", ">", "<", "HTML lang", "=", "ko", ">", "<", "BODY", ">", "<", "P", ">", "Hello, World!", "<", "/P", ">", "<", "/BODY", ">", "<", "/HTML", ">"]
자 이제 코드 분석을 하기 위한 준비가 끝났다.
하지만 컴파일러가 코드를 분석하기 앞서 분리해 놓은 각각의 토큰이 뭘 의미하는지 알 수가 없다.
그래서 컴파일러에게 아래와 같이 각 토큰이 뭘 의미하는지 알려줘야 한다.
{ element: 'HTML',
attributes: [
{ name : "lang", value : "ko" }
]
children: [
{ element : 'BODY',
children: [
{ element : 'P',
text : 'Hello, World!',
}
]
}
]
}
이때! lexer는 syntax가 맞는지 여부는 확인하지 않는다.
문법에 맞는지 검증하는 것은 다음 단계에서 진행한다.
💬
(필자는 여기서 조금 이해가 가지 않긴 했다... 잘못 이해한 것일 수도 😭
모든 토큰을 분석하기 전에 문법 검사를 하는 것이 더 효율적이지 않나? 생각이 들었다,,
문법 검증을 먼저하면 문법에 맞지 않는 토큰을 검사하지 않아도 된다고 생각했기 때문이다.
하지만 박사님들이 어련히 알아서 만들었을까)
컴파일러는 이제 이 단계에서 토큰화된 코드의 문법 검사를 한다.
가령 <body>
태그를 열었으면 </body>
로 닫아주었는지
<body>
를 <body>>
처럼 잘못 작성했는지 말이다.
이 과정에서 컴파일러는 1단계에서 토큰화된 토큰을 스택을 사용해서 검사한다.
토큰을 순차적으로 스택에 push
하고 pop
을 하며 문법을 검사하는 것이다.
스택에 순차적으로 토큰이 들어오고 스택은 정해진 로직에 따라 pop
할 때
아래와 같이 토큰이 잘못된 순서로 들어오면 "문법 오류에요!" 라고 알려준다.
["<", "html", "<"] // 에러! 3번째 요소는 "<"가 아니라 ">"어야 한다.