2020년 2월 8일 토요일

오랫만에 lex와 bison(yacc)를 써봤다.

소시적, 전자과 주제에 어이없지만 공룡책인지 드래곤책인지 하여튼 그 책으로 컴파일러를 처음 공부하기 시작했다.

공룡이나 드래곤이나... 생각했지만, 내가 떠올렸던 건 공룡이 아니라 용이었다.
공룡책은 대체로 운영체제 거시기 그 책을 지칭한다. 디테일은 소중한 것이다.

쥐뿔도 모르면서 마구잡이로 책을 읽던 시절이다. 물론 생각해보면 그때 배운게 제일 많기는 하다. 어이없게도 원서로 읽어서 한 2/3은 뭔소린지 모르고 넘긴 것 같다. 1/3이라도 배운게 어디냐.

그거 대강 보고 이러저러 하다가 flex & bison를 봤다. (기억에는 lex & yacc를 본거 같은데... 책장을 보니 flex & bison이 있더라는...) 덕분에 아직도 종종 이상한 포맷의 파일을 만나면 파서를 만들고 있다. 물론 내가 쓰는 파일들이 아주 흔하지는 않지만 그래도 어디 분야에서는 표준 또는 표준에 가까운 것들이라 잘 찾아보면 어딘가에 누군가가 만들어놓았을 가능성이 크지만, 검색이라는 것이 그렇다. 남들거는 한 방에 찾지만, 정작 내가 필요한 것은 삼일 밤낮을 뒤져도 안나온다. 검색 이틀 째를 맞이하면 슬슬 '이거 그냥 내가 만들었으면 벌써 만들었겠다' 하는 본전 생각이 든다. 물론 어림 반푼어치도 없는 소리다. 실제로 만들어보면 기본 동작이 일주일이고, 정리 좀 하면 한달이다. 그렇다고 계속 검색만 할 수는 없으니 뭐든 적당히 하고, 적당히 포기할 줄 알아야 한다.



보통 오라일리 책은 동물 표지를 사용하지만 공룡책이나 드래곤책, 마법사책과 달리
오라일리의 책은 대부분 표지의 동물 이름으로 불리지 않는다. 이유는 간단하다.
이 책을 '새 책'이라고 부를 수 없기 때문이다. 그렇다고 이 책을 니코바르 비둘기 책
(Nocobar Pigeon)으로 부르기에는.... 딱히 비둘기 책으로 부르기도....

lex와 yacc(bison)은 c/c++만 지원한다. c/c++을 주로 사용하던 때에는 뭐 별다른 필요를 못 느꼈지만 c#으로 옮겨간지 몇년 되니까 c# 코드를 직접 만들어주는 녀석들이 있었으면 좋겠다는 생각을 했다. 그런데 적당히 돌아가는 legacy 코드를 굳이 c#으로 다시 작성할 필요는 없으니 그냥 설렁설렁 넘아가는 중이었다.

이번에 some/ip에 관련된 일을 시작하면서 다시 파서가 필요하게 되었다. vsomeip 라이브러리에서 사용하는 IDL을 읽어와야 한다. 오픈 소스 라이브러리인데 리눅스 플랫폼에서 c/c++로 빌드된다. 그런데 코드 생성기는 자바, 이클립스 플러그인 등으로 만들어졌다. 딱 보니 설치하는데에만 2주는 걸릴 것 같다. 암도 걸릴 것 같다. 그냥 파일 포맷 찾아서 파서 만들면 훨씬 빨리 끝날 것 같다. 같았다.

IDL 파일은 확장자 *.fidl을 사용한다. franca IDL의 약자다. *.fdepl도 있다. deploy에 관련된 정보가 있어서 이놈도 같이 처리해야 한다. fidl 파일 포맷은 어렵지 않게 찾았다. language specification도 있고, 심지어 EBNF로 기술된 문서도 있다. 순조로왔다. 그런데  fdepl 파일 포맷은 잘 안보인다.

그러다가 고객사에서 온 *.fid, *.fdepl 파일을 받았다. 헉?! 파일 내용이 검색했던 내용과 다르다. 이런 썅썅바.

파일 포맷에 대한 문서는 없는 것 같았다. 포기했다. 하지만 vsomeip 라이브러리는 *.fidl 파일과 *.fdepl 파일로 소스코드를 생성해주는 툴이 있으니 그 툴 어딘가에는 파서가 있을 것이다. 찾아보았다. 이클립스 애드온이니 자바로 되어 있는 정도는 뭐 당연한거라고 생각했다. 자바 코드라고 해도 딱히 놀라지는 않았을 것이라는 얘기다. 그정도는 마음의 준비를 했다는 얘기다.

