Pratt 파싱(Pratt parsing)은 복잡한 프로그래밍 언어의 문법을 분석하는 데 사용되는 강력하면서도 간결한 기법입니다. 이 방식의 핵심은 짧은 알고리듬의 내부 구현을 파고들기보다, '토큰 왼쪽에 무엇이 있어야 하는가'라는 질문을 통해 문법을 나누는 사고방식을 익히는 데 있습니다. 전통적인 파서 생성기가 생성 규칙에 의미 동작을 연결하는 것과 달리, Pratt 파싱은 단말 토큰 자체에 의미 동작을 연결하며, 왼쪽 피연산자가 필요 없는 nud(null denotation)와 필요한 led(left denotation)로 파싱 코드를 구성합니다.
Pratt 파싱의 핵심 엔진은 대안 탐색이나 백트래킹 없이 진행되며, 의미 동작을 정확히 한 번만 실행합니다. 이는 부수 효과(side effect)를 안전하게 활용하고 하위 파서(sub-parser)를 유연하게 조합할 수 있게 합니다. 결합력(binding power) 규약을 통해 연산자의 우선순위와 결합 방향을 제어하며, 함수 호출이나 배열 인덱싱 같은 구조도 '왼쪽에 무엇이 있어야 하는가'라는 관점으로 led에 등록하여 처리합니다. 또한, 모드 기반 렉싱(modal lexing)과 렉서/파서 API를 함께 사용하는 매크로(macro)는 문법 확장의 중요한 수단이 되며, 렉서 설계가 하위 언어(sub-language)와 파서의 조합 가능성을 좌우합니다.
이러한 Pratt 파싱의 접근 방식은 여러 중요한 이점을 제공합니다. 첫째, 의미 동작을 호출하기 전에 해당 토큰을 이미 소비하므로 LL(k) 같은 전통적인 파싱 기법에서 흔히 발생하는 좌재귀(left recursion) 문제가 발생하지 않습니다. 둘째, 대안 탐색이나 백트래킹 없이 작동하여 PEG(Parsing Expression Grammar)나 팩랫(packrat) 파서에서 나타나는 속도와 메모리 사이의 절충이나 대규모 메모이제이션(memoization)이 필요 없습니다. 셋째, 의미 동작이 정확히 한 번만 실행되므로 상태 롤백(state rollback) 없이 부수 효과를 사용할 수 있고, 임의 길이의 전방 탐색(lookahead)과 하위 파서 호출이 가능해 복잡한 문법 구조를 유연하게 처리할 수 있습니다. 마지막으로, 테이블의 빈자리를 문법 확장 지점으로 활용하여 매크로나 자체 연산자 확장을 구현할 수 있어 언어 설계의 유연성을 크게 높입니다.