[pyparsing] 사용계기
언젠가는 작성(정리)하겠지, 나 자신?
한눈에 알아보기 어려운 정규식을 코드에 때려넣고 싶지 않았다.
pyparsing은 Keyword, alphas, alphanums 등으로 텍스트 파싱하도록 되어있어서, 나중에 시간이 지나서 코드를 분석하거나 유지보수를 다시 시작하기 쉽도록 할거라고 생각했다. 정규식은 기억이 사라지면 찾는데(뭐였는지 아는데) 시간이 걸리지만, pyparsing은 추측이 가능하기 때문에 pyparsing으로 텍스트 파싱을 구현하기로 했다.
내가 이 라이브러리가 필요한 이유는 구현하고자 하는 내용이 정규식 대신 사용함으로써 코드 가독성을 높힐 수 있기 때문이다. ITU의 X.280, X.680, X.681, X.682의 문서를 읽고, ASN.1 변수들의 이름과 정의값을 파싱해서 변수들을 분류하고 싶었다. ASN.1 변수는 아래처럼 (내 기준) 자유자재로 변신을 하는 놈들이기에, 얘네들을 다 파싱하려면 코드의 내용이 복잡해질게 뻔했다.
[identifier] = [declaration]
[identifier] [type] = [declaration]
...
pyparsing은 "Word(alphas, alphanums + '-') + Optional(Word(alphanums))"으로 2개 유형의 변수 선언을 한번에 파싱하도록 지원하기 때문에, 뭐가 적힌지도 모를 외계어가 난무한 하드 코딩의 문제점을 해소하는데 도움을 줄 수 있다.
이 라이브러리를 사용할 때 정규식보다 더 빛이 나는 이유가 ASN.1 변수 선언 방식이 정말로 다양하기 때문이다.
C/C++, JAVA, Python 등의 언어는 변수와 정의내용을 파싱할 때 간단한 이유가 포맷이 정해져있기 때문이다. 그래서 reserved word만 조사하면 구현하는데 있어서 대부분의 변수를 파싱할 수가 있다. 하지만 asn.1은 변수 선언방식이 [type] [identifier]으로만 선언하지 않아서, 정규식으로만 구현하면 코드가 괘랄해지는 것이다.