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

C++용 LALR(1) 파서 생성기 Yantra 등장: 아직도 파서 생성기를 쓸 일이 있을까?

C++용 LALR(1) 파서 생성기 Yantra 등장: 아직도 파서 생성기를 쓸 일이 있을까?
SOURCE IMAGE · HACKER NEWS
C++용 LALR(1) 파서 생성기 Yantra 등장: 아직도 파서 생성기를 쓸 일이 있을까?

무슨 일이 있었나요?

C++ 프로젝트에서 쓸 수 있는 LALR(1) 파서 생성기 Yantra가 GitHub에 공개됐어요. 파서 생성기라는 말이 낯선 분도 있을 텐데요, 이게 뭐냐면 문법 규칙만 적어주면 그 문법대로 입력을 읽어내는 코드를 대신 만들어주는 도구예요. 계산기나 설정 파일 포맷, 작은 스크립트 언어를 만들 때 문자열을 한 글자씩 쪼개는 코드를 손으로 짤 필요 없이, 문법만 선언하면 파서 코드가 자동으로 생성되는 거죠.

이 분야에는 이미 Bison(yacc의 후손)이나 ANTLR 같은 오래된 강자들이 있어요. 그런데도 새 도구가 계속 나오는 건, 기존 도구들이 현대 C++ 코드와 잘 안 어울린다는 불만이 꾸준히 있었기 때문이에요.

LALR(1)이 정확히 뭔가요?

이름이 좀 무섭지만 하나씩 풀어볼게요.

LR은 입력을 왼쪽(Left)에서 오른쪽으로 읽으면서 가장 오른쪽(Rightmost) 유도를 거꾸로 만들어가는 방식이에요. 쉽게 말하면 토큰을 하나씩 스택에 쌓다가(shift), 쌓인 모양이 어떤 문법 규칙과 딱 맞으면 그걸 하나로 접는(reduce) 거예요. 레고 조각을 하나씩 올려두다가 '이 세 개는 바퀴네' 하고 묶어버리는 느낌이죠.

(1)은 다음에 뭘 할지 정할 때 앞으로 딱 한 토큰만 미리 본다는 뜻이에요. 그리고 LA는 Look-Ahead의 약자인데요, 완전한 LR(1) 파서는 상태 표가 엄청나게 커지거든요. 그래서 비슷한 상태들을 합쳐서 표 크기를 줄인 버전이 LALR이에요. 표현력은 거의 유지하면서 메모리는 훨씬 덜 쓰는 실용적인 타협안이라, yacc와 Bison이 이 방식을 골랐어요.

이런 바텀업(bottom-up) 방식의 장점은 expr : expr '+' term 같은 왼쪽 재귀 문법을 자연스럽게 처리한다는 거예요. 손으로 짜는 재귀 하강 파서나 LL 계열은 이런 규칙을 만나면 무한 루프에 빠지기 때문에 문법을 고쳐 써야 하거든요. 연산자 우선순위나 결합 방향을 선언적으로 지정할 수 있다는 것도 큰 장점이고요.

기존 도구들과 비교하면

Bison은 수십 년 검증된 도구지만, 생성되는 코드가 C 스타일 전역 상태에 기대는 부분이 많아요. C++ 모드가 있긴 해도 설정이 번거롭고, shift/reduce 충돌 메시지가 뜨면 초보자는 어디를 고쳐야 할지 감 잡기가 어려워요.

ANTLR은 LL(*) 기반이라 문법 작성이 직관적이고 도구 생태계도 훌륭해요. 다만 본진이 Java라서 C++ 런타임을 따로 붙여야 하고, 빌드 과정에 JVM이 끼어드는 게 부담이라는 의견이 많아요.

PEG 계열(PEGTL, cpp-peglib 등)은 헤더 몇 개면 끝나는 가벼움이 매력이에요. 하지만 순서 있는 선택(ordered choice) 때문에 문법의 모호함이 조용히 숨어버릴 수 있어요. 반면 LALR은 모호한 문법을 만나면 생성 단계에서 충돌로 알려주기 때문에, 오히려 문법 설계를 엄격하게 검증해주는 효과가 있죠.

Yantra는 이 사이에서 'C++ 개발자가 C++ 생태계 안에서 끝낼 수 있는 LALR 도구'를 노리는 것으로 보여요. 구체적인 문법 파일 형식, 에러 복구 방식, 생성 코드 구조 같은 세부 사항은 저장소의 README와 예제를 직접 확인해보세요. 막 공개된 프로젝트인 만큼 문서와 API가 앞으로 바뀔 가능성도 있으니까요.

한국 개발자에게 주는 시사점

'요즘 누가 파서를 직접 만들어?' 싶을 수 있는데, 생각보다 쓸 데가 많아요. 사내 DSL, 로그나 검색 필터 문법, 게임 엔진의 스크립트, 테스트 시나리오 기술 언어, 레거시 포맷 변환기 같은 걸 만들다 보면 결국 정규식의 한계에 부딪히거든요. 정규식은 괄호 짝 맞추기 같은 중첩 구조를 다룰 수 없기 때문이에요.

당장 프로덕션에 넣기보다는, 사이드 프로젝트로 사칙연산 계산기나 간단한 JSON 파서를 Yantra로 만들어보고 Bison과 비교해보는 걸 추천해요. 컴파일러 수업에서 배운 shift/reduce 개념이 실제 코드로 어떻게 바뀌는지 눈으로 확인할 수 있는 좋은 학습 재료가 될 거예요.

마무리

핵심 한줄: Yantra는 오래되고 검증된 LALR(1) 이론을 현대 C++ 개발 흐름에 맞게 다시 포장하려는 시도예요.

여러분은 파서가 필요할 때 손으로 짜는 재귀 하강 파서를 선호하시나요, 아니면 생성기를 쓰시나요? 그 이유도 궁금해요.


🔗 출처: Hacker News

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

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

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

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