PEG 기반 구문 오류 복구를 위한 라벨링 확장
초록
이 논문은 PEG(Parsing Expression Grammar)에 라벨링 실패와 복구 표현식을 결합한 보수적 확장을 제안한다. 라벨은 오류를 보고할 뿐 아니라 지정된 복구 표현식으로 입력을 동기화 지점까지 건너뛰어 파싱을 재개한다. 저자들은 이를 형식적으로 정의하고, Lua 파서를 구현해 ANTLR 기반 파서와 비교 평가함으로써 IDE 환경에서 실시간 오류 복구가 가능한 PEG 파서의 실현 가능성을 입증한다.
상세 분석
PEG는 백트래킹을 허용하는 상향식 파서 모델로, 전통적인 오류 복구 메커니즘이 부재한다는 점에서 IDE와 같은 인터랙티브 환경에 부적합했다. 기존 연구에서는 가장 먼 실패 지점을 이용해 오류 위치를 추정하거나, 라벨링 실패(labeled failures)를 도입해 오류 메시지를 개선했지만, 파서는 여전히 첫 번째 오류 발생 시 파싱을 중단했다. 본 논문은 이러한 한계를 극복하기 위해 라벨에 복구 표현식(recovery expression)을 매핑하는 새로운 확장을 제안한다. 라벨이 발생하면 파서는 즉시 해당 라벨을 캡처하고, 사전에 정의된 복구 표현식을 실행해 입력 스트림을 ‘동기화 지점’까지 스킵한다. 이 과정에서 파서는 현재까지 누적된 오류 목록을 유지하고, 복구가 성공하면 파싱을 계속 진행한다.
형식적 측면에서는 기존 PEG의 정의에 라벨 집합 L과 라벨‑throw 연산자 ⇑l을 추가하고, 복구 맵 R: L → 표현식 로 구성한다. 논문에 제시된 추론 규칙은 성공, 실패, 시퀀스, 반복, 선택 등 모든 기본 연산자를 확장하여 라벨 발생 시 복구 표현식으로 전이하는 과정을 명시한다. 특히 시퀀스 연산에서 두 번째 피연산자가 라벨을 발생시키면 첫 번째 피연산자의 성공 결과를 보존하면서 복구를 수행하도록 설계돼, 부분 파싱 결과를 손실하지 않는다. 또한 ‘최소’ 연산을 통해 가장 먼 실패 위치 정보를 유지함으로써 오류 위치 보고와 복구를 동시에 지원한다.
구현에서는 Lua 문법에 라벨을 삽입하고, 각 라벨에 적절한 복구 전략(예: 세미콜론 삽입, 블록 종료 토큰 탐색 등)을 지정했다. 복구 표현식은 주로 ‘skip until token X’ 형태로 구현돼, 중첩 블록이나 중괄호 짝 맞추기와 같은 복잡한 동기화 상황도 처리한다. 평가 결과, 제안된 PEG 파서는 ANTLR이 자동 생성한 파서와 비교해 오류 복구 정확도와 파싱 속도 모두 경쟁력을 보였으며, 특히 다중 오류가 연속으로 발생하는 경우에도 안정적으로 AST를 생성했다. 이는 라벨 기반 복구가 PEG의 백트래킹 특성을 유지하면서도 실용적인 오류 복구를 가능하게 함을 실증한다.
이러한 접근은 PEG를 사용한 언어 구현체가 IDE와 같은 실시간 피드백 환경에 직접 적용될 수 있는 길을 열어준다. 라벨링 작업이 어느 정도 수작업을 요구하지만, 라벨과 복구 표현식을 재사용 가능하도록 설계하면 유지보수 비용을 크게 낮출 수 있다. 또한, 최악의 경우 기존의 ‘가장 먼 실패’ 전략과 결합해 자동 오류 메시지를 제공함으로써 라벨링 부담을 완화한다는 점도 주목할 만하다.
댓글 및 학술 토론
Loading comments...
의견 남기기