Bir alıştırma olarak, Haskell için sıfırdan bir ayrıştırıcı yazıyorum. Lexer'ı hazırlarken Haskell 2010 Raporunda aşağıdaki kuralları fark ettim :
basamak → ascDigit | uniDigit
ascDigit →0
|1
| … |9
uniDigit → herhangi bir Unicode ondalık basamaklı
oktit →0
|1
| … |7
hexit → basamak |A
| … |F
|a
| … |f
ondalık → haneli { haneli }
sekizlik → octit { octit }
onaltılık → Hexit { Hexit }tamsayı → ondalık |
0o
sekizli |0O
sekizli |0x
onaltılı |0X
onaltılık
yüzer → ondalık.
ondalık [ üs ] | ondalık üs
üs → (e
|E
) [+
|-
] ondalık
Ondalık ve şamandıra değişmezleri ile birlikte onaltılık sabitler, tüm dayanmaktadır rakam yerine, herhangi bir Unicode ondalık rakamı kabul ettiği ascDigit sadece temel rakam ASCII 0-9 itiraf. Garip bir şekilde, sekizli , sadece ASCII basamaklarını 0-7 kabul eden oktit üzerine kuruludur . Bu "Unicode ondalık basamak" ın "Nd" Genel Kategori ile herhangi bir Unicode kod noktaları olduğunu tahmin ediyorum. Bununla birlikte, Tam Genişlik 0- dig basamakları ve Devanagari ०-९ rakamları gibi karakterler de buna dahildir. Bunlara tanımlayıcılarda izin verilmesinin neden istenebileceğini anlayabiliyorum, ancak bir ९0
kişinin hazır bilgi için yazmasına izin vermenin hiçbir faydasını göremiyorum 90
.
GHC bana katılıyor gibi görünüyor. Bu dosyayı derlemeye çalıştığımda,
module DigitTest where
x1 = 1
bu hatayı verir.
digitTest1.hs:2:6: error: lexical error at character '\65297'
|
2 | x1 = 1
| ^
Ancak, bu dosya
module DigitTest where
x1 = 1
derler gayet iyi. Dil özelliklerini yanlış mı okuyorum? GHC'nin (mantıklı) davranışı gerçekten doğru mu veya teknik olarak Rapordaki spesifikasyona aykırı mı? Bunun hiçbir yerinde bulamadım.