ในการออกกำลังกายฉันกำลังเขียนโปรแกรมแยกวิเคราะห์สำหรับ Haskell ตั้งแต่เริ่มต้น ในการสร้าง lexer ฉันสังเกตเห็นกฎต่อไปนี้ในรายงาน Haskell 2010 :
หลัก → ascDigit | uniDigit
ascDigit →0
|1
| … |9
uniDigit →ใด ๆ Unicode ทศนิยมหลัก
octit →0
|1
| … |7
hexit → หลัก |A
| … |F
|a
| … |f
ทศนิยม → หลัก { หลัก }
ฐานแปด → octit { octit }
เลขฐานสิบหก → hexit { hexit }จำนวนเต็ม → ทศนิยม |
0o
ฐานแปด |0O
ฐานแปด |0x
เลขฐานสิบหก |0X
เลขฐานสิบหก
ลอย → ทศนิยม.
ทศนิยม [ ตัวแทน ] | เลขชี้กำลังเลขชี้กำลัง
เลขชี้กำลัง → (e
|E
) [+
|-
] ทศนิยม
ทศนิยมและเลขฐานสิบหกพร้อมกับตัวอักษรลอยทั้งหมดขึ้นอยู่กับหลักซึ่งยอมรับทศนิยมทศนิยม Unicode ใด ๆ แทนascDigitซึ่งยอมรับเฉพาะตัวเลขพื้นฐาน 0-9 จาก ASCII ตระการฐานแปดขึ้นอยู่กับoctitซึ่งแทนที่จะยอมรับเฉพาะตัวเลข ASCII 0-7 ฉันเดาว่า "Unicode decimal digit" เหล่านี้เป็น Unicode codepoints ที่มีหมวดหมู่ทั่วไป "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 นั้นถูกต้องจริงหรือในทางเทคนิคขัดกับข้อกำหนดในรายงานหรือไม่ ฉันไม่สามารถเอ่ยถึงเรื่องนี้ได้ทุกที่