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| … |fondalık → haneli { haneli }
sekizlik → octit { octit }
onaltılık → Hexit { Hexit }tamsayı → ondalık |
0osekizli |0Osekizli |0xonaltılı |0Xonaltı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 ९0kiş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.