다들 월요일을 잘 시작하셨는지요? 저는 주말을 너무도 재밌게 보내고나서인지 오늘 하루는 조금 피곤했네요. 모든 가족들이 잠든 조용한 밤에 몇글자 끄적여볼까 합니다.
본론부터 이야기하자면, 오늘 오후를 기점으로 소스 코드 분석을 위해 Perl을 이용하려던 계획은 잠정 보류하기로 하였습니다. 이전의 두개의 포스팅을 통해 Function과 Literal을 분리해내는 Perl 코드를 작성했다고 말씀드렸는데요, 이제 글로벌 변수에 대한 추출을 하려고 하니, 이게 막막하더군요. 처음의 생각은 이러했습니다.
- 전체 변수를 추출
- 로컬 변수를 제거 : 모듈 내의 선언문을 통해 알 수 있겠죠?
- 대입문이 있는 경우 왼쪽에 쓰이면 Output 1, 오른쪽에 쓰이면 Input. 대입문이 아니면 Input
위와 같은 단계를 거쳐 추출을 해내려고 했습니다. 그런데 위와 같은 방법으로 만들어내는 변수의 목록은 그 정확성을 100% 장담하기 어렵다는 것이지요. 즉, 뭔가 찜찜한 구석이 남게 되는 문제가 생깁니다. 그래서 생각한 것이 Syntax 에 따라 파싱을 하게되면 정확히 Input/Output을 가릴 수 있지 않을까 하는 것입니다. 그러기 위해서는 제대로된 파싱을 할 필요가 있겠지요.
그래서 일단 "Perl을 이용한 C 소스 코드 분석"은 잠시 보류하려고 합니다. 오늘 오후부터 Lex & Yacc 에 대해 살펴보고 있는 중이랍니다. 며칠 동안 서베이와 테스트 코드를 돌려보고 진행 여부를 결정해볼까 합니다.
생각보다 작업이 어려워지네요..^^
모두 즐거운 밤 되세요.
- 팀의 코딩 및 주석 규칙에 외부의 변수를 단순 참조할 경우 Input, 해당 값이 모듈 내에서 변경될 경우 Output으로 정하고 있습니다. [본문으로]
댓글을 달아 주세요
Perl에서도 고급기능을 가진 Parser들이 많습니다.
2008/11/25 13:18Parse::RecDescent 와 Parse::Yapp 모듈등...
http://search.cpan.org/dist/Parse-RecDescent/ 을 보시면
http://search.cpan.org/perldoc?csourceparser.pl 처럼 Parse::RecDescent 모듈로 C소스 파싱하는 샘플이 이미 있네요..
오호~ 고맙습니다. 아직 Perl을 접한지 얼마 안되다보니 부족한게 많네요~ ^^
2008/11/25 23:21