एक अभ्यास के रूप में, मैं स्क्रैच से हास्केल के लिए एक पार्सर लिख रहा हूं। लेसर बनाने में, मैंने हास्केल 2010 रिपोर्ट पर निम्नलिखित नियमों को देखा :
अंक → ascDigit | uniDigit
ascDigit →0
|1
| … |9
uniDigit → कोई भी यूनिकोड दशमलव अंक
ऑक्टिट →0
|1
| … |7
हेक्सिट → अंक |A
| … |F
|a
| … |f
दशमलव → अंक { अंक }
ऑक्टल → ऑक्टिट { ऑक्टिट }
हेक्साडेसिमल → हेक्सिट { हेक्सिट }}पूर्णांक → दशमलव |
0o
अष्टदल |0O
अष्टदल |0x
हेक्साडेसिमल |0X
हेक्साडेसिमल
फ्लोट → दशमलव.
दशमलव [ घातांक ] | दशमलव घातांक
घातांक → (e
|E
) [+
|-
] दशमलव
दशमलव और हेक्साडेसिमल शाब्दिक, फ्लोट शाब्दिक के साथ, सभी अंक पर आधारित होते हैं , जो किसी भी यूनिकोड दशमलव अंक को मानते हैं, एस्कडीजिट के बजाय , जो ASCII से केवल मूल अंक 0-9 को स्वीकार करता है। अजीब तरह से, ऑक्टल ऑक्टिट पर आधारित है , जो केवल ASCII अंक 0-4 को स्वीकार करता है। मुझे लगता है कि ये "यूनिकोड दशमलव अंक" किसी भी यूनिकोड कोडपॉइंट के साथ "एनडी" जनरल श्रेणी के होते हैं। हालाँकि, इसमें पूर्ण-चौड़ाई अंक 9- the और देवनागरी अंक ०-९ जैसे वर्ण शामिल हैं। मैं देख सकता हूं कि पहचानकर्ताओं में इनकी अनुमति देना क्यों वांछनीय हो सकता है, लेकिन मैं किसी को भी ९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 का (समझदार) व्यवहार वास्तव में सही है, या क्या यह तकनीकी रूप से रिपोर्ट में विनिर्देश के खिलाफ है? मुझे इसका कहीं भी कोई उल्लेख नहीं मिल रहा है।