49 — 컴파일러: 토큰 읽기
46은 식을 단어로 나누었고, 29은 명령 줄을 나누었습니다. 진짜 컴파일러도 같은 방식으로 시작합니다: 소스 글을 읽고 토큰으로 자릅니다 — 의미의 가장 작은 조각. 이 가이드는 줄을 토큰으로 나누고 명령마다 실행을 보내는 명령 리더를 만듭니다. 컴파일러가 입력을 한 토큰씩 읽는 방식과 같습니다.
단계
split()이 줄을 공백에서 자릅니다. 단어 하나가 토큰 하나이고, 목록이 순서를 지킵니다 —"move 3"이["move", "3"]이 됩니다:
실행해 보기 →line = "move 3" 토큰들 = line.split() 말해 f"토큰 {len(토큰들)}개: {토큰들}"토큰 2개: ['move', '3']이 출력됩니다. 첫 토큰이 명령이고, 나머지 토큰이 인자입니다.함수가 토큰을 받아 첫 토큰으로 실행을 보냅니다 — 06 가이드의
if/elif사슬과 같지만, 답 대신 토큰을 비교합니다.토큰들[1]이 첫 인자입니다:
실행해 보기 →def 토큰실행(토큰들): command = 토큰들[0] if command == "move": amount = int(토큰들[1]) 말해 f"{amount}만큼 이동" elif command == "turn": 말해 f"{토큰들[1]}쪽으로 회전" elif command == "say": 말해 토큰들[1] else: 말해 f"알 수 없음: {command}"int(토큰들[1])이 두 번째 토큰을 숫자로 바꿔move 3이 진짜 걸음을 더하게 합니다. 상태는 딕셔너리에 둡니다 —로봇 = {"direction": "north", "steps": 0}— 그리고move가로봇["steps"]에 더합니다. 전체 프로그램입니다.tokens.ko.nme으로 저장합니다:
실행해 보기 →# tokens.ko.nme — 명령 줄을 토큰으로 나누고 실행합니다. # 실행: nme 실행 tokens.ko # 토큰은 줄의 한 단어이고, split()이 목록을 만듭니다. # 첫 토큰이 명령이고, 나머지 토큰이 인자입니다. # 진짜 컴파일러도 글을 읽고, 토큰으로 자르고, 첫 토큰으로 갈라집니다. def 토큰실행(토큰들, 로봇): command = 토큰들[0] if command == "move": amount = int(토큰들[1]) 로봇["steps"] = 로봇["steps"] + amount 말해 f"{amount}만큼 이동 — 총 {로봇['steps']}걸음" elif command == "turn": 로봇["direction"] = 토큰들[1] 말해 f"{로봇['direction']}쪽으로 회전" elif command == "say": 말해 토큰들[1] elif command == "where": 말해 f"{로봇['direction']} {로봇['steps']}걸음" elif command == "help": 말해 "move <n>, turn <dir>, say <text>, where, help, quit" else: 말해 f"알 수 없음: {command}" 로봇 = {"direction": "north", "steps": 0} 말해 "장난감 로봇: help를 입력하세요." while True: 물어봐 line, "> " if line == "": continue if line == "quit": 말해 "안녕!" break 토큰들 = line.split() 토큰실행(토큰들, 로봇)move는로봇["steps"]에 더하고,turn은 방향을 바꾸며,say는 줄의 나머지를 출력하고,where는 상태를 알려 줍니다. 빈 줄은continue로 반복을 계속하고,quit이 멈춥니다.파이프로 명령을 넣어 실행합니다:
printf 'move 3\nturn left\nsay hi\nwhere\nquit\n' | nme 실행 tokens.ko장난감 로봇: help를 입력하세요. > 3만큼 이동 — 총 3걸음 > left쪽으로 회전 > hi > left 3걸음 > 안녕!나누기 → 실행 보내기 → 반복이 모든 컴파일러의 프런트엔드입니다.
직접 해보기
로봇["steps"]을 0으로 되돌리는 reset 가지를 추가해 보세요. 또는
토큰들[1]을 읽기 전에 인자 개수를 확인하게 해 보세요.
배운 것
- 토큰은 의미 있는 단어 하나이고,
line.split()이 토큰 목록을 만듭니다. 토큰들[0]이 명령이라 실행을 보내고, 나머지는 인자입니다.int(토큰들[1])이 인자를 숫자로 바꿉니다.- 나누기 → 실행 보내기 → 반복이 진짜 토크나이저와 파서의 씨앗입니다.