연습으로 Haskell의 파서를 처음부터 작성하고 있습니다. 어휘 분석기를 만들면서 Haskell 2010 Report 에서 다음 규칙을 발견했습니다 .
숫자 → ascDigit | uniDigit
ascDigit →0
|1
| … |9
uniDigit → 모든 유니 코드 소수점 자리
octit →0
|1
| … |7
hexit → 숫자 |A
| … |F
|a
| … |f
소수점 → 자리 { 숫자 }
진수 → octit { octit }
진수 → hexit { hexit }정수 → 십진수 |
0o
8 진 |0O
8 진 |0x
16 진 |0X
16 진
플로트 → 10.
진수 10 진수 [ 지수 ] | 소수점 지수
지수 → (e
|E
)+
|-
] 십진수
부동 소수점과 함께 10 진수 및 16 진 리터럴은 모두 digit를 기반으로 하며 ASCII에서 0-9 사이의 기본 숫자 만 허용하는 ascDigit 대신 유니 코드 10 진수 를 허용합니다. 이상하게도, 8 진 은 octit를 기반으로 하며 ASCII 숫자 0-7 만 허용합니다. 이 "유니 코드 10 진수"는 "Nd"일반 범주를 가진 모든 유니 코드 코드 포인트라고 생각합니다. 그러나 여기에는 전체 자릿수 0-9 및 Devanagari 숫자 ०-९와 같은 문자가 포함됩니다. 나는 그것들을 식별자로 허용하는 것이 바람직한 이유를 알 수 있지만 ९0
리터럴 로 쓰도록 허용해도 아무런 이점이 없습니다.90
.
GHC는 저에게 동의하는 것 같습니다. 이 파일을 컴파일하려고 할 때
module DigitTest where
x1 = 1
이 오류가 발생합니다.
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
그러나이 파일은
module DigitTest where
x1 = 1
잘 컴파일됩니다. 언어 사양을 잘못 읽습니까? GHC (현명한) 행동이 실제로 정확합니까, 아니면 기술적으로 보고서의 사양에 맞지 않습니까? 나는 어디서나 이것에 대한 언급을 찾을 수 없습니다.