피드로 돌아가기
Building a single-pass rich-text DSL parser (no regex)
Dev.toDev.to
Backend

개발자가 정규표현식 기반 파서를 단일패스 재귀하강 파서로 대체하여 Markdown 대비 예측 가능한 파싱 동작과 중첩 구조 처리의 명확성 확보

Building a single-pass rich-text DSL parser (no regex)

星野夢華2026년 3월 28일1intermediate

Context

Markdown은 편리하지만 커스텀 문법을 추가하면서 파싱 규칙이 복잡해지고 동작을 추론하기 어려워졌다. 블로그 엔진에서 예측 가능한 파싱 동작, 중첩 구조의 명확성, 확장 가능한 의미론, 최소한의 문법을 모두 충족하는 솔루션이 필요했다.

Technical Solution

  • 정규표현식 기반 접근법을 폐기하고 백트래킹 없는 단일패스 재귀하강 파서 구현: 상태 머신으로 인라인, 블록, 원본(raw) 3가지 형식을 동일한 핵심 로직으로 처리
  • 플러그인 방식 핸들러 설계: 파서는 구조 분석에만 집중하고 렌더링 동작은 외부에서 정의되는 핸들러를 통해 구현
  • DSL 문법 최소화: 예시로 제시된 $$bold(hello)$$, $$info()*...content...*end$$ 형식으로 문법 표면적 제한
  • 확장 가능한 의미론 기반 설계: 핸들러의 외부 정의로 파서 핵심을 수정하지 않고 기능 추가 가능

Key Takeaway

정규표현식 기반 파서의 복잡성 증가 대신 재귀하강 파서와 플러그인 핸들러 구조를 조합하면, 문법은 단순하면서도 의미론은 확장 가능한 DSL을 구현할 수 있다.


정적 사이트 생성기나 블로그 엔진에서 구조화된 리치텍스트 처리가 필요할 때, 백트래킹 없는 단일패스 재귀하강 파서와 외부 핸들러 패턴을 조합하면 Markdown보다 예측 가능한 파싱 동작과 중첩 구조의 명확성을 확보할 수 있다.

원문 읽기