TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 24 READS

야크·바이슨 계보의 C++ 파서 생성기 '얀트라', AST 선-구축 방식의 차별점

야크·바이슨 계보의 C++ 파서 생성기 '얀트라', AST 선-구축 방식의 차별점
SOURCE IMAGE · HACKER NEWS

컴파일러나 도메인 특화 언어(DSL)를 다뤄본 개발자라면 lex/yacc, 혹은 그 후예인 flex/bison이나 ANTLR 같은 파서 생성기 계보에 익숙할 것이다. 최근 해커뉴스에 공개된 얀트라(Yantra)는 이 계보에 합류하는 또 하나의 LALR(1) 파서 생성기다. TantrixAuto가 공개한 이 도구는 C++로 작성됐으며, 어휘 분석기(lexer), 파서, 그리고 추상 구문 트리(AST) 생성을 하나의 도구 안에서 처리한다고 소개한다. 이름인 '얀트라'는 산스크리트어로 '기계'를 뜻하며, 여기서는 상태 기계(state machine)라는 의미를 담았다.

의존성 없는 빌드와 자립형 산출물

실무 관점에서 먼저 눈에 띄는 부분은 배포와 빌드의 단순함이다. 얀트라는 C++ 표준 라이브러리 외에 별도 의존성이 없어, 평범한 CMake 빌드만으로 bin/ 디렉터리에 ycc라는 실행 파일을 만들어낸다. 사용자는 hello.y 같은 문법 파일을 작성한 뒤 ycc로 처리하면 되는데, 이때 생성되는 산출물이 특징적이다. 얀트라는 외부 런타임 라이브러리에 링크하는 대신, 자체 main() 함수까지 포함한 '아말가메이트(amalgamated)' 단일 파일, 즉 hello.cpp 하나와 로그 파일 hello.log를 출력한다. 생성된 파서는 그 자체로 완결된 C++ 소스이므로 C++23을 지원하는 아무 컴파일러로나 바로 컴파일할 수 있다. 라이브러리 버전 충돌이나 배포 시 의존성 동봉 문제를 신경 쓰지 않아도 된다는 점은 소규모 도구나 교육용 프로젝트에서 분명한 장점이다.

생성된 파서에 입력을 주는 방식도 세 가지로 나뉜다. -s 옵션은 문자열을 직접 파서에 전달하고, -f는 파일에서 읽으며, -i는 콘솔에서 대화식으로 입력을 받는다. 공개된 예시 문법인 hello.y는 공백으로 구분된 하나 이상의 알파벳 단어를 인식하는 간단한 규칙으로, 문법 작성부터 컴파일, 실행까지의 전체 흐름을 보여주는 역할을 한다.

핵심 차별점: AST를 먼저 만들고 하향식으로 순회

얀트라가 기존 파서 생성기와 구분되는 지점은 의미 동작(semantic action)의 실행 순서다. 대부분의 파서 생성기는 각 규칙이 환원(reduce)될 때마다 동작을 상향식(bottom-up)으로 실행한다. 반면 얀트라는 입력 전체를 먼저 AST로 완전히 파싱한 뒤, 그 트리를 상위에서 하위로(top-down) 순회하며 사용자가 정의한 동작을 호출한다. 이 순서 덕분에 부모 규칙의 동작이 자식 노드보다 먼저 실행될 수 있다.

이 차이는 계산기 예제 calc.y에서 구체적으로 드러난다. '1 + 2 + 3'은 좌결합으로 (1 + 2) + 3처럼 파싱되는데, 트리의 루트에 해당하는 바깥쪽 Adding 노드가 가장 먼저 출력되고, 이어서 왼쪽 자식인 Number: 1, 그다음 또 다른 Adding 노드인 오른쪽 자식이 각자의 두 자식과 함께 출력된다. 손으로 작성한 재귀 하향 파서나 상향식 파서로 같은 순서를 얻으려면 별도의 AST 클래스들과 트리를 다시 훑는 별개의 순회 패스를 추가로 구현해야 한다. 얀트라에서는 이 순서가 문법 정의에서 그대로 떨어져 나온다는 것이 제작자의 설명이다.

생태계와 실무적 판단

얀트라 주변에는 초기 단계의 생태계도 형성되고 있다. TantrixAuto는 얀트라를 실제로 사용하는 독립 샘플 프로젝트 '링고(lingo)'를 함께 공개했고, Raj Chaudhuri가 만든 언어 서버 확장은 LSP(Language Server Protocol)를 통해 VS Code, Qt Creator 등 LSP를 지원하는 모든 IDE에서 얀트라 문법 파일의 구문 강조를 제공한다. 프로젝트는 MIT 라이선스로 배포되며, 공식 저장소는 빌드 안내와 튜토리얼, 그리고 '아직 지원하지 않는 기능'을 솔직하게 정리한 알려진 한계(Known Limitations) 문서를 순서대로 읽을 것을 권한다.

실무자가 도입을 검토한다면 몇 가지 선을 분명히 해둘 필요가 있다. 제작자 스스로 '아직 못 하는 것'의 목록을 공개하고 있다는 점은 이 도구가 성숙 단계가 아니라 초기 공개 단계임을 시사한다. C++23을 요구하므로 최신 툴체인이 전제돼야 하고, bison이나 ANTLR 같은 기성 도구에 비하면 사용 사례와 레퍼런스가 아직 빈약하다. 다만 어휘 분석부터 AST 생성까지를 한 도구로 묶고, 의존성 없는 단일 소스 파일을 산출하며, 하향식 순회라는 뚜렷한 설계 선택을 내세운다는 점에서, 간단한 DSL이나 설정 언어 파서를 가볍게 만들어야 하는 상황이나 파서 이론을 가르치는 교육 맥락에서는 한 번 살펴볼 만한 선택지다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/TantrixAuto/yantra
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...