렉싱 단계에서 렉서(Lexer)는 원시 텍스트를 토큰으로 분할하고, 파서(Parser)는 이 토큰들을 기반으로 문법 규칙에 따라 추상 구문 트리(AST)를 구성하며 문법적 오류를 검사합니다. 마지막으로 컴파일러(Compiler)는 AST를 YARV(Yet Another Ruby VM)가 실행 가능한 바이트코드로 변환합니다. 파서 생성기는 언어 문법을 정의하는 BNF 기반의 형식 문법 명세(parse.y
파일)를 통해 파서 코드를 자동 생성합니다.
기존 Bison 기반의 parse.y
는 파싱 액션 내에서 심볼 값을 숫자 인덱스($1
, $2
)로 참조해야 하는 문제로 가독성이 낮았습니다. Rama는 이를 개선하고자 명명된 참조(Named References)를 도입하여 심볼 이름을 통한 직관적인 참조를 가능하게 했습니다. 또한, Bison의 추상화 메커니즘 부족으로 인한 문법 규칙의 코드 중복 문제를 해결하기 위해 매개변수화된 규칙(Parameterizing Rules)을 도입했습니다. 이는 비터미널 심볼을 매개변수화하여 일반화된 문법 규칙을 정의하고 재사용할 수 있도록 하며, 표준 라이브러리를 통해 일반적인 패턴을 제공하여 문법 표현을 간결하게 만들었습니다. 이러한 Rama의 기능들은 Ruby 문법의 parse.y
파일을 더욱 강력하고 추상화된 형태로 발전시켰습니다.