이 참조에서 토큰을 쓰는 방법과 읽기 오류의 뜻을 찾을 수 있습니다. 리더는 소스 표기를 검사하고, 그다음 정규화기가 식의 구조를 검사합니다.
문자와 문자열 비교하기
아래 프로그램 전체를 reader-grammar.lspx로 저장하세요. 네이티브 CLI로 실행합니다.
(list #\a #\x41 "\x41;" #true)lispex run reader-grammar.lspx표준 출력은 다음과 같습니다.
(#\a #\A "A" #t)종료 코드는 0이고 표준 오류는 비어 있습니다. 새 파일은 만들지 않습니다. 앞의 두 항목은 문자이고 세 번째는 문자열입니다. #true는 #t와 같은 값이며 #false는 #f와 같습니다.
문자와 문자열 이스케이프
문자는 #\로 시작합니다. 뒤에 유니코드 스칼라 하나나 x41 같은 16진 코드, 또는 아래 이름을 붙입니다. 유니코드 스칼라는 서로게이트를 제외한 유니코드 코드 포인트입니다.
문자 이름은 space, newline, linefeed, tab, return, null, nul, delete, rubout, escape, esc, backspace, alarm, page의 열네 가지입니다.
문자열은 큰따옴표로 감쌉니다. 문자열 안에서는 다음 여섯 이스케이프 형식을 쓸 수 있습니다.
| 이스케이프 | 뜻 |
|---|---|
\" | 큰따옴표 |
\\ | 역슬래시 |
\n | 줄바꿈 |
\t | 탭 |
\r | 캐리지 리턴 |
\xHEX; | 16진 숫자 하나 이상으로 적은 유니코드 스칼라 |
\a를 비롯한 잘못된 이스케이프는 E150을 냅니다. 잘못된 문자 이름이나 스칼라 값도 E150을 냅니다.
문자열의 \x41;은 세미콜론으로 끝납니다. 문자 #\x41은 구분자나 입력 끝에서 끝납니다. 이 문자 뒤의 세미콜론은 줄 주석을 시작합니다. 따라서 #\x41;은 문자 #\A와 그 뒤의 주석으로 읽습니다.
수
| 토큰 | 허용 형태 | 주의할 오류 |
|---|---|---|
| 정수 | -?(0|[1-9][0-9]*) | 01처럼 앞에 0이 붙으면 E100 |
| 유리수 | 정수 분자, /, [1-9][0-9]* 형태의 분모 | 분모가 0이나 음수이거나 앞에 0이 붙으면 E100 |
| 실수 | 소수부나 지수 또는 둘 다 있는 십진수 | 1.은 E100, 유한한 범위를 벗어난 값은 E314 |
위 표기에서 ?는 생략 가능, *는 0번 이상 반복, +는 1번 이상 반복을 뜻합니다. 대괄호는 숫자의 범위를, |는 선택지를 나타냅니다.
실수의 전체 형태는 -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][-+]?[0-9]+)?입니다. 소수부나 지수 가운데 하나는 반드시 있어야 합니다. 소수점 양쪽에는 숫자가 필요합니다.
유리수는 읽을 때 약분하므로 4/2는 정확한 정수 2가 됩니다. 정수와 유리수와 실수의 표기는 서로 구분됩니다.
맨 앞에 +가 있으면 이름입니다. 예를 들어 (define +5 7)은 이름 +5에 7을 연결합니다. #x와 #b와 #o, #e와 #i 같은 기수·정확성 접두사는 E100을 냅니다.
이름과 리스트와 인용
이름은 대소문자를 구분합니다. 유니코드 이름을 정규화 없이 그대로 다룹니다. alpha 같은 이름은 심볼로 읽습니다. 이름에 값을 연결하거나 코드에 쓸 수 있는지는 예약어와 금지 형식에서 설명합니다.
| 표기 | 뜻 |
|---|---|
(a b) | 리스트 |
(a . b) | 꼬리가 b인 쌍 |
#(1 2) | 벡터 |
#u8(1 2) | 바이트벡터 |
'x | (quote x) |
`x | (quasiquote x) |
,x | (unquote x) |
,@x | (unquote-splicing x) |
리더는 인용 접두사를 읽습니다. 인용 해제를 쓸 수 있는 위치는 정규화기가 검사합니다.
리스트는 (와 )로 감쌉니다. 대괄호와 중괄호를 쓰면 E100이 납니다. 점은 뒤에 구분자가 올 때만 꼬리를 구분합니다. ...이나 .foo 같은 이름은 심볼로 읽습니다. #(1 . 2)처럼 벡터 안에 점을 쓰면 E100이 납니다.
바이트벡터 원소는 0부터 255까지의 정수 표기로 적어야 합니다. 4/2의 값은 2이지만 #u8(4/2)는 리더가 E100으로 거부합니다. 닫히지 않은 구분자나 잘못 놓인 점도 읽기 단계에서 검사합니다.
공백과 주석과 위치
공백은 토큰을 구분합니다. 세미콜론은 줄 주석을 시작하고 #| ... |#는 블록 주석을 감쌉니다. 블록 주석은 중첩할 수 있습니다. #; 식 주석과 #lang 지시문은 리더가 E120으로 거부합니다.
진단은 입력과 줄과 열을 가리킵니다. 줄과 열 번호는 1부터 셉니다. 읽기와 정규화와 평가의 흐름은 코드를 읽는 방법에서 확인하세요.