객체 Z 사양 파싱을 위한 전통 컴파일 기법 적용
본 논문은 객체 Z 형식 사양을 분석하기 위한 파서를 설계·구현하는 과정에서 전통적인 컴파일러 기술을 적용하는 방법을 제시한다. 기존 Z·객체 Z 분석 도구들을 비교하고, 객체 Z 고유의 의미 제약을 정리한 뒤, 어휘·구문·의미 분석 단계별 구현 전략을 설명한다.
초록
본 논문은 객체 Z 형식 사양을 분석하기 위한 파서를 설계·구현하는 과정에서 전통적인 컴파일러 기술을 적용하는 방법을 제시한다. 기존 Z·객체 Z 분석 도구들을 비교하고, 객체 Z 고유의 의미 제약을 정리한 뒤, 어휘·구문·의미 분석 단계별 구현 전략을 설명한다.
상세 요약
논문은 먼저 객체 Z가 Z 기반의 확장 언어임을 강조하며, 클래스와 객체, 상속, 다형성 같은 객체 지향 개념이 사양에 도입되는 과정에서 발생하는 구문적·의미적 복잡성을 짚는다. 기존 Z 분석 도구인 Z/EVES, CZT, ZLive 등을 검토하면서, 이들 도구가 주로 텍스트 기반의 어휘·구문 분석에 초점을 맞추고, 의미 검증은 제한적이라는 점을 지적한다. 특히, 객체 Z는 클래스 선언부와 상태 스키마, 초기화 스키마, 연산 스키마가 혼재하는 구조를 가지므로, 전통적인 2단계 파싱(lexer → parser)만으로는 충분히 표현하기 어렵다.
이에 저자는 컴파일러 설계에서 차용한 다단계 파이프라인을 제안한다. 첫 단계는 Lexical Analyzer(lexer)로, 토큰 집합을 Z 기본 토큰에 객체 Z 전용 토큰(예: class, inheritance, visibility)까지 확장한다. 두 번째 단계는 Syntax Analyzer(parser)로, LALR(1) 파서를 사용해 BNF 형태의 문법을 정의하고, 클래스 선언, 스키마 병합, 다중 상속 구조 등을 문법 규칙으로 명시한다. 여기서 중요한 점은 파서가 추출한 추상 구문 트리(AST)를 단순히 텍스트 구조로 남기지 않고, 객체 지향 메타모델에 매핑한다는 것이다.
세 번째 단계는 Semantic Analyzer로, 객체 Z 고유의 의미 제약을 검증한다. 저자는 의미 제약을 크게 네 가지로 분류한다. 첫째, 클래스 이름 충돌 방지와 상속 계층의 무순환성; 둘째, 스키마 간 변수 선언의 일관성(동일 변수는 동일 타입, 동일 범위); 셋째, 초기화 스키마와 상태 스키마 간의 호환성(초기값이 상태 변수의 타입에 맞는가); 넷째, 연산 스키마의 전후조건이 선언된 변수와 일치하는가. 이러한 제약은 심볼 테이블을 구축하고, 타입 추론 및 범위 검사를 수행함으로써 자동 검증한다.
또한, 논문은 구현상의 실용적 고려사항을 논한다. 예를 들어, 파서 생성기로는 ANTLR을 활용해 문법을 정의하고, Java 기반의 Visitor 패턴을 이용해 AST를 순회한다. 의미 분석 단계에서는 Z 표준에 정의된 수학적 연산자를 그대로 활용하기 위해, 기존 Z 수식 파서를 재사용하고, 객체 Z 전용 연산자를 추가한다. 마지막으로, 오류 복구 메커니즘을 도입해 구문 오류 발생 시 가능한 한 많은 사양을 파싱하고, 의미 오류는 상세한 위치와 원인을 보고한다.
전체적으로 이 접근법은 기존 Z 도구가 제공하지 못한 객체 Z 전용 의미 검증을 자동화하고, 컴파일러 기술을 차용함으로써 확장성·유지보수성을 높인다. 또한, 파싱 파이프라인을 모듈화함으로써 새로운 객체 Z 확장(예: 제네릭 클래스)이나 다른 형식 사양 언어에 대한 이식도 용이하게 만든다.
📜 논문 원문 (영문)
🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...