역시, 메트릭스는 옳다. '무엇을 상상하든 그 이상을 볼 것이다.' 4편을 기다려주긴 한다만, 죽은 네오 살리는 것 보다는 콘스탄틴2를 좀 만들어주면 안되겠나 하는 생각이 든다. 지금 시대에 누가 키아누리브스를 보고 네오를 생각하겠나? 존윅이라고 하겠지.

무엇을 상상하든 존윅을 볼 것이다. (원본)
파서 관련된 코드는 찾았다. 며칠 걸렸다. 자바는 아니었다. *.xtext라는 확장자였다.

*.fidl 파일을 파싱하는 모듈은 여기 있고:
https://github.com/franca/franca/blob/master/plugins/org.franca.core.dsl/src/org/franca/core/dsl/FrancaIDL.xtext

*.fdepl 파일을 파싱하는 모듈은 여기 있다:
https://github.com/franca/franca/blob/master/plugins/org.franca.deploymodel.dsl/src/org/franca/deploymodel/dsl/FDeploy.xtext


음... 자바 바닥은 블랙홀과 같아서 뭐든지 다 있지만 들어가면 못 나온다. 굳이 이클립스 애드온을 사용해서 *.xtext 파일로 파서를 돌려보고 싶지는 않다. 파일 내용을 보니 그다지 어려운 것은 아니다. xtext 파일 포맷 따위 공부하지 않아도 알 것 같다. BNF나 regular expression 대충 퉁치면 될 것 같다. 샘플이랑 맞춰봐도 대강 비스무레 하다.

*.fdepl 파일을 처리하기위해 yacc 파일을 만들었고, 삽질을 좀 하다가 요령이 생겼다. 별다른 요령은 아니고, 그냥 xtext에 정의된거 그대로 만드는 거다. 생각하지 말자. 그냥 1:1 변환으로... *.fidl도 그냥 적당히 만드는 중이다.*.fdepl 파일은 샘플까지 다 파싱이 잘 되는 것을 확인했다 .

물론 구문을 파싱하는 것과 그것을 읽어서 어떤 처리를 해주는 것은 하늘과 땅 차이다. 말도 안되게 크지는 않지만 그냥 대충 퉁칠만큼 작지는 않다는 뜻이다. 이건 또 별도의 작업을 해야 할 일이다.

적당히 끝나는 시점이 보일 무렵, 아마도 삐딱한 전세계 모든 프로그래머들이 느끼는 그 시점이 왔다. 근데 뭐 다른 방법은 없나? yacc(bison)를 썼다는 것은 c/c++로 코드가 나오니까, 정작 내가 c#을 쓰려면 한 번 더 고생을 해야 한다는 얘기다. 그냥 바로 c# 코드를 생성해주는 yacc는 없을까? 프로젝트 처음 시작할 때는 없었다. 다시 검색해봤다. 많이 나온다.

음... 코로나 바이러스가 구글 데이터 센터를 감염시킨게 틀림없다. 시공간을 뚫고 이세계 인터넷에 접속됐다. 여튼 몇 가지를 찾아서 링크를 남긴다. 코로나 바이러스가 완전 퇴치되면 이 링크는 아마 접속되지 않을 것 같으니 미리 미리 코드랑 바이너리를 다운받아놔야 겠다. 이세계인지 어떻게 아냐교? 이쪽 사이트 바이너리가 Windows XP 또는 Windows 7 타깃이다.

1. LLLPG
http://ecsharp.net/lllpg/2-simple-examples.html

LL(x) 이런 골머리 아픈 표기법은 공룡/드래곤책으로 끝인줄 알았는데 LLLPG라니...

2. GOLD Parsing System
http://goldparser.org/builder/index.htm
GOLD Mining System인줄...
찾은 것 중에서는 젤 깔끔한 놈인 듯한데... 써봐야 알겠지...
뭔가 완성됐다는 느낌이 드는 놈이다.

3. Coco/R for C#
http://ssw.jku.at/Coco/#Docu
이놈도 뭔가 완성된 느낌이다. 홈페이지에는 금광 시스템보다는 좀 문서가 적긴 한데, 사용자 수는 더 많을 듯한 느낌이다.

다음 프로젝트는 c#으로 해야지...
다시 오지 않을 다음 프로젝트...

댓글 없음: