티스토리 뷰

Study/Compiler

[Compiler] Scanner의 역할

생각많은 소심남 2013. 4. 23. 19:28

과제로 Compiler의 Lexcial Analysis를 담당하는 Scanner와 Parser를 만드는 것이 목적이다. 

원래는 전반적인 부분을 모두 코딩하는 게 맞지만 교수님이 Grammar Specification을 미리 지정해줘서 그 것에 맞춰서 작성하면 된다.

우선은 Scanner를 만들었는데 Scanner의 역할은 코드 내의 Token이 어디에 속하는지를 분류해주는 역할을 한다. 보통 test code로 다음과 같이 제공된다. 


그러면 Scanner는 한 character씩 읽어나가면서 해당 구문이 어디에 속하는지를 화면상으로 보여줘야 한다. 유의할 점이 있다면 간혹 예외적인 구문이 있다는 것이다.

그냥 character 별로 구분하는 거면 switch 구문을 사용해서 해당 character를 분별해내면 되겠지만 문제는 이 두 개가 같이 결합된 요소다. 가령 comment를 나타내는 // 이라는 것도 먼저 / 를 인지한 상태에서 추가로 들어올 경우에 comment로 인지해줘야 한다. 물론 그 다음에 아무것도 나타나지 않으면 comment대신 division을 해줘야 한다. 혹은 number와 string이 같이 나오는 경우도 정확히 분별해내야 한다. 예를 들어 iden1 이나 __t 같은 것도 분류자로 분류할 수 있으면 추후 parser에서 처리하는데 쉬워질 것이다. 위의 test 구문을 내가 만든 scanner에 집어넣으면 다음과 같다. 



뭐 이런식으로 나오면 parser에서 특정 문법을 정의해 해당 문법이 나올 경우 실행만 하게 해주면 된다. 

댓글