인터프리터는 Lexer, Parser, 그리고 실제 실행을 담당하는 Interpreter라는 세 가지 주요 구성 요소로 이루어집니다. Lexer는 소스 코드를 토큰으로 분할하고, Parser는 이 토큰들을 문법 규칙에 따라 의미 있는 구조로 변환합니다. 본 구현에서는 먼저 사용자와 상호작용하는 REPL(Read-Eval-Print Loop)과 유사한 프로그램을 구축하여, QUIT
, CLEAR
, HELP
, NEW
, LIST
와 같은 기본 명령어를 처리하고 프로그램 라인을 메모리에 저장하는 기능을 추가합니다.
Lexer는 숫자, 식별자, 연산자, 문자열 리터럴 등 BASIC의 네 가지 필수 토큰 유형을 처리하도록 구현됩니다. 특히, BASIC의 대소문자 구분 없는 특성을 고려하여 식별자는 대문자로만 인식하며, 변수 유형 접미사($ 등)를 지원합니다. 이어서 PRINT
문을 구현하여 문자열, 변수 값을 출력하고 쉼표(,
)와 세미콜론(;
)과 같은 구분자를 처리하여 출력 형식을 제어합니다.
변수 선언 및 사용을 위해 LET
문이 도입됩니다. 모든 변수는 전역 해시($variables
)에 저장되며, 초기에는 간단한 숫자 값만 처리합니다. 이후에는 재귀 하향식 파싱(recursive descent parsing)을 통해 산술, 비트와이즈, 논리, 비교 연산을 포함한 복잡한 수식 평가 기능을 추가합니다. 이 파서는 연산자 우선순위(예: 곱셈이 덧셈보다 먼저)와 결합성(예: 지수 연산의 우측 결합성)을 정확히 따르며, NOT
과 같은 단항 연산자도 지원합니다.
마지막으로, 프로그램의 제어 흐름을 관리하는 GOTO
와 IF-THEN-ELSE
문을 구현합니다. GOTO
는 특정 라인 번호로 무조건 점프하는 기능을 제공하며, IF
문은 조건식 평가 결과에 따라 코드 블록을 실행하거나 건너뛰는 기능을 수행합니다. 특히, 초기 BASIC 버전에는 없었던 ELSE
절을 추가하여 현대적인 조건부 실행을 가능하게 합니다. 이 모든 과정에서 eval_expr
와 같은 헬퍼 함수를 사용하여 표현식 평가를 모듈화하고 재사용성을 높입니다.