Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: flex와 bison

내용으로 바로 넘어 가기


TokigunStudio3

228 / 3282   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

flex와 bison

2005/04/14 PM 09:34 | 컴퓨터/프로그래밍 언어 | 4 comments | 0 trackbacks | AllBlog: vote, to pocket

옛날에 모 군과 함께 모종의 물건을 만들던 중에 스크립트 엔진을 하나 만든 적이 있었다. 그때는 김 용묵 형의 C언어 수식 계산기(당시에는 후위 표기법이었는데, 지금은 전위 표기법으로 바뀌었다. 나 역시 후위 표기법을 썼다)를 참고해서 무작정 만들었는데, 사용한 언어가 비주얼 베이직(..)이다 보니까 상당히 골때렸다. 15일 걸려서 만든 코드가 1400여 줄이었는데 아마 내 기억으로 비주얼 베이직으로 만든 코드 중 가장 긴 코드일 것으로 추측한다.

요즘 여러 가지에 손을 댈 생각을 하고 있다 보니까 (무엇보다도 시험 기간이니 -_-;;;;;;;;;) 스크립트 엔진을 하나 만들어 볼까 하는 생각이 들었다. 그러나 위에서 말했듯이 스크립트 엔진 만들 때 엄청난 삽질을 했기에 좀 주춤거리다가, 문득 생각나는 것이 flex와 bison이었다.

대부분의 프로그래밍 언어는 전산학적으로 context-free한 문법을 가지고 있고, 문법을 체계적으로 정의만 하면 이를 토대로 문법을 해석하고 코드를 처리하는 것이 어렵지 않다. 그러다 보니까 이런 과정을 아예 자동으로 해 주는 프로그램이 등장했으니, 전산학과 분들이라면 귀에 박히도록 들으셨을 지도 모를 lex와 yacc이다. 두 개는 보통 같이 쓰는데, lex는 입력되는 문자열을 문법적으로 의미가 있는 토큰(token)으로 분리하는 과정(tokenize)을 담당하고, yacc는 그 토큰들을 가지고 실제로 문법을 해석해서 해당하는 동작을 한다. 여기서 "담당한다"고는 했지만 실제로 lex와 yacc가 반환하는 것은 이런 역할을 하는 C 코드이다. (yacc가 Yet Another Compiler Compiler의 약자라는 걸 생각해 보시라) flexbison은 각각 lex와 yacc의 확장 버전이며 GNU 소프트웨어이다.

암튼... flex와 bison을 써 보려고 조금 돌아 댕기다가 좋은 글을 찾았다. 무려 조인시 위키에 Flex and Bison Howto가 있다! (물론 한국어) 거기에다가 A Compact Guide to Lex & Yacc라는 좋은 글도 있다! 이 글들 정말로 괜찮다. compact guide인데도 웬만한 걸 다 다루고 있어서 (그럼에도 불구하고 길지도 않다!) 여러 가지로 쓸만하겠다. 실제로 접할 수 있는 상황, 예를 들어서 if-else 블록 충돌 같은 상황에 대한 해결책도 있을 정도니까 말 다 했다.

흐흐, 글도 있겠다 flex와 bison 좀 써 봐야 겠다. 일단 시험 끝나고 나서 -_-;;;;;;;;;;

덤: 내가 아주 먼 옛날(?)에 짰던 그 문제의 스크립트 엔진 소스는 여기에서 받을 수 있다. 코드를 본 어떤 분의 한 마디... "이야.. 저때는 obfuscate 안 했군요! 그런대로 읽을만 해요!" OTL

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=578

Comment: 디토 (2005/04/15 AM 07:34)

같이 해요~ ;) 아예 객체지향 스크립트 언어를 만드는것도... -_-

Comment: 토끼군 (2005/04/15 AM 10:51)

디토: 흐흐흐... 근데 flex/bison 쓰면 C 말고 다른 언어를 쓸 수 없기 때문에, 좀 참고로 익혀 두고 실제 구현은 완전히 언어 독립적으로 만드는 걸 생각하고 있습니다.

Comment: 디토 (749/04/20 AM 11:13)

Python/Ruby/Lua 등 대부분의 언어들이 C 확장을 지원해서 별로 상관은 없을 것 같은데요? :)

Comment: 토끼군 (2005/04/15 PM 08:53)

디토: 제가 원하는 건 어떤 언어 A가 있을 때 그 언어 A만 가지고 모든 것을 구현하려는 것입니다. 예를 들어서 php라면 dl 같이 외부 라이브러리를 불러 오는 과정이 없다던지 하는 거겠죠. 순수하게 A만 가지고 만들 수 있을 정도로 (pure A implementation) 간단한 언어라면 충분히 만들 가치가 있다고 생각합니다.

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).