Racc는 Ruby 언어의 문법을 정의하고 해석하는 데 사용되는 파서 생성기입니다. Ruby가 Racc를 도입하게 된 주요 원인은 크게 두 가지입니다. 첫째, Bison은 Ruby 개발 환경에 설치된 버전을 사용하기 때문에, 새로운 Bison 기능이 Ruby에 즉시 적용되기 어려웠습니다. 둘째, Bison은 PHP, Perl, MySQL 등 다양한 프로젝트에서 사용되므로, Ruby만을 위한 기능 확장이 어렵고 변경에 많은 논의가 필요했습니다. 이러한 한계점을 극복하고 Ruby 문법의 발전을 가속화하기 위해 Racc가 개발되었습니다.
Racc는 다음과 같은 방식으로 Ruby 파서 문법의 유지보수성을 개선했습니다.
1. 숫자 매개변수 참조의 어려움 해결 (Named References)
기존 Bison 기반의 parse.y
파일에서는 파싱 규칙 내에서 특정 컴포넌트의 의미론적 값에 접근할 때 $1
, $2
와 같은 숫자 참조를 사용했습니다. 이는 규칙이 복잡해질수록 어떤 숫자가 어떤 의미를 가지는지 파악하기 매우 어렵게 만들었습니다.
- 문제점:
parse.y
파일 내에서$N
형태의 숫자 참조는 가독성을 저해하고 유지보수를 어렵게 함. - 해결책: Racc는 명명된 참조(Named References) 기능을 도입하여
$
뒤에 심볼 이름을 사용하여 참조할 수 있도록 했습니다. 또한,[alias]
를 통해 별칭을 부여하는 것도 가능해져 코드의 의미를 명확히 했습니다.
2. 문법 추상화 부재 문제 해결 (Parameterizing Rules)
Bison은 코드 재사용을 위한 추상화 메커니즘이 부족하여, 유사한 문법 구조가 여러 곳에서 반복될 경우 코드가 중복되는 문제가 있었습니다. 이는 특히 키워드 인자(keyword arguments)와 같은 복잡한 구조에서 두드러졌습니다.
- 문제점: Bison에는 Ruby의 메서드나 모듈처럼 문법 규칙을 추상화하고 재사용할 수 있는 기능이 없어 중복 코드가 발생.
- 해결책: Racc는 매개변수화된 규칙(Parameterizing Rules)을 도입하여 비-터미널 심볼을 매개변수화할 수 있도록 했습니다. 이를 통해 공통된 구조와 동작을 가진 규칙을 일반화하고 재사용할 수 있게 되어 문법 정의의 간결성과 모듈성을 크게 향상시켰습니다.
- 표준 라이브러리: Racc는
option
,list
,nod_list
와 같은 일반적인 구조를 위한 표준 라이브러리 규칙을 제공하여, 더욱 간편하게 문법을 정의할 수 있도록 지원합니다.
이러한 개선 사항들을 통해 Racc는 Ruby의 파서 문법을 더욱 강력하고 풍부하게 만들었으며, 개발자들이 Ruby의 문법을 이해하고 확장하는 데 있어 큰 편의성을 제공하게 되었습니다.